新聞中心
分布式--nginx 負載均衡服務(wù)器
作者:凌浩雨 2019-03-27 08:43:17
服務(wù)器
分布式 ginx是一款輕量級的 Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,其特點是占有內(nèi)存少,并發(fā)能力強。

成都創(chuàng)新互聯(lián)公司歡迎來電:13518219792,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù),成都創(chuàng)新互聯(lián)公司網(wǎng)頁制作領(lǐng)域十多年,包括自上料攪拌車等多個方面擁有豐富的網(wǎng)站制作經(jīng)驗,選擇成都創(chuàng)新互聯(lián)公司,為網(wǎng)站錦上添花。
本文轉(zhuǎn)載自微信公眾號凌浩雨。作者已授權(quán)。轉(zhuǎn)載本文請聯(lián)系凌浩雨公眾號。
1. Nginx
1). 學習資源
Nginx 中文文檔
Nginx 配置
2). Nginx
Nginx是一款輕量級的 Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,其特點是占有內(nèi)存少,并發(fā)能力強。Nginx 是俄羅斯人編寫的十分輕量級的 HTTP 服務(wù)器,Nginx,它的發(fā)音為“engine X”,是一個高性能的HTTP和反向代理服務(wù)器,同時也是一個 IMAP/POP3/SMTP 代理服務(wù)器。Nginx 是由俄羅斯人 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發(fā)的,它已經(jīng)在該站點運行超過兩年半了。Igor Sysoev 在建立的項目時,使用基于 BSD 許可。
3). Nginx 特點
Nginx 做為 HTTP 服務(wù)器,有以下幾項基本特性:
- 處理靜態(tài)文件,索引文件以及自動索引;打開文件描述符緩沖.
- 無緩存的反向代理加速,簡單的負載均衡和容錯.
- FastCGI,簡單的負載均衡和容錯.
- 模塊化的結(jié)構(gòu)。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCGI 或其它代理服務(wù)器處理單頁中存在的多個 SSI,則這項處理可以并行運行,而不需要相互等待。
- 支持 SSL 和 TLSSNI.
Nginx 專為性能優(yōu)化而開發(fā),性能是其最重要的考量,實現(xiàn)上非常注重效率 。它支持內(nèi)核 Poll 模型,能經(jīng)受高負載的考驗,有報告表明能支持高達 50,000 個并發(fā)連接數(shù)。
Nginx 具有很高的穩(wěn)定性。其它 HTTP 服務(wù)器,當遇到訪問的峰值,或者有人惡意發(fā)起慢速連接時,也很可能會導致服務(wù)器物理內(nèi)存耗盡頻繁交換,失去響應(yīng),只能重啟服務(wù)器。例如當前 apache 一旦上到 200 個以上進程,web響應(yīng)速度就明顯非常緩慢了。而 Nginx 采取了分階段資源分配技術(shù),使得它的 CPU 與內(nèi)存占用率非常低。Nginx 官方表示保持 10,000 個沒有活動的連接,它只占 2.5M 內(nèi)存,所以類似 DOS 這樣的對 Nginx 來說基本上是毫無用處的。就穩(wěn)定性而言,Nginx 比 lighthttpd 更勝一籌。
Nginx 支持熱部署。它的啟動特別容易, 并且?guī)缀蹩梢宰龅?7*24 不間斷運行,即使運行數(shù)個月也不需要重新啟動。你還能夠在不間斷服務(wù)的情況下,對軟件版本進行進行升級。
Nginx 采用 master-slave 模型,能夠充分利用 SMP 的優(yōu)勢,且能夠減少工作進程在磁盤 I/O 的阻塞延遲。當采用 select()/poll() 調(diào)用時,還可以限制每個進程的連接數(shù)。
Nginx 代碼質(zhì)量非常高,代碼很規(guī)范,手法成熟,模塊擴展也很容易。特別值得一提的是強大的 Upstream 與 Filter 鏈。Upstream 為諸如 reverse proxy,與其他服務(wù)器通信模塊的編寫奠定了很好的基礎(chǔ)。而 Filter 鏈最酷的部分就是各個 filter 不必等待前一個 filter 執(zhí)行完畢。它可以把前一個 filter 的輸出做為當前 filter 的輸入,這有點像 Unix 的管線。這意味著,一個模塊可以開始壓縮從后端服務(wù)器發(fā)送過來的請求,且可以在模塊接收完后端服務(wù)器的整個請求之前把壓縮流轉(zhuǎn)向客戶端。
Nginx 采用了一些 os 提供的新特性如對 sendfile (Linux2.2+),accept-filter (FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持,從而大大提高了性能。
4). 反向代理
代理就是一個代表、一個渠道,此時就設(shè)計到兩個角色,一個是被代理角色,一個是目標角色,被代理角色通過這個代理訪問目標角色完成一些任務(wù)的過程稱為代理操作過程。
I. 正向代理典型的特點是客戶端非常明確要訪問的服務(wù)器地址;服務(wù)器只清楚請求來自哪個代理服務(wù)器,而不清楚來自哪個具體的客戶端;正向代理模式屏蔽或者隱藏了真實客戶端信息。
II. 多個客戶端給服務(wù)器發(fā)送的請求,nginx服務(wù)器接收到之后,按照一定的規(guī)則分發(fā)給了后端的業(yè)務(wù)處理服務(wù)器進行處理了。此時~請求的來源也就是客戶端是明確的,但是請求具體由哪臺服務(wù)器處理的并不明確了,nginx扮演的就是一個反向代理角色。反向代理,主要用于服務(wù)器集群分布式部署的情況下,反向代理隱藏了服務(wù)器的信息!網(wǎng)站中大部分功能也是直接使用nginx進行反向代理實現(xiàn)的,通過封裝nginx和其他的組件之后起了個高大上的名字:Tengine
III. 通常情況下,我們在實際項目操作時,正向代理和反向代理很有可能會存在在一個應(yīng)用場景中,正向代理代理客戶端的請求去訪問目標服務(wù)器,目標服務(wù)器是一個反向單利服務(wù)器,反向代理了多臺真實的業(yè)務(wù)處理服務(wù)器。具體的拓撲圖如下:
5). 負載均衡
客戶端發(fā)送的、nginx反向代理服務(wù)器接收到的請求數(shù)量(負載量),請求數(shù)量按照一定的規(guī)則進行分發(fā)到不同的服務(wù)器處理的規(guī)則(均衡規(guī)則),將服務(wù)器接收到的請求按照規(guī)則分發(fā)的過程,稱為負載均衡。
負載均衡在實際項目操作過程中,有硬件負載均衡和軟件負載均衡兩種,硬件負載均衡也稱為硬負載,如F5負載均衡,相對造價昂貴成本較高,但是數(shù)據(jù)的穩(wěn)定性安全性等等有非常好的保障,如中國移動中國聯(lián)通這樣的公司才會選擇硬負載進行操作;更多的公司考慮到成本原因,會選擇使用軟件負載均衡,軟件負載均衡是利用現(xiàn)有的技術(shù)結(jié)合主機硬件實現(xiàn)的一種消息隊列分發(fā)機制。
負載均衡調(diào)度算法方式如下:
- weight輪詢(默認):接收到的請求按照順序逐一分配到不同的后端服務(wù)器,即使在使用過程中,某一臺后端服務(wù)器宕機,nginx會自動將該服務(wù)器剔除出隊列,請求受理情況不會受到任何影響。 這種方式下,可以給不同的后端服務(wù)器設(shè)置一個權(quán)重值(weight),用于調(diào)整不同的服務(wù)器上請求的分配率;權(quán)重數(shù)據(jù)越大,被分配到請求的幾率越大;該權(quán)重值,主要是針對實際工作環(huán)境中不同的后端服務(wù)器硬件配置進行調(diào)整的。
- ip_hash:每個請求按照發(fā)起客戶端的ip的hash結(jié)果進行匹配,這樣的算法下一個固定ip地址的客戶端總會訪問到同一個后端服務(wù)器,這也在一定程度上解決了集群部署環(huán)境下session共享的問題。
- fair:智能調(diào)整調(diào)度算法,動態(tài)的根據(jù)后端服務(wù)器的請求處理到響應(yīng)的時間進行均衡分配,響應(yīng)時間短處理效率高的服務(wù)器分配到請求的概率高,響應(yīng)時間長處理效率低的服務(wù)器分配到的請求少;結(jié)合了前兩者的優(yōu)點的一種調(diào)度算法。但是需要注意的是nginx默認不支持fair算法,如果要使用這種調(diào)度算法,請安裝upstream_fair模塊
- url_hash:按照訪問的url的hash結(jié)果分配請求,每個請求的url會指向后端固定的某個服務(wù)器,可以在nginx作為靜態(tài)服務(wù)器的情況下提高緩存效率。同樣要注意nginx默認不支持這種調(diào)度算法,要使用的話需要安裝nginx的hash軟件包
6). Windows安裝
I. Nginx 下載 并解壓
II. 雙擊nginx.exe, 瀏覽器訪問http://localhost/即可
III. 命令行開啟
- nginx
IV. 命令行關(guān)閉
- # 強制停止nginx服務(wù)器,如果有未處理的數(shù)據(jù),丟棄
- nginx -s stop
- # 優(yōu)雅的停止nginx服務(wù)器,如果有未處理的數(shù)據(jù),等待處理完成之后停止
- nginx -s quit
7). nginx配置
nginx服務(wù)器的配置信息主要集中在nginx.conf這個配置文件中(\nginx-1.14.0\conf\nginx.conf)
- main # 全局配置
- events { # nginx工作模式配置
- }
- http { # http設(shè)置
- ....
- server { # 服務(wù)器主機配置
- ....
- location { # 路由配置
- ....
- }
- location path {
- ....
- }
- location otherpath {
- ....
- }
- }
- server {
- ....
- location {
- ....
- }
- }
- upstream name { # 負載均衡配置
- ....
- }
- }
- main:用于進行nginx全局信息的配置
- events:用于nginx工作模式的配置
- http:用于進行http協(xié)議信息的一些配置
- server:用于進行服務(wù)器訪問信息的配置
- location:用于進行訪問路由的配置
- upstream:用于進行負載均衡的配置
I. main模塊
- # user nobody nobody;
- worker_processes 2;
- # error_log logs/error.log
- # error_log logs/error.log notice
- # error_log logs/error.log info
- # pid logs/nginx.pid
- worker_rlimit_nofile 1024;
- user用來指定nginx worker進程運行用戶以及用戶組,默認nobody賬號運行
- worker_processes指定nginx要開啟的子進程數(shù)量,運行過程中監(jiān)控每個進程消耗內(nèi)存(一般幾M~幾十M不等)根據(jù)實際情況進行調(diào)整,通常數(shù)量是CPU內(nèi)核數(shù)量的整數(shù)倍
- error_log定義錯誤日志文件的位置及輸出級別【debug / info / notice / warn / error / crit】
- pid用來指定進程id的存儲文件的位置
- worker_rlimit_nofile用于指定一個進程可以打開最多文件數(shù)量的描述
II. event 模塊
- event {
- worker_connections 1024;
- multi_accept on;
- use epoll;
- }
worker_connections 指定可以同時接收的連接數(shù)量的上限,這里一定要注意,上限連接數(shù)量是和worker processes共同決定的。
multi_accept 配置指定nginx在收到一個新連接通知后盡可能多的接受更多的連接
use epoll 配置指定了線程輪詢的方法,如果是linux2.6+,使用epoll;如果是BSD如Mac請使用Kqueue
III. http模塊
作為web服務(wù)器,http模塊是nginx最核心的一個模塊,配置項也是比較多的,項目中會設(shè)置到很多的實際業(yè)務(wù)場景,需要根據(jù)硬件信息進行適當?shù)呐渲?,常?guī)情況下,使用默認配置即可!
- http {
- ##
- # 基礎(chǔ)配置
- ##
- sendfile on;
- tcp_nopush on;
- tcp_nodelay on;
- keepalive_timeout 65;
- types_hash_max_size 2048;
- # server_tokens off;
- # server_names_hash_bucket_size 64;
- # server_name_in_redirect off;
- include /etc/nginx/mime.types;
- default_type application/octet-stream;
- ##
- # SSL證書配置
- ##
- ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
- ssl_prefer_server_ciphers on;
- ##
- # 日志配置
- ##
- access_log /var/log/nginx/access.log;
- error_log /var/log/nginx/error.log;
- ##
- # Gzip 壓縮配置
- ##
- gzip on;
- gzip_disable "msie6";
- # gzip_vary on;
- # gzip_proxied any;
- # gzip_comp_level 6;
- # gzip_buffers 16 8k;
- # gzip_http_version 1.1;
- # gzip_types text/plain text/css application/json application/javascript
- text/xml application/xml application/xml+rss text/javascript;
- ##
- # 虛擬主機配置
- ##
- include /etc/nginx/conf.d/*.conf;
- include /etc/nginx/sites-enabled/*;
- }
=> 基礎(chǔ)配置
- sendfile on:配置on讓sendfile發(fā)揮作用,將文件的回寫過程交給數(shù)據(jù)緩沖去去完成,而不是放在應(yīng)用中完成,這樣的話在性能提升有有好處
- tc_nopush on:讓nginx在一個數(shù)據(jù)包中發(fā)送所有的頭文件,而不是一個一個單獨發(fā)
- tcp_nodelay on:讓nginx不要緩存數(shù)據(jù),而是一段一段發(fā)送,如果數(shù)據(jù)的傳輸有實時性的要求的話可以配置它,發(fā)送完一小段數(shù)據(jù)就立刻能得到返回值,但是不要濫用哦
- keepalive_timeout 10:給客戶端分配連接超時時間,服務(wù)器會在這個時間過后關(guān)閉連接。一般設(shè)置時間較短,可以讓nginx工作持續(xù)性更好
- client_header_timeout 10:設(shè)置請求頭的超時時間
- client_body_timeout 10:設(shè)置請求體的超時時間
- send_timeout 10:指定客戶端響應(yīng)超時時間,如果客戶端兩次操作間隔超過這個時間,服務(wù)器就會關(guān)閉這個鏈接
- limit_conn_zone $binary_remote_addr zone=addr:5m :設(shè)置用于保存各種key的共享內(nèi)存的參數(shù),
- limit_conn addr 100: 給定的key設(shè)置上限連接數(shù)
- server_tokens:雖然不會讓nginx執(zhí)行速度更快,但是可以在錯誤頁面關(guān)閉nginx版本提示,對于網(wǎng)站安全性的提升有好處哦
- include /etc/nginx/mime.types:指定在當前文件中包含另一個文件的指令
- default_type application/octet-stream:指定默認處理的文件類型可以是二進制
- type_hash_max_size 2048:混淆數(shù)據(jù),影響三列沖突率,值越大消耗內(nèi)存越多,散列key沖突率會降低,檢索速度更快;值越小key,占用內(nèi)存較少,沖突率越高,檢索速度變慢
=> 日志配置
- access_log logs/access.log:設(shè)置存儲訪問記錄的日志
- error_log logs/error.log:設(shè)置存儲記錄錯誤發(fā)生的日志
=> SSL證書加密
- ssl_protocols:指令用于啟動特定的加密協(xié)議,nginx在1.1.13和1.0.12版本后默認是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1與TLSv1.2要確保OpenSSL >= 1.0.1 ,SSLv3 現(xiàn)在還有很多地方在用但有不少漏洞。
- ssl prefer server ciphers:設(shè)置協(xié)商加密算法時,優(yōu)先使用我們服務(wù)端的加密套件,而不是客戶端瀏覽器的加密套件
=> 壓縮配置
- gzip 是告訴nginx采用gzip壓縮的形式發(fā)送數(shù)據(jù)。這將會減少我們發(fā)送的數(shù)據(jù)量。
- gzip_disable 為指定的客戶端禁用gzip功能。我們設(shè)置成IE6或者更低版本以使我們的方案能夠廣泛兼容。
- gzip_static 告訴nginx在壓縮資源之前,先查找是否有預先gzip處理過的資源。這要求你預先壓縮你的文件(在這個例子中被注釋掉了),從而允許你使用高壓縮比,這樣nginx就不用再壓縮這些文件了。
- gzip_proxied 允許或者禁止壓縮基于請求和響應(yīng)的響應(yīng)流。我們設(shè)置為any,意味著將會壓縮所有的請求。
- gzip_min_length 設(shè)置對數(shù)據(jù)啟用壓縮的最少字節(jié)數(shù)。如果一個請求小于1000字節(jié),建議不要壓縮它,因為壓縮這些小的數(shù)據(jù)會降低處理此請求的所有進程的速度。
- gzip_comp_level 設(shè)置數(shù)據(jù)的壓縮等級。這個等級可以是1-9之間的任意數(shù)值,9慢但是壓縮比大。我們設(shè)置為4,這是一個比較折中的設(shè)置。
- gzip_type 設(shè)置需要壓縮的數(shù)據(jù)格式。
=> 文件緩存配置
- open_file_cache 打開緩存的同時也指定了緩存上限數(shù)目,以及緩存的時間。我們可以設(shè)置一個相對高的上限時間,這樣我們可以在它們不活動超過20秒后清除掉。
- open_file_cache_valid 在open_file_cache中指定檢測正確信息的間隔時間。
- open_file_cache_min_uses 定義了open_file_cache中指令參數(shù)不活動時間期間里最小的文件數(shù)。
- open_file_cache_errors 指定了當搜索一個文件時是否緩存錯誤信息,也包括再次給配置中添加文件。我們也包括了服務(wù)器模塊,這些是在不同文件中定義的。如果你的服務(wù)器模塊不在這些位置,你就得修改這一行來指定正確的位置。
IV. server模塊
srever模塊配置是http模塊中的一個子模塊,用來定義一個虛擬訪問主機,也就是一個虛擬服務(wù)器的配置信息
- server {
- listen 80;
- server_name localhost 192.168.1.100;
- root /nginx/www;
- index index.php index.html index.html;
- charset utf-8;
- access_log logs/access.log;
- error_log logs/error.log;
- ......
- }
- server:一個虛擬主機的配置,一個http中可以配置多個server
- server_name:用力啊指定ip地址或者域名,多個配置之間用空格分隔
- root:表示整個server虛擬主機內(nèi)的根目錄,所有當前主機中web項目的根目錄
- index:用戶訪問web網(wǎng)站時的全局首頁
- charset:用于設(shè)置www/路徑中配置的網(wǎng)頁的默認編碼格式
- access_log:用于指定該虛擬主機服務(wù)器中的訪問記錄日志存放路徑
- error_log:用于指定該虛擬主機服務(wù)器中訪問錯誤日志的存放路徑
V. location模塊
location模塊是nginx配置中出現(xiàn)最多的一個配置,主要用于配置路由訪問信息。在路由訪問信息配置中關(guān)聯(lián)到反向代理、負載均衡等等各項功能,所以location模塊也是一個非常重要的配置模塊
=> 基本配置
- location / {
- root /nginx/www;
- index index.php index.html index.htm;
- }
- location /:表示匹配訪問根目錄
- root:用于指定訪問根目錄時,訪問虛擬主機的web目錄
- index:在不指定訪問具體資源時,默認展示的資源文件列表
=> 反向代理配置方式
通過反向代理代理服務(wù)器訪問模式,通過proxy_set配置讓客戶端訪問透明化
- location / {
- proxy_pass http://localhost:8888;
- proxy_set_header X-real-ip $remote_addr;
- proxy_set_header Host $http_host;
- }
=> uwsgi配置
wsgi模式下的服務(wù)器配置訪問方式
- location / {
- include uwsgi_params;
- uwsgi_pass localhost:8888
- }
VI. upstream模塊
upstream模塊主要負責負載均衡的配置,通過默認的輪詢調(diào)度方式來分發(fā)請求到后端服務(wù)器。簡單的配置方式如下:
- upstream name {
- ip_hash;
- server 192.168.1.100:8000;
- server 192.168.1.100:8001 down;
- server 192.168.1.100:8002 max_fails=3;
- server 192.168.1.100:8003 fail_timeout=20s;
- server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
- }
- ip_hash:指定請求調(diào)度算法,默認是weight權(quán)重輪詢調(diào)度,可以指定
- server host:port:分發(fā)服務(wù)器的列表配置
- down:表示該主機暫停服務(wù)
- max_fails:表示失敗上限次數(shù),超過失敗上限次數(shù)暫停服務(wù)
- fail_timeout:表示如果請求受理失敗,暫停指定的時間之后重新發(fā)起請求
文章名稱:分布式--Nginx 負載均衡服務(wù)器
文章轉(zhuǎn)載:http://fisionsoft.com.cn/article/dhgesde.html


咨詢
建站咨詢
