1. 程式人生 > >nginx系列 3 nginx.conf介紹(1)

nginx系列 3 nginx.conf介紹(1)

一. nginx.conf 檔案結構概述

  在第一篇中講到nginx的安裝,安裝完後,預設的nginx伺服器配置檔案都存在安裝目錄conf中,主配置檔名為nginx.conf。下面是我linux系統安裝nginx的目錄資訊:

    [[email protected] nginx]# pwd
    /usr/local/nginx
    [[email protected] 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塊,locationserver塊的一個指令,由於在整個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 processnginx伺服器實現併發處理服務(網站)的關鍵所在。理念上講,值越大,可以支援的併發處理量也越多。但實現受限於軟體本身、作業系統資源。一般建議啟動的工作程序數,通常設定成和cpu核數相等。該worker process指令的語法格式為:

       worker_processes number | auto;

    number:指定nginx程序最多可以產生的程序數。auto:自動檢測。下面是worker_processes指令,指定一個程序數:

    worker_processes  1;

    當啟動nginx伺服器後,可以檢視nginx伺服器除了主程序master process之處,還生成了一個worker process:

    [[email protected] 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伺服器詳解