Nginx參考 Nginx 簡介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Nginx 安裝,、調(diào)試 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Nginx 安裝 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1. 安裝前注意事項(xiàng) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2. 安裝前資源的準(zhǔn)備 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3. 安裝 Nginx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 4. 驗(yàn)證安裝 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 5. Nginx 的常用參數(shù)和控制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 6. 編寫管理 Nginx 的腳步 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 7. 使用注意事項(xiàng) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Nginx 配置文件詳解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Nginx 中的全局變量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 通過例子學(xué)習(xí) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Nginx 監(jiān)控 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Nginx Rewrite 基礎(chǔ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Rewrite 基本標(biāo)記 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Rewrite 正則表達(dá)式匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Rewrite 條件判斷 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Rewrite 應(yīng)用實(shí)例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 偽地址 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 域名跳轉(zhuǎn) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 附錄 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Nginx 編譯模塊名稱解析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Nginx 簡介
Nginx 是俄羅斯人編寫的十分輕量級(jí)的 HTTP 服務(wù)器 ,Nginx ,它的發(fā)音為 “ engine X ” ,, 是一個(gè)高性能的 HTTP 和反向代理服務(wù)器,,同時(shí)也是一個(gè) IMAP/POP3/SMTP 代理服務(wù)器. Nginx 是由俄羅斯人 Igor Sysoev 為俄羅斯訪問 量第二的 Rambler.ru 站點(diǎn)開發(fā)的,它已經(jīng)在該站點(diǎn)運(yùn)行超過兩年半了,。 Igor Sysoev 在建立的項(xiàng)目時(shí) , 使用基于 BSD 許可,。 據(jù)說他當(dāng)初是 F5 的成員之一,英文主頁: http:// ,。 俄羅斯的一些大網(wǎng)站已經(jīng)使用它超過兩年多了 ,, 一直表現(xiàn)不凡 , 相信想了解 nginx 的朋友都讀過阿葉大哥的利用 nginx 實(shí)現(xiàn)負(fù)載均衡 . 直到 2007 年 4 月,, 俄 羅 斯大約有 20% 左右的虛擬主機(jī)是由 nignx 服務(wù)或代理的,。 Google 在線安全博 客中統(tǒng)計(jì) nginx 服務(wù)或代理了大約所有 Internet 虛擬主機(jī)的 4% 。而 netcraft 的統(tǒng)計(jì)顯示,, nginx 服務(wù)的主機(jī)在過去的一年里以四倍的速度增長短短的幾年 里,, 它的排名已躍進(jìn)第 9 。 ( 參見: http://survey./Reports/200707/ ) Nginx 以事件驅(qū)動(dòng)的方式編寫,,所以有非常好的性能,,同時(shí)也是一個(gè)非常 高 效的反向代理、負(fù)載平衡,。其擁有匹配 Lighttpd 的性能,,同時(shí)還沒有 Lighttp d 的內(nèi)存泄漏問題,而且 Lighttpd 的 mod_proxy 也有一些問題并且很久沒有更新 ,。 Nginx 并不支持 cgi 方式運(yùn)行,,原因是可以減少因此帶來的一些程序上的 漏 洞。那么我們必須使用 FastCGI 方式來執(zhí)行 PHP 程序,。 現(xiàn)在,, Igor 將源代碼以類 BSD 許可證的形式發(fā)布。 Nginx 因?yàn)樗姆€(wěn)定性,、 豐富的模塊庫,、靈活的配置和低系統(tǒng)資源的消耗而聞名.業(yè)界一致認(rèn)為它是 Apache2.2 + mod_proxy_balancer 的輕量級(jí)代替者,不僅是因?yàn)轫憫?yīng)靜態(tài)頁面 的 速度非???,而且它的模塊數(shù)量達(dá)到 Apache 的近 2/3 。對(duì) proxy 和 rewrite 模 塊的支持很徹底,,還支持 mod_fcgi ,、 ssl ,、 vhosts ,適合用來做 mongrel clus ters 的前端 HTTP 響應(yīng),。 N ginx 做為 HTTP 服務(wù)器,,有以下幾項(xiàng)基本特性: 1. 處理靜態(tài)文件,索引文件以及自動(dòng)索引,;打開文件描述符緩沖 ,。 2. 無緩存的反向代理加速,簡單的負(fù)載均衡和容錯(cuò) ,。 3. FastCGI , 簡單的負(fù)載均衡和容錯(cuò) ,。 4. 模塊化的結(jié)構(gòu)。包括 gzipping, byte ranges, chunked responses 以及 SSI-filter 等 filter ,。如果由 FastCGI 或其它代理服務(wù)器處理單頁中 存 在的多個(gè) SSI , 則這項(xiàng)處理可以并行運(yùn)行,,而不需要相互等待。 5. 支持 SSL 和 TLSSNI . ,。 Nginx 專為性能優(yōu)化而開發(fā),,性能是其最重要的考量 , 實(shí)現(xiàn)上非常注重效率 。
它支持內(nèi)核 Poll 模型,,能經(jīng)受高負(fù)載的考驗(yàn) , 有報(bào)告表明能支持高達(dá) 50,000 個(gè) 并發(fā)連接數(shù),。 Nginx 具有很高的穩(wěn)定性。其它 HTTP 服務(wù)器,,當(dāng)遇到訪問的峰值,,或者有 人惡意發(fā)起慢速連接時(shí),也很可能會(huì)導(dǎo)致服務(wù)器物理內(nèi)存耗盡頻繁交換,,失去 響 應(yīng),,只能重啟服務(wù)器。例如當(dāng)前 apache 一旦上到 200 個(gè)以上進(jìn)程,, web 響應(yīng)速 度 就明顯非常緩慢了,。而 Nginx 采取了分階段資源分配技術(shù),使得它的 CPU 與內(nèi) 存 占用率非常低,。 nginx 官方表示保持 10,000 個(gè)沒有活動(dòng)的連接,,它只占 2.5M 內(nèi) 存 , 所以類似 DOS 這樣的攻擊對(duì) nginx 來說基本上是毫無用處的,。就穩(wěn)定性而 言 ,nginx 比 lighthttpd 更勝一籌,。 Nginx 支持熱部署。它的啟動(dòng)特別容易 , 并且?guī)缀蹩梢宰龅?7*24 不間斷運(yùn) 行,,即使運(yùn)行數(shù)個(gè)月也不需要重新啟動(dòng),。你還能夠在不間斷服務(wù)的情況下,對(duì) 軟 件版本進(jìn)行進(jìn)行升級(jí)。 Nginx 采用 master-slave 模型 , 能夠充分利用 SMP 的優(yōu)勢,,且能夠減少工 作 進(jìn)程在磁盤 I/O 的阻塞延遲,。當(dāng)采用 select()/poll() 調(diào)用時(shí),還可以限制每 個(gè) 進(jìn)程的連接數(shù),。 Nginx 代碼質(zhì)量非常高,,代碼很規(guī)范,手法成熟,,模塊擴(kuò)展也很容易,。特 別 值得一提的是強(qiáng)大的 Upstream 與 Filter 鏈。 Upstream 為諸如 reverse proxy , 與其他服務(wù)器通信模塊的編寫奠定了很好的基礎(chǔ),。而 Filter 鏈最酷的部分就是 各個(gè) filter 不必等待前一個(gè) filter 執(zhí)行完畢,。它可以把前一個(gè) filter 的輸出 做為當(dāng)前 filter 的輸入,這有點(diǎn)像 Unix 的管線,。這意味著,,一個(gè)模塊可以開 始 壓縮從后端服務(wù)器發(fā)送過來的請(qǐng)求,且可以在模塊接收完后端服務(wù)器的整個(gè)請(qǐng) 求 之前把壓縮流轉(zhuǎn)向客戶端,。 Nginx 采用了一些 OS 提供的最新特性如對(duì) sendfile (Linux2.2+) ,, accept - filter (FreeBSD4.1+) , TCP_DEFER_ACCEPT (Linux 2.4+) 的支持,,從而大大提 高了性能,。 當(dāng)然,, nginx 還很年輕,,多多少少存在一些問題,比如: Nginx 是俄羅斯人 創(chuàng)建,,目前文檔方面還不是很完善.因?yàn)槲臋n大多是俄語,,所以文檔方面這也 是 個(gè)障礙.盡管 nignx 的模塊比較多,但它們還不夠完善,。對(duì)腳本的支持力度不 夠 ,。 這些問題, nginx 的作者和社區(qū)都在努力解決,,我們有理由相信 nginx 將 繼 續(xù)以高速的增長率來分享輕量級(jí) HTTP 服務(wù)器市場,,會(huì)有一個(gè)更美好的未來。 Nginx 安裝,、調(diào)試
Nginx 安裝 1. 1. 1. 1. 安裝前注意事項(xiàng)
1 ) 目前官方 Nginx 并不支持 Windows ,,您只能在包括 Linux 、 UNIX ,、 BS D 系統(tǒng)下安裝和使用,; 2 ) Nginx 本身只是一個(gè) HTTP 和反向代理服務(wù)器,它無法像 Apache 一樣 通過安裝各種模塊來支持不同的頁面腳本,例如 PHP ,、 CGI 等,。 3 )為了確保能在 Nginx 中使用正則表達(dá)式進(jìn)行更靈活的配置,安裝之前 需 要確定系統(tǒng)是否安裝有 PCRE ( Perl Compatible Regular Expressions )包 ,。 4) 需要安裝在 2.6 以上內(nèi)核版本的 GNU/Linux 系統(tǒng)中,。 5) 編譯前,請(qǐng)先確認(rèn) gcc ,、 make ,、 patch 等編譯工具是否已安裝,并可正常 使用,。 2. 2. 2. 2. 安裝前資源的準(zhǔn)備 主要軟件清單列表: 1 ) Nginx 安裝文件 Nginx 0.6.32 nginx-0.6.32.tar.gz ( Nginx 官方站點(diǎn)為 http://www. ,,國內(nèi)較好的中文站點(diǎn)為 http://www. ) 2 ) Nginx URL 哈希模塊 Upstream Hash Module nginx_upstream_hash-0.3.tar.gz 3 )正則表達(dá)式模塊 PCRE 7.7 pcre-7.7.tar.gz ( 到 http://www. 下載 PCRE 庫的最新穩(wěn)定版本 ) 3. 3. 3. 3. 安裝 Nginx (本安裝環(huán)境是在 Rethad5 上,所有的安裝文件和其他軟件都在 /usr/local/src 上)
#cd /usr/local/src #gunzip nginx-0.6.32.tar.gz #gunzip nginx_upstream_hash-0.3.tar.gz #gunzip pcre-7.7.tar.gz #tar -xvf nginx-0.6.32.tar #tar -xvf nginx_upstream_hash-0.3.tar #tar -xvf pcre-7.7.tar #cd nginx-0.6.32 (隨后 patch 的運(yùn)行必須要在該目錄下) #patch -p0 < /usr/local/src/nginx_upstream_hash-0.3/nginx.patch 4. 4. 4. 4. 驗(yàn)證安裝
安裝成功后 /usr/local/nginx 目錄下有四個(gè)子目錄分別是: conf ,、 html ,、 log s 、 sbin ,。其中 Nginx 的配置文件存放于 conf/nginx.Conf ,; Nginx 只有一個(gè)程 序文件位于 sbin 目錄下的 nginx 文件。 如果你使用默認(rèn)的配置文件,,則要 確 保系統(tǒng)的 8 0 端口沒被其他程序占用,, 然后 運(yùn)行 /usr/local/nginx/sbin/nginx 命 令 來啟動(dòng) Nginx 。 可以通過以下兩種方法測試 Nginx 是否成功啟動(dòng) 1. 打開瀏覽器訪問此機(jī)器的 http:// IP : 端口( 80 可免輸入) ,,如果瀏覽器 出 現(xiàn) Welcome to nginx! 則表示 Nginx 已經(jīng)安裝并運(yùn)行成功,。 2. 輸入命令 netstat -nlp 如果能找到 Nginx 的端口那也代表你的 Nginx 成 功啟動(dòng)了。我的輸出結(jié)果是: tcp 0 0 0.0.0.0:82 0.0.0.0:* LISTEN 10209/nginx 5. 5. 5. 5. Nginx 的常用參數(shù)和控制 Nginx 安裝后只有一個(gè)程序文件,,本身并不提供各種管理程序,,它是使用 參 數(shù)和系統(tǒng)信號(hào)機(jī)制對(duì) Nginx 進(jìn)程本身進(jìn)行控制的。 程序運(yùn)行參數(shù) -c <path_to_config> :使用指定的配置文件而不是 conf 目錄下的 nginx.conf ,。 -t :測試配置文件是否正確,,在運(yùn)行時(shí)需要重新加載配置的時(shí)候,此命令非常 重 要,,用來檢測所修改的配置文件是否有語法錯(cuò)誤,。 -v :顯示 nginx 版本號(hào)。 -V :顯示 nginx 的版本號(hào)以及編譯環(huán)境信息以及編譯時(shí)的參數(shù),。 如果 要測試某個(gè)配置文件是否書寫正確,,可以使用以下命令 /usr/local/nginx/ sbin/nginx – t – c conf/nginx _my .conf 通過信號(hào)量對(duì) Nginx 進(jìn)行控制 有一個(gè)奇怪的現(xiàn)象不知道大家有沒有注意到,就是你會(huì)發(fā)現(xiàn)只有啟動(dòng) Nginx #./configure --add-module=/usr/local/src/nginx_upstream_hash-0.3/ --with- pcre=/usr/local/src/pcre-7.7/ --prefix=/usr/local/nginx --with- http_stub_status_module --without-select_module --without-poll_module ( 模塊的選擇請(qǐng)參考附錄 ) #make #make install 的命令,,但并沒有關(guān)閉 Nginx 的命令,。原因是 Nginx 是通過信號(hào)量來控制 Ngin x
的,,包括重啟 Nginx 、停止 Nginx 等,。 Nginx 支持下表中的信號(hào): 有兩種方式來通過這些信號(hào)去控制 Nginx : 1 ) 通過 logs 目錄下的 nginx.pid 查看當(dāng)前運(yùn)行的 Nginx 的進(jìn)程 ID ,,通過 kill – XXX <pid> 來控制 Nginx ,其中 XXX 可通 cat $Nginx_HOME/logs/nginx.pid 來查看 ,。 2 )如果您的系統(tǒng)中只有一個(gè) Nginx 進(jìn)程,,那您也可以通過 killall 命令來完 成,例如運(yùn)行 killall – s HUP nginx 來讓 Nginx 重新加載配置,。 6. 6. 6. 6. 編寫管理 Nginx 的腳步 從上面的敘述可知道,, Nginx 是通過信號(hào)量來控制的,所以管理起來是比 較 麻煩的,,但我們可以通過書寫相應(yīng)的腳本來達(dá)到方便管理,。(這樣的管理腳本在 網(wǎng)上很多,大家也可以在網(wǎng)上查找) 步驟如下: 1 ) cd /usr/local/nginx 2 ) mkdir bin 3 ) vi nginx.sh 4 )內(nèi)容是: ------------------------------------------------------------------------------- #!/bin/sh NGINX_HOME=/usr/local/nginx NGINX_SBIN=$NGINX_HOME/sbin/nginx NGINX_CONF=$NGINX_HOME/conf/nginx.conf NGINX_PID=$NGINX_HOME/logs/nginx.pid NGINX_MAXFD=65535 信號(hào)名 作用描述 TERM, INT 快速關(guān)閉程序,,中止當(dāng)前正在處理的請(qǐng)求 QUIT 處理完當(dāng)前請(qǐng)求后,,關(guān)閉程序 HUP 重新加載配置,并開啟新的工作進(jìn)程,,關(guān)閉就的進(jìn) 程,,此操作不會(huì)中斷請(qǐng)求 USR1 重新打開日志文件,用于切換日志,,例如每天生成 一個(gè)新的日志文件 USR2 平滑升級(jí)可執(zhí)行程序 WINCH 從容關(guān)閉工作進(jìn)程 NGINX_NAME="Nginx"
. /etc/rc.d/init.d/functions if [ ! -f $NGINX_SBIN ] then echo "$NGINX_NAME startup: $NGINX_SBIN not exists! " exit fi start() { ulimit -HSn $NGINX_MAXFD $NGINX_SBIN -c $NGINX_CONF ret=$? if [ $ret -eq 0 ]; then action $"Starting $NGINX_NAME: " /bin/true else action $"Starting $NGINX_NAME: " /bin/false fi } stop() { kill `cat $NGINX_PID` ret=$? if [ $ret -eq 0 ]; then action $"Stopping $NGINX_NAME: " /bin/true else action $"Stopping $NGINX_NAME: " /bin/false fi } restart() { stop start } check() { $NGINX_SBIN -c $NGINX_CONF -t } reload() { kill -HUP `cat $NGINX_PID` } relog() {
kill -USR1 `cat $NGINX_PID` } case "$1" in start) start ;; stop) stop ;; restart) restart ;; check) check ;; reload) reload ;; relog) relog ;; *) echo $"Usage: $0 {start|stop|restart|reload|check|relog}" exit 1 esac --------------------------------------------------------------------------- 5 ) chmod +x nginx.sh 6 ) 現(xiàn)在可以通過如下方式來控制 Nginx /usr/local/nginx/bin/nginx.sh start 啟動(dòng) /usr/local/nginx/bin/nginx.sh stop 關(guān)閉 /usr/local/nginx/bin/nginx.sh restart 重新啟動(dòng),,即先關(guān)閉后啟動(dòng) /usr/local/nginx/bin/nginx.sh reload 重新裝載配置文件 /usr/local/nginx/bin/nginx.sh check 檢查配置文件 /usr/local/nginx/bin/nginx.sh relog 重新打開日志文件 7. 7. 7. 7. 使用注意事項(xiàng)
1 ) 在生產(chǎn)運(yùn)行中,請(qǐng)注意 Nginx 的日志,,定期進(jìn)行日志文件的歸檔和截?cái)唷?BR>A 將現(xiàn)有日志文件 備份 ,; B /usr/local/nginx/bin/nginx.sh relog 2 ) 當(dāng)要求 reload (重新裝載配置文件)時(shí), N ginx 會(huì)對(duì)配置文件進(jìn)行檢查,, 如 果配置文件有錯(cuò),,那么會(huì)繼續(xù)使用舊的,,已裝載完畢的配置文件運(yùn)行,。為保 證生產(chǎn)系統(tǒng)的穩(wěn)定運(yùn)行,修改完配置文件后,,必須進(jìn)行 check 操作,,以確保 配置文件的正確性。 3 ) 為保證生產(chǎn)系統(tǒng)的穩(wěn)定運(yùn)行,, N ginx 與 php-cgi 的通訊端口請(qǐng)使用 tcp/ip 方式,,而不使用 unix 套接字。雖然 tcp/ip 效率較低,,但是相對(duì)穩(wěn)定,,而 且 可以將 php 運(yùn)行在其他機(jī)器上。當(dāng) php 應(yīng)用運(yùn)行較慢,并發(fā)請(qǐng)求多的情況 下 ,, 使用 unix 套接字容易導(dǎo)致連接失敗,,從而報(bào)告 502 錯(cuò)誤( Bad Gateway )。 Nginx Nginx Nginx Nginx 配置文件詳解 配置文件詳解 配置文件詳解 配置文件詳解 接下來,,觀察 一個(gè) Nginx 默認(rèn) 的配置文件 并解析其中的含義 #user nobody; ----- 工作進(jìn)程的屬主 # worker_processes 1; ----- 工作進(jìn)程數(shù),,一般與 CUP 的核數(shù)相同 # error_log logs/error.log; ----- 這三個(gè)是 Nginx 的錯(cuò)誤日志 # error_log logs/error.log notice; #error_log logs/error.log info; pid logs/nginx.pid; -----Nginx pid 文件存放路徑 events { # use epoll; -----Nginx 的工作模式, Linux 下性能最好的 event 模式 worker_connections 1024; ----- 每個(gè)工作進(jìn)程允許最大的同時(shí)連接數(shù) } -----http ,,設(shè)定 http 服務(wù)器,,利用它的反響代理功能,并可以利用它的負(fù)載 均 衡功能 http { include mime.types; ----- 設(shè)定 mime 類型 default_type application/octet-stream; ------ 以下是設(shè)定日志格式 log_format main '$remote_addr - $remote_user [$time_local] $request ' # '"$status" $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; ----- 日志文件名
sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; ----- 是否開啟 gzip 功能 -----server 設(shè)定虛擬主機(jī) server { listen 8 0 ; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443; # server_name localhost; # ssl on; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_timeout 5m; # ssl_protocols SSLv2 SSLv3 TLSv1; # ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #}
} (文件配置內(nèi)容在逐步更新) 從上面 Nginx 默認(rèn)的配置我們可以知道,,我們可以通過編寫相應(yīng)的模塊達(dá)到我 們 想要的效果,。 Nginx Nginx Nginx Nginx 中的全局變量 通過例子學(xué)習(xí) 小例子: 1. 禁止訪問某個(gè)目錄下的文件 location ~ ^/data { deny all; } 2. 禁止多個(gè)目錄 location ~ ^/(cron|templates)/ { deny all; break; $args $content_length $content_type $document_root $document_uri $host $http_user_agent $http_cookie $limit_rate $request_body_file $request_method $remote_addr $remote_port $remote_user $request_filename $request_uri $query_string $scheme $server_protocol $server_addr $server_name $server_port $uri }
3. 禁止以 /data 開頭的文件 location ~ ^/data { deny all; } 4. 禁止單個(gè)目錄 不能禁止 .log.txt 能請(qǐng)求 location /searchword/cron/ { deny all; } 5. 禁止單個(gè)文件 location ~ /data/sql/data.sql { deny all; } 6. 只允許固定的 IP 訪問并有密碼 location / { root /opt/htdocs/www; allow Address; allow Address; allow Address; deny all; auth_basic "C1G_ADMIN"; auth_basic_user_file htpasswd; } 7. 文件和目錄不存在的時(shí)候重定向: if (!-e $request_filename) { proxy_pass http://127.0.0.1; } (注意: Nginx 不允許 if 嵌套操作) 案例一: 要求 : 1) 配置兩個(gè)虛擬主機(jī),分別為: A www. 根連接為 /data/html/my, 端口為 80 B www.My_two.com.cn 根連接為 /data/html/my_two, 端口為 8080) 2) 針對(duì)兩個(gè)域名把 gif,jpg 圖片設(shè)置過期時(shí)間為 1 個(gè)月 3) 對(duì) html ,、 css ,、 js 進(jìn)行壓縮
1,2 的實(shí)現(xiàn) server { listen 8 0 ; server_name www. ; charset gb2312 ; access_log /data/my/ logs/host.access.log main; location / { root /data/html/my ; index index.html index.htm; } location ~*\.(gif|jpg)$ { Expires 30d; } } server { listen 8 080 ; server_name www.My_two.com.cn ; charset gb2312 ; #access_log logs/host.access.log main; location / { root /data/html/my_two ; index index.html index.htm; } location ~*\.(gif|jpg)$ { Expires 30d; } } 3 的實(shí)現(xiàn) 在 http 里添加 : gzip on; gzip_types text/plain text/css text/html text/javascript 案例二 利用 Nginx 實(shí)現(xiàn)負(fù)載均衡,來自 http://dianping.blog.51cto.com/427241/95274/ http {
include mime.types; 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"'; #access_log off; access_log logs/access.log;# 日志文件名 sendfile on; #tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; include gzip.conf; # 集群中的所有后臺(tái)服務(wù)器的配置信息 upstream tomcats { server 192.168.0.11:8080 weight=10; server 192.168.0.12:8081 weight=10; server 192.168.0.13:8080 weight=10; server 192.168.0.14:8081 weight=10; server 192.168.0.15:8080 weight=10; server 192.168.0.16:8081 weight=10; } server { listen 80;#HTTP 的端口 server_name localhost; charset utf-8; #access_log logs/host.access.log main; location ~ ^/NginxStatus/ { stub_status on; #Nginx 狀態(tài)監(jiān)控配置 access_log off; auth_basic "NginxStatus"; auth_basic_user_file /usr/local/nginx/conf/htpasswd; } location ~ ^/(WEB-INF)/ { deny all; } location ~ \.(htm|html|asp|php|gif|jpg|jpeg|png|bmp|ico|rar|css|js| zip|java|jar|txt|flv|swf|mid|doc|ppt|xls|pdf|txt|mp3|wma)$ { root /opt/webapp; expires 24h; }
location / { proxy_pass [url]http://tomcats;#[/url] 反向代理 include proxy.conf; } error_page 404 /html/404.html; # redirect server error pages to the static page /50x.html # error_page 502 503 /html/502.html; error_page 500 504 /50x.html; location = /50x.html { root html; } } } 更具體地書寫配置文件,,在介紹完 rewrite 后會(huì)有更詳細(xì)的介紹,。 Nginx 監(jiān)控 要使用 Nginx 的監(jiān)控功能必須有一個(gè)用戶和密碼,因此 我們必需生成一個(gè)
htppasswd 文件,,這時(shí)候我們得用到 Apache 的 htpasswd 工具了,。 生成 htppasswd 文件的方法: #htpasswd -c /tmp/htpassswd user 輸入兩次密碼就完成了,然后把生成好的 htpasswd 文件拷貝到 proxy 的機(jī) 器的 /usr/local/nginx/conf 目錄下就行了,。 有這個(gè)文件后,,我們還要配置 conf 文件才能應(yīng)用這一功能: 在根 {} 下書寫以下模塊 location ~^/NginxStatus{ stub_status on; access_log on; auth_basic "NginxStatus"; Auth_basic_user_file conf/htpasswd; } 這個(gè)時(shí)候我們可以從瀏覽器中輸入 http://ip/NginxStatus 輸入驗(yàn)證賬號(hào)后我們就可以看到相關(guān)的信息了,例如 ; Active connection:10 Server accepts handled requests 9309 8982 28890 Reading:1 Writing:3 Waiting:6 Nginx Rewrite 基礎(chǔ)
Rewrite 基本標(biāo)記 last 相當(dāng)于 Apache 里的 [L] 標(biāo)記,,表示完成 rewrite break 終止匹配 , 不再匹配后面的規(guī)則 redirect 返回 302 臨時(shí)重定向 地址欄會(huì)顯示跳轉(zhuǎn)后的地址 permanent 返回 301 永久重定向 地址欄會(huì)顯示跳轉(zhuǎn)后的地址 Rewrite Rewrite Rewrite Rewrite 正則表達(dá)式匹配 * ~ 為區(qū)分大小寫匹配 * ~* 為不區(qū)分大小寫匹配 * !~ 和 !~* 分別為區(qū)分大小寫不匹配及不區(qū)分大小寫不匹配 Rewrite Rewrite Rewrite Rewrite 條件判斷 -f 和 !-f 用來判斷是否存在文件 -d 和 !-d 用來判斷是否存在目錄 -e 和 !-e 用來判斷是否存在文件或目錄 -x 和 !-x 用來判斷文件是否可執(zhí)行 Rewrite 應(yīng)用實(shí)例 偽地址
/123456/xxxx -> /xxxx?id=123456
rewrite ^/(\d+)/(.+)/ /$2?id=$1 last; /[0-9]/my.html rewrite /(\d+)/my.html /friend/my_list.jsp?uid=$1; break; 通過偽地址能提高你網(wǎng)站的安全性,,這樣暴露給用戶的是一個(gè)假的地址。 域名跳轉(zhuǎn)
簡單域名跳轉(zhuǎn) server { listen 80; server_name sky .com; index index.html index.htm index.php; root /opt/ sky /www; rewrite ^/ http:// skybin090804.cublog .c n /; access_log off; } 多域名轉(zhuǎn)向 server_name www. www.; index index.html index.htm index.php; root /data/sky; if ($host ~ "sky\.net") { rewrite ^(.*) http://www.$1 permanent; } Nginx 相關(guān)知識(shí)在更新中 附錄
Nginx Nginx Nginx Nginx 編譯模塊名稱解析 編譯模塊名稱解析 編譯模塊名稱解析 編譯模塊名稱解析 – prefix=PATH 設(shè)定安裝目錄 – sbin-path=PATH 設(shè)定程序文件目錄 – conf-path=PATH 設(shè)定配置文件 (nginx.conf) 目錄 – error-log-path=PATH 設(shè)定錯(cuò)誤日志目錄 – pid-path=PATH 設(shè)定 pid 文件 (nginx.pid) 目錄 – lock-path=PATH 設(shè)定 lock 文件 (nginx.lock) 目錄 – user=USER 設(shè)定程序運(yùn)行的用戶環(huán)境 (www) – group=GROUP 設(shè)定程序運(yùn)行的組環(huán)境 (www) – builddir=DIR 設(shè)定程序編譯目錄 – with-rtsig_module 允許 rtsig 模塊 – with-select_module 允許 select 模塊 ( 一種輪詢模式 , 不推薦用在高載環(huán)境 ) – without-select_module 不使用 select 模塊 – with-poll_module 允許 poll 模塊 ( 一種輪詢模式 , 不推薦用在高載環(huán)境 ) – without-poll_module 不使用 poll 模塊 – with-http_ssl_module 允許 ngx_http_ssl_module 模塊 (Apache 對(duì)應(yīng) :mod_ssl) – with-http_realip_module 允許 ngx_http_realip_module 模塊 (mod_rpaf) – with-http_addit ion_module 允許 ngx_http_addit ion_module 模塊 (mod_layout) – with-http_xslt_module 允許 ngx_http_xslt_module 模塊 – with-http_sub_module 允許 ngx_http_sub_module 模塊 – with-http_dav_module 允許 ngx_http_dav_module 模塊 (mod_dav) – with-http_flv_module 允許 ngx_http_flv_module 模塊 (mod_flvx) – with-http_gzip_stat ic_module 允許 ngx_http_gzip_static_module 模塊 (mod_dflate) – with-http_random_index_module 允許 ngx_http_random_index_module 模塊 (mod_autoindex)
– with-http_stub_status_module 允許 ngx_http_stub_status_module 模塊 (mod_status) – without-http_charset_module 不使用 ngx_http_charset_module 模塊 – without-http_gzip_module 不使用 ngx_http_gzip_module 模塊 – without-http_ssi_module 不使用 ngx_http_ssi_module 模塊 – without-http_userid_module 不使用 ngx_http_userid_module 模塊 – without-http_access_module 不使用 ngx_http_access_module 模塊 – without-http_auth_basic_module 不使用 ngx_http_auth_basic_module 模塊 – without-http_autoindex_module 不使用 ngx_http_autoindex_module 模塊 – without-http_geo_module 不使用 ngx_http_geo_module 模塊 – without-http_map_module 不使用 ngx_http_map_module 模塊 – without-http_referer_module 不使用 ngx_http_referer_module 模塊 – without-http_rewrite_module 不使用 ngx_http_rewrite_module 模塊 – without-http_proxy_module 不使用 ngx_http_proxy_module 模塊 – without-http_fastcgi_module 不使用 ngx_http_fastcgi_module 模塊 – without-http_memcached_module 不使用 ngx_http_memcached_module 模塊 – without-http_limit_zone_module 不使用 ngx_http_limit_zone_module 模塊 – without-http_empty_gif_module 不使用 ngx_http_empty_gif_module 模塊 – without-http_browser_module 不使用 ngx_http_browser_module 模塊 – without-http_upstream_ip_hash_module 不使用 ngx_http_upstream_ip_hash_module 模塊 – with-http_perl_module 允許 ngx_http_perl_module 模塊 – with-perl_modules_path=PATH 設(shè)置 perl 模塊路徑 – with-perl=PATH 設(shè)置 perl 庫文件路徑 – http-log-path=PATH 設(shè)置 access log 文件路徑 – http-client-body-temp-path=PATH 設(shè)置客戶端請(qǐng)求臨時(shí)文件路徑 – http-proxy-temp-path=PATH 設(shè)置 http proxy 臨時(shí)文件路徑 – http-fastcgi-temp-path=PATH 設(shè)置 http fastcgi 臨時(shí)文件路徑 – without-http 不使用 HTTP server 功能 – with-mail 允許 POP3/IMAP4/SMTP 代理模塊 – with-mail_ssl_module 允許 ngx_mail_ssl_module 模塊 – without-mail_pop3_module 不允許 ngx_mail_pop3_module 模塊 – without-mail_imap_module 不允許 ngx_mail_imap_module 模塊 – without-mail_smtp_module 不允許 ngx_mail_smtp_module 模塊 – with-google_perftools_module 允許 ngx_google_perftools_module 模塊 ( 調(diào)試用 ) – with-cpp_test_module 允許 ngx_cpp_test_module 模塊 – add-module=PATH 允許使用外部模塊 , 以及路徑 – with-cc=PATH 設(shè)置 C 編譯器路徑 – with-cpp=PATH 設(shè)置 C 預(yù)處理路徑 – with-cc-opt=OPTIONS 設(shè)置 C 編譯器參數(shù) – with-ld-opt=OPTIONS 設(shè)置連接文件參數(shù) – with-cpu-opt=CPU 為指定 CPU 優(yōu)化 , 可選參數(shù)有 : pentium, pentiumpro, pentium3, pentium4, athlon, opteron, sparc32, sparc64, ppc64 – without-pcre 不使用 pcre 庫文件
– with-pcre=DIR 設(shè)定 PCRE 庫路徑 – with-pcre-opt=OPTIONS 設(shè)置 PCRE 運(yùn)行參數(shù) – with-md5=DIR 設(shè)定 md5 庫文件路徑 – with-md5-opt=OPTIONS 設(shè)置 md5 運(yùn)行參數(shù) – with-md5-asm 使用 md5 源文件編譯 – with-sha1=DIR 設(shè)定 sha1 庫文件路徑 – with-sha1-opt=OPTIONS 設(shè)置 sha1 運(yùn)行參數(shù) – with-sha1-asm 使用 sha1 源文件編譯 – with-zlib=DIR 設(shè)定 zlib 庫文件路徑 – with-zlib-opt=OPTIONS 設(shè)置 zlib 運(yùn)行參數(shù) – with-zlib-asm=CPU 使 zlib 對(duì)特定的 CPU 進(jìn)行優(yōu)化 , 可選參數(shù) : pentium, pentiumpro – with-openssl=DIR 設(shè)定 OpenSSL 庫文件路徑 – with-openssl-opt=OPTIONS 設(shè)置 OpenSSL 運(yùn)行參數(shù) – with-debug 允許調(diào)試日志 介紹一個(gè) Nginx 外部模塊 : ngx_http_accesskey_module 封堵下載軟件的好東東 , 只有遠(yuǎn)程 IP 地址符合加密字串的才被允許訪問 . 示例如下 : location /download { accesskey on; accesskey_hashmethod md5; accesskey_arg “ key ” ; accesskey_signature “ mypass$remote_addr ” ; } 模塊地址 : http://wiki./NginxHttpAccessKeyModule 其它更多外部模塊請(qǐng)?jiān)L問 : http://wiki./NginxModules 在 OpenBSD 環(huán)境下安裝 Nginx 需要注意下 , 在 ./configure 之后還需要修改一下源文件,,否則 后面 make 過不去 : vi +74 src/os/unix/ngx_posix_config.h 將這行的 malloc.h 改成 stdlib.h, 保存退出 . 然后再執(zhí)行 make && make install 即可 !< begin ajax random post data > 以上模塊解析來自: http://www.oschina.net/bbs/thread/719 |
|