Nginx 常見應用技術指南[Nginx Tips] 第二版javascript
做者:NetSeek http://www.linuxtone.org (IT運維專家網|集羣架構|性能調優)
php
目 錄css
1、 Nginx 基礎知識
2、 Nginx 安裝及調試
3、 Nginx Rewrite
4、 Nginx Redirect
5、 Nginx 文件夾本身主動加斜線:
6、 Nginx Location
7、 Nginx expires
8、 Nginx 防盜鏈
9、 Nginx 訪問控制
10、 Nginx日誌處理
11、 Nginx Cache
12、 Nginx 負載均衡
十3、 Nginx簡單優化
十4、 怎樣構建高性能的LEMP環境
十5、 Nginx服務監控
十6、 常見問題與錯誤處理.
十7、 相關資源下載html
【前言】:java
編寫此技術指南在於推廣普及NGINX在國內的使用,更方便的幫助你們瞭解和掌握NGINX
的一些使用技巧。linux
本指南很是多技巧來自於網絡和工做中或網絡上朋友們問個人問題.在此對
網絡上願意分享的朋友們表示感謝和致意!歡迎你們和我一塊兒豐富本技術指南提出更好的建
議!請朋友們關注: http://www.linuxtone.org 技術分享社區! 互想學習共同進步!nginx
1、 Nginx 基礎知識web
一、簡單介紹
Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 server,也是一個 IMAP/POP3/SMTP 代理服
務器。 Nginx 是由 Igor Sysoev 爲俄羅斯訪問量第二的 Rambler.ru 網站開發的,它已經在該網站執行超
過兩年半了。Igor 將源碼以類BSD許可證的形式公佈。雖然仍是測試版。但是,Nginx 已經因爲它的穩
定性、豐富的功能集、演示樣例配置文件和低系統資源的消耗而聞名了。express
不少其它的請見官方wiki: http://wiki.codemongers.com/apache
二、 Nginx的長處
nginx作爲HTTPserver。有下面幾項基本特性:
1) 處理靜態文件。索引文件以及本身主動索引。打開文件描寫敘述符緩衝.
2) 無緩存的反向代理加速,簡單的負載均衡和容錯.
3) FastCGI。簡單的負載均衡和容錯.
4) 模塊化的結構。包含gzipping, byte ranges, chunked responses, 以及 SSI-filter等filter。
假設由FastCGI或其餘代理server處理單頁中存在的多個SSI,則這項處理可以並行執行,而不
需要相互等待。
5) 支持SSL 和 TLS SNI.
Nginx專爲性能優化而開發,性能是其最重要的考量, 實現上很注重效率 。
它支持內核Poll模型,
能經受高負載的考驗, 有報告代表能支持高達 50,000 個併發鏈接數。
Nginx具備很是高的穩定性。
其餘HTTPserver。當遇到訪問的峯值,或者有人惡意發起慢速鏈接時。
也很是可能會致使server物理內存耗盡頻繁交換。失去響應,僅僅能從新啓動server。
好比當前apache一旦上到
200個以上進程,web響應速度就明顯很緩慢了。
而Nginx採取了分階段資源分配技術,使得它的CPU與
內存佔用率很低。nginx官方表示保持10,000個沒有活動的鏈接。它僅僅佔2.5M內存,因此相似DOS這
樣的攻擊對nginx來講基本上是毫無用處的。就穩定性而言, nginx比lighthttpd更勝一籌。
Nginx支持熱部署。它的啓動特別easy, 並且差點兒可以作到7*24不間斷執行。即便執行數個月也不
需要又一次啓動。
你還能夠在不間斷服務的狀況下,對軟件版本號進行進行升級。
Nginx採用master-slave模型, 能夠充分利用SMP的優點。且能夠下降工做進程在磁盤I/O的阻
塞延遲。當採用select()/poll()調用時。還可以限制每個進程的鏈接數。
Nginx代碼質量很是高,代碼很是規範。 手法成熟, 模塊擴展也很是easy。
特別值得一提的是強大
的Upstream與Filter鏈。 Upstream爲諸如reverse proxy, 與其它server通訊模塊的編寫奠基了很是好的
基礎。而Filter鏈最酷的部分就是各個filter沒必要等待前一個filter運行完成。它可以把前一個filter
的輸出作爲當前filter的輸入。這有點像Unix的管線。這意味着。一個模塊可以開始壓縮從後端server
發送過來的請求,且可以在模塊接收完後端server的整個請求以前把壓縮流轉向client。
Nginx採用了一些os提供的最新特性如對sendfile (Linux 2.2+)。accept-filter (FreeBSD
4.1+)。TCP_DEFER_ACCEPT (Linux 2.4+) 的支持。從而大大提升了性能
2、 Nginx 安裝及調試
一、Pcre 安裝
2. nginx 編譯安裝
更具體的模塊定製與安裝請參照官方wiki.
三、Nginx 配置文件測試:
2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf
syntax is ok
2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf was
tested successfully
三、 Nginx 啓動:
四、 Nginx 配置文件改動又一次載入:
3、 Nginx Rewrite
1. Nginx Rewrite 基本標記(flags)
last - 基本上都用這個Flag。
※至關於Apache裏的[L]標記,表示完畢rewrite,再也不匹配後面的規則
break - 停止Rewirte。再也不繼續匹配
redirect - 返回暫時重定向的HTTP狀態302
permanent - 返回永久重定向的HTTP狀態301
※原有的url支持正則 重寫的url不支持正則
2. 正則表達式匹配。當中:
~ 爲區分大寫和小寫匹配
~* 爲不區分大寫和小寫匹配
!~ 和 !~* 分別爲區分大寫和小寫不匹配及不區分大寫和小寫不匹配
3. 文件及文件夾匹配。當中:
-f 和 !-f 用來推斷是否存在文件
-d 和 !-d 用來推斷是否存在文件夾
-e 和 !-e 用來推斷是否存在文件或文件夾
-x 和 !-x 用來推斷文件是否可運行
3. Nginx 的一些可用的全局變量,可用作條件推斷:
4、 Nginx Redirect
將全部linuxtone.org與netseek.linuxtone.org域名全部自跳轉到http://www.linuxtone.org
5、 Nginx 文件夾本身主動加斜線:
6、 Nginx Location
1.基本的語法:[和上面rewrite正則匹配語法基本一致]
location [=|~|~*|^~] /uri/ { … }
~ 爲區分大寫和小寫匹配
~* 爲不區分大寫和小寫匹配
!~ 和 !~* 分別爲區分大寫和小寫不匹配及不區分大寫和小寫不匹配
演示樣例1:
匹配不論什麼查詢,因爲所有請求都已 / 開頭。但是正則表達式規則和長的塊規則將被優先和查詢匹配
演示樣例2:
演示樣例3:
7、 Nginx expires
1.依據文件類型推斷。加入expires
二、依據某個文件夾推斷,加入expires
8、 Nginx 防盜鏈
1. 針對不一樣的文件類型
2. 針對不一樣的文件夾
3. 同實現防盜鏈和expires的方法
9、 Nginx 訪問控制
1. Nginx 身份證驗證
#加入username爲linuxtone
New password: (此處輸入你的密碼)
Re-type new password: (再次輸入你的密碼)
Adding password for user
http://count.linuxtone.org/tongji/data/index.html(文件夾存在/data/www/wwwroot/tongji/data/文件夾
下)
將下段配置放到虛擬主機文件夾,當訪問http://count.linuxtone/tongji/即提示要密驗證:
2. Nginx 禁止訪問某類型的文件.
如,Nginx下禁止訪問*.txt文件,配置方法例如如下.
方法2:
實例:
禁止訪問某個文件夾
3. 使用ngx_http_access_module限制ip訪問
具體參見wiki: http://wiki.codemongers.com/NginxHttpAccessModule#allow
4. Nginx 下載限制併發和速率
僅僅贊成客房端一個線程,每個線程20k.
【注】limit_zone linuxtone $binary_remote_addr 10m; 這個可以定義在主的
5. Nginx 實現Apache同樣文件夾列表
6. 上文件限制大小
主配置文件中增長例如如下,詳細大小依據你本身的業務作調整。
10、 Nginx 日誌處理
1.Nginx 日誌分割
# cat /usr/local/sbin/logcron.sh
不少其它的日誌分析與處理就關注(同一時候歡迎你參加討論):http://bbs.linuxtone.org/forum-8-1.html
2.利用AWSTATS分析NGINX日誌
設置好Nginx日誌格式,仍後利用awstats進行分析.
請參考: http://bbs.linuxtone.org/thread-56-1-1.html
3. Nginx 怎樣不記錄部分日誌
日誌太多。天天好幾個G。少記錄一些,如下的配置寫到server{}段中就可以了
11、Nginx Cache服務配置
假設需要將文件緩存到本地,則需要添加例如如下幾個子參數:
當中。
proxy_store on 用來啓用緩存到本地的功能,
proxy_temp_path 用來指定緩存在哪一個文件夾下,如:proxy_temp_path html;
在通過上一步配置以後,儘管文件被緩存到了本地磁盤上,但每次請求仍會向遠端拉取
文件。爲了不去遠端拉取文件。必須改動proxy_pass:
即改爲有條件地去運行proxy_pass。這個條件就是當請求的文件在本地的
proxy_temp_path指定的文件夾下不存在時,再向後端拉取。
不少其它更高級的應用可以研究ncache,官方站點: http://code.google.com/p/ncache/
具體安裝請參照http://bbs.linuxtone.org 應用加速版ncache相關的貼子.
12、Nginx 負載均衡
1. Nginx 負載均衡基礎知識
nginx的upstream眼下支持4種方式的分配
1)、輪詢(默認)
每個請求按時間順序逐一分配到不一樣的後端server,假設後端serverdown掉,能本身主動剔除。
2)、weight
指定輪詢概率,weight和訪問比率成正比,用於後端server性能不均的狀況。
2)、ip_hash
每個請求按訪問ip的hash結果分配。這樣每個訪客固定訪問一個後端server。可以解決session的問題。
3)、fair(第三方)
按後端server的響應時間來分配請求,響應時間短的優先分配。
4)、url_hash(第三方)
2. Nginx 負載均衡實例1
在需要使用負載均衡的server中添加
每個設備的狀態設置爲:
a) down 表示單前的server臨時不參與負載
b) weight 默以爲1.weight越大,負載的權重就越大。
c) max_fails :贊成請求失敗的次數默以爲1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤
d) fail_timeout:max_fails次失敗後。暫停的時間。
e) backup: 其餘所有的非backup機器down或者忙的時候。請求backup機器。因此這臺機器壓力會最輕。
nginx支持同一時候設置多組的負載均衡,用來給不用的server來使用。
client_body_in_file_only 設置爲On 可以講client post過來的數據記錄到文件裏用來作debug
client_body_temp_path 設置記錄文件的文件夾 可以設置最多3層文件夾
location 對URL進行匹配.可以進行重定向或者進行新的代理 負載均衡
3. Nginx 負載均衡實例 2
按訪問url的hash結果來分配請求。使每個url定向到同一個後端server,後端server爲緩
存時比較有效,也可以用做提升Squid緩存命中率.
簡單的負載均等實例:
#vi nginx.conf //nginx主配置文件核心配置
.........
# vi proxy.conf
#vi linuxtone_lb.conf
十3、Nginx簡單優化
1. 減少nginx編譯後的文件大小 (Reduce file size of nginx)
默認的nginx編譯選項里居然是用debug模式(-g)的(debug模式會插入很是多跟蹤和
ASSERT之類),編譯之後一個nginx有好幾兆。
去掉nginx的debug模式編譯。編譯以
後僅僅有幾百K
在 auto/cc/gcc,最後幾行有:
凝視掉或刪掉這幾行,又一次編譯就能夠。
2. 改動Nginx的header假裝server
1) 改動nginx.h
2) 改動nginx_http_header_filter_module
#vi nginx-0.7.30/src/http/ngx_http_header_filter_module.c
將例如如下
改動爲
a) 改動nginx_http_header_filter_module
#vi nginx-0.7.30/src/http/ngx_http_special_response.c
將例如如下:
改動爲:
改動後又一次編譯一下環境,
404錯誤的時候顯示效果圖(假設沒有指定錯誤頁的話):
利用curl命令查看serverheader
3. 爲特定的CPU指定CPU類型編譯優化.
默認nginx使用的GCC編譯參數是-O
需要更加優化可以使用下面兩個參數
使得編譯針對特定CPU以及添加GCC的優化.
此方法僅對性能有所改善並不會有很是大的性能提高。供朋友們參考.
CPUD類型肯定:
編譯優化參數參考:http://en.gentoo-wiki.com/wiki/Safe_Cflags
4. Tcmalloc優化Nginx 性能
編譯nginx 載入google_perftools_module:
在主配置文件加入nginx.conf 加入:
5. 內核參數優化
# vi /etc/sysctl.conf
#使配置立刻生效
/sbin/sysctl -p
十4、怎樣構建高性的LEMP
請參見: http://www.linuxtone.org/lemp/lemp.pdf
一、 提供完整的配置腳本下載:http://www.linuxtone.org/lemp/scripts.tar.gz
二、 提供NGINX常見配置範例含(虛擬主機,防盜鏈,Rewrite,訪問控制,負載均衡Discuz相關程序靜態化及等等),你僅僅要稍稍改動就能夠線上應用。
三、將原版的xcache替換成EA,並提供相關簡單調優腳本及配置文件。
不少其它的及更新資料請關注: http://www.linuxtone.org
十5、Nginx監控
一、 RRDTOOL+Perl腳本繪圖監控
先安裝好rrdtool 。關於rrdtool本文不做介紹,詳細安裝請參照linuxtone監控版塊.
#vi rrd_nginx.pl //配置腳本文件設置好路徑
【注】依據本身詳細的情況改動對應的路徑.
#crontab –e //增長例如如下
從新啓動crond後,經過配置nginx虛擬主機指到/data/www/wwwroot/nginx/html文件夾。經過crond
本身主動運行perl腳本會生成很是多圖片.
http://xxx/connections-day.png就能夠看到server狀態圖。
二、 官方Nginx-rrd 監控服務(多虛擬主機)(推薦)
網址:http://www.nginx.eu/nginx-rrd.html
此解決方式事實上是基於上述監控方案的一個改進和加強,相同先安裝好rrdtool這個繪圖工
具和對應的perl模塊再作例如如下操做:
先創建好生成的庫存和圖片存放錄
#vi /etc/nginx-rrd.conf
http://www.linuxtone.org/nginx_status;www.linuxtone.org"" //依據你的詳細狀況作調整.
SEVERS_URL 格式 http://domain1/nginx_status;domain1 http://domain2/nginx_status;domain2
這樣的格式監控多虛擬主機鏈接狀態:
重點啓crond服務,仍後經過http://219.32.205.13/nginx/html/ 就能夠訪問。配置過程很是easy!
三、 CACTI模板監控Nginx
利用Nginx_status狀態來繪圖實現CACTI監控
nginx編譯時贊成http_stub_status_module
# vi /usr/local/nginx/conf/nginx.conf
id=12676
# tar xvfz cacti-nginx.tar.gz
# cp cacti-nginx/get_nginx_socket_status.pl /data/cacti/scripts/
# cp cacti-nginx/get_nginx_clients_status.pl /data/cacti/scripts/
# chmod 755 /data/cacti/scripts/get_nginx*
檢測插件
# /data/cacti/scripts/get_nginx_clients_status.pl http://192.168.1.37/nginx_status
在cacti管理面板導入
十6、常見問題與錯誤處理
一、 400 bad request錯誤的緣由和解決的方法
配置nginx.conf相關設置例如如下.
依據詳細狀況調整。通常適當調整值就可以。
二、 Nginx 502 Bad Gateway錯誤
或者嘗試設置:
三、 Nginx出現的413 Request Entity Too Large錯誤
這個錯誤通常在上傳文件的時候會出現。
編輯Nginx主配置文件Nginx.conf,找到http{}段。加入
假設執行php的話這個大小client_max_body_size要和php.ini中的例如如下值的最大值
一致或者稍大,這樣就不會因爲提交數據大小不一致出現的錯誤。
四、 解決504 Gateway Time-out(nginx)
遇到這個問題是在升級discuz論壇的時候遇到的
通常看來, 這樣的狀況多是由於nginx默認的fastcgi進程響應的緩衝區過小形成的,
這將致使fastcgi進程被掛起, 假設你的fastcgi服務對這個掛起處理的很差, 那麼最後就
極有可能致使504 Gateway Time-out
現在的站點, 尤爲某些論壇有大量的回覆和很是多內容的, 一個頁面甚至有幾百K。
默認的fastcgi進程響應的緩衝區是8K, 咱們可以設置大點
在nginx.conf裏, 增長:
這表示設置fastcgi緩衝區爲8×128k
固然假設您在進行某一項即時的操做, 可能需要nginx的超時參數調大點,好比設置成60秒:
僅僅是調整了這兩個參數, 結果就是沒有再顯示那個超時, 可以說效果不錯, 但是也
多是由於其它的緣由, 眼下關於nginx的資料不是很是多, 很是多事情都需要長期的經驗
累計纔有結果, 期待您的發現哈!
五、 怎樣使用Nginx Proxy
朋友一臺server執行tomcat 爲8080port,IP:192.168.1.2:8080,還有一臺機器
IP:192.168.1.8. 朋友想經過訪問http://192.168.1.8就能夠訪問tomcat服務.配置例如如下:
在192.168.1.8的nginx.conf上配置例如如下:
六、 怎樣關閉Nginx的LOG
十7、相關資源下載
1. nginx配置演示樣例及腳本下載: # wget http://www.linuxtone.org/lemp/scripts.tar.gz #此腳本範例按期更新.