Nginx是lgor Sysoev爲俄羅斯訪問量第二的rambler.ru站點設計開發的。從2004年發佈至今,憑藉開源的力量,已經接近成熟與完善。Nginx功能豐富,可做爲HTTP服務器,也可做爲反向代理服務器,郵件服務器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。而且支持不少第三方的模塊擴展。css
nginx能夠做爲反向代理、負載均衡和web緩存使用,本節主要講解nginx的負載均衡功能,按照不一樣的負載策略能夠分發到不一樣的後端服務器。負載均衡的結構圖以下圖所示:html
配置影響nginx全局的指令。通常有運行nginx服務器的用戶組,nginx進程pid存放路徑,日誌存放路徑,配置文件引入,容許生成worker process數等。前端
user 語法: user user [group] 缺省值: nobody nobody 指定Nginx Worker進程運行用戶,默認是nobody賬號。 error_log 語法: error_log file [ debug | info | notice | warn | error | crit ] 缺省值: ${prefix}/logs/error.log 指定錯誤日誌的存放位置和級別。 include 語法: include file | * 缺省值: none include 指令還支持像下面配置同樣的全局包含的方法,例如包含一個目錄下全部以".conf"結尾的文件: include vhosts/*.conf; pid 語法: pid file 進程id存儲文件。可使用 kill -HUP cat /var/log/nginx.pid/ 對Nginx進行配置文件從新加載。 worker_processes 語法: worker_processes number 缺省值: 1,指定工做進程數。nginx可使用多個worker進程(建議與本機CPU核心數一致)。
實例java
user root root; worker_processes 24; #error_log logs/error.log; #error_log logs/error.log notice; error_log logs/error.log info; pid logs/nginx.pid;
配置影響nginx服務器或與用戶的網絡鏈接。有每一個進程的最大鏈接數,選取哪一種事件驅動模型處理鏈接請求,是否容許同時接受多個網路鏈接,開啓多個網絡鏈接序列化等。node
events { use epoll; 使用epoll的I/O 模型。linux建議epoll,FreeBSD建議採用kqueue,window下不指定。 補充說明:與apache相類,nginx針對不一樣的操做系統,有不一樣的事件模型 A)標準事件模型 Select、poll屬於標準事件模型,若是當前系統不存在更有效的方法,nginx會選擇select或poll B)高效事件模型 Kqueue:使用於FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用雙處理器的MacOS X系統使用kqueue可能會形成內核崩潰。 Epoll:使用於Linux內核2.6版本及之後的系統。 /dev/poll:使用於Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。 Eventport:使用於Solaris 10。 爲了防止出現內核崩潰的問題, 有必要安裝安全補丁。 worker_connections 204800; 每一個工做進程的最大鏈接數量。根據硬件調整,和前面工做進程配合起來用,儘可能大,可是別把cpu跑到100%就行。每一個進程容許的最多鏈接數,理論上每臺nginx服務器的最大鏈接數爲。worker_processes*worker_connections keepalive_timeout 60; keepalive超時時間。 client_header_buffer_size 4k; 客戶端請求頭部的緩衝區大小。這個能夠根據你的系統分頁大小來設置,通常一個請求頭的大小不會超過1k,不過因爲通常系統分頁都要大於1k,因此這裏設置爲分頁大小。 分頁大小能夠用命令getconf PAGESIZE 取得。 open_file_cache max=65535 inactive=60s; #這個是指多長時間檢查一次緩存的有效信息。 #語法:open_file_cache_valid time 默認值:open_file_cache_valid 60 使用字段:http, server, location 這個指令指定了什麼時候須要檢查open_file_cache中緩存項目的有效信息. open_file_cache_valid 80s; #open_file_cache指令中的inactive參數時間內文件的最少使用次數,若是超過這個數字,文件描述符一直是在緩存中打開的,如上例,若是有一個文件在inactive時間內一次沒被使用,它將被移除。 open_file_cache_min_uses 1; #語法:open_file_cache_min_uses number 默認值:open_file_cache_min_uses 1 使用字段:http, server, location 這個指令指定了在open_file_cache指令無效的參數中必定的時間範圍內可使用的最小文件數,若是使用更大的值,文件描述符在cache中老是打開狀態. open_file_cache_errors on; #語法:open_file_cache_errors on | off 默認值:open_file_cache_errors off 使用字段:http, server, location 這個指令指定是否在搜索一個文件是記錄cache錯誤. }
實例linux
events { worker_connections 65535; }
能夠嵌套多個server,配置代理,緩存,日誌定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日誌自定義,是否使用sendfile傳輸文件,鏈接超時時間,單鏈接請求數等。nginx
http { include mime.types; 設定mime類型,類型由mime.type文件定義 default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location'; 日誌格式設置。 $remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址; $remote_user:用來記錄客戶端用戶名稱; $time_local: 用來記錄訪問時間與時區; $request: 用來記錄請求的url與http協議; $status: 用來記錄請求狀態;成功是200, $body_bytes_sent :記錄發送給客戶端文件主體內容大小; $http_referer:用來記錄從那個頁面連接訪問過來的; $http_user_agent:記錄客戶瀏覽器的相關信息; 一般web服務器放在反向代理的後面,這樣就不能獲取到客戶的IP地址了,經過$remote_add拿到的IP地址是反向代理服務器的iP地址。反向代理服務器在轉發請求的http頭信息中,能夠增長x_forwarded_for信息,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址。 access_log logs/host.access.log main; access_log logs/host.access.404.log log404; 用了log_format指令設置了日誌格式以後,須要用access_log指令指定日誌文件的存放路徑; server_names_hash_bucket_size 128; #保存服務器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。參數hash bucket size老是等於hash表的大小,而且是一路處理器緩存大小的倍數。在減小了在內存中的存取次數後,使在處理器中加速查找hash表鍵值成爲可能。若是hash bucket size等於一路處理器緩存的大小,那麼在查找鍵的時候,最壞的狀況下在內存中查找的次數爲2。第一次是肯定存儲單元的地址,第二次是在存儲單元中查找鍵 值。所以,若是Nginx給出須要增大hash max size 或 hash bucket size的提示,那麼首要的是增大前一個參數的大小. client_header_buffer_size 4k; 客戶端請求頭部的緩衝區大小。這個能夠根據你的系統分頁大小來設置,通常一個請求的頭部大小不會超過1k,不過因爲通常系統分頁都要大於1k,因此這裏設置爲分頁大小。分頁大小能夠用命令getconf PAGESIZE取得。 large_client_header_buffers 8 128k; 客戶請求頭緩衝大小。nginx默認會用client_header_buffer_size這個buffer來讀取header值,若是header過大,它會使用large_client_header_buffers來讀取。 open_file_cache max=102400 inactive=20s; 這個指令指定緩存是否啓用。 例: open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; 語法:open_file_cache_valid time 默認值:open_file_cache_valid 60 使用字段:http, server, location 這個指令指定了什麼時候須要檢查open_file_cache中緩存項目的有效信息. open_file_cache_min_uses 2; 語法:open_file_cache_min_uses number 默認值:open_file_cache_min_uses 1 使用字段:http, server, location 這個指令指定了在open_file_cache指令無效的參數中必定的時間範圍內可使用的最小文件數,若是使用更大的值,文件描述符在cache中老是打開狀態. open_file_cache_errors on; 語法:open_file_cache_errors on | off 默認值:open_file_cache_errors off 使用字段:http, server, location 這個指令指定是否在搜索一個文件是記錄cache錯誤. client_max_body_size 300m; 設定經過nginx上傳文件的大小 sendfile on; sendfile指令指定 nginx 是否調用sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,必須設爲on。若是用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡IO處理速度,下降系統uptime。 tcp_nodelay on; tcp_nopush on; 此選項容許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用 keys_zone=cache_one:200m inactive=1d max_size=30g; #設置內存緩存空間大小爲200MB,1天沒有被訪問的內容自動清除,硬盤緩存空間大小爲30GB。 keepalive_timeout 120; keepalive超時時間。 client_body_buffer_size 512k; 若是把它設置爲比較大的數值,例如256k,那麼,不管使用firefox仍是IE瀏覽器,來提交任意小於256k的圖片,都很正常。若是註釋該指令,使用默認的client_body_buffer_size設置,也就是操做系統頁面大小的兩倍,
8k或者16k,問題就出現了。不管使用firefox4.0仍是IE8.0,提交一個比較大,200k左右的圖片,都返回500 Internal Server Error錯誤 #http_proxy模塊
。。。。。。 #gzip模塊 。。。。。。 upstream bakend { 。。。。。。。 } #server模塊 。。。。。 }
gzip_static on; gzip_http_version 1.0; gzip_proxied expired no-cache no-store private auth; gzip_vary on; gzip on; gzip_types text/plain text/css text/xml application/xml application/xml+rss application/json; gzip_min_length 1100; gzip_buffers 4 8k;
gzip on|off
# 默認值: gzip off
# 開啓或者關閉gzip模塊web
gzip_static on|offapache
# nginx對於靜態文件的處理模塊
# 該模塊能夠讀取預先壓縮的gz文件,這樣能夠減小每次請求進行gzip壓縮的CPU資源消耗。該模塊啓用後,nginx首先檢查是否存在請求靜態文件的gz結尾的文件,若是有則直接返回該gz文件內容。爲了要兼容不支持gzip的瀏覽器,啓用gzip_static模塊就必須同時保留原始靜態文件和gz文件。這樣的話,在有大量靜態文件的狀況下,將會大大增長磁盤空間。咱們能夠利用nginx的反向代理功能實現只保留gz文件。
#能夠google"nginx gzip_static"瞭解更多json
gzip_comp_level 4
# 默認值:1(建議選擇爲4)
# gzip壓縮比/壓縮級別,壓縮級別 1-9,級別越高壓縮率越大,固然壓縮時間也就越長(傳輸快但比較消耗cpu)。
gzip_buffers 4 16k
# 默認值: gzip_buffers 4 4k/8k
# 設置系統獲取幾個單位的緩存用於存儲gzip的壓縮結果數據流。 例如 4 4k 表明以4k爲單位,按照原始數據大小以4k爲單位的4倍申請內存。 4 8k 表明以8k爲單位,按照原始數據大小以8k爲單位的4倍申請內存。
# 若是沒有設置,默認值是申請跟原始數據相同大小的內存空間去存儲gzip壓縮結果。
gzip_types mime-type [mime-type ...]
# 默認值: gzip_types text/html (默認不對js/css文件進行壓縮)
# 壓縮類型,匹配MIME類型進行壓縮
# 不能用通配符 text/*
# (不管是否指定)text/html默認已經壓縮
# 設置哪壓縮種文本文件可參考 conf/mime.types
gzip_min_length 1k
# 默認值: 0 ,無論頁面多大都壓縮
# 設置容許壓縮的頁面最小字節數,頁面字節數從header頭中的Content-Length中進行獲取。
# 建議設置成大於1k的字節數,小於1k可能會越壓越大。 即: gzip_min_length 1024
gzip_http_version 1.0|1.1
# 默認值: gzip_http_version 1.1(就是說對HTTP/1.1協議的請求才會進行gzip壓縮)
# 識別http的協議版本。因爲早期的一些瀏覽器或者http客戶端,可能不支持gzip自解壓,用戶就會看到亂碼,因此作一些判斷仍是有必要的。
# 注:99.99%的瀏覽器基本上都支持gzip解壓了,因此能夠不用設這個值,保持系統默認便可。
# 假設咱們使用的是默認值1.1,若是咱們使用了proxy_pass進行反向代理,那麼nginx和後端的upstream server之間是用HTTP/1.0協議通訊的,若是咱們使用nginx經過反向代理作Cache Server,並且前端的nginx沒有開啓gzip,同時,咱們後端的nginx上沒有設置gzip_http_version爲1.0,那麼Cache的url將不會進行gzip壓縮
gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any] ...
# 默認值:off
# Nginx做爲反向代理的時候啓用,開啓或者關閉後端服務器返回的結果,匹配的前提是後端服務器必需要返回包含"Via"的 header頭。
off - 關閉全部的代理結果數據的壓縮
expired - 啓用壓縮,若是header頭中包含 "Expires" 頭信息
no-cache - 啓用壓縮,若是header頭中包含 "Cache-Control:no-cache" 頭信息
no-store - 啓用壓縮,若是header頭中包含 "Cache-Control:no-store" 頭信息
private - 啓用壓縮,若是header頭中包含 "Cache-Control:private" 頭信息
no_last_modified - 啓用壓縮,若是header頭中不包含 "Last-Modified" 頭信息
no_etag - 啓用壓縮 ,若是header頭中不包含 "ETag" 頭信息
auth - 啓用壓縮 , 若是header頭中包含 "Authorization" 頭信息
any - 無條件啓用壓縮
gzip_vary on
# 和http頭有關係,加個vary頭,給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,因此避免浪費不支持的也壓縮,因此根據客戶端的HTTP頭來判斷,是否須要壓縮
gzip_disable "MSIE [1-6]."
#禁用IE6的gzip壓縮,又是由於杯具的IE6。固然,IE6目前依然普遍的存在,因此這裏你也能夠設置爲「MSIE [1-5].」
#IE6的某些版本對gzip的壓縮支持很很差,會形成頁面的假死,今天產品的同窗就測試出了這個問題後來調試後,發現是對img進行gzip後形成IE6的假死,把對img的gzip壓縮去掉後就正常了爲了確保其它的IE6版本不出問題,因此建議加上gzip_disable的設置
做爲負載均衡池,能夠爲一個請求分配多個負載,防止單臺服務器宕機後請求沒法處理,負載均衡的策略有:輪詢、加權輪詢和哈希一致,配置以下:
#加權輪詢 upstream back_openaccess { server 10.159.39.136:12080 weight=2 max_fails=3 fail_timeout=10s; server 10.159.39.137:12080 weight=2 max_fails=3 fail_timeout=10s; } #ip_hash upstream back_openadmin { ip_hash; server 10.159.39.136:12081; server 10.159.39.137:12081; }
加權輪詢配置參數:
down 表示單前的server暫時不參與負載.
weight 默認爲1.weight越大,負載的權重就越大。
max_fails :容許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤.
fail_timeout : max_fails次失敗後,暫停的時間。
backup: 其它全部的非backup機器down或者忙的時候,請求backup機器。因此這臺機器壓力會最輕。
max_conns:限制分配給某臺Server處理的最大鏈接數量,超過這個數量,將不會分配新的鏈接給它。默認爲0,表示不限制。注意:1.5.9以後的版本纔有這個配置
server { listen 80; server_name "127.0.0.1"; root /kingdee/www/; #Open underscores_in_headers underscores_in_headers on; proxy_redirect off; include conf.d/*.conf; location /ngs { stub_status on; access_log on; } location /upss { check_status; access_log off; } }
listen:監聽端口,默認80,小於1024的要以root啓動。能夠爲listen
*:80
、liste
n
127.0.0.1:80
等形式。
server_name:服務器名,如localhost、www.example.com
,能夠經過正則匹配。
root:設定響應的根目錄。
include:引入其餘的配置文件。
underscores_in_headers:支持讀取非nginx標準的用戶自定義header的,可是須要在http或者server下開啓header。
proxy_redirect:語法:proxy_redirect [ default|off|redirect replacement ] ,默認值:proxy_redirect default ,修改被代理服務器返回的響應頭。例如:proxy_redirect http://localhost:8000/two/ http://frontend/one/;將Location字段重寫爲http://frontend/one/。
location:根據請求的RUI設置配置,進行負載均衡。location中的配置參數以下:
一、proxy_set_header參數:語法爲:proxy_set_header Field Value。常見的設置如:
proxy_set_header Host $proxy_host;
獲取nginx配置中的server_name值。
proxy_set_header X-Real-IP $remote_addr;
有了這個配置就能夠在web服務器端得到用戶的真實ip
proxy_set_header X-Forwarded-For $remote_addr;
咱們先看看這裏有個X-Forwarded-For變量,這是一個squid開發的,用於識別經過HTTP代理或負載平衡器原始IP一個鏈接到Web服務器的客戶機地址的非rfc標準,若是有作X-Forwarded-For設置
的話,每次通過proxy轉發都會有記錄,格式就是client1, proxy1, proxy2,以逗號隔開各個地址,因爲他是非rfc標準,因此默認是沒有的,須要強制添加,在默認狀況下通過proxy轉發的請求,在後端看
來遠程地址都是proxy端的ip 。也就是說在默認狀況下咱們使用request.getAttribute("X-Forwarded-For")獲取不到用戶的ip,若是咱們想要經過這個變量得到用戶的ip,咱們須要本身在nginx添加配置。
二、proxy_pass:轉發的代理路徑
狀況1、location /test/ {
proxy_pass http://t6:8300;
}
狀況2、location /test/ {
proxy_pass http://t6:8300/;
}
針對狀況2,若是訪問url = http://server/test/test.jsp,則被nginx代理後,請求路徑會變爲 http://proxy_pass/test.jsp,直接訪問server的根資源
針對狀況1,若是訪問url = http://server/test/test.jsp,則被nginx代理後,請求路徑會便問http://proxy_pass/test/test.jsp,將test/ 做爲根路徑,請求test/路徑下的資源
proxy_buffer_size 256k; 設置從被代理服務器讀取的第一部分應答的緩衝區大小,一般狀況下這部分應答中包含一個小的應答頭,默認狀況下這個值的大小爲指令proxy_buffers中指定的一個緩衝區的大小,不過能夠將其設置爲更小 proxy_buffers 4 256k; 設置用於讀取應答(來自被代理服務器)的緩衝區數目和大小,默認狀況也爲分頁大小,根據操做系統的不一樣多是4k或者8k proxy_busy_buffers_size 256k;
proxy_connect_timeout 90; 後端服務器鏈接的超時時間_發起握手等候響應超時時間 proxy_read_timeout 180; 鏈接成功後_等候後端服務器響應時間_其實已經進入後端的排隊之中等候處理(也能夠說是後端服務器處理請求的時間) proxy_send_timeout 180; 後端服務器數據回傳時間_就是在規定時間以內後端服務器必須傳完全部的數據 proxy_temp_file_write_size 256k; 設置在寫入proxy_temp_path時數據的大小,預防一個工做進程在傳遞文件時阻塞太長 proxy_temp_path /data0/proxy_temp_dir; proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區
1. proxy_buffering
語法:proxy_buffering on|off
默認值:proxy_buffering 0n
該 指令開啓從後端被代理服務器的響應內容緩衝。若是緩衝區開啓,nginx假定被代理的後端服務器會以最快速度響應,並把內容保存在由指令 proxy_buffer_size 和 proxy_buffers指定的緩衝區裏邊.若是響應內容沒法放在內存裏邊,那麼部份內容會被寫到磁盤上。若是緩衝區被關閉了,那麼響應內容會按照獲取 內容的多少馬上同步傳送到客戶端。nginx不嘗試計算被代理服務器整個響應內容的大小,nginx能從服務器接受的最大數據,是由指令 proxy_buffer_size指定的.對於基於長輪詢(long-polling)的Comet 應用來講,關閉 proxy_buffering 是重要的,否則異步響應將被緩存致使Comet沒法工做。
2. proxy_buffers
語法:proxy_buffers 數量 大小
默認值:proxy_buffers 8 4k/8k
該指令設置緩衝區的大小和數量,從被代理的後端服務器取得的響應內容,會放置到這裏. 默認狀況下,一個緩衝區的大小等於內存頁面大小,多是4K也多是8K,這取決於平臺。
3. proxy_buffer_size
語法:proxy_buffer_size the size
默認值:proxy_buffer_size 4k/8k
該指令設置緩衝區大小,從代理後端服務器取得的第一部分的響應內容,會放到這裏.小的響應header一般位於這部分響應內容裏邊.默認來講,該緩衝區大小等於指令 proxy_buffers所設置的;可是,你能夠把它設置得更小.
4. proxy_busy_buffers_size
語法:proxy_busy_buffers_size 大小
默認值:proxy_busy_buffers_size proxy_buffer_size*2
buffer 工做原理
1. 全部的proxy buffer參數是做用到每個請求的。每個請求會安按照參數的配置得到本身的buffer。proxy buffer不是global而是per request的。
2. proxy_buffering 是爲了開啓response buffering of the proxied server,開啓後proxy_buffers和proxy_busy_buffers_size參數纔會起做用。
3. 不管proxy_buffering是否開啓,proxy_buffer_size(main buffer)都是工做的,proxy_buffer_size所設置的buffer_size的做用是用來存儲upstream端response的header。
4. 在proxy_buffering 開啓的狀況下,Nginx將會盡量的讀取全部的upstream端傳輸的數據到buffer,直到proxy_buffers設置的全部buffer們 被寫滿或者數據被讀取完(EOF)。此時nginx開始向客戶端傳輸數據,會同時傳輸這一整串buffer們。同時若是response的內容很大的 話,Nginx會接收並把他們寫入到temp_file裏去。大小由proxy_max_temp_file_size控制。若是busy的buffer 傳輸完了會從temp_file裏面接着讀數據,直到傳輸完畢。
5. 一旦proxy_buffers設置的buffer被寫入,直到buffer裏面的數據被完整的傳輸完(傳輸到客戶端),這個buffer將會一直處 在busy狀態,咱們不能對這個buffer進行任何別的操做。全部處在busy狀態的buffer size加起來不能超過proxy_busy_buffers_size,因此proxy_busy_buffers_size是用來控制同時傳輸到客戶 端的buffer數量的。四、server塊:配置虛擬主機的相關參數,一個http中能夠有多個server。
stub_status模塊主要用來展現nginx的狀態信息也就是nginx的統計信息。配置信息以下:
location /ngs { stub_status on; access_log on; }
在輸入域名/ngs後會展現nginx的統計信息以下:
Active connections: 當前nginx正在處理的活動鏈接數. Server accepts handled requests request_time: nginx總共處理了13057 個鏈接,成功建立13057 握手(證實中間沒有失敗的),總共處理了11634 個請求,總共請求時間2230854。 Reading: nginx讀取到客戶端的Header信息數. Writing: nginx返回給客戶端的Header信息數. Waiting: 開啓keep-alive的狀況下,這個值等於 active – (reading + writing),意思就是nginx已經處理完成,正在等候下一次請求指令的駐留鏈接。因此,在訪問效率高,請求很快被處理完畢的狀況下,Waiting數比較可能是正常的.若是reading +writing數較多,則說明併發訪問量很是大,正在處理過程當中。