定義Nginx運行的用戶和用戶組
user www www;
進程數
建議設置為等于CPU總核心數。
worker_processes 8;
全局錯誤日志
全局錯誤日志定義類型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;
進程文件
pid /var/run/nginx.pid;
打開的最多文件描述符
一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(系統的值ulimit -n)與nginx進程數相除,但是nginx分配請求并不均勻,所以建議與ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
event
單個進程最大連接數
并發總數是 worker_processes 和 worker_connections 的乘積
即 max_clients = worker_processes * worker_connections
在設置了反向代理的情況下,max_clients = worker_processes * worker_connections / 4 為什么 為什么上面反向代理要除以4,應該說是一個經驗值根據以上條件,正常情況下的Nginx Server可以應付的最大連接數為:4 * 8000 = 32000worker_connections 值的設置跟物理內存大小有關
因為并發受IO約束,max_clients的值須小于系統可以打開的最大文件數
工作模式與連接數上限
events {
參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是linux 2.6以上版本內核中的高性能網絡I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
單個進程最大連接數(最大連接數=連接數*進程數)
worker_connections 65535;
}
查看可以打開的文件句柄數是多少
cat /proc/sys/fs/file-max
并發連接總數小于系統可以打開的文件句柄總數,這樣就在操作系統可以承受的范圍之內
所以,worker_connections 的值需根據 worker_processes 進程數目和系統可以打開的最大文件總數進行適當地進行設置,使得并發總數小于操作系統可以打開的最大文件數目,其實質也就是根據主機的物理CPU和內存進行配置
查看系統限制 ulimit -a
打開文件句柄數量限制
是Linux操作系統對一個進程打開的文件句柄數量的限制(也包含打開的SOCKET數量,可影響MySQL的并發連接數目)
系統總限制: /proc/sys/fs/file-max
當前使用句柄數:/proc/sys/fs/file-nr
修改句柄數:ulimit -SHn 65535
http
include mime.types; #文件擴展名與文件類型映射表
default_type Application/octet-stream; #默認文件類型
charset utf-8; #默認編碼
client_header_buffer_size 32k; #上傳文件大小限制
sendfile
sendfile on; 開啟高效文件傳輸模式
sendfile指令指定nginx是否調用sendfile函數來輸出文件,對于普通應用設為 on,如果用來進行下載等應用磁盤IO重負載應用,可設置為off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改成off。
sendfile()還能夠用來在兩個文件夾之間移動數據
tcp_nopush 在linux/Unix系統中優化tcp數據傳輸,僅在sendfile開啟時有效
autoindex on;#開啟目錄列表訪問,合適下載服務器,默認關閉。
keepalive_timeout 120;#長連接超時時間,單位是秒
gzip
gzip on; 開啟gzip壓縮輸出
gzip_min_length 1k; 設置允許壓縮的頁面最小字節數
頁面字節數從header頭得content-length中進行獲取。默認值是0,不管頁面多大都壓縮。建議設置成大于2k的字節數,小于2k可能會越壓越大。
gzip_buffers 4 16k; 設置系統獲取幾個單位的緩存用于存儲gzip的壓縮結果數據流。
例如 4 4k 代表以4k為單位,按照原始數據大小以4k為單位的4倍申請內存。 4 8k 代表以8k為單位,按照原始數據大小以8k為單位的4倍申請內存。 如果沒有設置,默認值是申請跟原始數據相同大小的內存空間去存儲gzip壓縮結果。
gzip_http_version 1.0;壓縮版本(默認1.1,前端如果是squid2.5請使用1.0)
gzip_comp_level 2; 壓縮級別,1-10,數字越大壓縮的越好,也越占用CPU時間
gzip_types text/plain application/x-JAVAscript text/css application/xml; 壓縮類型
默認就已經包含text/html,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn。
默認值: gzip_types text/html (默認不對js/css文件進行壓縮)
壓縮類型,匹配MIME類型進行壓縮
設置哪壓縮種文本文件可參考 conf/mime.types
gzip_disable "MSIE [1-6].";E6及以下禁止壓縮
gzip_vary on;給CDN和代理服務器使用,針對相同url,可以根據頭信息返回壓縮和非壓縮副本
server
listen 80; 監聽端口
server_name www.fangzy.me; 域名可以有多個,用空格隔開
charset koi8-r; 編碼集
日志相關
access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main;
root /data; 主目錄
index index.html; 默認頁
虛擬主機
虛擬主機是一種特殊的軟硬件技術,它可以將網絡上的每一臺計算機分成多個虛擬主機,每個虛擬主機可以獨立對外提供www服務,這樣就可以實現一臺主機對外提供多個web服務,每個虛擬主機之間是獨立的,互不影響的
通過nginx可以實現虛擬主機的配置,nginx支持三種類型的虛擬主機配置
- 基于ip的虛擬主機, (一塊主機綁定多個ip地址)
- 基于域名的虛擬主機(servername)
- 基于端口的虛擬主機(listen如果不寫ip端口模式)
http
server {
表示一個虛擬主機
}
}
location
映射/虛擬目錄
location = / {
[ configuration A ]
}
?
location / {
[ configuration B ]
}
?
location /documents/ {
[ configuration C ]
}
?
location ^~ /images/ {
[ configuration D ]
}
?
location ~* .(gif|jpg|jpeg)$ {
[ configuration E ]
}
location [ = | ~ | ~* | ^~ ] uri { ... }
location URI {} 對當前路徑及子路徑下的所有對象都生效;
location = URI {} 注意URL最好為具體路徑。 精確匹配指定的路徑,不包括子路徑,因此,只對當前資源生效;
location ~ URI {} location ~* URI {} 模式匹配URI,此處的URI可使用正則表達式,~區分字符大小寫,~*不區分字符大小寫;
location ^~ URI {} 禁用正則表達式
優先級:= > ^~ > ~|~* > /|/dir/
location配置規則
location 的執行邏輯跟 location 的編輯順序無關。 矯正:這句話不全對,“普通 location ”的匹配規則是“最大前綴”,因此“普通 location ”的確與 location 編輯順序無關;
但是“正則 location ”的匹配規則是“順序匹配,且只要匹配到第一個就停止后面的匹配”;
“普通location ”與“正則 location ”之間的匹配順序是?先匹配普通 location ,再“考慮”匹配正則 location 。
注意這里的“考慮”是“可能”的意思,也就是說匹配完“普通 location ”后,有的時候需要繼續匹配“正則 location ”,有的時候則不需要繼續匹配“正則 location ”。兩種情況下,不需要繼續匹配正則 location :
- ( 1 )當普通 location 前面指定了“ ^~ ”,特別告訴 Nginx 本條普通 location 一旦匹配上,則不需要繼續正則匹配;
- ( 2 )當普通location 恰好嚴格匹配上,不是最大前綴匹配,則不再繼續匹配正則
IP訪問控制
location {
deny IP /IP段
deny 192.168.1.109;
allow 192.168.1.0/24;192.168.0.0/16;192.0.0.0/8
}
用戶認證訪問
模塊ngx_http_auth_basic_module 允許使用“HTTP基本認證”協議驗證用戶名和密碼來限制對資源的訪問
location ~ (.*).avi$ {
auth_basic "closed site";
auth_basic_user_file conf/users;
}
賬號密碼通過httpd-tools配置
yum install httpd
htpasswd -c -d /usr/local/users zhangyang
nginx訪問狀態監控
location /basic_status {
stub_status on;
}
反向代理
通常的代理服務器,只用于代理內部網絡對Internet的連接請求,客戶機必須指定代理服務器,并將本來要直接發送到Web服務器上的http請求發送到代理服務器中由代理服務器向Internet上的web服務器發起請求,最終達到客戶機上網的目的。
反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器
location /basic_status {
proxy_pass http://localhost/
}
upstream
反向代理配合upstream使用
upstream httpds {
server 192.168.43.152:80;
server 192.168.43.153:80;
}
weight(權重)
指定輪詢幾率,weight和訪問比率成正比,用于后端服務器性能不均的情況。
upstream httpds {
server 127.0.0.1:8050 weight=10 down;
server 127.0.0.1:8060 weight=1;
server 127.0.0.1:8060 weight=1 backup;
}
- down:表示當前的server暫時不參與負載
- weight:默認為1.weight越大,負載的權重就越大。
- backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。
max_conns
可以根據服務的好壞來設置最大連接數,防止掛掉,比如1000,我們可以設置800
upstream httpds {
server 127.0.0.1:8050 weight=5 max_conns=800;
server 127.0.0.1:8060 weight=1;
}
max_fails、 fail_timeout
max_fails:失敗多少次 認為主機已掛掉則,踢出,公司資源少的話一般設置2~3次,多的話設置1次
max_fails=3 fail_timeout=30s代表在30秒內請求某一應用失敗3次,認為該應用宕機,后等待30秒,這期間內不會再把新請求發送到宕機應用,而是直接發到正常的那一臺,時間到后再有請求進來繼續嘗試連接宕機應用且僅嘗試1次,如果還是失敗,則繼續等待30秒...以此循環,直到恢復。
upstream httpds {
server 127.0.0.1:8050 weight=1 max_fails=1 fail_timeout=20;
server 127.0.0.1:8060 weight=1;
}
負載均衡算法
輪詢、 weight、 ip_hash、 url_hash、 least_conn、 least_time
健康檢查模塊
配置一個status的location
location /status {
check_status;
}
在upstream配置如下
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "HEAD / HTTP/1.0rnrn";
check_http_expect_alive http_2xx http_3xx;