一. nginx.conf 文件結構概述 在第一篇中講到nginx的安裝,安裝完後,預設的nginx伺服器配置文件都存在安裝目錄conf中,主配置文件名為nginx.conf。下麵是我linux系統安裝nginx的目錄信息: 下麵將說明nginx.conf原始文件中,各條語句的生效範圍,對指令作用域 ...
一. nginx.conf 文件結構概述
在第一篇中講到nginx的安裝,安裝完後,預設的nginx伺服器配置文件都存在安裝目錄conf中,主配置文件名為nginx.conf。下麵是我linux系統安裝nginx的目錄信息:
[root@xuegod64 nginx]# pwd /usr/local/nginx [root@xuegod64 nginx]# ls client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
下麵將說明nginx.conf原始文件中,各條語句的生效範圍,對指令作用域有一個初步的瞭解。在nginx.conf文件結構中,最外層的花括弧將內容整體分為兩部分(event、http)。nginx.conf一共由三部分組成,分別為全局塊、events塊、http塊。 在http塊中,又包含http全局塊、多個server塊。每個server塊中,可以包含server全局塊和多個location塊。在同一配置塊中嵌入的配置塊,各個之間不存在次序關係。
配置文件支持大量可配置的指令,絕大多數指令不是特定屬於某一塊的。同一個指令放在不同層級的塊中,其作用域也不同。一般情況下,高一級塊中的指令可以作用於自身所在的塊和此塊包含的所有低層級塊。 如果某個指令在兩個不同層級的塊中同時出現,則採用"就近原則,即以較低層級的塊中的配置為準。
下麵是一個nginx.conf簡單的配置示例:
#user nobody; user nginx nginx; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; #以上是全局塊 events { worker_connections 1024; } #以上是events塊 #最後是http塊,裡面包括location塊 http { include mime.types; default_type application/octet-stream; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; if ($request_uri ~* \.html$) { proxy_pass http://htmlservers; } if ($request_uri ~* \.aspx$){ proxy_pass http://aspxservers; } proxy_pass http://picservers; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } upstream htmlservers{ server 192.168.2.50:80; server 192.168.2.51:80; } upstream aspxservers{ server 192.168.2.50:80; server 192.168.2.51:80; } upstream picservers{ server 192.168.2.50:80; server 192.168.2.51:80; } }View Code
1. 全局塊
全局塊是預設配置文件從開始到events塊之間的一部份內容,主要設置一些影響nginx伺服器整體運行的配置指令,因此這些指令作用域是nginx伺服器全局。通常包括配置運行nginx伺服器的用戶(組),允許生成的worker process數、nginx進程pid存放路徑、日誌的存放路徑和類型以及配置文件引入等。
2. events塊
events塊涉及的指令主要影響nginx伺服器與用戶的網路連接,常用到的設置包括是否開啟對多worker process下的網路連接進行序列化,是否允許同時接收多個網路連接,選取哪種事件驅動模型處理連接請求,每個worker process可以同時支持的最大連接數。這一塊對nginx伺服器的性能影響較大,應該根據實際情況靈活調整。
3. http塊
http塊是nginx伺服器配置中重要部分,代理、緩存和日誌定義等絕大多數的功能和第三方模塊的配置都可以放在這個模塊中。可以在http全局塊中配置的指令包括文件引入、mime-type定義、日誌自定義、是否使用sendfile轉輸文件、連接超時時間、單連接請求數上限等。
4.server塊
配置虛擬主機的相關參數,一個http中可以有多個server。server塊和"虛擬主機"的概述有密切聯繫,虛擬主機又稱虛擬伺服器或虛擬機。例如使用VMware來虛擬一個主機。對外表現為多個伺服器。從用戶角度來看,一臺虛擬主機和一臺獨立的硬體主機是完全一樣的。前面提過每一個http塊可以包含多個server塊,而每個server塊就相當於一臺虛擬主機,它內部可有多台主機聯合提供服務,一起對外提供在邏輯上關係密切的一組服務(或網站)。
和http塊相同,server塊也可以包含自己的全局塊,同時可以包含多個location塊,在server全局塊中,最常見的兩個配置項是本虛擬主機的監聽配置和本虛擬主機的名稱或ip配置。
5. location塊
用於配置請求的路由,以及各種頁面的處理情況。每個server塊中可以包含多個location塊,location是server塊的一個指令,由於在整個nginx配置中起著重要的作用,而且許多功能上靈活性往往在location指令的配置中體現出來,所以單獨列為一個"塊"。 這些location塊的主要作用是,基於nginx伺服器接收到的請求字元串(例如:server_name 或 url_string),對除虛擬主機名稱(或ip) 之外的字元串如url_stirng進行匹配,對特定的請求進行處理。地址定向、數據緩存、和應答控制等功能都是在這部分實現,許多第三方模塊的配置也是在location塊中提供功能。
二. 全局塊指令配置
2.1 運行Nginx伺服器用戶(組) user指令
該指令配置屬於全局塊,在文件的第一行,預設是user nobody。該user指令的語法格式為:
user 用戶 [用戶組];
用戶:是指定可以運行nginx伺服器的用戶。用戶組:是可選項,指定可以運行nginx伺服器的用戶組。只有被設置的用戶或者用戶組成員才有許可權啟動nginx進程。如果希望所有用戶可以啟動Nginx進程,可以註釋掉user指令。下麵是user指令,指定nginx用戶和nginx用戶組。第一行#表示已註釋,不生效。
#user nobody;
user nginx nginx;
在nginx.conf配置文件中,每一條指令配置都必須以分號結束。
2.2 允許生成的工作進程數 worker_processes指令
worker process是nginx伺服器實現併發處理服務(網站)的關鍵所在。理念上講,值越大,可以支持的併發處理量也越多。但實現受限於軟體本身、操作系統資源。一般建議啟動的工作進程數,通常設置成和cpu核數相等。該worker process指令的語法格式為:
worker_processes number | auto;
number:指定nginx進程最多可以產生的進程數。auto:自動檢測。下麵是worker_processes指令,指定一個進程數:
worker_processes 1;
當啟動nginx伺服器後,可以查看nginx伺服器除了主進程master process之處,還生成了一個worker process:
[root@xuegod64 nginx]# ps -ef | grep nginx root 5454 1 0 1月03 ? 00:00:00 nginx: master process ./nginx -c /usr/local/nginx/conf/nginx.conf nginx 5455 5454 0 1月03 ? 00:00:00 nginx: worker process root 19141 2678 1 10:34 pts/0 00:00:00 grep --color=auto nginx
2.3 nginx進程存放路徑 PID指令
nginx進程作為系統的守護進程運行,需要在某文件中保存當前運行程式的主進程號。nginx支持對它的存放路徑進行自定義配置。該pid指令語法格式為:
pid file;
file:指定存放路徑和文件名稱。配置文件預設將此文件存放在nginx安裝目錄logs下,名字為nginx.pid。file可以是相對路徑,註意file除了路徑一定要指定文件名。下麵是pid指令的配置路徑存放於安裝目錄logs文件夾下:
pid logs/nginx.pid;
2.4 錯誤日誌的存放路徑 error_log指令
在全局塊、http塊、server塊都可以對nginx伺服器的日誌進行相關配置。這裡首先介紹全局塊下日誌的存放配置,另二塊配置基本相同,只是作用域不同。該error_log指令語法格式為:
error_log file | level [debug | info |notice |warn | error| crit | alert| emerg];
nginx伺服器日誌支持輸出到某一固定的文件file 以及level日誌級別。日誌的級別是可選項,由低到高,級別越高記錄的信息越少, 比如設置了warn級別後,級別為warn、error、crit、alert、emerg的日誌都會被記錄下來。生產場景一般是 warn | error | crit 這三個級別之一。下麵看一個配置實例,也是nginx預設的日誌存放路徑和預設日誌級別設置:
error_log logs/error.log error;
註意指定的文件對於運行nginx進程的用戶具有寫許可權,否則在啟動ningx進程時會報錯(/nginx/logs/error.log permission denied)。
三. events塊指令配置
3.1 最大連接數worker_connections指令
該指令用來設置允許每一個worker process同時開啟的最大連接數。number預設值是1024。這個number不僅僅包括和前端用戶建立的連接數,而是包括所有可能的連接數。該worker_connections指令語法格式為:
worker_connections number;
3.2 事件驅動模型 use指令
nginx伺服器提供了多種事件驅動模型來處理網路消息,可以使用user指令來指定某一事件驅動模型。後面再詳細介紹。 user指令語法結構為:
use select | poll | kqueue | epoll | rtsig | /dev/poll | eventport;
3.3 是否允許同時接收多個網路連接 multi_accept 指令
每個nginx伺服器的worker_process都有能力同時接收多個新到達的網路連接,但是這需要在配置文件中進行設置,預設是關閉。當指令預設為關閉狀態,即每個worker_process一次只能接收一個新到達的網路連接。 該multi_accept 指令語法結構為:
multi_accept on | off
3.4 設置網路連接的序列化 accept_mutex指令
這裡涉及到一個名詞"驚群"。驚群(thundering herd problem) 大意是:當某一時候只有一個網路連接到來時,多個睡眠進程會被同時叫醒,但只有一個進程可獲得連接。如果每次喚醒的進程數目太多,會影響一部分系統性能。在nginx伺服器的多進程下,有可能出現這樣的問題。
為瞭解決這樣的問題,nginx配置中包含了這樣一條指令accept_mutex。當設置為開啟的時候會對多個nginx進程接收連接進行序列化,防止多個進程對連接的爭搶。預設為開啟狀態。其語法結構為:
accept_mutex on | off;
本篇最後先展示nginx.conf配置文件的全局塊和event塊的指令條數示例:
user nginx nginx; worker_processes 1; pid logs/nginx.pid; error_log logs/error.log error; #制定日誌路徑,級別。這個設置可以放入全局塊,http塊,server塊 events { accept_mutex on; #預設為on multi_accept on; #預設為off use epoll; #事件驅動模型 worker_connections 1024; #最大連接數 }
參考文獻:
Nginx高性能Web伺服器詳解