概述
Nginx 是使用一個 master 行程來管理多個 worker 行程提供服務,master 負責管理 worker 行程,而 worker 行程則提供真正的客戶服務,worker 行程的數量一般跟服務器上 CPU 的核心數相同,worker 之間通過一些行程間通信機制實作負載均衡等功能,Nginx 行程之間的關系可由下圖表示:

Nginx 服務啟動時會讀入組態檔,后續的行為則按照組態檔中的指令進行,Nginx 的組態檔是純文本檔案,默認安裝 Nginx 后,其組態檔均在 /usr/local/nginx/conf/ 目錄下,其中,nginx.conf 為主組態檔,組態檔中以 # 開始的行,或者是前面有若干空格或者 TAB 鍵,然后再跟 # 的行,都被認為是注釋,這里只是了解主組態檔的結構,
Nginx 組態檔是以 block(塊)形式組織,每個 block 都是以一個塊名字和一對大括號 “{}” 表示組成,block 分為幾個層級,整個組態檔為 main 層級,即最大的層級;在 main 層級下可以有 event、http 、mail 等層級,而 http 中又會有 server block,server block中可以包含 location block,即塊之間是可以嵌套的,內層塊繼承外層塊,最基本的配置項語法格式是“配置項名 配置項值1 配置項值2 配置項值3 ... ”;
每個層級可以有自己的指令(Directive),例如 worker_processes 是一個main層級指令,它指定 Nginx 服務的 Worker 行程數量,有的指令只能在一個層級中配置,如worker_processes 只能存在于 main 中,而有的指令可以存在于多個層級,在這種情況下,子 block 會繼承 父 block 的配置,同時如果子block配置了與父block不同的指令,則會覆寫掉父 block 的配置,指令的格式是“指令名 引數1 引數2 … 引數N;”,注意引數間可用任意數量空格分隔,最后要加分號,
下圖是 Nginx 組態檔通常結構圖示,

Nginx 服務的基本配置項
Nginx 服務運行時,需要加載幾個核心模塊和一個事件模塊,這些模塊運行時所支持的配置項稱為基本配置;基本配置項大概可分為以下四類:
- 用于除錯、定位的配置項;
- 正常運行的必備配置項;
- 優化性能的配置項;
- 事件類配置項;
各個配置項的具體實作如下:
/* Nginx 服務基本配置項 */
/* 用于除錯、定位的配置項 */
#以守護行程 Nginx 運行方式
#語法:daemon off | on;
#默認:daemon on;
#master / worker 作業方式
#語法:master_process on | off;
#默認:master_process on;
#error 日志設定
# 路徑 錯誤級別
#語法:error_log /path/file level;
#默認:error_log logs/error.log error;
#其中/path/file是一個具體檔案;level是日志的輸出級別,其取值如下:
# debug info notice warn error crit alert emerg
#從左至右級別增大;若設定一個級別后,則在輸出的日志檔案中只輸出級別大于或等于已設定的級別;
#處理特殊除錯點
#語法:debug_points [stop | abort]
#這個設定是來跟蹤除錯 Nginx 的;
#僅對指定的客戶端輸出 debug 級別的日志
#語法:debug_connection [IP | DIR]
#限制 coredump 核心轉儲檔案的大小
#語法:worker_rlimit_core size;
#指定 coredump 檔案的生成目錄
#語法:working_directory path;
/* 正常運行的配置項 */
#定義環境變數
#語法:env VAR | VAR=VALUE;
#VAR 是變數名,VALUE 是目錄;
#嵌入其他組態檔
#語法:include /path/file;
#include 配置項可以將其他組態檔嵌入到 Nginx 的 nginx.conf 檔案中;
#pid 的檔案路徑
#語法:pid path/file;
#默認:pid logs/nginx.pid;
#保存 master 行程 ID 的 pid 檔案存放路徑;
#Nginx worker 運行的用戶及用戶組
#語法:user username [groupname];
#默認:user nobody nobody;
#指定 Nginx worker行程可打開最大句柄個數
#語法:worker_rlimit_nofile limit;
#限制信號佇列
#語法:worker_rlimit_sigpending limit;
#設定每個用戶發給 Nginx 的信號佇列大小,超出則丟棄;
/* 優化性能配置項 */
#Nginx worker 行程的個數
#語法:worker_process number;
#默認:worker_process 1;
#系結 Nginx worker 行程到指定的 CPU 內核
#語法:worker_cpu_affinity cpumask [cpumask...]
#SSL 硬體加速
#語法:ssl_engine device;
#系統呼叫 gettimeofday 的執行頻率
#語法:timer_resolution t;
#Nginx worker 行程優先級設定
#語法:worker_priority nice;
#默認:worker_priority 0;
/* 事件類配置項 */
#一般有以下幾種配置:
#1、是否打開accept鎖
# 語法格式:accept_mutex [on | off];
#2、lock檔案的路徑
# 語法格式:lock_file path/file;
#3、使用accept鎖后到真正建立連接之間的延遲時間
# 語法格式:accept_mutex_delay Nms;
#4、批量建立新連接
# 語法格式:multi_accept [on | off];
#
#5、選擇事件模型
# 語法格式:use [kqueue | rtisg | epoll | /dev/poll | select | poll | eventport];
#6、每個worker進行的最大連接數
# 語法格式:worker_connections number;
HTTP 核心模塊的配置
具體可以參看《Nginx 中 HTTP 核心模塊配置》
/* HTTP 核心模塊配置的功能 */
/* 虛擬主機與請求分發 */
#監聽埠
#語法:listen address:port[default | default_server | [backlong=num | rcvbuf=size | sndbuf=size |
# accept_filter | deferred | bind | ipv6only=[on | off] | ssl]];
# 默認:listen:80;
# 說明:
# default或default_server:將所在的server塊作為web服務的默認server塊;當請求無法匹配組態檔中的所有主機名時,就會選擇默認的虛擬主機;
# backlog=num:表示 TCP 中backlog佇列存放TCP新連接請求的大小,默認是-1,表示不予設定;
# rcvbuf=size:設定監聽句柄SO_RCVBUF的引數;
# sndbuf=size:設定監聽句柄SO_SNDBUF的引數;
# accept_filter:設定accept過濾器,只對FreeBSD作業系統有用;
# deferred:設定該引數后,若用戶發起TCP連接請求,并且完成TCP三次握手,但是若用戶沒有發送資料,則不會喚醒worker行程,直到發送資料;
# bind:系結當前埠 / 地址對,只有同時對一個埠監聽多個地址時才會生效;
# ssl:在當前埠建立的連接必須基于ssl協議;
#配置塊范圍:server
#主機名稱
#語法:server_name name[...];
#默認:server_name "";
#配置塊范圍:server
#server name 是使用散串列存盤的
#每個散列桶占用記憶體大小
#語法:server_names_hash_bucket_size size;
#默認:server_names_hash_bucker_size 32|64|128;
#
#散串列最大bucket數量
#語法:server_names_hash_max_size size;
#默認:server_names_hash_max_size 512;
#默認:server_name_in_redirect on;
#配置塊范圍:server、http、location
#處理重定向主機名
#語法:server_name_in_redirect on | off;
#默認:server_name_in_redirect on;
#配置塊范圍:server、http、location
#location語法:location[= | ~ | ~* | ^~ | @] /uri/ {}
#配置塊范圍:server
#location嘗試根據用戶請求中的URI來匹配 /uri運算式,若匹配成功,則執行{}里面的配置來處理用戶請求
#以下是location的一般配置項
#1、以root方式設定資源路徑
# 語法格式:root path;
#2、以alias方式設定資源路徑
# 語法格式:alias path;
#3、訪問首頁
# 語法格式:index file...;
#4、根據HTTP回傳碼重定向頁面
# 語法格式:error_page code [code...] [= | =answer-code] uri | @named_location;
#5、是否允許遞回使用error_page
# 語法格式:recursive_error_pages [on | off];
#6、try_files
# 語法格式:try_files path1 [path2] uri;
/* 檔案路徑的定義 */
#root方式設定資源路徑
#語法:root path;
#默認:root html;
#配置塊范圍:server、http、location、if
#以alias方式設定資源路徑
#語法:alias path;
#配置塊范圍:location
#訪問主頁
#語法:index file...;
#默認:index index.html;
#配置塊范圍:http、server、location
#根據HTTP回傳碼重定向頁面
# 語法:error_page code [code...] [= | =answer-code] uri | @named_location;
#配置塊范圍:server、http、location、if
#是否允許遞回使用error_page
# 語法:recursive_error_pages [on | off];
#配置塊范圍:http、server、location
#try_files
# 語法:try_files path1 [path2] uri;
#配置塊范圍:server、location
/* 記憶體及磁盤資源分配 */
# HTTP 包體只存盤在磁盤檔案中
# 語法:client_body_in_file_only on | clean | off;
# 默認:client_body_in_file_only off;
# 配置塊范圍:http、server、location
# HTTP 包體盡量寫入到一個記憶體buffer中
# 語法:client_body_single_buffer on | off;
# 默認:client_body_single_buffer off;
# 配置塊范圍:http、server、location
# 存盤 HTTP 頭部的記憶體buffer大小
# 語法:client_header_buffer_size size;
# 默認:client_header_buffer_size 1k;
# 配置塊范圍:http、server
# 存盤超大 HTTP 頭部的記憶體buffer大小
# 語法:large_client_header_buffer_size number size;
# 默認:large_client_header_buffer_size 4 8k;
# 配置塊范圍:http、server
# 存盤 HTTP 包體的記憶體buffer大小
# 語法:client_body_buffer_size size;
# 默認:client_body_buffer_size 8k/16k;
# 配置塊范圍:http、server、location
# HTTP 包體的臨時存放目錄
# 語法:client_body_temp_path dir-path [level1 [level2 [level3]]];
# 默認:client_body_temp_path client_body_temp;
# 配置塊范圍:http、server、location
# 存盤 TCP 成功建立連接的記憶體池大小
# 語法:connection_pool_size size;
# 默認:connection_pool_size 256;
# 配置塊范圍:http、server
# 存盤 TCP 請求連接的記憶體池大小
# 語法:request_pool_size size;
# 默認:request_pool_size 4k;
# 配置塊范圍:http、server
/* 網路連接設定 */
# 讀取 HTTP 頭部的超時時間
# 語法:client_header_timeout time;
# 默認:client_header_timeout 60;
# 配置塊范圍:http、server、location
# 讀取 HTTP 包體的超時時間
# 語法:client_body_timeout time;
# 默認:client_body_timeout 60;
# 配置塊范圍:http、server、location
# 發送回應的超時時間
# 語法:send_timeout time;
# 默認:send_timeout 60;
# 配置塊范圍:http、server、location
# TCP 連接的超時重置
# 語法:reset_timeout_connection on | off;
# 默認:reset_timeout_connection off;
# 配置塊范圍:http、server、location
# 控制關閉 TCP 連接的方式
# 語法:lingering_close off | on | always;
# 默認:lingering_close on;
# 配置塊范圍:http、server、location
# always 表示關閉連接之前無條件處理連接上所有用戶資料;
# off 表示不處理;on 一般會處理;
# lingering_time
# 語法:lingering_time time;
# 默認:lingering_time 30s;
# 配置塊范圍:http、server、location
# lingering_timeout
# 語法:lingering_timeout time;
# 默認:lingering_time 5s;
# 配置塊范圍:http、server、location
# 對某些瀏覽器禁止keepalive功能
# 語法:keepalive_disable [mise6 | safari | none]...
# 默認:keepalive_disable mise6 safari;
# 配置塊范圍:http、server、location
# keepalive超時時間
# 語法:keepalive_timeout time;
# 默認:keepalive_timeout 75;
# 配置塊范圍:http、server、location
# keepalive長連接上允許最大請求數
# 語法:keepalive_requests n;
# 默認:keepalive_requests 100;
# 配置塊范圍:http、server、location
# tcp_nodelay
# 語法:tcp_nodelay on | off;
# 默認:tcp_nodelay on;
# 配置塊范圍:http、server、location
# tcp_nopush
# 語法:tcp_nopush on | off;
# 默認:tcp_nopush off;
# 配置塊范圍:http、server、location
/* MIME 型別設定 */
# MIME type 與檔案擴展的映射
# 語法:type{...}
# 配置塊范圍:http、server、location
# 多個擴展名可映射到同一個 MIME type
# 默認 MIME type
# 語法:default_type MIME-type;
# 默認:default_type text/plain;
# 配置塊范圍:http、server、location
# type_hash_bucket_size
# 語法:type_hash_bucket_size size;
# 默認:type_hash_bucket_size 32 | 64 | 128;
# 配置塊范圍:http、server、location
# type_hash_max_size
# 語法:type_hash_max_size size;
# 默認:type_hash_max_size 1024;
# 配置塊范圍:http、server、location
/* 限制客戶端請求 */
# 按 HTTP 方法名限制用戶請求
# 語法:limit_except method...{...}
# 配置塊:location
# method 的取值如下:
# GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、
# PROPFIND、PROPPATCH、LOCK、UNLOCK、PATCH
# HTTP 請求包體的最大值
# 語法:client_max_body_size size;
# 默認:client_max_body_size 1m;
# 配置塊范圍:http、server、location
# 對請求限制速度
# 語法:limit_rate speed;
# 默認:limit_rate 0;
# 配置塊范圍:http、server、location、if
# 0 表示不限速
# limit_rate_after規定時間后限速
# 語法:limit_rate_after time;
# 默認:limit_rate_after 1m;
# 配置塊范圍:http、server、location、if
/* 檔案操作的優化 */
# sendfile系統呼叫
# 語法:sendfile on | off;
# 默認:sendfile off;
# 配置塊:http、server、location
# AIO 系統呼叫
# 語法:aio on | off;
# 默認:aio off;
# 配置塊:http、server、location
# directio
# 語法:directio size | off;
# 默認:directio off;
# 配置塊:http、server、location
# directio_alignment
# 語法:directio_alignment size;
# 默認:directio_alignment 512;
# 配置塊:http、server、location
# 打開檔案快取
# 語法:open_file_cache max=N [inactive=time] | off;
# 默認:open_file_cache off;
# 配置塊:http、server、location
# 是否快取打開檔案的錯誤資訊
# 語法:open_file_cache_errors on | off;
# 默認:open_file_cache_errors off;
# 配置塊:http、server、location
# 不被淘汰的最小訪問次數
# 語法:open_file_cache_min_user number;
# 默認:open_file_cache_min_user 1;
# 配置塊:http、server、location
# 檢驗快取中元素有效性的頻率
# 語法:open_file_cache_valid time;
# 默認:open_file_cache_valid 60s;
# 配置塊:http、server、location
/* 客戶請求的特殊處理 */
# 忽略不合法的 HTTP 頭部
# 語法:ignore_invalid_headers on | off;
# 默認:ignore_invalid_headers on;
# 配置塊:http、server
# HTTP 頭部是否允許下劃線
# 語法:underscores_in_headers on | off;
# 默認:underscores_in_headers off;
# 配置塊:http、server
# If_Modified_Since 頭部的處理策略
# 語法:if_modified_since [off | exact | before]
# 默認:if_modified_since exact;
# 配置塊:http、server、location
# 檔案未找到時是否記錄到error日志
# 語法:log_not_found on | off;
# 默認:log_not_found on;
# 配置塊:http、server、location
# 是否合并相鄰的“/”
# 語法:merge_slashes on | off;
# 默認:merge_slashes on;
# 配置塊:http、server、location
# DNS決議地址
# 語法:resolver address...;
# 配置塊:http、server、location
# DNS決議的超時時間
# 語法:resolver_timeout time;
# 默認:resolver_timeout 30s;
# 配置塊:http、server、location
# 回傳錯誤頁面是否在server中注明Nginx版本
# 語法:server_tokens on | off;
# 默認:server_tokens on;
# 配置塊:http、server、location
以下是在 Ubuntu 12.04 系統成功安裝 Nginx 之后的主組態檔:
#Nginx服務器正常啟動時會讀取該組態檔,以下的值都是默認的,若需要可自行修改;
#以下是配置選項
#Nginx worker行程運行的用戶以及用戶組
#語法格式:user username[groupname]
#user nobody;
#Nginx worker 行程個數
worker_processes 1;
#error 日志設定
#語法格式:error /path/file level
#其中/path/file是一個具體檔案;level是日志的輸出級別,其取值如下:
#debug info notice warn error crit alert emerg,從左至右級別增大;
#若設定一個級別后,則在輸出的日志檔案中只輸出級別大于或等于已設定的級別;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#保存master行程ID的pid檔案存放路徑
#語法格式:pid path/file
#pid logs/nginx.pid;
#事件類配置項
#一般有以下幾種配置:
#1、是否打開accept鎖
# 語法格式:accept_mutex [on | off];
#2、lock檔案的路徑
# 語法格式:lock_file path/file;
#3、使用accept鎖后到真正建立連接之間的延遲時間
# 語法格式:accept_mutex_delay Nms;
#4、批量建立新連接
# 語法格式:multi_accept [on | off];
#5、選擇事件模型
# 語法格式:use [kqueue | rtisg | epoll | /dev/poll | select | poll | eventport];
#6、每個worker進行的最大連接數
# 語法格式:worker_connections number;
events {
worker_connections 1024;
}
#以下是http模塊
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;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
#server塊
# 每個server塊就是一個虛擬主機,按照server_name來區分
server {
#監聽埠
listen 80;
#主機名稱
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#location語法:location[= | ~ | ~* | ^~ | @] /uri/ {}
#location嘗試根據用戶請求中的URI來匹配 /uri運算式,若匹配成功,則執行{}里面的配置來處理用戶請求
#以下是location的一般配置項
#1、以root方式設定資源路徑
# 語法格式:root path;
#2、以alias方式設定資源路徑
# 語法格式:alias path;
#3、訪問首頁
# 語法格式:index file...;
#4、根據HTTP回傳碼重定向頁面
# 語法格式:error_page code [code...] [= | =answer-code] uri | @named_location;
#5、是否允許遞回使用error_page
# 語法格式:recursive_error_pages [on | off];
#6、try_files
# 語法格式:try_files path1 [path2] uri;
location / {
root html;
index index.html index.htm;
}
#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;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
參考資料:
《深入理解Nginx》
《Nginx模塊開發入門》
《Nginx開發從入門到精通》
https://www.kancloud.cn/digest/understandingnginx/202587
點擊得好禮
> 本文由作者pm1024:JAVA實驗手冊 發布,交流:583284584!轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/3824.html
標籤:其他
