Nginx基礎,反向代理,負載均衡配置,僅此一篇文章就夠了

Nginx 簡介

是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點開發的,第一個公開版本0.1.0發佈於2004年10月4日。

其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4發佈。

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

Nginx基礎,反向代理,負載均衡配置,僅此一篇文章就夠了

NGINX優點及應用

Nginx作為負載均衡服務器:Nginx 既可以在內部直接支持 Rails 和 PHP 程序對外進行服務,也可以支持作為 HTTP代理服務器對外進行服務。Nginx採用C進行編寫,不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多。

處理靜態文件,索引文件以及自動索引;打開文件描述符緩衝。

無緩存的反向代理加速,簡單的負載均衡和容錯。

FastCGI,簡單的負載均衡和容錯。

模塊化的結構。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCG或其它代理服務器處理單頁中存在的多個 SSI,則這項處理可以並行運行,而不需要相互等待。

支持 SSL 和 TLSSNI。

__HTTP基礎功能:__

  • 處理靜態文件,索引文件以及自動索引;

  • 反向代理加速(無緩存),簡單的負載均衡和容錯;

  • FastCGI,簡單的負載均衡和容錯;

  • 模塊化的結構。過濾器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI過濾器中,到同一個 proxy 或者 FastCGI 的多個子請求併發處理;

  • SSL 和 TLS SNI 支持;

__IMAP/POP3 代理服務功能:__

  • 使用外部 HTTP 認證服務器重定向用戶到 IMAP/POP3 後端;

  • 使用外部 HTTP 認證服務器認證用戶後連接重定向到內部的 SMTP 後端;

  • 認證方法:

  • POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;

  • IMAP: IMAP LOGIN;

  • SMTP: AUTH LOGIN PLAIN CRAM-MD5;

  • SSL 支持;

  • 在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;

__支持的操作系統:__

  • FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;

  • Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;

  • Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;

  • MacOS X (10.4) PPC;

__結構與擴展:__

  • 一個主進程和多個工作進程。工作進程是單線程的,且不需要特殊授權即可運行;

  • kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select, 以及 poll 支持;

  • kqueue支持的不同功能包括 EV_CLEAR, EV_DISABLE (臨時禁止事件), NOTE_LOWAT, EV_EOF, 有效數據的數目,錯誤代碼;

  • sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支持;

  • 輸入過濾 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;

  • 10,000 非活動的 HTTP keep-alive 連接僅需要 2.5M 內存。

  • 最小化的數據拷貝操作;

__其他HTTP功能:__

  • 基於IP 和名稱的虛擬主機服務;

nginx命令行參數

  • Memcached 的 GET 接口;

  • 支持 keep-alive 和管道連接;

  • 靈活簡單的配置;

  • 重新配置和在線升級而無須中斷客戶的工作進程;

  • 可定製的訪問日誌,日誌寫入緩存,以及快捷的日誌回捲;

  • 4xx-5xx 錯誤代碼重定向;

  • 基於 PCRE 的 rewrite 重寫模塊;

  • 基於客戶端 IP 地址和 HTTP 基本認證的訪問控制;

  • PUT, DELETE, 和 MKCOL 方法;

  • 支持 FLV (Flash 視頻);

  • 帶寬限制;

不像許多其他軟件系統,Nginx 僅有幾個命令行參數,完全通過配置文件來配置

-c 為 Nginx 指定一個配置文件,來代替缺省的。

-t 不運行,而僅僅測試配置文件。nginx 將檢查配置文件的語法的正確性,並嘗試打開配置文件中所引用到的文件。

-v 顯示 nginx 的版本。

-V 顯示 nginx 的版本,編譯器版本和配置參數。

nginx控制信號

可以使用信號系統來控制主進程。默認,nginx 將其主進程的 pid 寫入到 /usr/local/nginx/nginx.pid 文件中。通過傳遞參數給 ./configure 或使用

pid 指令,來改變該文件的位置。

主進程可以處理以下的信號:

TERM, INT快速關閉
QUIT從容關閉
HUP重載配置

用新的配置開始新的工作進程

從容關閉舊的工作進程

USR1重新打開日誌文件
USR2平滑升級可執行程序。
WINCH
從容關閉工作進程

儘管你不必自己操作工作進程,但是,它們也支持一些信號:

TERM, INT快速關閉
QUIT從容關閉
USR1重新打開日誌文件

nginx 啟動、停止、重啟命令

nginx啟動

sudo /usr/local/nginx/nginx (nginx二進制文件絕對路徑,可以根據自己安裝路徑實際決定)

nginx從容停止命令,等所有請求結束後關閉服務

ps -ef |grep nginx

kill -QUIT nginx主進程號

nginx 快速停止命令,立刻關閉nginx進程

ps -ef |grep nginx

kill -TERM nginx主進程號

如果以上命令不管用,可以強制停止

kill -9 nginx主進程號

如果嫌麻煩可以不用查看進程號,直接使用命令進行操作

其中/usr/local/nginx/nginx.pid 為nginx.conf中pid命令設置的參數,用來存放nginx主進程號的文件

kill -信號類型(HUP|TERM|QUIT) cat /usr/local/nginx/nginx.pid

例如

1

kill-QUIT`cat/usr/local/nginx/nginx.pid`

nginx重啟命令

nginx重啟可以分成幾種類型

1.簡單型,先關閉進程,修改你的配置後,重啟進程。

kill -QUIT cat /usr/local/nginx/nginx.pid

sudo /usr/local/nginx/nginx

2.重新加載配置文件,不重啟進程,不會停止處理請求

3.平滑更新nginx二進制,不會停止處理請求

使用信號加載新的配置

Nginx 支持幾個信號,能在它運行時控制其操作。其中最普通的是 15 ,用來中止運行的進程:

1

2

3

4

# ps aux | egrep '(PID|nginx)'

USER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMAND

root22130.00.067842036?Ss03:010:00nginx:master process/usr/sbin/nginx-c/etc/nginx/nginx.conf

# kill -15 2213

而最有趣的是能平滑改變 nginx 配置的選項(請注意,在重載前,要先測試一下配置文件):

1

2

3

4

5

6

7

# nginx -t -c /etc/nginx/nginx.conf

2006/09/1613:07:10[info]15686#0: the configuration file /etc/nginx/nginx.conf syntax is ok

2006/09/1613:07:10[info]15686#0: the configuration file /etc/nginx/nginx.conf was tested successfully

# ps aux | egrep '(PID|nginx)'

USER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMAND

root22130.00.067842036?Ss03:010:00nginx:master process/usr/sbin/nginx-c/etc/nginx/nginx.conf

# kill -HUP 2213

當 nginx 接收到 HUP 信號,它會嘗試先解析配置文件(如果指定配置文件,就使用指定的,否則使用默認的),成功的話,就應用新的配置文件(例如:重新打開日誌文件或監聽的套接 字)。之後,nginx 運行新的工作進程並從容關閉舊的工作進程。通知工作進程關閉監聽套接字但是繼續為當前連接的客戶提供服務。所有客戶端的服務完成後,舊的工作進程被關閉。 如果新的配置文件應用失敗,nginx 將繼續使用舊的配置進行工作。

平滑升級到新的二進制代碼

你可以在不中斷服務的情況下 - 新的請求也不會丟失,使用新的 nginx 可執行程序替換舊的(當升級新版本或添加/刪除服務器模塊時)。

首先,使用新的可執行程序替換舊的(最好做好備份),然後,發送 USR2 (kill -USR2 pid)信號給主進程。主進程將重命名它的

.pid 文件為 .oldbin (比如:/usr/local/nginx/logs/nginx.pid.oldbin),然後執行新的可執行程序,依次啟動新的主進程和新的工作進程:

1

2

3

4

5

6

7

8

9

PID PPID USER%CPU VSZ WCHAN COMMAND

331261root0.01164pause nginx:master process/usr/local/nginx/sbin/nginx

3313433126nobody0.01368kqread nginx:worker process(nginx)

3313533126nobody0.01380kqread nginx:worker process(nginx)

3313633126nobody0.01368kqread nginx:worker process(nginx)

3626433126root0.01148pause nginx:master process/usr/local/nginx/sbin/nginx

3626536264nobody0.01364kqread nginx:worker process(nginx)

3626636264nobody0.01364kqread nginx:worker process(nginx)

3626736264nobody0.01364kqread nginx:worker process(nginx)

在這時,兩個 nginx 實例會同時運行,一起處理輸入的請求。要逐步停止舊的實例,你必須發送 WINCH 信號給舊的主進程,然後,它的工作進程就將開始從容關閉:

1

2

3

4

5

6

7

PID PPID USER%CPU VSZ WCHAN COMMAND

331261root0.01164pause nginx:master process/usr/local/nginx/sbin/nginx

3313533126nobody0.01380kqread nginx:worker process isshutting down(nginx)

3626433126root0.01148pause nginx:master process/usr/local/nginx/sbin/nginx

3626536264nobody0.01364kqread nginx:worker process(nginx)

3626636264nobody0.01364kqread nginx:worker process(nginx)

3626736264nobody0.01364kqread nginx:worker process(nginx)

一段時間後,舊的工作進程處理了所有已連接的請求後退出,就僅由新的工作進程來處理輸入的請求了:

1

2

3

4

5

6

PID PPID USER%CPU VSZ WCHAN COMMAND

331261root0.01164pause nginx:master process/usr/local/nginx/sbin/nginx

3626433126root0.01148pause nginx:master process/usr/local/nginx/sbin/nginx

3626536264nobody0.01364kqread nginx:worker process(nginx)

3626636264nobody0.01364kqread nginx:worker process(nginx)

3626736264nobody0.01364kqread nginx:worker process(nginx)

這時,因為舊的服務器還尚未關閉它監聽的套接字,所以,通過下面的幾步,你仍可以恢復舊的服務器:

發送 HUP 信號給舊的主進程 - 它將在不重載配置文件的情況下啟動它的工作進程

發送 QUIT 信號給新的主進程,要求其從容關閉其工作進程

發送 TERM 信號給新的主進程,迫使其退出

如果因為某些原因新的工作進程不能退出,向其發送 KILL 信號

新的主進程退出後,舊的主進程會由移除 .oldbin 前綴,恢復為它的 .pid 文件,這樣,一切就都恢復到升級之前了。

如果嘗試升級成功,而你也希望保留新的服務器時,發送 QUIT 信號給舊的主進程使其退出而只留下新的服務器運行:


配置nginx

啟動nginx

1) 直接雙擊該目錄下的nginx.exe,即可啟動nginx服務器

2) 命令行計入該文件夾,執行nginx命令,也會直接啟動nginx服務器

D:/resp_application/nginx-1.13.5> nginx

訪問nginx

打開瀏覽器,輸入地址:http://localhost,訪問頁面,出現如下頁面表示訪問成功

Nginx基礎,反向代理,負載均衡配置,僅此一篇文章就夠了

按照正常軟件的安裝方式,直接通過如下命令進行安裝:

$ sudo apt-get install nginx

Nginx基礎,反向代理,負載均衡配置,僅此一篇文章就夠了

安裝完成即可,在/usr/sbin/目錄下是nginx命令所在目錄,在/etc/nginx/目錄下是nginx所有的配置文件,用於配置nginx服務器以及負載均衡等信息

啟動nginx服務器命令

直接執行nginx會按照默認的配置文件進行服務器的啟動

$ nginx

Nginx基礎,反向代理,負載均衡配置,僅此一篇文章就夠了

停止nginx服務命令

和windows系統執行過程一樣,兩種停止方式

$ nginx -s stopor$ nginx -s quit

Nginx基礎,反向代理,負載均衡配置,僅此一篇文章就夠了

NGINX配置

1) 基礎配置

sendfile on:配置on讓sendfile發揮作用,將文件的回寫過程交給數據緩衝去去完成,而不是放在應用中完成,這樣的話在性能提升有有好處tc_nopush on:讓nginx在一個數據包中發送所有的頭文件,而不是一個一個單獨發tcp_nodelay on:讓nginx不要緩存數據,而是一段一段發送,如果數據的傳輸有實時性的要求的話可以配置它,發送完一小段數據就立刻能得到返回值,但是不要濫用哦keepalive_timeout 10:給客戶端分配連接超時時間,服務器會在這個時間過後關閉連接。一般設置時間較短,可以讓nginx工作持續性更好client_header_timeout 10:設置請求頭的超時時間client_body_timeout 10:設置請求體的超時時間send_timeout 10:指定客戶端響應超時時間,如果客戶端兩次操作間隔超過這個時間,服務器就會關閉這個鏈接limit_conn_zone $binary_remote_addr zone=addr:5m :設置用於保存各種key的共享內存的參數,limit_conn addr 100: 給定的key設置最大連接數server_tokens:雖然不會讓nginx執行速度更快,但是可以在錯誤頁面關閉nginx版本提示,對於網站安全性的提升有好處哦include /etc/nginx/mime.types:指定在當前文件中包含另一個文件的指令default_type application/octet-stream:指定默認處理的文件類型可以是二進制type_hash_max_size 2048:混淆數據,影響三列衝突率,值越大消耗內存越多,散列key衝突率會降低,檢索速度更快;值越小key,佔用內存較少,衝突率越高,檢索速度變慢

2) 日誌配置

access_log logs/access.log:設置存儲訪問記錄的日誌error_log logs/error.log:設置存儲記錄錯誤發生的日誌

3) SSL證書加密

ssl_protocols:指令用於啟動特定的加密協議,nginx在1.1.13和1.0.12版本後默認是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1與TLSv1.2要確保OpenSSL >= 1.0.1 ,SSLv3 現在還有很多地方在用但有不少被攻擊的漏洞。ssl prefer server ciphers:設置協商加密算法時,優先使用我們服務端的加密套件,而不是客戶端瀏覽器的加密套件

4) 壓縮配置

gzip 是告訴nginx採用gzip壓縮的形式發送數據。這將會減少我們發送的數據量。gzip_disable 為指定的客戶端禁用gzip功能。我們設置成IE6或者更低版本以使我們的方案能夠廣泛兼容。gzip_static 告訴nginx在壓縮資源之前,先查找是否有預先gzip處理過的資源。這要求你預先壓縮你的文件(在這個例子中被註釋掉了),從而允許你使用最高壓縮比,這樣nginx就不用再壓縮這些文件了(想要更詳盡的gzip_static的信息,請點擊這裡)。gzip_proxied 允許或者禁止壓縮基於請求和響應的響應流。我們設置為any,意味著將會壓縮所有的請求。gzip_min_length 設置對數據啟用壓縮的最少字節數。如果一個請求小於1000字節,我們最好不要壓縮它,因為壓縮這些小的數據會降低處理此請求的所有進程的速度。gzip_comp_level 設置數據的壓縮等級。這個等級可以是1-9之間的任意數值,9是最慢但是壓縮比最大的。我們設置為4,這是一個比較折中的設置。gzip_type 設置需要壓縮的數據格式。上面例子中已經有一些了,你也可以再添加更多的格式。 

5) 文件緩存配置

open_file_cache 打開緩存的同時也指定了緩存最大數目,以及緩存的時間。我們可以設置一個相對高的最大時間,這樣我們可以在它們不活動超過20秒後清除掉。open_file_cache_valid 在open_file_cache中指定檢測正確信息的間隔時間。open_file_cache_min_uses 定義了open_file_cache中指令參數不活動時間期間裡最小的文件數。open_file_cache_errors 指定了當搜索一個文件時是否緩存錯誤信息,也包括再次給配置中添加文件。我們也包括了服務器模塊,這些是在不同文件中定義的。如果你的服務器模塊不在這些位置,你就得修改這一行來指定正確的位置。

server模塊

srever模塊配置是http模塊中的一個子模塊,用來定義一個虛擬訪問主機,也就是一個虛擬服務器的配置信息

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虛擬主機內的根目錄,所有當前主機中web項目的根目錄

  • index:用戶訪問web網站時的全局首頁

  • charset:用於設置www/路徑中配置的網頁的默認編碼格式

  • access_log:用於指定該虛擬主機服務器中的訪問記錄日誌存放路徑

  • error_log:用於指定該虛擬主機服務器中訪問錯誤日誌的存放路徑

location模塊

location模塊是nginx配置中出現最多的一個配置,主要用於配置路由訪問信息

在路由訪問信息配置中關聯到反向代理、負載均衡等等各項功能,所以location模塊也是一個非常重要的配置模塊

基本配置

location / { root /nginx/www; index index.php index.html index.htm;} 

location /:表示匹配訪問根目錄

root:用於指定訪問根目錄時,訪問虛擬主機的web目錄

index:在不指定訪問具體資源時,默認展示的資源文件列表

反向代理配置方式

通過反向代理代理服務器訪問模式,通過proxy_set配置讓客戶端訪問透明化

location / { proxy_pass http://localhost:8888; proxy_set_header X-real-ip $remote_addr; proxy_set_header Host $http_host;}

uwsgi配置

wsgi模式下的服務器配置訪問方式

location / { include uwsgi_params; uwsgi_pass localhost:8888}

upstream模塊

upstream模塊主要負責負載均衡的配置,通過默認的輪詢調度方式來分發請求到後端服務器

簡單的配置方式如下

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:指定請求調度算法,默認是weight權重輪詢調度,可以指定

  • server host:port:分發服務器的列表配置

  • -- down:表示該主機暫停服務

  • -- max_fails:表示失敗最大次數,超過失敗最大次數暫停服務

  • -- fail_timeout:表示如果請求受理失敗,暫停指定的時間之後重新發起請求


分享到:


相關文章: