天天看點

nginx2

 ​​https://www.codesheep.cn/2018/06/26/%E4%BB%8E%E4%B8%80%E4%BB%BD%E9%85%8D%E7%BD%AE%E6%B8%85%E5%8D%95%E8%AF%A6%E8%A7%A3Nginx%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%85%8D%E7%BD%AE/​​    從一份配置清單詳解Nginx伺服器配置

 《Nginx高性能Web伺服器詳解》

nginx2
nginx2

檢測配置檔案是否有文法錯誤:nginx -t

檢視系統允許程序打開的檔案描述符個數:cat /proc/sys/fs/file-max

​​https://www.codesheep.cn/2018/05/25/Nginx%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E7%AE%B1%E4%BD%93%E9%AA%8C/​​     Nginx伺服器開箱體驗

Nginx配置檔案的整體結構

​​

nginx2

​​

nginx配置檔案結構

從圖中可以看出主要包含以下幾大部分内容:

1. 全局塊

該部配置設定置主要影響Nginx全局,通常包括下面幾個部分:

  • 配置運作Nginx伺服器使用者(組)
  • worker process數
  • Nginx程序PID存放路徑
  • 錯誤日志的存放路徑
  • 配置檔案的引入

2. events塊

該部配置設定置主要影響Nginx伺服器與使用者的網絡連接配接,主要包括:

  • 設定網絡連接配接的序列化
  • 是否允許同時接收多個網絡連接配接
  • 事件驅動模型的選擇
  • 最大連接配接數的配置

3. http塊

  • 定義MIMI-Type
  • 自定義服務日志
  • 允許sendfile方式傳輸檔案
  • 連接配接逾時時間
  • 單連接配接請求數上限

4. server塊

  • 配置網絡監聽
  • 基于名稱的虛拟主機配置
  • 基于IP的虛拟主機配置

5. location塊

  • location配置
  • 請求根目錄配置
  • 更改location的URI
  • 網站預設首頁配置

一份配置清單例析

筆者按照文章:​​《Nginx伺服器開箱體驗》​​ 中的實驗,給出了一份簡要的清單配置舉例:

​一份配置清單例析

配置代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65      
user  nobody  nobody;
worker_processes  3;
error_log  logs/error.log;
pid  logs/nginx.pid;

events {
    use epoll;
    worker_connections  1024;
}


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"';
    access_log  logs/access.log  main;
    sendfile  on;
    keepalive_timeout  65;

    server {
        listen       8088;
        server_name  codesheep;
        access_log  /codesheep/webserver/server1/log/access.log;
        error_page  404  /404.html;

        location /server1/location1 {
            root   /codesheep/webserver;
            index  index.server2-location1.htm;
        }

        location /server1/location2 {
        root   /codesheep/webserver;
            index  index.server2-location2.htm;
        }

    }

    server {
        listen       8089;
        server_name  192.168.31.177;
        access_log  /codesheep/webserver/server2/log/access.log;
        error_page  404  /404.html;
        
        location /server2/location1 {
            root   /codesheep/webserver;
            index  index.server2-location1.htm;
        }

        location /srv2/loc2 {
            alias   /codesheep/webserver/server2/location2/;
            index  index.server2-location2.htm;
        }
        
        location = /404.html {
            root /codesheep/webserver/;
            index 404.html;
        }
        
    }

}      

接下來就來詳細剖析以下配置檔案中各個指令的含義⬇️

配置運作Nginx伺服器使用者(組)

指令格式:​

​user user [group];​

  • user:指定可以運作Nginx伺服器的使用者
  • group:可選項,可以運作Nginx伺服器的使用者組

如果user指令不配置或者配置為 ​

​user nobody nobody​

​ ,則預設所有使用者都可以啟動Nginx程序

worker process數配置

Nginx伺服器實作并發處理服務的關鍵,指令格式:​

​worker_processes number | auto;​

  • number:Nginx程序最多可以産生的worker process數
  • auto:Nginx程序将自動檢測

按照上文中的配置清單的實驗,我們給worker_processes配置的數目是:3,啟動Nginx伺服器後,我們可以背景看一下主機上的Nginx程序情況:

1      
ps -aux | grep nginx      

很明顯,了解 ​

​worker_processes​

​ 這個指令的含義就很容易了

nginx2

​ps -aux | grep nginx

Nginx程序PID存放路徑

Nginx程序是作為系統守護程序在運作,需要在某檔案中儲存目前運作程式的主程序号,Nginx支援該儲存檔案路徑的自定義

指令格式:​

​pid file;​

  • file:指定存放路徑和檔案名稱
  • 如果不指定預設置于路徑​

    ​logs/nginx.pid​

錯誤日志的存放路徑

指定格式:​

​error_log file | stderr;​

  • file:日志輸出到某個檔案file
  • stderr:日志輸出到标準錯誤輸出

配置檔案的引入

指令格式:​

​include file;​

  • 該指令主要用于将其他的Nginx配置或者第三方子產品的配置引用到目前的主配置檔案中

設定網絡連接配接的序列化

指令格式:​

​accept_mutex on | off;​

  • 該指令預設為on狀态,表示會對多個Nginx程序接收連接配接進行序列化,防止多個程序對連接配接的争搶。

說到該指令,首先得闡述一下什麼是所謂的 “驚群問題”,可以參考 ​​WIKI百科的解釋​​。就Nginx的場景來解釋的話大緻的意思就是:當一個新網絡連接配接來到時,多個worker程序會被同時喚醒,但僅僅隻有一個程序可以真正獲得連接配接并處理之。如果每次喚醒的程序數目過多的話,其實是會影響一部分性能的。

是以在這裡,如果accept_mutex on,那麼多個worker将是以串行方式來處理,其中有一個worker會被喚醒;反之若accept_mutex off,那麼所有的worker都會被喚醒,不過隻有一個worker能擷取新連接配接,其它的worker會重新進入休眠狀态

這個值的開關與否其實是要和具體場景挂鈎的。

是否允許同時接收多個網絡連接配接

指令格式:​

​multi_accept on | off;​

  • 該指令預設為off狀态,意指每個worker process 一次隻能接收一個新到達的網絡連接配接。若想讓每個Nginx的worker process都有能力同時接收多個網絡連接配接,則需要開啟此配置

事件驅動模型的選擇

指令格式:​

​use model;​

  • model模型可選擇項包括:select、poll、kqueue、epoll、rtsig等……

最大連接配接數的配置

指令格式:​

​worker_connections number;​

  • number預設值為512,表示允許每一個worker process可以同時開啟的最大連接配接數

定義MIME-Type

指令格式:

1
2      
include mime.types;
default_type mime-type;      
  • MIME-Type指的是網絡資源的媒體類型,也即前端請求的資源類型
  • include指令将mime.types檔案包含進來

​cat mime.types​

​ 來檢視mime.types檔案内容,我們發現其就是一個types結構,裡面包含了各種浏覽器能夠識别的MIME類型以及對應類型的檔案字尾名字,如下所示:

​cat mime.types

自定義服務日志

指令格式:

1      
access_log path [format];      
  • path:自定義服務日志的路徑 + 名稱
  • format:可選項,自定義服務日志的字元串格式。其也可以使用​

    ​log_format​

    ​ 定義的格式

允許sendfile方式傳輸檔案

指令格式:

1
2      
sendfile on | off;
sendfile_max_chunk size;      
  • 前者用于開啟或關閉使用sendfile()傳輸檔案,預設off
  • 後者指令若size>0,則Nginx程序的每個worker process每次調用sendfile()傳輸的資料了最大不能超出此值;若size=0則表示不限制。預設值為0

連接配接逾時時間配置

指令格式:​

​keepalive_timeout timeout [header_timeout];​

  • timeout 表示server端對連接配接的保持時間,預設75秒
  • header_timeout 為可選項,表示在應答封包頭部的 Keep-Alive 域設定逾時時間:“Keep-Alive : timeout = header_timeout”

單連接配接請求數上限

指令格式:​

​keepalive_requests number;​

  • 該指令用于限制使用者通過某一個連接配接向Nginx伺服器發起請求的次數

配置網絡監聽

指令格式:

  • 第一種:配置監聽的IP位址:​

    ​listen IP[:PORT];​

  • 第二種:配置監聽的端口:​

    ​listen PORT;​

實際舉例:

1
2
3      
listen 192.168.31.177:8080; # 監聽具體IP和具體端口上的連接配接
listen 192.168.31.177;      # 監聽IP上所有端口上的連接配接
listen 8080;                # 監聽具體端口上的所有IP的連接配接      

基于名稱和IP的虛拟主機配置

指令格式:​

​server_name name1 name2 ...​

  • name可以有多個并列名稱,而且此處的name支援正規表達式書寫

實際舉例:

1      
server_name ~^www\d+\.myserver\.com$      

此時表示該虛拟主機可以接收類似域名 www1.myserver.com 等的請求而拒絕 ​​www.myserver.com​​ 的域名請求,是以說用正規表達式可以實作更精準的控制

至于基于IP的虛拟主機配置比較簡單,不再太贅述:

指令格式:​

​server_name IP位址​

location配置

指令格式為:​

​location [ = | ~ | ~* | ^~ ] uri {...}​

  • 這裡的uri分為标準uri和正則uri,兩者的唯一差別是uri中是否包含正規表達式

uri前面的方括号中的内容是可選項,解釋如下:

  • “=”:用于标準uri前,要求請求字元串與uri嚴格比對,一旦比對成功則停止
  • “~”:用于正則uri前,并且區分大小寫
  • “~*”:用于正則uri前,但不區分大小寫
  • “^~”:用于标準uri前,要求Nginx找到辨別uri和請求字元串比對度最高的location後,立即使用此location處理請求,而不再使用location塊中的正則uri和請求字元串做比對

請求根目錄配置

  • path:Nginx接收到請求以後查找資源的根目錄路徑
1      
alias path;  # path為修改後的根路徑      

設定網站的預設首頁

  • file可以包含多個用空格隔開的檔案名,首先找到哪個頁面,就使用哪個頁面響應請求

繼續閱讀