配置指南
接下來我們學習有關(guān) Nginx 的配置
基本配置格式
Nginx 的配置文件由若干個部分組成成福,每一個部分都是按照下面這樣定義的陨收。
<section> {
<directive> <paramters>;
}
需要注意的是每一個指令都由行;
結(jié)束,{}
代表一個新的上下文。
一伞矩、全局配置
全局配置部分對整個 server 都有效,全局部分包含配置指令夏志,例如user
和worker_processes
乃坤,也包括各種各樣的節(jié)<section>
,配置如下 :
指令 | 說明 |
---|---|
user | 配置 worker 進程的用戶與組沟蔑,如果忽略 group湿诊,那么 group 的名字等于該參數(shù)指定的用戶和用戶組 |
worker_processes | 指定 worker 進程的啟動數(shù)量,這些進程用于處理客戶的鏈接溉贿,該數(shù)量取決于服務(wù)器環(huán)境枫吧、磁盤子系統(tǒng)和網(wǎng)絡(luò)基礎(chǔ)設(shè)施浦旱。例如與 cpu 綁定的負載核心數(shù)量相同宇色,并用1.5~2 之間乘以這個數(shù)作為I/O 密集型負載 |
error_log | 錯誤寫入文件,如果在其他區(qū)段沒有這個參數(shù)颁湖,則這個日志文件將會記載所有的錯誤記錄宣蠕,錯誤記錄級別有(debug、info甥捺、notice抢蚀、warn、error镰禾、crit皿曲、alert唱逢、emerg) |
pid | 記錄主進程的 pid,該參數(shù)可以覆蓋編譯時的默認配置 |
use | 用于使用怎么樣的連接方法屋休,該參數(shù)可以覆蓋編譯時的默認配置坞古,需要配置一個 events 區(qū)段 |
worker_conections | 該指令用于配置一個工作進程能夠接受并發(fā)的最大連接數(shù),這個連接包括劫樟,客戶連接和向上游服務(wù)器的連接等痪枫,對于反向代理服務(wù)器尤其重要,為了達到這個并發(fā)連接數(shù)量叠艳,還需要對操作系統(tǒng)作一定的調(diào)整 |
進入 Nginx 目錄下conf
目錄奶陈,編輯nginx.conf
,編輯成功后/usr/local/nginx/sbin/nginx -s reload
重啟 Nginx
# worker 的進程啟動數(shù)量
worker_processes 1;
# 錯誤日志存放地址
error_log /usr/local/nginx/logs/error.log;
# Nginx啟動進程號附较,方便關(guān)閉進程
pid /usr/local/nginx/logs/nginx.pid;
events {
# 配置工作進程接受的最大并發(fā)數(shù)
worker_connections 1024;
}
二吃粒、Include
我們可以使用 include 指令將 Nginx 的配置模塊導入,只有這些模塊有正確的 Nginx 語法即可翅睛,例如我們將在conf
目錄下創(chuàng)建blocks
声搁,然后創(chuàng)建global.conf
文件,將上面內(nèi)容寫入捕发。
然后使用
nginx -t -c global.conf
注意疏旨,如果你的nginx
不能使用,你可需要將它添加到環(huán)境變量中
vim /etc/profile
在最后一行添加
PATH=$PATH:/usr/local/nginx/sbin
export PATH
使配置立即生效
source /etc/profile
如果測試成功扎酷,則會打印
nginx: configuration file /usr/local/nginx/conf/blocks/global.conf test is successful
最后我們可以在nginx.conf
中配置
include /usr/local/nginx/conf/blocks/global.conf;
你也可以使用通配符使 nginx 自動匹配
include /usr/local/nginx/conf/blocks/*.conf;
三檐涝、Http server
Nginx 必須有 http 模塊,你不能在編譯的時候使用--without-http
接下來將關(guān)于 http 塊的指令法挨。這些指令都位置http
的塊下
A. 客戶端指令
為什么叫客戶端指令谁榜,因為這些指令是處理客戶端連接本身的各個房買你,以及不同類型的客戶端
指令 | 說明 |
---|---|
chunked_transfer_encoding | 響應(yīng)允許或禁用Http/1.1標準的塊傳輸編碼 |
client_body_buffer_size | 設(shè)置請求實體的緩沖區(qū)大小凡纳,如果實體超過該緩沖區(qū)大小窃植,則完整主體將它的一部分寫入臨時文件。如果Nginx直接使用文件而不是緩沖區(qū)荐糜,則該指令會忽略巷怜,默認清清褲下,該指令為32位新系統(tǒng)設(shè)置8k暴氏,為64為系統(tǒng)設(shè)置16k延塑,可以在http,server答渔,location區(qū)塊使用 |
client_body_in_file_only | 該指令禁用Nginx緩沖器并將請求體存儲在臨時文件中关带。該指令可以在http與location塊使用,可選值可以為off 禁用文件寫入(默認) 沼撕、clean 請求實體將寫入磁盤宋雏,該文件會在處理請求后立即刪除 芜飘、on 請求正文將寫入文件,處理請求后磨总,將不會刪除文件
|
client_body_in_single_buffer | 設(shè)置請求實體存儲在單個緩存區(qū)中燃箭,默認為off ,如果啟用舍败,他將優(yōu)化請求實體變量涉及的I/O操作 |
client_body_temp_path | 保存客戶端請求體的路徑 |
client_body_timeout | 指定客戶端發(fā)送請求實體的超時時間招狸,如果在指定時間內(nèi)沒有發(fā)送任何內(nèi)容,Nginx將返回HTTP 408(Request Timed Out) |
client_header_buffer_size | 為請求報文首部分配一個緩沖區(qū)邻薯,如果請求頭大小大于指定的緩沖區(qū)裙戏,則可以使用large_client_header_buffer 指令分配更大的緩沖區(qū) |
client_header_timeout | 指定客戶端發(fā)送請求首部的超時時間 |
client_max_boddy_size | 默認為1M,表示允許請求報文實體的最大大小厕诡,在Content-Length 中指定累榜,如果請求的正文數(shù)據(jù)大于該值,那么HTTP協(xié)議就會報413 Request Entity Too Large灵嫌。 |
keepalive_disable | 對某些客戶端禁用keep-alive齊請求功能 |
keepalive_requests | 定義在一個keep-alive關(guān)閉之前可以接受多少個請求 |
keepalive_timout | 指定keep-alive連結(jié)持續(xù)多久壹罚。第二個參數(shù)可以設(shè)置,用戶在響應(yīng)頭中設(shè)置keep-alive 頭 |
large_client_header_buffers | 定義最大數(shù)量和最大客戶端請求頭大小 |
msie_padding | 為了填充響應(yīng)的大小至512字節(jié)寿羞,對于MSIE客戶端猖凛,大于400的狀態(tài)代碼會添加注釋以便于滿足512字節(jié),通過啟用該命令可以禁止該行為 |
mise_refresh | 對于MSIE客戶端绪穆,可啟用發(fā)送一個refresh頭辨泳,而不是重定向 |
附 : msie就是IE瀏覽器
B. 文件I/O指令
這些指令用于控制Nginx如果投遞靜態(tài)文件,以及如何管理文件
指令 | 說明 |
---|---|
aio | 啟動異步文件I/O玖院。該指令對于現(xiàn)代版本的FreeBSD和發(fā)布的Linux都有效 |
directio | 用于啟動操作系統(tǒng)特定的標志或者功能菠红,提供大于給定參數(shù)的文件,在linxu下使用aio時难菌,需要該指令 |
directio_aignment | 設(shè)置directio的算法试溯,默認值為512,通常足夠郊酒,但在Linux下的XFS下推薦增加到4k |
open_file_cache | 配置一個緩存用于存放打開的文件描述符遇绞、目錄查詢和文件錯誤,啟用該指令可以存儲信息的緩存猎塞。例如打開的文件描述符和相關(guān)元數(shù)據(jù)试读、大小修改時間等杠纵。文件和目錄的存在于查找相關(guān)的任何錯誤荠耽,例如權(quán)限被拒絕 |
open_file_cache_errors | 按照open_file_cache,啟用文件查詢錯誤緩存 |
open_file_cache_min_uses | open_file_cache 緩存的文件描述符保留在緩存中比藻,使用該指令可以配置最少使用文件描述符的次數(shù) |
open_file_cache_valid | 指定對open_file_cache緩存有效性檢查的時間間隔 |
postpone_output | 指定Nginx發(fā)送給客戶端的最小數(shù)值铝量,如果可能倘屹,沒有數(shù)據(jù)會發(fā)送,直到達到該值 |
read_ahead | 內(nèi)核將預讀文件到設(shè)定參數(shù)大小慢叨。目前支持FreeBSD和Linux |
sendfile | 使用sendfile直接復制數(shù)據(jù)從一個到另一個文件描述符 |
sendfile_max_chunk | 設(shè)置一個sendfile 拷貝最大數(shù)據(jù)的大小纽匙,這是為了阻止worker的貪婪 |
C. 哈希指令
hash指令控制Nginx分配給某些塊多大的靜態(tài)內(nèi)存,在啟動與重新配置時拍谐,Nginx會計算需要的最小值烛缔。在Nginx發(fā)出警告時,你只需要調(diào)整一個*_hash_max_size
指令的參數(shù)就可以達到效果轩拨。該指令用于滿足多處理器緩存行践瓷,降低檢索所需要的檢索茶軸啊。因此不需要改變
指令 | 說明 |
---|---|
server_names_hash_bucket_size | 指定用于保存server_name(服務(wù)器名稱)哈希表的大小 |
sever_names_hash_max_size | 指定server_name的哈希表的最大大小 |
types_hash_bucket_size | 指定存放哈希表的“桶"大小 |
types_hash_max_size | 指定哈希類型表的最大大小 |
variables_hash_bucket_size | 它指定用于存放保留變量"桶"的大小 |
variables_hash_max_size | 指定存放保留變量最大哈希值的大小 |
Nginx存在一個存儲服務(wù)器名字的hash表亡蓉,它由 server_names_hash_max_size 和 server_names_hash_bucket_size所控制晕翠,并且參數(shù)
hash_bucket_size
總是等于hash表的大小,而且是一個處理器緩存大小的倍數(shù)砍濒。在減少了內(nèi)存中存取次數(shù)后淋肾,是處理器加速查找hash表成為可能,如果hash_bucket_size
等于一個處理器緩存的大小爸邢,那么查找鍵的時候樊卓,最壞的情況是在內(nèi)存中查找兩次,第一次用于確定存儲單元的地址杠河,第二次是在存儲單元中找到鍵值简识。所以如果Nginx提示需要增大hash_max_size
或者hash_bucket_size
,那么主要考慮增加sever_names_hash_max_size
的大小
D. socket 指令
這些指令描述了Nginx如何設(shè)置創(chuàng)建TCP套接字的變量選項
指令 | 說明 |
---|---|
lingering_close | 指定如何保持客戶端的連接感猛,在nginx中七扰,需要關(guān)閉連接時,并非立即關(guān)閉連接陪白,而是先關(guān)閉TCP的連接颈走,等待一段時候后,再關(guān)掉連接的讀咱士。因為有可能Nginx在執(zhí)行關(guān)閉TCP連接時立由,有可能有一部分數(shù)據(jù)還在緩沖流中,當我們發(fā)送錯誤信息時序厉,關(guān)閉了TCP連接锐膜,那么這個錯誤信息就沒有發(fā)送到客戶端了。 |
lingering_time | 使用lingering_close指令的連結(jié)中弛房,使用該指令可以指定客戶端連接為了處理更多的數(shù)據(jù)需要保持打開連接的時間 |
lingering_timeout | 結(jié)合linger_close道盏,該指令顯示Nginx在關(guān)閉客戶端連接之前,為獲取更多數(shù)據(jù)要等待多久 |
reset_timeout_connection | 使用這個指令,超時的連結(jié)會立即關(guān)閉荷逞,釋放相關(guān)的內(nèi)存媒咳。默認的狀態(tài)是出于FIN_WAIT1 ,這種狀態(tài)會一直保持連接 |
send_lowat | 如果非0种远,Nginx將會在客戶端套接字嘗試減少發(fā)送操作 |
send_timeout | 在兩次成功的客戶端接受響應(yīng)的寫操作之間設(shè)置一個超時時間 |
tcp_nodelay | 啟用或者禁用TCP_NODELAY 選項涩澡,用于keep-alive 連結(jié) |
tcp_nopush | 僅依賴于sendfile 使用,能夠使Nginx在一個數(shù)據(jù)包中嘗試發(fā)送響應(yīng)頭坠敷,以及在數(shù)據(jù)包中發(fā)送一個完整的文件 |
例如妙同,下面給一個http配置部分的例子
http {
include /opt/local/etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
sever_names_hash_max_size 1024;
}
虛擬Server
任意使用關(guān)鍵字server
開始的部分我們稱之為虛擬服務(wù)器,它根據(jù)server_name
指令將邏輯分開處理膝迎,這些虛擬服務(wù)器響應(yīng)Http請求渐溶,因此它們應(yīng)包含在http
塊中。
虛擬服務(wù)器應(yīng)該由 listen
和 server_name
指令組合定義弄抬,listen指令可以定義一個IP地址或者端口組合或者UNIX域套接字路徑
listen address[:port];
listen port;
listen unix:path;
listen指令位而已表示了Nginx下的套接字(socket)綁定茎辐,此外還有一些可選參數(shù)
參數(shù) | 說明 | 解釋 |
---|---|---|
default_server | 定義個組合。address:port 默認的請求綁定在這里處理 | |
Setfib | 為套接字監(jiān)聽設(shè)置相應(yīng)的FIB | 僅僅支持FreeBSD掂恕,不支持UNIX域套接字 |
backlog | 在listen()的調(diào)用設(shè)置backlog參數(shù)調(diào)用 | 在FreeBSD系統(tǒng)默認值為-1,其他系統(tǒng)為511 |
rcvbuf | 在套接字監(jiān)聽中設(shè)置SO_RCVBUF 參數(shù) |
|
sndbuf | 在套接字監(jiān)聽中設(shè)置SO_SNDBUF 參數(shù) |
|
accept_filter | 設(shè)置接收的過濾器 dataready或者httpread dataready | 僅支持FreeBSD |
deferred | 設(shè)置accept()調(diào)用 TCP_DEFER_ACCEPT | 僅支持linux |
bind | 為address:port套接字打開一個單獨的bind()調(diào)用 | 熱河套接字被調(diào)用拖陆,那么一個單端的bind()將會被隱式的調(diào)用 |
ipv6only | 設(shè)置IPV6_V6ONLY參數(shù)的值 | 只能在一個全新的開始設(shè)置,不支持UNIX域套接字 |
ssl | 表明該端口僅接受https的連結(jié) | 允許更為緊湊的配置 |
so_keepalive | 為TCP監(jiān)聽套接字配置的keepalive |
server_name指令很簡單懊亡,默認值為""依啰,對于沒有server_name的server,沒有設(shè)置host頭字段的請求將會匹配給該server處理店枣,這種情況可以用于速警,例如,丟棄缺乏域名頭的請求(IP地址直接請求)鸯两,例如
server {
listen 80;
return 444;
}
使用444會使Nginx即關(guān)閉一個連接
除了普通字符串外闷旧, server_name
的參數(shù)還可以是通配符,例如
*.example.com
www.example.*
.example.com 匹配子域以及域本身
另外钧唐,還可以在域名前面加上波浪號~
輸入正則表達式忙灼,例如
server_name ~^www\.example\.com$
server_name ~^www(\d+).example\.(com)$
// 后者使用`()`為字符片段,可以在后面的指令進一步配置($1 $2)
對于一個特定的請求钝侠,確定有那些虛擬服務(wù)器提供該請求的服務(wù)该园,應(yīng)該遵循下面的邏輯 :
- 匹配 IP地址 和
listen
指令指定的端口 - 將Host頭字段作為一個字符串匹配
server_name
指令 - 將Host頭字段與
server_name
指令值字符串的開始部分作匹配 - 將 Host 頭字段與
server_name
指令值進行正則匹配 - 如果所有的 Host 頭匹配失敗,那么轉(zhuǎn)向 listen 指令標記 的 default_server
- 如果所有的 Host 頭匹配失敗帅韧,也沒有default_server里初,應(yīng)該有第一個sevre進行l(wèi)isten
最佳實踐 : 推薦在
listen
中明確定義default_server
,例如 我們可以給Nginx設(shè)置默認服務(wù)器忽舟,并返回403双妨。server{ listen 80 default_server; server_name _; return 403; }