最近感覺很多東西在運用到一定的程度之后,會發(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珠月。