Nginx實用教程(二):配置文件入門

来源:http://www.cnblogs.com/foxgab/archive/2017/06/13/6972191.html
-Advertisement-
Play Games

Nginx配置文件結構 nginx配置文件由指令(directive)組成,指令分為兩種形式,簡單指令和區塊指令。 一條簡單指令由指令名、參數和結尾的分號(;)組成,例如: listen 80 backlog 4096; ,其中“listen”是指令名,“80”、“backlog”、“4096”都是 ...


Nginx配置文件結構

 nginx配置文件由指令(directive)組成,指令分為兩種形式,簡單指令和區塊指令。

一條簡單指令由指令名、參數和結尾的分號(;)組成,例如: listen 80 backlog 4096; ,其中“listen”是指令名,“80”、“backlog”、“4096”都是參數,“;”表示指令結尾。

區塊指令由指令名、參數和花括弧({})組成,例如: location /imag {} ,其中“location”是指令名,“/imag”是參數,“{}”用於包括其它指令和表示結尾。如果一個區塊指令中的大括弧可以包括其它簡單指令或區塊指令,那麼這種區塊指令稱為“語境(context)”,大部分常用的區塊指令都是“語境”。

不被任何其它區塊指令包含的指令被認為處於main語境中,即main語境是nginx配置文件中最外層語境,任何指令都位於main語境或main語境的子級語境中。請看下麵的配置文件例子:

 1 # nginx.conf
 2 worker_processes 2;
 3 events {
 4     use epoll;
 5     worker_connections 1024;
 6 }
 7 http {
 8     include       mime.types;
 9     upstream server_group_a {   
10       server 192.168.1.1:8080;
11       server 192.168.1.2:8080;
12     }
13     server {
14         listen       80;
15         server_name  www.example.com;   
16         location / {
17            proxy_pass  http://server_group_a;        
18         } 
19     }
20 }

上例中,worker_processes、event、http指令處於main語境中,use、worker_connections指令位於event語境中,include、upstream、server指令位於http語境中,兩條server指令位於upstream語境中……

nginx軟體是由各種不同功能的模塊組成的,因此配置文件也遵照這種模塊化的結構,nginx核心模塊提供一些全局的配置指令,功能配置指令則由其他的功能模塊提供。上例中的worker_processes、event指令都由nginx的核心模塊提供,而http指令由http功能模塊提供,proxy_pass指令則由http模塊的一個子模塊提供。

在安裝nginx時,預設包含了一些常用功能模塊,使用者也可以通過源碼編譯安裝的方式自由選擇安裝其他功能模塊,在配置nginx時可以查找功能模塊的文檔,文檔中會說明這個功能模塊包括哪些指令,以及這些指令應該在哪些語境下配置,而從語境(指令)查找它包含哪些可以配置的指令卻是不靠譜的,因為安裝的模塊不同,包含的指令也不一樣,因此配置nginx需要有一些經驗,初入門者只能先從參考他人的示例著手。

功能模塊除了http外,還有mail(郵件代理)、stream(TCP、UDP代理,v1.9.0以後)這兩個功能模塊

 

全局配置指令

  • 語法:include file | mask;
  • 預設值:無
  • 語境:任意

可在任意語境中使用,將其他配置文件中的指令引入到使用include指令的語境中。被引入的指令需要符合語法和引入的語境要求。舉例:

http {
    include mime.types;
    include vhosts/*.conf;
}

將mime.types和vhosts目錄下以“.conf”結尾的文件引入到http語境中。

 

  • 語法:deamon on | off;
  • 預設值:deamon on
  • 語境:main

指定nginx是否以守護進程運行。

 

  • 語法:debug_points abort | stop;
  • 預設值:無
  • 語境:main

用於debug,判斷nginx內部錯誤,特別是判斷工作中進程的socket溢出問題。nginx代碼中包含了一些調試點,如果debug_points設置為abord,當運行到調試點時會產生一個核心運行信息dump文件,當設置為stop時會停止進程。

 

  • 語法:error_log file [level]
  • 預設值:error_log logs/error.log error;
  • 語境:main, http, mail(v1.9.0後), stream(v1.7.11後), server, location

指定日誌文件和日誌級別。

file可以是指定的文件,也可以是標準錯誤輸出文件stderr、syslog伺服器或記憶體。輸出到syslog伺服器使用“syslog:”首碼,輸出到迴圈記憶體緩衝區使用“memory:”首碼和緩衝區大小。

level參數指定輸出日誌的級別,高於指定級別的日誌將被輸出。支持的級別從低到高依次有:debug、info、notice、warn、error、crit、alert、emerg。

指定debug級別需要編譯時安裝了debug模塊。

 

  • 語法:env variable[=value];
  • 預設值:env TZ;
  • 語境:main

預設情況下,nginx只會繼承TZ這個環境變數,這條指令可以將環境變數傳遞到nginx進程中,也可以定義新的變數傳遞到nginx進程中。

 

  • 語法:load_module file;
  • 預設值:無
  • 語境:main

載入動態模塊。例如:

load_module module/ngx_mail_module.so;

 

  • 語法:lock_file file;
  • 預設值:lock_file logs/nginx.lock;
  • 語境:main

nginx使用鎖的機制來實現accept_mutex功能和共用記憶體,大多數操作系統中鎖都是一個原子操作,這種情況下這條指令無效,還有一些操作系統中使用“鎖文件”的的機制來實現鎖,此命令用來指定鎖文件首碼名。

 

  • 語法:master_process on | off;
  • 預設值:master_process on;
  • 語境:main

是否啟用worker進程,如果設置為off,則不啟用worker進程,由master進程處理請求。

 

  • 語法:pcre_jit on | off;
  • 預設值:pcre_jit off;
  • 語境:main

在解析配置文件時對正則表達式啟用或禁用實時編譯(PCRE JIT)。

RCRE JIT能顯著提升正則表達式的處理速度。

JIT依賴PCRE庫8.20以後版本,並且在編譯時需要指定--enable-jit參數。也可以將PCRE庫作為nginx的模塊編譯安裝(編譯nginx指定--with-pcre=參數),併在編譯時指定--with-pcre-jit參數啟用JIT功能。

 

  • 語法:pid file;
  • 預設值:pid nginx.pid;
  • 語境:main

指定pid文件。pid文件存放了master進程的進程號。

 

語法:ssl_engine device;

預設值:無

語境:main

如果使用了硬體ssl加速設備,使用此指令指定。

 

  • 語法:thread_pool name threads=number [max_queue=number];
  • 預設值:thread_pool default threads=32 max_queue=65535;
  • 語境:main

在使用非同步IO的情況下,定義命名線程池,並設置線程池大小和等待隊列大小。當線程池中所有線程都繁忙時,新任務會放在等待隊列中,如果等待隊列滿了,任務會報錯退出。

命名線程池可以定義多個,供http模塊的非同步線程指令(aio)調用。

此指令在v1.7.11中出現。

 

  • 語法:timer_resolution interval;
  • 預設值:無
  • 語境:main

設置時間精度,減少worker進程調用系統時間函數的次數。預設情況下,每個核心事件都會調用gettimeofday()介面來獲得系統時間,以便nginx計算連接超時等工作,此指令指定更新時間的間隔,nginx在間隔時間內只調用一次系統時間函數。

 

  • 語法:user user [group];
  • 預設值:user nobody nodoby;
  • 語境:main

指定master啟動worker進程使用的linux用戶和組。如果組(group)沒有指定,那麼會預設用一個和user同名的組名。

 

  • 語法:worker_processes number | auto
  • 預設值:worker_processes 1
  • 語境:main

指定worker進程的數量。進程數最好是CPU核心數或CPU核心數的倍數。當設置為auto時,nginx會嘗試自動獲取CPU核心數並設置。

auto參數從v1.3.8和v1.2.5版本以後支持。

 

  • 語法:worker_cpu_affinity cpumask ...;
  •    worker_cpu_affinity auto [cpumask];
  • 預設值:無
  • 語境:main

將worker進程綁定到CPU核心,每個worker進程對應一個二進位掩碼,掩碼的每一位對應一個CPU。預設情況下,worker不與cpu核心綁定。此指令只適用於Linux和FreeBSD。

舉例:

worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;

表示有4個worker進程,第一個綁定到CPU0,第二個綁定到CPU1,以此類推,4個進程分別綁定一個CPU核心。

再例:

worker_processes 2;
worker_cpu_affinity 0101 0101;

表示將第一個進程綁定到CPU0/CPU2,第二個worker進程綁定到CPU1/CPU3,這個例子適用於超線程場景,即一個核心虛擬出兩個CPU線程。

值auto(v1.9.10)允許自動和可用的CPU綁定:

worker_process auto;
worker_cpu_affinity auto;

掩碼(mask)可用用於限制某些CPU參加綁定。例如:

worker_cpu_affinity auto 01010101;

只有CPU0/2/4/6參與綁定,其他的CPU不分配worker進程。

 

  • 語法:worker_rlimit_core size;
  • 預設值:無
  • 語境:main

為worker進程修改系統核心轉儲文件(core file)的大小限制。通常提升這個值不需要重啟主進程。

 

  • 語法:worker_rlimit_nofile number;
  • 預設值:無
  • 語境:main

修改worker進程最大可打開句柄數限制。通常提升這個值不需要重啟主進程。

 

  • 語法:worker_shutdown_timeout time;
  • 預設值:無
  • 語境:main

此指令在v1.11.11中出現。用於設置安全地結束一個worker進程的超時時間。

當安全結束一個worker進程時,會停止對worker進程分配新連接,並等待他處理完當前的任務後再退出,如果設置了超時時間,超時後nginx會強制關閉worker進程的連接。

 

  • 語法:working_directory directory;
  • 預設值:無
  • 語境:main

指定預設工作路徑。主要用於worker進程導出記憶體轉儲文件,為worker進程指定的用戶需要有改文件的寫入許可權。

 

連接處理控制指令

  • 語法:events { ... }
  • 預設值:無
  • 語境:main

作用只是開闢一個指令區塊,events語境中配置的指令用於控制連接處理行為。

 

  • 語法:accept_mutex on | off;
  • 預設值:accept_mutex off;
  • 語境:events

當啟用這個參數時,會使用互斥鎖交替給worker進程分配新連接,否則話所有worker進程會爭搶新連接,即或造成所謂的“驚群問題”,驚群問題會使nginx的空閑worker進程無法進入休眠狀態,造成系統資源占用過多。啟用此參數會一定程度上導致後臺伺服器負載不均衡,但是在高併發的情況下,關閉此參數可以提高nginx的吞吐量。

在支持epoll的操作系統上不需要啟用accept_mutex(v1.11.3後),使用了reuseport功能也不需要啟用(v1.9.1後,需要操作系統支持SO_REUSEPORT socket選項,Linux 3.9+)。

在v1.11.3以前版本中,預設值為on。

 

  • 語法:accept_mutex_delay time;
  • 預設值:accept_mutex_delay 500ms;
  • 語境:events

如果accept_mutex參數啟用,當一個空閑worker進程嘗試獲取互斥鎖時發現有另一個worker進程已經獲得互斥鎖並處理新連接,這個空閑的worker進程等待下一次獲取互斥鎖嘗試的時間。而獲得互斥鎖的進程在處理完當前連接後,會立即嘗試獲取互斥鎖,因此此數值較大或連接壓力較小時,會造成部分worker進程總是空閑,一部分進程總是繁忙的情況。

 

  • 語法:debug_connection address | network | unix:;
  • 預設值:無
  • 語境:events

需要debug模塊支持,需確認安裝時包括了debug模塊,可以使用nginx -V命令確定包含--wih-debug參數。

對特定的客戶發起的連接開啟debugging級別日誌,用於分析和拍錯。可以指定IPv4或者IPv6地址(v1.3.0,v1.2.1)或一個無類網段或功能變數名稱,或UNIX socket(v1.3.0,v1.2.1)。例如:

events {
    debug_connection 127.0.0.1;
    debug_connection localhost;
    debug_connection 192.168.2.0/24;
    debug_connection 2001:0db8::/32;
    debug_connection unix:;
}

非指定連接的日誌級別依然由error_log指令決定。

 

  • 語法:multi_accept on | off;
  • 預設值:multi_accept off;
  • 語境:events

當設置為off時,一個worker進程獲得互斥鎖時一次只處理一個新連接,如果設置為on,則一次性將所有新連接都分配給獲得當前互斥鎖的worker進程、當使用kqueue連接處理方式時(use kqueue),此項指令無效。

 

  • 語法:use method;
  • 預設值:無
  • 語境:events

指定連接處理方式,通常不需要指定,nginx會自動使用最有效的方式。

連接處理方式用於決定用什麼方法從當前的連接池中找出哪些連接已經準備好傳輸/接收數據。常見的連接處理方式有:

select(需要select模塊)、poll(需要poll模塊)、kqueue(macOS/FreeBSD 4.1+/OpenBSD 2.9+)、epoll(Linux 2.6+)、/dev/poll(Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+, and Tru64 UNIX 5.1A+)、eventport(Solaris 10+)

 

  • 語法:worker_aio_requests number;
  • 預設值:worker_aio_requests 32;
  • 語境:events

在v1.1.4和1.0.7中出現。當啟用aio(非同步IO)和epoll連接處理方式後,單個worker進程最大的未完成非同步IO操作數。

 

  • 語法:worker_connections number;
  • 預設值:worker_connections 512;
  • 語境:events

單個worker進程可處理的最大併發連接數限制。

這個連接數包括和後臺伺服器之間的連接在內的所有的連接,而不僅是與客戶的連接。所有worker進程的總連接數(即worker_connections × worker_processes )不能超過操作系統最大可打開句柄數的限制(nofile),nofile限制可以通過worker_rlimit_nofile指令修改。

 

果覺得本文對您有幫助,請掃描後面的二維碼給予捐贈,您的支持是作者繼續寫出更好文章的動力!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Power BI 報表伺服器讓你的用戶能夠訪問數據、獲取見解,並能夠使用 SQL 報表伺服器服務的企業報告功能 - 這一切都在現代本地解決方案中完成。讓用戶能夠直觀瀏覽數據並快速發現模式,以便更快作出更好的決策。同時生成滿足你業務需求的精確格式的報表。你還可以胸有成竹地擴展到數千名用戶,因為 Pow ...
  • SQL%NOTFOUND 是一個布爾值。與最近的sql語句(update,insert,delete,select)發生交互,當最近的一條sql語句沒有涉及任何行的時候,則返回true。否則返回false。這樣的語句在實際應用中,是非常有用的。例如要update一行數據時,如果沒有找到,就可以作相應 ...
  • 1. Aggregate Aggregate即聚合操作。直接上代碼: acc即(0,0),number即data,seqOp將data的值累加到Tuple的第一個元素,將data的個數累加到Tuple的第二個元素。由於沒有分區,所以combOp是不起作用的,這個例子裡面即使分區了,combOp起作用 ...
  • 為什麼Oracle 查詢出來的數據會產生亂碼? 安裝的資料庫和客戶端編碼編碼不一致就會產生亂碼,要想解決此問題改一下客戶端的編碼即可 1. select * from table; 如果是這種問題則解決的辦法有許多,以下這種是比較通用一點的方法 1.查字元集編碼 select * from v$nl ...
  • 本文主要參考 http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html 主要內容是對該文章的翻譯,部分內容參考其他的網路文章。 1.簡介 hadoop分散式文件系統(HDFS)是一個分散式 ...
  • 伺服器重啟後,資料庫登錄信息為空 錯誤信息: (Not logged on) - PL/SQL Developer Initialization errorCould not initialize "D:\app\Administrator\product\11.2.0\dbhome_1\bin\o ...
  • 1 背景概述 在大多數的開發項目中,尤其是集成項目,都會有涉及到數據分析部分的工作,數據分析多數是各種圖表的展現和交互(所謂數據可視化),數據分析的展現速度直接影響著用戶的體驗,而且絕大多數管理系統(MES、PDM/PLM、ERP、SCM、OA、HR等等)的數據都存儲在資料庫中,資料庫相關的性能優化 ...
  • 大數據時代來臨,信息化建設對企業的生存發展的重要作用越發凸顯,如何跨越信息孤島,打破部門之間的聯動壁壘,實現以大數據分析與應用為前提,成為企業提高市場競爭能力和應變能力成為關鍵所在。企業迫求“實用快上” 信息孤島無可迴避博為軟體與企業合作時發現,幾乎所有企業都會因為信息化建設缺乏總體規劃,往往以實現 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...