個(gè)人整理資料,轉帖注明出處,謝謝~
Nginx介紹和安裝
一個(gè)簡(jiǎn)單的配置文件
模塊介紹
常用場(chǎng)景配置
進(jìn)階內容
參考資料
== Nginx介紹和安裝 ==
Nginx是一個(gè)自由、開(kāi)源、高性能及輕量級的HTTP服務(wù)器及反轉代理服務(wù)器,
其性能與IMAP/POP3代理服務(wù)器相當。Nginx以其高性能、穩定、功能豐富、配置簡(jiǎn)單及占用系統資源少而著(zhù)稱(chēng)。
Nginx 超越 Apache 的高性能和穩定性,使得國內使用 Nginx 作為 Web 服務(wù)器的網(wǎng)站也越來(lái)越多.
*基礎功能
處理靜態(tài)文件,索引文件以及自動(dòng)索引;
反向代理加速(無(wú)緩存),簡(jiǎn)單的負載均衡和容錯;
FastCGI,簡(jiǎn)單的負載均衡和容錯;
模塊化的結構。過(guò)濾器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI過(guò)濾器中,到同一個(gè) proxy 或者 FastCGI 的多個(gè)子請求并發(fā)處理;
SSL 和 TLS SNI 支持;
*優(yōu)勢
Nginx專(zhuān)為性能優(yōu)化而開(kāi)發(fā),性能是其最重要的考量, 實(shí)現上非常注重效率 。它支持內核Poll模型,能經(jīng)受高負載的考驗, 有報告表明能支持高達 50,000 個(gè)并發(fā)連接數。
Nginx作為負載均衡服務(wù)器: Nginx 既可以在內部直接支持 Rails 和 PHP 程序對外進(jìn)行服務(wù), 也可以支持作為 HTTP代理服務(wù)器對外進(jìn)行服務(wù)。
Nginx具有很高的穩定性。其它HTTP服務(wù)器,當遇到訪(fǎng)問(wèn)的峰值,或者有人惡意發(fā)起慢速連接時(shí),也很可能會(huì )導致服務(wù)器物理內存耗盡頻繁交換,失去響應,只能重啟服務(wù)器。
例如當前apache一旦上到200個(gè)以上進(jìn)程,web響應速度就明顯非常緩慢了。而Nginx采取了分階段資源分配技術(shù),使得它的CPU與內存占用率非常低。
nginx官方表示保持10,000個(gè)沒(méi)有活動(dòng)的連接,它只占2.5M內存,就穩定性而言, nginx比lighthttpd更勝一籌。
Nginx支持熱部署。它的啟動(dòng)特別容易, 并且幾乎可以做到7*24不間斷運行,即使運行數個(gè)月也不需要重新啟動(dòng)。你還能夠在不間斷服務(wù)的情況下,對軟件版本進(jìn)行進(jìn)行升級。
Nginx采用C進(jìn)行編寫(xiě), 不論是系統資源開(kāi)銷(xiāo)還是CPU使用效率都比 Perlbal 要好很多。
*nginx的安裝
開(kāi)發(fā)穩定版: Nginx 0.8.X
當前穩定版: Nginx 0.7.X
歷史穩定版: Nginx 0.6.X
- 1)pcre安裝,支持正則表達式
-
- http://www.pcre.org/
-
- # tar zxvf pcre-7.9.tar.gz
-
- # cd pcre-7.9
-
- #./configure
-
- # make && make install
-
- 2)openssl安裝(可選),支持安全協(xié)議的站點(diǎn)
-
- http://www.openssl.org/
-
- # tar zxvf openssl-0.9.8l.tar.gz
-
- # cd openssl-0.9.8l
-
- #./config
-
- # make && make install
-
- 3)nginx的安裝
-
- # tar zxvf nginx-0.7.64.tar.gz
-
- # cd nginx-0.7.64
-
- 配置安裝和不安裝組件:--with-MODULE_NAME or --without-MODULE_NAME
-
- # ./configure --prefix=/usr/local/nginx/nginx8011 --with-openssl=/usr/include/openssl --with-http_stub_status_module
-
- # make && make install
-
- 目錄結構:
-
- conf 配置文件
-
- html 靜態(tài)頁(yè)面
-
- logs 日志文件
-
- sbin 主程序
-
- 4)啟動(dòng)
-
- # /usr/local/nginx/nginx8011/sbin/nginx //啟動(dòng)
-
- 啟動(dòng)參數:
-
- -c </path/to/config> 為 Nginx 指定一個(gè)配置文件,來(lái)代替缺省的。
-
- -t 不運行,而僅僅測試配置文件。nginx 將檢查配置文件的語(yǔ)法的正確性,并嘗試打開(kāi)配置文件中所引用到的文件。
-
- -v 顯示 nginx 的版本。
-
- -V 顯示 nginx 的版本,編譯器版本和配置參數。
-
- 不啟動(dòng),僅測試配置文件:/usr/bin/nginx -t -c ~/mynginx.conf
-
- 5)配置自啟動(dòng)
== 一個(gè)簡(jiǎn)單的配置文件 ==
- #-----------------------------------基本模塊
-
- # 使用的用戶(hù)和組
-
- user www www;
-
- # 指定工作進(jìn)程數
-
- worker_processes 1;
-
- # 可以使用 [ debug | info | notice | warn | error | crit ] 參數
-
- #error_log logs/error.log;
-
- #error_log logs/error.log notice;
-
- # 指定 pid 存放的路徑
-
- #pid logs/nginx.pid;
-
- #-----------------------------------事件模塊
-
- events {
-
- #每個(gè)worker的最大連接數
-
- worker_connections 1024;
-
- }
-
- #-----------------------------------HTTP 模塊
-
- http {
-
- #包含一個(gè)文件描述了:不同文件后綴對應的MIME,見(jiàn)案例分析
-
- include mime.types;
-
- #制定默認MIME類(lèi)型為二進(jìn)制字節流
-
- default_type application/octet-stream;
-
- #指令 access_log 指派路徑、格式和緩存大小。
-
- #access_log off;
-
- #開(kāi)啟調用Linux的sendfile(),提供文件傳輸效率
-
- sendfile on;
-
- #是否允許使用socket的TCP_NOPUSH或TCP_CORK選項
-
- #tcp_nopush on;
-
- #指定客戶(hù)端連接保持活動(dòng)的超時(shí)時(shí)間,在這個(gè)時(shí)間之后,服務(wù)器會(huì )關(guān)掉連接。
-
- keepalive_timeout 65;
-
- #設置gzip,壓縮文件
-
- #gzip on;
-
- #為后端服務(wù)器提供簡(jiǎn)單的負載均衡
-
- upstream apaches {
-
- server 127.0.0.1:8001;
-
- server 127.0.0.1:8002;
-
- }
-
- #配置一臺虛擬機
-
- server {
-
- listen 8012;
-
- server_name localhost;
-
- location / {
-
- proxy_pass http://apaches;
-
- }
- }
- }
== 模塊介紹 ==
模塊劃分:
#Core 核心模塊
#Events 事件模塊
#HTTP HTTP模塊
#Mail 郵件模塊
*核心模塊的常用組件
- user
-
- 語(yǔ)法: user user [group]
-
- 缺省值: nobody nobody
-
- 指定Nginx Worker進(jìn)程運行用戶(hù),默認是nobody賬號。
-
- error_log
-
- 語(yǔ)法: error_log file [ debug | info | notice | warn | error | crit ]
-
- 缺省值: ${prefix}/logs/error.log
-
- 制定錯誤日志的存放位置和級別。
-
- include
-
- 語(yǔ)法: include file | *
-
- 缺省值: none
-
- include 指令還支持像下面配置一樣的全局包含的方法,例如包含一個(gè)目錄下所有以".conf"結尾的文件: include vhosts/*.conf;
-
- pid
-
- 語(yǔ)法: pid file
-
- 進(jìn)程id存儲文件??梢允褂?nbsp;kill -HUP cat /var/log/nginx.pid/ 對Nginx進(jìn)行配置文件重新加載。
-
- worker_processes
-
- 語(yǔ)法: worker_processes number
-
- 缺省值: 1
-
- 指定工作進(jìn)程數。nginx可以使用多個(gè)worker進(jìn)程。
*事件模塊的常用組件
- worker_connections
-
- 語(yǔ)法:worker_connections number
-
- 通過(guò)worker_connections和worker_proceses可以計算出maxclients: max_clients = worker_processes * worker_connections
-
- 作為反向代理,max_clients為: max_clients = worker_processes * worker_connections/4 ,因為瀏覽器訪(fǎng)問(wèn)時(shí)會(huì )通過(guò)連接池建立多個(gè)連接。
-
- use
-
- 語(yǔ)法:use [ kqueue | rtsig | epoll | /dev/poll | select | poll | eventport ]
-
- 如果在./configure的時(shí)候指定了不止一種事件模型,那么可以設置其中一個(gè),以便告訴nginx使用哪種事件模型。默認情況下nginx會(huì )在./configure時(shí)找出最適合系統的事件模型。
-
- 事件模型是指Nginx處理連接的方法。
*HTTP模塊的核心組件和變量
- 三個(gè)作用域:http, server, location
-
- server
-
- 語(yǔ)法:server {...}
-
- 作用域: http
-
- 配置一臺虛擬機。
-
- location
-
- 語(yǔ)法: location [=|~|~*|^~] /uri/ { ... }
-
- 作用域: server
-
- 配置訪(fǎng)問(wèn)路徑的處理方法。
-
- listen
-
- 語(yǔ)法: listen address:port [ default [ backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ssl ]
-
- 默認值: listen 80
-
- 作用域: server
-
- 指定當前虛擬機的監聽(tīng)端口。
-
- alias
-
- 語(yǔ)法: alias file-path|directory-path;
-
- 作用域: location
-
- 該指令設置指定location使用的路徑.注意它跟 root 相似,但是不改變文件的根路徑,僅僅是使用文件系統路徑
-
- root
-
- 語(yǔ)法: root path
-
- 默認值:root html
-
- 作用域:http, server, location
-
- alias指定的目錄是準確的,root是指定目錄的上級目錄,并且該上級目錄要含有location指定名稱(chēng)的同名目錄。
-
- 區別:
-
- location /abc/ {
-
- alias /home/html/abc/;
-
- }
-
- 在這段配置下,http://test/abc/a.html就指定的是/home/html/abc/a.html。這段配置亦可改成
-
- location /abc/ {
-
- root /home/html/;
-
- }
-
- 這樣,nginx就會(huì )去找/home/html/目錄下的abc目錄了,得到的結果是相同的。
-
- HTTP模塊的其他基本組件將結合案例介紹。
-
- 變量:
-
- HTTP header 里邊 特定HEADER的值,變量會(huì )轉成小寫(xiě),比如 $http_user_agent, $http_referer... header信息 "YOUR-STRANGE-HEADER: values" 能通過(guò) $http_your_strange_header獲得.
-
- $arg_PARAMETER
-
- $http_HEADER
-
- $query_string = $args
*郵件模塊的常用組件(略)
== 常用場(chǎng)景配置 ==
1.多臺服務(wù)器配置負載均衡
- http {
-
- include mime.types;
-
- default_type application/octet-stream;
-
- sendfile on;
-
- keepalive_timeout 65;
-
- upstream allserver {
-
- #ip_hash;
-
- server 127.0.0.1:8083 down;
-
- server 127.0.0.1:8084 weight=3;
-
- server 127.0.0.1:8001;
-
- server 127.0.0.1:8002 backup;
-
- }
- server {
-
- listen 8012;
-
- server_name localhost;
-
- location / {
-
- proxy_pass http://allserver;
-
- }
- }
- }
ip_hash; nginx中的ip_hash技術(shù)能夠將某個(gè)ip的請求定向到同一臺后端,這樣一來(lái)這個(gè)ip下的某個(gè)客戶(hù)端和某個(gè)后端就能建立起穩固的session
1.down 表示單前的 server 暫時(shí)不參與負載
2.weight 默認為 1.weight 越大,負載的權重就越大。
3.backup: 其它所有的非 backup 機器 down 或者忙的時(shí)候,請求 backup機器。所以這臺機器壓力會(huì )最輕。
2.通過(guò)手機客戶(hù)端的頭信息或者請求的參數轉發(fā)到不用目錄
- http {
-
- include mime.types;
-
- default_type application/octet-stream;
-
- sendfile on;
-
- keepalive_timeout 65;
-
- upstream apaches {
-
- server 127.0.0.1:8001;
-
- server 127.0.0.1:8002;
-
- }
-
- upstream tomcats {
-
- server 127.0.0.1:8083;
-
- server 127.0.0.1:8084;
-
- }
- server {
-
- listen 8012;
-
- server_name localhost;
-
- location / {
-
- set $ismob 0;
-
- # 注意if后的空格
-
- if ( $http_chip ~* "(NOKIA3500)|(NOKIA3200)" )
-
- {
-
- set $ismob 1;
-
- proxy_pass http://apaches;
-
- }
-
- if ( $http_chip ~* "(NOKIA3500)|(NOKIA3200)" )
-
- {
-
- set $ismob 1;
-
- proxy_pass http://tomcats;
-
- }
-
- if ( $ismob = 0 )
-
- {
-
- root /usr/local/nginx/nginx8012/html;
-
- }
- }
-
- location ~* /rewrite/testXID.jsp {
-
- if ( $arg_XID = "13800138000")
-
- {
-
- rewrite ^(.*)$ http://192.168.0.190:8084/testSID.jsp break;
-
- }
-
- }
- }
-
- }
1、正則表達式匹配,其中:
= 完全相等;
~為區分大小寫(xiě)匹配;
~*為不區分大小寫(xiě)匹配;
!~和!~*分別為區分大小寫(xiě)不匹配及不區分大小寫(xiě)不匹配。
2、文件及目錄匹配,其中:
-f和!-f用來(lái)判斷是否存在文件;
-d和!-d用來(lái)判斷是否存在目錄;
-e和!-e用來(lái)判斷是否存在文件或目錄;
-x和!-x用來(lái)判斷文件是否可執行。
if (-d $request_filename){ ... }
哪些地方會(huì )出現正則表達式:
1.location ~* /.(gif|jpg|png|swf|flv)${...}
2.rewrite ^(.*)$ /nginx-ie/$1 break;
正則表達式舉例:
1.多目錄轉成參數 abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2
if ($host ~* (.*)/.domain/.com) {
set $sub_name $1;
rewrite ^/sort//(/d+)//?$ /index.php?act=sort&cid=$sub_name&id=$1 last;
}
2.目錄對換 /123456/xxxx -> /xxxx?id=123456
rewrite ^/(/d+)/(.+)/ /$2?id=$1 last;
3.防盜鏈
- http {
-
- include mime.types;
-
- default_type application/octet-stream;
-
- sendfile on;
-
- keepalive_timeout 65;
-
- server {
-
- listen 8012;
-
- server_name localhost;
-
- location / {
-
- root html;
-
- }
-
- location ~* ^.+/.(gif|jpg|png|swf|flv|rar|zip)$ {
-
- valid_referers none blocked server_names http://localhost baidu.com;
-
- if ($invalid_referer) {
-
- rewrite ^/ html/50x.html;
-
- }
-
- }
- }
-
- }
4.訪(fǎng)問(wèn)控制:身份驗證、限制IP
- http {
-
- include mime.types;
-
- default_type application/octet-stream;
-
- sendfile on;
-
- keepalive_timeout 65;
-
- upstream tomcats {
-
- server 127.0.0.1:8083;
-
- server 127.0.0.1:8084;
-
- }
- server {
-
- listen 8012;
-
- server_name localhost;
-
- location / {
-
- allow 192.168.4.8;
-
- deny all;
-
- auth_basic "index";
-
- auth_basic_user_file ../htpasswd;
-
- proxy_pass http://tomcats;
-
- }
- }
- }
cp /usr/local/apache/apache8001/bin/htpasswd /usr/local/bin/
/usr/local/bin/htpasswd -c htpasswd root
5.查看Nginx的運行狀態(tài)
- http {
-
- include mime.types;
-
- default_type application/octet-stream;
-
- sendfile on;
-
- keepalive_timeout 65;
-
- upstream apaches {
-
- server 127.0.0.1:8001;
-
- server 127.0.0.1:8002;
-
- }
-
- upstream tomcats {
-
- server 127.0.0.1:8083;
-
- server 127.0.0.1:8084;
-
- }
-
- server {
-
- listen 8012;
-
- server_name localhost;
-
- location / {
-
- proxy_pass http://tomcats;
-
- }
-
- location /NginxStatus {
-
- stub_status on;
-
- access_log off;
-
- auth_basic "NginxStatus";
-
- auth_basic_user_file ../htpasswd;
-
- }
- }
- }
== 進(jìn)階內容 ==
1.查看Nginx的運行狀態(tài)
Active connections: 364
server accepts handled requests
5477919 5477919 17515830
Reading: 10 Writing: 26 Waiting: 328
意思如下:
active connections – 當前 Nginx 正處理的活動(dòng)連接數。
serveraccepts handled requests -- 總共處理了 5477919 個(gè)連接 , 成功創(chuàng )建 5477919 次握手 (證明中間沒(méi)有失敗的 ), 總共處理了 17515830 個(gè)請求 ( 平均每次握手處理了 3.2 個(gè)數據請求 )。
reading -- nginx 讀取到客戶(hù)端的 Header 信息數。
writing -- nginx 返回給客戶(hù)端的 Header 信息數。
waiting -- 開(kāi)啟 keep-alive 的情況下,這個(gè)值等于 active - (reading + writing),意思就是 Nginx 已經(jīng)處理完正在等候下一次請求指令的駐留連接。
2.案例分析:
將web server由apache換為nginx后,卻帶來(lái)意想不到的問(wèn)題.多個(gè)頁(yè)面顯示模塊顯示"正在加載中..."然后一直停頓,使用FireBug調試前端,XSL文件解析失敗.但載入又是HTTP 200 的正常狀態(tài).
繼續用FireBug調試,發(fā)現XSL文件下載時(shí)的HTTP響應頭中,
Content-Type是oct/stream ,而在原來(lái)的apache中,是text/xml,于是修改/etc/nginx/mime.types文件.將XSL的擴展名加到xml組中.問(wèn)題解決.
3. 通過(guò)系統的信號控制 Nginx
使用信號加載新的配置
平滑升級到新的二進(jìn)制代碼
4. 使用Nginx限制下載速率和并發(fā)數
limit_zone limit_conn limit_rate
5. 使用Nginx進(jìn)行地址轉發(fā)
rewrite
nginx rewrite中last和break的區別: http://blog.sina.com.cn/s/blog_4b01279a0100hd4c.html
6.Nginx Internals: Nginx源代碼、內部機制的分析
http://blog.zhuzhaoyuan.com/2009/09/nginx-internals-slides-video/
== 參考資料 ==
Nginx中文文檔:
http://wiki.nginx.org/NginxChs
服務(wù)器系統架構分析日志:
http://www.sudone.com/
使用 Nginx 提升網(wǎng)站訪(fǎng)問(wèn)速度:
http://www.ibm.com/developerworks/cn/web/wa-lo-nginx/
Nginx介紹和安裝
一個(gè)簡(jiǎn)單的配置文件
模塊介紹
常用場(chǎng)景配置
進(jìn)階內容
參考資料