1. 程式人生 > >高併發分散式系統架構——Nginx

高併發分散式系統架構——Nginx

Nginx介紹

Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,並在一個BSD-like 協議下發行。其特點是佔有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站使用者有:百度、京東、新浪、網易、騰訊、淘寶等。 —— [ 百度百科 ]

Nginx由C語言編寫,對系統資源和CPU資源利用率都很高,支援50000併發連線數,並且安裝和配置簡便,啟動速度極快,支援Linux、Mac OS X、Microsoft Windows等眾多主流作業系統,是做分散式系統的常用的反向代理器。

Nginx實現請求轉向

博主使用阿里雲CentOS 7.3雲伺服器實現,小夥伴們也可以使用Linux虛擬機器實現,只是使用虛擬機器話要注意橋接模式與NAT模式的區別,注意是否需要修改本機的hosts檔案。

安裝Nginx

博主使用Xshell 5連線伺服器,yum安裝Nginx:

[[email protected] ...]# yum install nginx

使用yum安裝,要求伺服器能夠訪問公網,使用虛擬機器的小夥伴注意要使虛擬機器能夠訪問外網。
檢視Nginx安裝後的各路徑:

[[email protected] ...]# whereis ngnix
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz /usr/share/man/man3/nginx.3pm.gz

執行命令nginx -t檢視安裝是否成功:

[[email protected] ...]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

有以上輸出說明安裝成功。

配置Nginx

Nginx的配置檔案nginx.conf在資料夾/etc/nginx中,博主使用FileZilla修改nginx.conf檔案,嫌麻煩的話也可以使用vim命令編輯,在http {…}中新增server {…}標籤:

http {
    #...
    #新增測試用的轉向配置
    server {
        #Nginx伺服器監聽8080埠
        listen 8080;
        #監聽的服務的名稱,因為博主並未設定任何服務,所以直接使用localhost
        server_name localhost;
        #代理有可能導致請求頭丟失,以下三行保證請求一定會有請求頭
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #要轉向的IP及埠
        location / {
            #博主的Tomcat與Nginx安裝在同一臺伺服器上,所以直接將請求轉向本地的8081埠
            proxy_pass http://127.0.0.1:8081;
        }
    }
}

nginx.conf配置檔案中的內容遠不止於此,轉載@Java高知大神的超詳細的配置檔案說明:Nginx配置檔案(nginx.conf)配置詳解,感興趣的小夥伴可以研讀一下。

啟動Nginx

介紹下Nginx的啟動、停止、重啟命令:

命令 價格
nginx 根據配置檔案/etc/nginx/nginx.conf啟動
nginx -s stop 停止
nginx -s reload 重啟

執行以上三個命令都不會有任何輸出提示,但可以通過ps命令檢視程序狀態:

[[email protected] ...]# nginx
[[email protected] ...]# ps -ef |grep nginx
root     10133     1  0 21:00 ?        00:00:00 nginx: master process nginx
nginx    10134 10133  0 21:00 ?        00:00:00 nginx: worker process
root     10136  9121  0 21:00 pts/1    00:00:00 grep --color=auto nginx
[[email protected] ...]# nginx -s stop
[[email protected] ...]# ps -ef |grep nginx
root     10181  9121  0 21:05 pts/1    00:00:00 grep --color=auto nginx

很容易看出差別。

測試轉向

在Linux伺服器上啟動一個訪問埠為8081的Tomcat伺服器,使用瀏覽器訪問伺服器的8080埠(注意開啟8080埠或關閉防火牆),會發現請求被轉發到8081埠的Tomcat伺服器中,測試完成,成功完成轉向。

Nginx負載均衡

由於單臺Tomcat伺服器能夠承受的併發量太小,所以開發環境下都要配置多臺Tomcat伺服器,形成分散式叢集,這時也可以通過Nginx來實現。
三種常用的均衡演算法:

均衡策略 說明
輪詢 將所有請求依次傳送給所有伺服器
權重 將所有請求按照權重的比例傳送給各伺服器
IP_HASH 根據使用者的訪問IP將請求傳送給固定的伺服器

修改配置檔案實現輪詢負載均衡

在全新的nginx.conf文件中進行修改,或將上例中的配置檔案已更改的內容刪除後在使用:

    server {
        listen 8080;
        server_name localhost;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        location / {
            #這裡的“bal”應與已存在的某一策略名稱一致
            proxy_pass http://bal;
        }
    }
    #配置均衡策略,"bal"為策略名稱
    upstream bal {
        #輪詢
        server  127.0.0.1:8081;
        server  127.0.0.1:8082;
        server  127.0.0.1:8083;
    }

這裡要注意server標籤要寫在http標籤內部,並且要開啟8080埠,但8081、8082、8083埠不需要開啟,這也是Nginx安全性特點的體現之一。

測試輪詢負載均衡

啟動三臺內容各不相同的Tomcat伺服器,分別監聽8081、8082、8083埠。在瀏覽器中訪問伺服器8080埠,多次重新整理會發現三臺Tomcat依次被訪問:
首次訪問伺服器8080埠

第二次訪問8080埠

第三次訪問8080埠

如果有Tomcat伺服器意外宕機,Nginx能夠檢測Tomcat的狀態,並只將請求發往能夠正常接收請求的伺服器(但是不排除能夠接受卻不能返回結果的伺服器,這裡可以通過worker_processes設定超時後轉發到另一臺伺服器)。

權重負載均衡策略

因為一般情況下,一家公司中的伺服器效能不一,使用輪詢式策略會出現資源分配不均的現象,所以權重式的負載均衡策略是開發中最常用的負載策略。

    upstream bal {
        server 127.0.0.1:8081 weight=6;
        server 127.0.0.1:8082 weight=1;
        server 127.0.0.1:8083 weight=3;
    }

在地址後加上weight屬性即可,Nginx會根據同一個策略中的中weight值,按照各自值所佔百分比將請求儘量均勻的傳送至每一個伺服器,值越大的伺服器獲得的請求越多。

IP_HASH負載均衡策略

IP_HASH負載均衡策略實現方式非常簡單,在策略中加入ip_hash語句即可,一旦新增ip_hash語句,其他策略將不起作用(即使添加了weight屬性也會按照IP_HASH策略分發請求)。
Nginx伺服器將使用者的IP進行hash運算獲得對映值,將特定的IP與特定的伺服器繫結,以後該IP的所有請求都會發往該伺服器。

    upstream bal {
        ip_hash;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
        server 127.0.0.1:8083;
    }

在分散式系統環境下,可以利用Session黏著的現象實現Session共享。但這是一種低階的實現方式,因為不可能所有使用者的IP分佈與真實的伺服器效能分佈情況正好吻合,並且在IP可變的情況下因Session黏著現象會導致安全問題。所以這種負載策略一般不會使用,而通過單點登入的方式實現Session共享。

備用機機制

在某臺伺服器後新增backup屬性即可將該伺服器設定為備用機。Nginx一般情況下不會將請求傳送給備用機,只有所有的非備用機全部宕機或全部忙碌,沒有非備用機能夠響應新的請求時,才會將請求傳送給備用機,使其承擔一部分壓力。如果非備用機重啟或壓力減小,可以正常處理使用者請求時,則備用機再次處於等待狀態。

    upstream bal {
        server 127.0.0.1:8081 weight=6;
        server 127.0.0.1:8082 weight=1 backup;
        server 127.0.0.1:8083 weight=3;
    }

這裡需要注意,備用機機制不能與IP_HASH負載均衡策略一起使用。

相關推薦

併發分散式系統架構——Nginx

Nginx介紹 Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,並在一個BSD-like 協議下發行。其特點是佔有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好,中國大

基於SOA的併發可用分散式系統架構和元件詳解

基於SOA的分散式高可用架構和微服務架構,是時下如日中天的網際網路企業級系統開發架構選擇方案。在核心思想上,兩者都主張對系統的橫向細分和擴充套件,按不同的業務功能模組來對系統進行分割並且使用一定的手段實現服務之間的通訊,並且基於彈性雲服務搭建高可用的分散式解決方案。 但它們之間的區別可能比相似的地方要多,特別

併發訂單系統架構設計

高併發下單主要包括以下幾個方面: 分庫分表 多應用例項全域性唯一訂單號 資料庫連線 買家查詢訂單 賣家查詢訂單 擴容問題 業務拆分 一、分庫分表 隨著訂單量的增長,資料庫的發展主要經歷以下幾個步驟:  - 1主-1從架構  - 雙主-多從架構,讀寫分離  - 表

併發分散式系統如何做到唯一Id

又一個多月沒冒泡了,其實最近學了些東西,但是沒有安排時間整理成博文,後續再奉上。最近還寫了一個發郵件的元件以及效能測試請看 《NET開發郵件傳送功能的全面教程(含郵件元件原始碼)》 ,還弄了個MSSQL引數化語法生成器,會在9月整理出來,有興趣的園友可以關注下我的部落格。 分享原由,最近公司用到,並且在找最

如何在併發分散式系統中生成全域性唯一Id

又一個多月沒冒泡了,其實最近學了些東西,但是沒有安排時間整理成博文,後續再奉上。最近還寫了一個發郵件的元件以及效能測試請看 《NET開發郵件傳送功能的全面教程(含郵件元件原始碼)》 ,還弄了個MSSQL引數化語法生成器,會在9月整理出來,有興趣的園友可以關注下我的部落格。 分享原由,最近公司用到,並

併發訂單系統架構設計(二)

高併發下單主要包括以下幾個方面: 分庫分表 多應用例項全域性唯一訂單號 資料庫連線 買家查詢訂單 賣家查詢訂單 擴容問題 業務拆分 一、分庫分表 隨著訂單量的增長,資料庫的發展主要經歷以下幾個步驟: - 1主-1從架構 - 雙主-多從架構,讀寫

併發併發分散式架構解密,不是所有的鎖都是分散式鎖!!

## 寫在前面 > 最近,很多小夥伴留言說,在學習高併發程式設計時,不太明白分散式鎖是用來解決什麼問題的,還有不少小夥伴甚至連分散式鎖是什麼都不太明白。明明在生產環境上使用了自己開發的分散式鎖,為什麼還會出現問題呢?同樣的程式,加上分散式鎖後,效能差了幾個數量級!這又是為什麼呢?今天,我們就來說說如何

阿里架構師,講述網際網路分散式系統架構設計中的“併發

一、什麼是高併發 高併發(High Concurrency)是網際網路分散式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。 高併發相關常用的一些指標有響應時間(Response Time),吞吐量(Throughput),每秒

不懂這些併發分散式架構分散式系統的資料一致性解決方案,你如何能找到高新網際網路工作呢?強勢解析eBay BASE模式、去哪兒及蘑菇街分散式架構

網際網路行業是大勢所趨,從招聘工資水平即可看出,那麼如何提升自我技能,滿足網際網路行業技能要求?需要以目標為導向,進行技能提升,本文主要針對高併發分散式系統設計、架構(資料一致性)做了分析,祝各位早日走上屬於自己的"成金之路"。 目錄:問題分析概念解讀Most Simple原理解讀eBey、去哪兒、蘑菇街分

阿里P8架構師精講開源+高效能+併發+分散式+微服務+實戰等

1.架構鞏基   2.開源框架   3.高效能架構   4.微服務架構   5.團隊協作開發   6.B2C專案實戰   進群領取架構視訊資料下載以及高清思

京東併發搶購系統的核心邏輯與架構實現

1、服務介紹 限時搶購又稱閃購,英文Flash sale,起源於法國網站Vente Privée。閃購模式即是以網際網路為媒介的B2C電子零售交易活動,以限時特賣的形式,定期定時推出國際知名品牌的商品,一般以原價1-5折的價格供專屬會員限時搶購,每次特賣時間持續5-10

服務端併發分散式架構演進之路

1. 概述 本文以淘寶作為例子,介紹從一百個併發到千萬級併發情況下服務端的架構的演進過程,同時列舉出每個演進階段會遇到的相關技

性能系統架構分析

存在 tail lis cdn加速 速度 blog 好的 可能 功能 什麽樣的系統架構算是高性能的呢?我的理解是它是以用戶為中心,提供快速的網頁訪問體驗。主要參數有較短的響應時間,較大的並發處理能力,較高的吞吐量,穩定的性能參數。 具體優化的方向可分為前端優化,應用層優化,

適用於深度學習的性能系統架構綜述

局限性 orm 網路 notice nis csdn 計算機視覺 tor model 課程作業,正好自己也在學深度學習,正好有所幫助,做了深度學習的AI芯片調研,時間比較短,寫的比較倉促,大家隨便看看 近年來,深度學習技術,如卷積神經網絡(CNN)、遞歸神經網絡(RNN

分散式系統架構關於Invalid bound statement (not found)的錯誤處理

分散式系統架構關於Invalid bound statement (not found)的錯誤處理,錯誤資訊如下: 該錯誤是一個典型的沒有找到*mapper.xml檔案的錯誤,由於在分散式架構中預設不會將**.xml檔案拷入到專案中 解決方法:修改**-mapper的pom檔案,在pom檔案

iBase4J是Java的分散式系統架構 使用Springboot整合開源框架

iBase4J專案簡介 iBase4J是Java語言的分散式系統架構。 使用Spring整合開源框架。 使用Maven對專案進行模組化管理,提高專案的易開發性、擴充套件性。 系統包括4個子系統:系統管理Service、系統管理Web、業務Service、業務Web。 系統

分散式系統架構——SSM整合Dubbo

SpringMVC+Spring+MyBatis Dubbo 專案地址:https://github.com/ryiann/ssm-dubbo 1、本文主要側重於專案中Dubbo部分,SSM框架如何搭建的這裡就不再贅述,關於SSM搭建部分

併發服務 系統引數調優相關

(*)系統引數 1、訊息佇列大小 和 可開啟檔案數 設定 /etc/sysctl.conf中增加以下配置 kernel.msgmni=1000 kernel.msgmax=81920 kernel.msgmnb=1638400   #fs.mqueue.msg_max=1000 #f

美團即時物流的分散式系統架構設計

本文根據美團資深技術專家宋斌在ArchSummit架構師峰會上的演講整理而成。 背景 美團外賣已經發展了五年,即時物流探索也經歷了3年多的時間,業務從零孵化到初具規模,在整個過程中積累了一些分散式高併發系統的建設經驗。最主要的收穫包括兩點: 即時物流業務對故障和高延遲的容忍度極低,在業

[轉]分散式系統架構知識體系

註明:原文由【薛定諤貓】發表於其個人微信公眾號【架構師是怎樣煉成的】中。   雙十一終於過去了,趁雙十二的需求還沒下來前,晚上稍微有點時間搞點自己的事情了,距離上篇微信公眾號文章已經過去快三個月了,今天決定寫一篇關於分散式知識體系的文章,分散式架構整個知識體系紛繁複雜,不加以總結很難形成知