nginx配置詳解

nginx配置文件結構

main
events   {
  ....
}
http        {
  ....
  upstream myproject {
    .....
  }
  server  {
    ....
    location {
        ....
    }
  }
  server  {
    ....
    location {
        ....
    }
  }
  ....
}

從文件結構可知配置文件主要由一下六部分組成:

  1. main(全局設置)

  2. events(nginx工作模式)

  3. http(http設置)

  4. sever(主機設置)

  5. location(URL匹配)

  6. 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種調度算法:

  1. weight 輪詢(默認):每個請求按時間順序逐一分配到不同的后端服務器,如果后端某臺服務器宕機,故障系統被自動剔除,使用戶訪問不受影響。weight。指定輪詢權值,weight值越大,分配到的訪問機率越高,主要用于后端每個服務器性能不均的情況下。

  2. ip_hash:每個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個后端服務器,有效解決了動態網頁存在的session共享問題。

  3. fair:比上面兩個更加智能的負載均衡算法。此種算法可以依據頁面大小和加載時間長短智能地進行負載均衡,也就是根據后端服務器的響應時間來分配請求,響應時間短的優先分配。Nginx本身是不支持fair的,如果需要使用這種調度算法,必須下載Nginx的upstream_fair模塊。

  4. 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。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容