配置指南

配置指南

接下來我們學習有關(guān) Nginx 的配置

基本配置格式

Nginx 的配置文件由若干個部分組成成福,每一個部分都是按照下面這樣定義的陨收。

<section> {
    <directive> <paramters>;
}

需要注意的是每一個指令都由行;結(jié)束,{}代表一個新的上下文。

一伞矩、全局配置

全局配置部分對整個 server 都有效,全局部分包含配置指令夏志,例如userworker_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)該由 listenserver_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; 
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淮阐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斥难,更是在濱河造成了極大的恐慌,老刑警劉巖帘饶,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哑诊,死亡現(xiàn)場離奇詭異,居然都是意外死亡及刻,警方通過查閱死者的電腦和手機镀裤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缴饭,“玉大人,你說我怎么就攤上這事〗椿ⅲ” “怎么了蹄胰?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長丢氢。 經(jīng)常有香客問我傅联,道長,這世上最難降的妖魔是什么疚察? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任蒸走,我火速辦了婚禮,結(jié)果婚禮上貌嫡,老公的妹妹穿的比我還像新娘比驻。我一直安慰自己,他們只是感情好岛抄,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布别惦。 她就那樣靜靜地躺著,像睡著了一般夫椭。 火紅的嫁衣襯著肌膚如雪步咪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天益楼,我揣著相機與錄音猾漫,去河邊找鬼。 笑死感凤,一個胖子當著我的面吹牛悯周,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陪竿,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼禽翼,長吁一口氣:“原來是場噩夢啊……” “哼屠橄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起闰挡,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤锐墙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后长酗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溪北,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年夺脾,在試婚紗的時候發(fā)現(xiàn)自己被綠了之拨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡咧叭,死狀恐怖蚀乔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菲茬,我是刑警寧澤吉挣,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站婉弹,受9級特大地震影響听想,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜马胧,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一汉买、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧佩脊,春花似錦蛙粘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至歇盼,卻和暖如春舔痕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豹缀。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工伯复, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人邢笙。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓啸如,卻偏偏與公主長得像,于是被迫代替她去往敵國和親氮惯。 傳聞我的和親對象是個殘疾皇子叮雳,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349