架構(gòu)師細說 NGINX 的配置及優(yōu)化

最近感覺很多東西在運用到一定的程度之后,會發(fā)現(xiàn)原來是自己了解到的不夠。一方面限于實際運用到的不多绊汹,一方面可能是因為一開始沒有進行全面認識。遂這里搜集整理了一番NGINX扮宠。

一西乖、nginx啟動和關(guān)閉

centos平臺,源碼安裝的

/usr/local/nginx/nginx # 啟動

/usr/local/nginx/nginx -s reload # 平滑重啟

/usr/local/nginx/nginx.conf # 配置文件

mac平臺,使用brew安裝的

/usr/local/bin/nginx # 啟動

/usr/local/bin/nginx -s reload # 平滑重啟

/usr/local/etc/nginx/nginx.cnf # 配置文件

二坛增、nginx.conf 配置文件詳解

其實获雕,對比,apache 的配置文件收捣,它的相對比較清晰和簡單届案,之前覺得很難,現(xiàn)在沉下心來想想罢艾,其實很簡單楣颠。大致的分塊下,基本就分為以下幾塊:

main

events {

....

}

http {

....

upstream myproject {

.....

}

server {

....

location {

....

}

}

server {

....

location {

....

}

}

....

}

以上我們可以看出咐蚯,nginx配置文件主要分為六個區(qū)域:

1童漩、main (全局設(shè)置)

2、events (nginx工作模式)

3春锋、http (http設(shè)置)

4矫膨、sever (主機設(shè)置)

5、location (URL匹配)

6期奔、upstream (負載均衡服務器設(shè)置)

2.1 main模塊

下面是一個main區(qū)域侧馅,他是一個全局的設(shè)置

user nobody nobody; # 指定 Nginx Worker 進程運行用戶以及用戶組,默認由 nobody 賬號運行

worker_processes 2; # 指定 Nginx 要開啟的子進程數(shù)

error_log /usr/local/var/log/nginx/error.log notice; # 定義全局錯誤日志文件

pid /usr/local/var/run/nginx/nginx.pid; # 指定進程 id 的存儲文件位置

worker_rlimit_nofile 1024; # 指定一個 nginx 進程可以打開的最多文件描述符數(shù)目呐萌,如果設(shè)置 65535施禾,需要使用命令 “ulimit -n 65535” 來設(shè)置

user 來指定 Nginx Worker 進程運行用戶以及用戶組,默認由 nobody 賬號運行搁胆。

worker_processes 來指定了 Nginx 要開啟的子進程數(shù)弥搞。每個 Nginx 進程平均耗費 10M~12M 內(nèi)存。根據(jù)經(jīng)驗渠旁,一般指定 1 個進程就足夠了攀例,如果是多核 CPU,建議指定和 CPU 的數(shù)量一樣的進程數(shù)即可顾腊。我這里寫 2粤铭,那么就會開啟 2 個子進程,總共 3 個進程杂靶。

error_log 用來定義全局錯誤日志文件梆惯。日志輸出級別有 debug酱鸭、info、notice垛吗、warn凹髓、error、crit 可供選擇怯屉,其中蔚舀,debug 輸出日志最為最詳細,而 crit 輸出日志最少锨络。

pid 用來指定進程id的存儲文件位置赌躺。

worker_rlimit_nofile 用于指定一個 nginx 進程可以打開的最多文件描述符數(shù)目,這里是 65535羡儿,需要使用命令 “ulimit -n 65535” 來設(shè)置礼患。

2.2 events 模塊

events 模塊來用指定 nginx 的工作模式和工作模式及連接數(shù)上限,一般是這樣

events {

use kqueue; # mac 平臺掠归,指定 Nginx 的工作模式

worker_connections 1024; # 定義 Nginx 每個進程的最大連接數(shù)缅叠,即接收前端的最大請求數(shù),默認是 1024

}

use 用來指定 Nginx 的工作模式拂到。Nginx 支持的工作模式有 select、poll码泞、kqueue兄旬、epoll、rtsig 和 /dev/poll余寥。其中 select 和 poll 都是標準的工作模式领铐,kqueue 和 epoll 是高效的工作模式,不同的是 epoll 用在 Linux 平臺上宋舷,而 kqueue 用在 BSD 系統(tǒng)中绪撵,因為 Mac 基于 BSD ,所以 Mac 也得用這個模式,對于 Linux 系統(tǒng)祝蝠,epoll 工作模式是首選音诈。

worker_connections 用于定義Nginx每個進程的最大連接數(shù),即接收前端的最大請求數(shù)绎狭,默認是1024细溅。最大客戶端連接數(shù)由worker_processes 和 worker_connections 決定,即 Max_clients = worker_processes * worker_connections儡嘶,在作為反向代理時喇聊,Max_clients 變?yōu)椋篗ax_clients = worker_processes * worker_connections/4。

進程的最大連接數(shù)受 Linux 系統(tǒng)進程的最大打開文件數(shù)限制蹦狂,在執(zhí)行操作系統(tǒng)命令 “ulimit -n 65536” 后 worker_connections 的設(shè)置才能生效誓篱。

2.3 http 模塊

http 模塊可以說是最核心的模塊了朋贬,它負責 HTTP 服務器相關(guān)屬性的配置,它里面的 server 和 upstream 子模塊窜骄,至關(guān)重要锦募,等到反向代理和負載均衡以及虛擬目錄等會仔細說。

http{

include mime.types; # 用來設(shè)定文件的 mime 類型啊研,來告訴 nginx 來識別文件類型

default_type application/octet-stream; # 設(shè)定了默認的類型為二進制流御滩,也就是當文件類型未定義時使用這種方式

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

# log_format 設(shè)置日志的格式,和記錄哪些參數(shù)党远,這里設(shè)置為 main 類型的日志

access_log /usr/local/var/log/nginx/access.log main;

# access_log 記錄每次的訪問日志的文件地址削解,后面的 main 是日志的格式樣式,對應于 log_format 的 main

sendfile on; # 開啟高效文件傳輸模式

tcp_nopush on; # 設(shè)置為 on 用于防止網(wǎng)絡(luò)阻塞

tcp_nodelay on; # 設(shè)置為 on 用于防止網(wǎng)絡(luò)阻塞

keepalive_timeout 10; # 設(shè)置客戶端連接保持活動的超時時間沟娱。在超過這個時間之后氛驮,服務器會關(guān)閉該連接

#gzip on;

upstream myproject {

.....

}

server {

....

}

}

下面詳細介紹下這段代碼中每個配置選項的含義。

include 用來設(shè)定文件的 mime 類型,類型在配置文件目錄下的 mime.type 文件定義济似,來告訴 nginx 來識別文件類型矫废。

default_type 設(shè)定了默認的類型為二進制流,也就是當文件類型未定義時使用這種方式砰蠢,例如在沒有配置 asp 的 locate 環(huán)境時蓖扑,Nginx 是不予解析的,此時台舱,用瀏覽器訪問 asp 文件就會出現(xiàn)下載了律杠。

log_format 用于設(shè)置日志的格式(格式設(shè)置可參照 Nginx日志格式設(shè)置),和記錄哪些參數(shù)竞惋,這里設(shè)置為 main柜去,剛好用于 access_log 來記錄這種類型。

main 的類型日志如下:也可以增刪部分參數(shù)拆宛。

127.0.0.1 - - [21/Apr/2015:18:09:54 +0800] "GET /index.php HTTP/1.1" 200 87151 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36"

access_log 用來記錄每次的訪問日志的文件地址嗓奢,后面的 main 是日志的格式樣式浑厚,對應于 log_format 的 main。

sendfile 參數(shù)用于開啟高效文件傳輸模式钳幅。將 tcp_nopush 和 tcp_nodelay 兩個指令設(shè)置為 on 用于防止網(wǎng)絡(luò)阻塞。

keepalive_timeout 設(shè)置客戶端連接保持活動的超時時間贡这。在超過這個時間之后,服務器會關(guān)閉該連接。

2.4 server 模塊

sever 模塊是 http 的子模塊击奶,它用來定一個虛擬主機。

我們來看一個簡單的 server 是如何做的柜砾?

server { # 標志定義虛擬主機開始

listen 8080; # 指定虛擬主機的服務端口

server_name localhost 192.168.12.10 www.yangyi.com; # 指定IP地址或者域名,多個域名之間用空格分開

# 全局定義痰驱,如果都是這一個目錄,這樣定義最簡單担映。

root /Users/yangyi/www;

# root 表示在這整個 server 虛擬主機內(nèi),全部的 root web 根目錄叫潦。注意要和 locate {} 下面定義的區(qū)分開來

index index.php index.html index.htm;

# index 全局定義訪問的默認首頁地址蝇完。注意要和 locate {} 下面定義的區(qū)分開來

charset utf-8; # 設(shè)置網(wǎng)頁的默認編碼格式

access_log usr/local/var/log/host.access.log main;

# access_log 指定此虛擬主機的訪問日志存放路徑,最后的 main 用于指定訪問日志的輸出格式

error_log usr/local/var/log/host.error.log error;

....

}

server 標志定義虛擬主機開始矗蕊。

listen 用于指定虛擬主機的服務端口短蜕。

server_name 用來指定IP地址或者域名,多個域名之間用空格分開傻咖。

root 表示在這整個 server 虛擬主機內(nèi)朋魔,全部的 root web 根目錄。注意要和 locate {} 下面定義的區(qū)分開來卿操。

index 全局定義訪問的默認首頁地址警检。注意要和 locate {} 下面定義的區(qū)分開來。

charset 用于設(shè)置網(wǎng)頁的默認編碼格式硬纤。

access_log 用來指定此虛擬主機的訪問日志存放路徑解滓,最后的 main 用于指定訪問日志的輸出格式赃磨。

2.5 location 模塊

location 模塊是 nginx 中用的最多的筝家,也是最重要的模塊了,什么負載均衡啊邻辉、反向代理啊溪王、虛擬域名啊都與它相關(guān)。慢慢來講:

location 根據(jù)它字面意思就知道是來定位的值骇,定位 URL莹菱,解析 URL,所以吱瘩,它也提供了強大的正則匹配功能道伟,也支持條件判斷匹配,用戶可以通過 location 指令實現(xiàn) Nginx 對動、靜態(tài)網(wǎng)頁進行過濾處理蜜徽。像我們的 php 環(huán)境搭建就是用到了它祝懂。

我們先來看這個,設(shè)定默認首頁和虛擬機目錄拘鞋。

location / { # 表示匹配訪問根目錄

root /Users/yangyi/www; # 指定訪問根目錄時砚蓬,虛擬主機的 web 目錄

index index.php index.html index.htm; # 設(shè)定我們只輸入域名后訪問的默認首頁地址

}

location / 表示匹配訪問根目錄。

root 指令用于指定訪問根目錄時盆色,虛擬主機的web目錄灰蛙,這個目錄可以是相對路徑(相對路徑是相對于nginx的安裝目錄)。也可以是絕對路徑隔躲。

index 用于設(shè)定我們只輸入域名后訪問的默認首頁地址摩梧,有個先后順序:index.php index.html index.htm,如果沒有開啟目錄瀏覽權(quán)限蹭越,又找不到這些默認首頁障本,就會報403錯誤驾霜。

location 還有一種方式就是正則匹配粪糙,開啟正則匹配這樣:location ~忿项。后面加個~轩触。

下面這個例子是運用正則匹配來鏈接php脱柱。我們之前搭建環(huán)境也是這樣做:

location ~ .php$ {

root /Users/yangyi/www;

fastcgi_pass 127.0.0.1:9000; # 鏈接的是 php-fpm 的地址

fastcgi_index index.php;

include fastcgi.conf;

}

.php$ 熟悉正則的我們直到惨好,這是匹配 .php 結(jié)尾的 URL日川,用來解析 php 文件矩乐。里面的 root 也是一樣,用來表示虛擬主機的根目錄透葛。

fast_pass 鏈接的是 php-fpm 的地址僚害。

2.6 upstream 模塊

upstream 模塊負責負載均衡模塊繁调,通過一個簡單的調(diào)度算法來實現(xiàn)客戶端 IP 到后端服務器的負載均衡

upstream iyangyi.com{

ip_hash;

server 192.168.12.1:80;

server 192.168.12.2:80 down;

server 192.168.12.3:8080 max_fails=3 fail_timeout=20s;

server 192.168.12.4:8080;

}

在上面的例子中蹄胰,通過 upstream 指令指定了一個負載均衡器的名稱 iyangyi.com。這個名稱可以任意指定浩蓉,在后面需要的地方直接調(diào)用即可捻艳。

里面是 ip_hash 這是其中的一種負載均衡調(diào)度算法认轨,下面會著重介紹嘁字。緊接著就是各種服務器了纪蜒。用 server 關(guān)鍵字表識纯续,后面接 ip拌蜘。

Nginx 的負載均衡模塊目前支持 4 種調(diào)度算法 :

1)weight 輪詢(默認)

每個請求按時間順序逐一分配到不同的后端服務器简卧,如果后端某臺服務器宕機举娩,故障系統(tǒng)被自動剔除,使用戶訪問不受影響智玻。weight吊奢。指定輪詢權(quán)值页滚,weight值越大裹驰,分配到的訪問機率越高幻林,主要用于后端每個服務器性能不均的情況下沪饺。

2)ip_hash

每個請求按訪問IP的hash結(jié)果分配闷愤,這樣來自同一個IP的訪客固定訪問一個后端服務器肝谭,有效解決了動態(tài)網(wǎng)頁存在的session共享問題攘烛。

3)fair

比上面兩個更加智能的負載均衡算法坟漱。此種算法可以依據(jù)頁面大小和加載時間長短智能地進行負載均衡芋齿,也就是根據(jù)后端服務器的響應時間來分配請求,響應時間短的優(yōu)先分配觅捆。Nginx本身是不支持fair的掂摔,如果需要使用這種調(diào)度算法,必須下載Nginx的upstream_fair模塊级历。

4)url_hash

按訪問url的hash結(jié)果來分配請求寥殖,使每個url定向到同一個后端服務器扛禽,可以進一步提高后端緩存服務器的效率编曼。Nginx本身是不支持url_hash的掐场,如果需要使用這種調(diào)度算法熊户,必須安裝Nginx 的hash軟件包嚷堡。

在 HTTP Upstream 模塊中蝌戒,可以通過server指令指定后端服務器的IP地址和端口北苟,同時還可以設(shè)定每個后端服務器在負載均衡調(diào)度中的狀態(tài)友鼻。常用的狀態(tài)有:

down彩扔,表示當前的server暫時不參與負載均衡虫碉。

backup蔗衡,預留的備份機器绞惦。當其他所有的非backup機器出現(xiàn)故障或者忙的時候洋措,才會請求backup機器济蝉,因此這臺機器的壓力最輕。

max_fails菠发,允許請求失敗的次數(shù)王滤,默認為1。當超過最大次數(shù)時滓鸠,返回proxy_next_upstream 模塊定義的錯誤雁乡。

fail_timeout,在經(jīng)歷了max_fails次失敗后糜俗,暫停服務的時間踱稍。max_fails可以和fail_timeout一起使用。

注意 當負載調(diào)度算法為ip_hash時悠抹,后端服務器在負載均衡調(diào)度中的狀態(tài)不能是weight和backup珠月。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蕊玷,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門欺殿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棍潘,“玉大人肴楷,你說我怎么就攤上這事呵恢〕疲” “怎么了术徊?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晒衩。 經(jīng)常有香客問我,道長霎褐,這世上最難降的妖魔是什么省艳? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任涩堤,我火速辦了婚禮福荸,結(jié)果婚禮上敬锐,老公的妹妹穿的比我還像新娘。我一直安慰自己丰泊,他們只是感情好瞳购,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般给梅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上站欺,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音纤垂,去河邊找鬼矾策。 笑死,一個胖子當著我的面吹牛峭沦,可吹牛的內(nèi)容都是我干的贾虽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吼鱼,長吁一口氣:“原來是場噩夢啊……” “哼蓬豁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起菇肃,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤地粪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后琐谤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蟆技,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了质礼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聊品。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖几苍,靈堂內(nèi)的尸體忽然破棺而出翻屈,到底是詐尸還是另有隱情,我是刑警寧澤妻坝,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布伸眶,位于F島的核電站,受9級特大地震影響刽宪,放射性物質(zhì)發(fā)生泄漏厘贼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一圣拄、第九天 我趴在偏房一處隱蔽的房頂上張望嘴秸。 院中可真熱鬧,春花似錦庇谆、人聲如沸岳掐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽串述。三九已至,卻和暖如春寞肖,著一層夾襖步出監(jiān)牢的瞬間纲酗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工新蟆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留觅赊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓琼稻,卻偏偏與公主長得像吮螺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子欣簇,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容