nginx配置文件結構
main
events {
....
}
http {
....
upstream myproject {
.....
}
server {
....
location {
....
}
}
server {
....
location {
....
}
}
....
}
從文件結構可知配置文件主要由一下六部分組成:
main(全局設置)
events(nginx工作模式)
http(http設置)
sever(主機設置)
location(URL匹配)
upstream(負載均衡服務器設置)
main(全局設置)
user nobody nobody;
worker_processes 2;
error_log /usr/local/var/log/nginx/error.log notice;
pid /usr/local/var/run/nginx/nginx.pid;
worker_rlimit_nofile 1024;
user 來指定Nginx Worker進程運行用戶以及用戶組,默認由nobody賬號運行。
worker_processes 來指定了Nginx要開啟的子進程數。每個Nginx進程平均耗費10M~12M內存。根據經驗,一般指定1個進程就足夠了,如果是多核CPU,建議指定和CPU的數量一樣的進程數即可。我這里寫2,那么就會開啟2個子進程,總共3個進程。
建議值 <= cpu核心數量,一般高于cpu數量不會帶好處,也許還有進程切換開銷的負面影響
worker_processes 4;
將work process綁定到特定cpu上,避免進程在cpu間切換的開銷
worker_cpu_affinity 0001 0010 0100 1000
8內核4進程時的設置方法 worker_cpu_affinity 00000001 00000010 00000100 10000000
error_log 用來定義全局錯誤日志文件。日志輸出級別有debug、info、notice、warn、error、crit可供選擇,其中,debug輸出日志最為最詳細,而crit輸出日志最少。
pid 用來指定進程id的存儲文件位置。
worker_rlimit_nofile 用于指定一個nginx進程可以打開的最多文件描述符數目,這里是65535,需要使用命令“ulimit -n 65535”來設置。
每進程最大可打開文件描述符數量(linux上文件描述符比較廣義,網絡端口、設備、磁盤文件都是)# 文件描述符用完了,新的連接會被拒絕,產生502類錯誤
linux最大可打開文件數可通過ulimit -n FILECNT或 /etc/security/limits.conf配置
理論值 系統最大數量 / 進程數。但進程間工作量并不是平均分配的,所以可以設置的大一些
events(nginx工作模式)
events {
use kqueue; #mac平臺
worker_connections 1024;
}
use 用來指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是標準的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平臺上,而kqueue用在BSD系統中,因為Mac基于BSD,所以Mac也得用這個模式,對于Linux系統,epoll工作模式是首選。
worker_connections
用于定義Nginx每個進程的最大連接數,即接收前端的最大請求數,默認是1024。最大客戶端連接數由worker_processes和worker_connections決定,即Max_clients=worker_processes*worker_connections,因為一般一個瀏覽器會同時開兩條連接,所以在做靜態服務器時,一般 maxClient = work_connectins * worker_processes / 2,在作為反向代理時,Max_clients變為:Max_clients = worker_processes * worker_connections/4。
進程的最大連接數值理論上越大越好,但最多可承受多少請求與配件和網絡相關,也可最大可打開文件,最大可用sockets數量(約64K)。
http(http設置)
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"';
# 關閉此項可減少IO開銷,但也無法記錄訪問信息,不利用業務分析,一般運維情況不建議使用
access_log off
# 只記錄更為嚴重的錯誤日志,可減少IO壓力
error_log logs/error.log crit;
#access_log logs/access.log main;
# 啟用內核復制模式,應該保持開啟達到最快IO效率
sendfile on;
# 簡單說,啟動如下兩項配置,會在數據包達到一定大小后再發送數據
# 這樣會減少網絡通信次數,降低阻塞概率,但也會影響響應及時性
# 比較適合于文件下載這類的大數據包通信場景
#tcp_nopush on; 在
#tcp_nodelay on|off on禁用Nagle算法
#keepalive_timeout 0;
# HTTP1.1支持持久連接alive
# 降低每個連接的alive時間可在一定程度上提高可響應連接數量,所以一般可適當降低此值
keepalive_timeout 30s;
# 啟動內容壓縮,有效降低網絡流量
gzip on;
# 過短的內容壓縮效果不佳,壓縮過程還會浪費系統資源
gzip_min_length 1000;
# 可選值1~9,壓縮級別越高壓縮率越高,但對系統性能要求越高
gzip_comp_level 4;
# 壓縮的內容類別
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# 靜態文件緩存
# 最大緩存數量,文件未使用存活期
open_file_cache max=655350 inactive=20s;
# 驗證緩存有效期時間間隔
open_file_cache_valid 30s;
# 有效期內文件最少使用次數
open_file_cache_min_uses 2;
upstream myproject {
.....
}
server {
....
}
}
include 來用設定文件的mime類型,類型在配置文件目錄下的mime.type文件定義,來告訴nginx來識別文件類型。
default_type 設定了默認的類型為二進制流,也就是當文件類型未定義時使用這種方式,例如在沒有配置asp 的locate 環境時,Nginx是不予解析的,此時,用瀏覽器訪問asp文件就會出現下載了。
log_format 用于設置日志的格式,和記錄哪些參數,這里設置為main,剛好用于access_log來紀錄這種類型。
main的類型日志如下:也可以增刪部分參數。
127.0.0.1 - - [21/Apr/2016:18:09:54 +0800] "GET /index.php HTTP/1.1" 200 87151 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36"
access_log 用來紀錄每次的訪問日志的文件地址,后面的main是日志的格式樣式,對應于log_format的main。
sendfile 參數用于開啟高效文件傳輸模式。將tcp_nopush和tcp_nodelay兩個指令設置為on用于防止網絡阻塞。
keepalive_timeout 設置客戶端連接保持活動的超時時間。在超過這個時間之后,服務器會關閉該連接。
靜態文件緩存 open_file_cache max=655350 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; 表示30秒檢查一次,20s內訪問超過2次則緩存有效,否則緩存無效。
sever(主機設置)
server {
listen 8080;
server_name localhost 192.168.12.10 www.wjk.com;
# 全局定義,如果都是這一個目錄,這樣定義最簡單。
root /Users/wjk/www;
index index.php index.html index.htm;
charset utf-8;
access_log usr/local/var/log/host.access.log main;
aerror_log usr/local/var/log/host.error.log error;
....
}
server 標志定義虛擬主機開始。
listen 用于指定虛擬主機的服務端口。
server_name 用來指定IP地址或者域名,多個域名之間用空格分開。
root 表示在這整個server虛擬主機內,全部的root web根目錄。注意要和locate {}下面定義的區分開來。
index 全局定義訪問的默認首頁地址。注意要和locate {}下面定義的區分開來。
charset 用于設置網頁的默認編碼格式。
access_log 用來指定此虛擬主機的訪問日志存放路徑,最后的main用于指定訪問日志的輸出格式。
location(URL匹配)
location / {
root /Users/wjk/www;
index index.php index.html index.htm;
}
location /表示匹配訪問根目錄。
location配置詳解參考
root 指令用于指定訪問根目錄時,虛擬主機的web目錄,這個目錄可以是相對路徑(相對路徑是相對于nginx的安裝目錄)。也可以是絕對路徑。
index 用于設定我們只輸入域名后訪問的默認首頁地址,有個先后順序:index.php index.html index.htm,如果沒有開啟目錄瀏覽權限,又找不到這些默認首頁,就會報403錯誤。
upstream(負載均衡服務器設置)
upstream iyangyi.com{
ip_hash;
server 192.168.12.1:80;
server 192.168.12.2:80 down;
server 192.168.12.3:8080 max_fails=3 fail_timeout=20s;
server 192.168.12.4:8080;
}
Nginx的負載均衡模塊目前支持4種調度算法:
weight 輪詢(默認):每個請求按時間順序逐一分配到不同的后端服務器,如果后端某臺服務器宕機,故障系統被自動剔除,使用戶訪問不受影響。weight。指定輪詢權值,weight值越大,分配到的訪問機率越高,主要用于后端每個服務器性能不均的情況下。
ip_hash:每個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個后端服務器,有效解決了動態網頁存在的session共享問題。
fair:比上面兩個更加智能的負載均衡算法。此種算法可以依據頁面大小和加載時間長短智能地進行負載均衡,也就是根據后端服務器的響應時間來分配請求,響應時間短的優先分配。Nginx本身是不支持fair的,如果需要使用這種調度算法,必須下載Nginx的upstream_fair模塊。
url_hash:按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,可以進一步提高后端緩存服務器的效率。Nginx本身是不支持url_hash的,如果需要使用這種調度算法,必須安裝Nginx 的hash軟件包。
在HTTP Upstream模塊中,可以通過server指令指定后端服務器的IP地址和端口,同時還可以設定每個后端服務器在負載均衡調度中的狀態。
常用的狀態有:
down,表示當前的server暫時不參與負載均衡。
backup,預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,才會請求backup機器,因此這臺機器的壓力最輕。
max_fails,允許請求失敗的次數,默認為1。當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤。
fail_timeout,在經歷了max_fails次失敗后,暫停服務的時間。max_fails可以和fail_timeout一起使用。
注意 當負載調度算法為ip_hash時,后端服務器在負載均衡調度中的狀態不能是weight和backup。