1. 程式人生 > 實用技巧 >分散式系統系列--(三)Nginx配置檔案的相關引數說明

分散式系統系列--(三)Nginx配置檔案的相關引數說明

Nginx的相關配置引數說明

在安裝Nginx的時,會有一個關於Nginx啟動時預設的配置檔案nginx.conf,裡邊指定了Nginx伺服器的各種引數配置資訊,下邊我們就來具體講一講它的各個配置項。

Nginx的監聽埠

listen引數決定Nginx伺服器監聽的具體埠。在listen後可以加IP地址,埠和主機名,非常靈活。
基本語法:

listen address:port

擴充套件語法:

listen address:port [default(deprecated in 0.8.21)|default_server|[backlog=num|rcvbuf=size|snbuf=size|accept_filter=filter|deferred|bind|ipv6only=[on|off]|ssl]];

各個引數的含義如下:
default
將所在的server設為整個web服務的預設server模組,如果沒有這個設定,那麼會在nginx.conf中找到的第一個server作為預設server。(default_server同上)
backlog=num
表示TCP中backlog佇列的大小
rcvbuf=size
設定監聽控制代碼的SO_RECVBUF引數
snbuf=size
設定監聽控制代碼的SO_SNBUF引數
accept_filter
設定accept過濾器,支援FreeBSD時有用
deferred
在設定引數後,若使用者發起建立請求,並且完成了TCP的三次握手,核心也不會為這次連線排程worker程序來處理,只有使用者真的傳送資料時,核心才會喚醒worker程序處理這個請求。
bind


綁定當前埠、地址對。只有同時對一個埠監聽多個地址時才會生效
ssl
在當監聽的埠上建立的連線必須基於SSL協議

listen預設的監聽80埠,例如:

listen 127.0.0.1:8000;
# 預設監聽80埠
listen 127.0.0.1;
# 等同於listen *:8000;或者listen localhost:8000;
listen 8000;

比如我們在Nginx監聽80和8080兩個埠,並向客戶端傳送他們當前監聽的埠資訊,Mac電腦上的配置如下:

#user  nobody;
worker_processes  1;

pid /usr/local/Cellar/nginx/1.19.2/logs/nginx.pid;

events {
    #use epoll; //此命令只有在Linux系統才有效
    worker_connections  1024;
}


http {
	# 監聽的服務埠 80
    server {
        listen 80;
        location / {
          default_type text/html;  
          return 200 "Hello,Nginx!I am working on port 80.\n";
        }
    }

    # 監聽的服務埠 8080
    server {
        listen 8080;
        location / {
          default_type text/html;   
          return 200 "Hello,Nginx!I am working on port 8080.\n";
        }
    }
}

Nginx虛擬主機

基本語法:

server_name name

它是在server配置快下設定的,Mac電腦下具體的配置例子如下:

worker_processes  1;

pid /usr/local/Cellar/nginx/1.19.2/logs/nginx.pid;

events {
    worker_connections  1024;
}


http {
	# 設定負載均衡對映到的地址
	upstream www.young.cn {
		server 127.0.0.1:8080;
	}

    # 通過訪問虛擬主機的地址www.yes.com,然後反向代理到http://www.young.cn,然後被伺服器分發到127.0.0.1:8080的伺服器地址上
    server {
        listen 80;
        # 設定虛擬主機
        server_name www.yes.com;

        location / {
          # 設定反向代理的地址
          proxy_pass http://www.young.cn;
        }
    }

    # 監聽8080伺服器
    server {
        listen 8080;

        location / {
          default_type text/html; 
          return 200 "Hello,Nginx!I am working on port 8080!\n";
        }
    }
}

Nginx配置location

基本語法:

location [=|~*|^~|@]/uri/{···}

location是配置在server配置塊中的,正如我們上邊所用到的那樣。
它的作用是:通過配置location,伺服器會嘗試根據使用者請求的uri來匹配location後邊的表示式,如果可以匹配,就選擇location塊中的配置來處理使用者請求;如果不匹配,則不響應請求。具體的匹配方式說明如下:

  • =/uri 表示完全匹配
  • ~/uri 表示匹配uri時大小寫敏感
  • ~*/uri 表示匹配uri時忽略大小寫
  • ^~/uri 表示匹配uri時只需要其前半部分匹配即可
  • /uri 表示不帶任何修飾符,也表示字首匹配,但是在正則匹配之後
  • / 表示通用匹配,任何未能匹配到其他location的請求都會匹配到,相當於switch語句中的default

注意,如果請求匹配了上了多個location的表示式,那麼它會只執行第一個匹配上的那個location。

我們來看一下具體的示例(Mac電腦下):

worker_processes  1;

pid /usr/local/Cellar/nginx/1.19.2/logs/nginx.pid;

events {
    worker_connections  1024;
}


http {

    #設定符合多中格式請求的location
    server {
        listen 80;

        # 所有都匹配不到,則會執行該location
        location / {
          default_type text/html;
          return 200 "location / : I am default location!\n";
        }

        #完全匹配
        location =/goodjob {
          default_type text/html;
          return 200 "location = /goodjob\n";
        }

        #匹配uri時大小寫敏感
        location ~/Goodjob {
          default_type text/html;
          return 200 "location ~ /Goodjob\n";
        }

        #匹配uri時忽略大小寫
        location ~*/goodjob {
          default_type text/html;
          return 200 "location ~*/goodjob\n";
        }

        #匹配uri時只需要其前半部分匹配即可
        location ^~/goodjob {
          default_type text/html;
          return 200 "location ^~/goodjob\n";
        }
    }
}

Nginx事件配置

是否開啟accept鎖

語法: accept_mutex[on|of];
預設:accept_mutex on;
作用: accept_mutex是Nginx的負載均衡鎖。這把鎖可以讓多個worker程序輪流的,序列化的與新的客戶端建立TCP連線。accept鎖預設是開啟的,如果關閉它,那麼建立TCP連線的耗時會更短,但不利於負載均衡,因此不建議關閉。

使用accept鎖後到真正建立連線之間的延遲時間

語法:accept_mutex_delay Nms;
預設:accept_mutex_delay 500ms;
作用:在使用accept鎖後,同一時間只有一個worker程序能夠取到accept鎖。這個accept鎖不是堵塞鎖,如果娶不到會立刻返回。如果只有一個worker程序試圖取鎖而沒取到,它至少要等待accept_mutex_delay定義的時間才能再次試圖取鎖。

批量建立新連線

語法:multi_accept[on|off];
預設:multi_accept off;
作用:當事件模型有新連線時,儘可能的對本次排程中客戶端發起的所有TCP請求都建立連線。

選擇事件模型

語法:use [kqueue|rtsig|epoll|/dev/poll|select|poll|eventport];
預設:Nginx會選出最合適的事件模型
作用:對於Linux系統,可供選擇的事件驅動模型有:poll,select,epoll三種,一般來說,epoll是效能最高的

epoll是Linux核心為處理大批量檔案描述符而作了改進的poll,是Linux下多路複用IO介面select/poll的增強版,它能顯著提高程式在大量併發中只有少量活躍的情況下的系統CPU利用率。它的特點:

  • 支援一個程序開啟大數目的socket描述符
  • IO效率不隨FD數目的增加而線性下降
  • 使用mmap加速核心與使用者空間的訊息傳遞

worker的最大連線數

語法:worker_connections number;
作用:定義每個worker程序可以同時處理的最大連線數

其他常規配置

定義環境變數

語法:evn VAR|VAR=value
作用:使用者可以直接設定作業系統上的環境變數
例子:evn TESTPATH=/tmp

嵌入其他檔案

語法:include /path/file;
作用:可以把其他配置檔案引入進來,路徑可以使絕對路徑也可以是相對路徑,還可以含有萬用字元。

pid檔案

語法:pid path/file;
預設:pid logs/nginx.pid,也即在logs目錄下生成一個nginx.pid的檔案來儲存當前程序號
作用:儲存master程序ID的pid檔案存放路徑。

Nginx worker程序執行的使用者和使用者組

語法:user username[groupname];
預設:user nobody nobody;
作用:master程序fork出的程序在哪個使用者和使用者組下

指定Nginx worker程序可以開啟的最大控制代碼描述符個數

語法:worker_rlimit_nofile limit;
作用:設定一個worker可以開啟的最大控制代碼數;

限制訊號佇列

語法:worker_rlimit_sigpending limit;
作用:設定每個使用者發往Nginx的訊號佇列的大小。也就是說,當某個使用者的訊號佇列滿了,這個使用者再發送的訊號量就會被丟掉。

Nginx worker程序個數

語法: worker_processes number;
預設: worker_processes 1;
作用: 在master_worker執行方式下,定義worker程序的個數。worker程序的數量會直接影響效能。每個worker都是單執行緒的程序,它會呼叫各個模組來實現各種功能。如果確定這些模組不會出現堵塞式呼叫,那麼程序數可以和CPU的核心數一樣;反之,則稍少一些較好

繫結worker程序到指定的CPU核心

語法:worker_cpu_affinity cpumask [cpumask...]
作用:假設每個worker都是很繁忙的,如果多個程序都在搶同一個CPU,那麼就會出現同步問題。反之,如果每個worker程序獨享一個CPU,就實現了完全的併發。
例子:

worker_processes 1;
worker_cpu_affinity 1000 0100 0010 0001;

ssl硬體加速

語法:ssl_engine device;
作用:如果伺服器上有SSL硬體加速裝置,那麼就可以進行配置以加快SSL協議的處理速度。使用者可以用OpenSSL提供的命令來檢視是否有SSL硬體加速裝置:openssl engine -t

worker程序優先順序設定

語法:worker_priority nice;
預設:worker_priority 0;
作用:在Linux和Unix中,當許多程序都處於可執行狀態時,按照優先順序來決定本次核心選擇哪一個程序進行。程序分配的CPU時間片大小與優先順序有關,優先順序越高,時間片越長(例如,在預設情況下,最小時間片是5ms,最大擇優800ms)。優先順序由靜態優先順序和核心根據程序的執行情況所做的動態調整共同決定。nice是程序的優先順序,它的取值範圍是-20到+19。-20是最高優先順序,+19是最低優先順序,不建議把nice的值設為比核心程序(通常為-5)還要小。

user配置

語法:user username;
作用:用來指定程序執行的使用者和使用者組

pid配置

語法: pid /path/file
作用:儲存master程序ID的pid檔案存放路徑

use配置

語法:use epoll;
作用:選擇事件模型

upstream配置

語法:

upstream address {
  #負載均衡策略
  ip_hash;
  #負載均衡分發的地址列表
  server ip:port;
}

作用:用於將訪問的網址通過負載均衡策略分發給內網的各個伺服器地址。

proxy_pass配置

語法:proxy_pass address;
作用:指定反向代理後的伺服器網址。