Nginx (發音爲[engine x])專爲性能優化而開發,其最知名的優勢是它的穩定性和低系統資源消耗,以及對併發鏈接的高處理能力(單臺物理服務器可支持30000~50000個併發鏈接), 是一個高性能的 HTTP 和反向代理服務器,也是一個IMAP/POP3/SMTP 代理服務器,官網http://nginx.org/javascript
實際使用中,nginx主要應用場景有:反向代理,負載均衡php
前面幾篇文章有說明安裝完nginx以後,能夠經過/etc/nginx/nginx.conf 文件打開nginx配置文件下面分別對nginx各項參數配置項進行說明css
#運行用戶html
user nobody;
#啓動進程,一般設置成和cpu的數量相等java
worker_processes 1;
#全局錯誤日誌及PID文件node
#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;
#pid logs/nginx.pid;
#工做模式及鏈接數上限linux
events {nginx
#epoll是多路複用IO(I/O Multiplexing)中的一種方式,算法
#僅用於linux2.6以上內核,能夠大大提升nginx的性能 apache
use epoll;
#單個後臺worker process進程的最大併發連接數
worker_connections 1024;
# 併發總數是 worker_processes 和 worker_connections 的乘積
# 即 max_clients = worker_processes * worker_connections
# 在設置了反向代理的狀況下,max_clients = worker_processes * worker_connections / 4 爲何
# 爲何上面反向代理要除以4,應該說是一個經驗值
# 根據以上條件,正常狀況下的Nginx Server能夠應付的最大鏈接數爲:4 * 8000 = 32000
# worker_connections 值的設置跟物理內存大小有關
# 由於併發受IO約束,max_clients的值須小於系統能夠打開的最大文件數
# 而系統能夠打開的最大文件數和內存大小成正比,通常1GB內存的機器上能夠打開的文件數大約是10萬左右
# 咱們來看看360M內存的VPS能夠打開的文件句柄數是多少:
# $ cat /proc/sys/fs/file-max
# 輸出 34336
# 32000 < 34336,即併發鏈接總數小於系統能夠打開的文件句柄總數,這樣就在操做系統能夠承受的範圍以內
# 因此,worker_connections 的值需根據 worker_processes 進程數目和系統能夠打開的最大文件總數進行適當地進行設置
# 使得併發總數小於操做系統能夠打開的最大文件數目
# 其實質也就是根據主機的物理CPU和內存進行配置
# 固然,理論上的併發總數可能會和實際有所誤差,由於主機還有其餘的工做進程須要消耗系統資源。
# ulimit -SHn 65535
}
#設定http服務器
http {
#設定mime類型,類型由mime.type文件定義
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 logs/access.log main;
#sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,
#對於普通應用,必須設爲 on,
#若是用來進行下載等應用磁盤IO重負載應用,可設置爲 off,
#以平衡磁盤與網絡I/O處理速度,下降系統的uptime.
sendfile on;
#tcp_nopush on;
#鏈接超時時間
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#FastCGI相關參數是爲了改善網站的性能:減小資源佔用,提升訪問速度。下面參數看字面意思都能理解。
fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k;
#upstream的負載均衡,(以權重方式分發),weight是權重,能夠根據機器配置定義權重。weigth參數表示權值,權值越高被分配到的概率越大。
upstream blog.nginx.com { server 192.168.102.121:80 weight=3; server 192.168.102.122:80 weight=2; server 192.168.102.123:80 weight=1; }
#upstream的負載均衡,(以nginx熱備方式分發),其它全部的非backup Server down或者忙的時候,請求backup機器,因此這臺機器壓力會最輕
upstream blog.nginx.com { server 192.168.102.121:80; server 192.168.102.122:80; server 192.168.102.123:80 backup; }
#開啓gzip壓縮
gzip on;
gzip_disable "MSIE [1-6].";
#設定請求緩衝
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#設定虛擬主機配置
server {
#監聽80端口
listen 80;
#定義訪問地址,域名能夠有多個,用空格隔開
server_name www.nginx.cn nginx.cn ;
#定義服務器的默認網站根目錄位置
root html;
#設定本虛擬主機的訪問日誌
access_log logs/nginx.access.log main;
#默認請求
location / { #定義首頁索引文件的名稱 index index.php index.html index.htm; }
#對 「/」 啓用反向代理
location / { proxy_pass http://127.0.0.1:88; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; #後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #如下是一些反向代理的配置,可選。 proxy_set_header Host $host; client_max_body_size 10m; #容許客戶端請求的最大單文件字節數 client_body_buffer_size 128k; #緩衝區代理緩衝用戶端請求的最大字節數, proxy_connect_timeout 90; #nginx跟後端服務器鏈接超時時間(代理鏈接超時) proxy_send_timeout 90; #後端服務器數據回傳時間(代理髮送超時) proxy_read_timeout 90; #鏈接成功後,後端服務器響應時間(代理接收超時) proxy_buffer_size 4k; #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小 proxy_buffers 4 32k; #proxy_buffers緩衝區,網頁平均在32k如下的設置 proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #設定緩存文件夾大小,大於這個值,將從upstream服務器傳 }
#設定查看Nginx狀態的地址
location /NginxStatus { stub_status on; access_log on; auth_basic 「NginxStatus」; auth_basic_user_file conf/htpasswd; #htpasswd文件的內容能夠用apache提供的htpasswd工具來產生。 }
#全部jsp的頁面均交由tomcat或resin處理
location ~ .(jsp|jspx|do)?$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; }
#全部靜態文件由nginx直接讀取不通過tomcat或resin
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt |pdf|xls|mp3|wma)$ { expires 15d; } location ~ .*.(js|css)?$ { expires 1h; }
# 定義錯誤提示頁面
error_page 500 502 503 504 /50x.html; location = /50x.html { }
#靜態文件緩存時間設置,nginx本身處理
location ~ ^/(images|javascript|js|css|flash|media|static)/ { #過時30天,靜態文件不怎麼更新,過時能夠設大一點, #若是頻繁更新,則能夠設置得小一點。 expires 30d; }
#PHP 腳本請求所有轉發到 FastCGI處理. 使用FastCGI默認配置.
location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
#禁止訪問 .htxxx 文件
location ~ /.ht { deny all; }
Nginx中upstream有如下幾種方式:
一、輪詢(weight=1)
默認選項,當weight不指定時,各服務器weight相同, 每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。
upstream bakend { server 192.168.1.10; server 192.168.1.11; }
二、weight
指定輪詢概率,weight和訪問比率成正比,用於後端服務器性能不均的狀況。
若是後端服務器down掉,能自動剔除。
好比下面配置,則1.11服務器的訪問量爲1.10服務器的兩倍。
upstream bakend { server 192.168.1.10 weight=1; server 192.168.1.11 weight=2; }
三、ip_hash
每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session不能跨服務器的問題。
若是後端服務器down掉,要手工down掉。
upstream resinserver{ ip_hash; server 192.168.1.10:8080; server 192.168.1.11:8080; }
四、fair(第三方插件)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream resinserver{ server 192.168.1.10:8080; server 192.168.1.11:8080; fair; }
五、url_hash(第三方插件)
按訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器,後端服務器爲緩存服務器時比較有效。
在upstream中加入hash語句,hash_method是使用的hash算法
upstream resinserver{ server 192.168.1.10:8080; server 192.168.1.11:8080; hash $request_uri; hash_method crc32; }
設備的狀態有:
1.down 表示單前的server暫時不參與負載
2.weight 權重,默認爲1。 weight越大,負載的權重就越大。
3.max_fails 容許請求失敗的次數默認爲1。當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤
4.fail_timeout max_fails次失敗後,暫停的時間。
5.backup 備用服務器, 其它全部的非backup機器down或者忙的時候,請求backup機器。因此這臺機器壓力會最輕。
error_page 404 /404.html; location = /40x.html { } error_page 500 502 504 /50x.html; location = /50x.html { } error_page 503 /503.html; location = /usr/share/nginx/html/503.html { }
啓動nginx: nginx -c /etc/nginx/nginx.conf 重啓nginx: nginx -s reload //修改配置後從新加載生效 nginx -s reopen //從新打開日誌文件 nginx -t -c /etc/nginx/nginx.conf 測試nginx配置文件是否正確 關閉nginx: nginx -s stop //快速中止nginx quit //完整有序的中止nginx ps -ef | grep nginx;//查看nginx進程