Nginx爛筆頭——新手指引
說明:“Nginx爛筆頭”系列Blog是自己對Nginx官方文件的的翻譯,用作閱讀筆記便於日後查閱的成分居多,無關重要內容會刪減,也可能會加入自己的理解。囿於個人水平,一些專業的名稱翻譯不會太準確,推薦檢視Nginx官網原始文件。翻譯內容如果有錯誤,歡迎指正。
1.摘要
指引描述瞭如何啟動、停止nginx和重新載入nginx,解釋了配置檔案的結構並且說明使用nginx做靜態檔案伺服器該如何設定、如何把nginx配置成一個代理伺服器和如何把它作為一個fastCGI應用連線。
Nginx有一個主執行緒和若干個服務執行緒(Worker Process)。主執行緒的功能是讀取並驗證配置檔案。服務執行緒處理各個請求。Nginx採用了事件驅動和依賴系統的架構來通高效地分發請求給各個服務執行緒。服務執行緒的數量定義在配置檔案上,可以通過配置檔案修改或者根據可用的CPU核心數來自動調整(參看
Nginx和nginx的模組是由配置檔案決定的。配置預設名稱為nginx.conf,一般放在/usr/local/nginx/conf、/etc/nginx或者/usr/local/etc/nginx路徑下。
2.啟動、停止和重新載入nginx配置
啟動nginx,執行ngiinx可執行檔案就行。
./nginx
當nginx啟動之後,它可以通過呼叫-s引數的方式控制。用下面的語法:
./nginx -s [signal]
signal可選項可以是
- stop 快速關閉
- quit 流暢關閉
- reload 重新載入配置檔案
- reopen 重新開啟日誌檔案
例如,要等待所有服務執行緒完成現在正在處理的請求後再關閉nginx可以使用
./nginx -s quit
這個命令需要使用啟動nginx服務時的使用者執行
在reload命令和重啟nginx之前,修改配置檔案不會應用到nginx上。使用下面命令重新載入配置檔案
./nginx -s reload
當nginx的主執行緒收到重新載入訊號時,先驗證新配置檔案的語法是否正確,然後嘗試在主執行緒中應用新的配置。如果應用成果,主執行緒會開啟新的服務執行緒併發送關閉訊號給舊的訪問執行緒。否則,主執行緒會回滾到原來的配置並繼續使用舊的服務執行緒去工作。舊的服務執行緒接到關閉訊號後會停止接受新的請求並且會繼續處理執行緒中所有的請求導結束。然後,舊執行緒關閉。
訊號也可以通過Unix的一些工具例如kill
/usr/local/nginx/logs
或者/var/run
的nginx.id
檔案中。例如,主執行緒id是1268,傳送quit訊號:
kill -s QUIT 1628
3.配置檔案的結構
Nginx由不同的模組組成,這些模組是有配置檔案中的指令(Directives)控制的。指令分為簡單指令和快指令。簡單指令由名字和引數組成,用空格分割分號結尾。快指令和簡單指令的結構一樣,不同的是它是以大括號包圍的一組簡單指令結束的。如果一個快指令裡面包含有其他的快指令,它叫上下文(例如:events,http,server和location)。
放置在任何上下文之外的指令被稱為主上下文(main context)。events和http塊指令(上下文)在主上下文中(是否可以理解為主上下文就只有這兩個指令?),server塊指令在http上下文中,location指令在server指令塊中。
以#號開頭的一行在配置檔案中是註釋。
4. 提供靜態資源服務
Web伺服器的一個重要任務就是提供檔案(比如圖片或者靜態Html頁面)。你可以寫一個根據不同請求返回不同本地路徑檔案的例子:/data/www
(裡面有HTML頁面)和/data/images
(裡面有圖片)。這需要在配置檔案的http上下文中配置server上下文並且在server上下文中新增兩條location塊指令。
先建立好兩個路徑,放置一個index.html和圖片在對應目錄。
然後,開啟配置檔案,預設的配置檔案已經包含了server,大部分被註釋掉了。新增一個新的server指令塊。
http {
server {
}
}
通常,配置檔案都會包含幾個server塊指令,用server監聽的埠和server names來區分。當nginx決定了那個server程序去處理請求時,它會嘗試對比請求頭中的url和server快指令中的location塊指令定義的url引數。
新增下面的location塊指令到server塊指令。
location / {
root /data/www;
}
這個location塊指令指定了“/”字首來對比請求中的url。對於匹配上url的請求,請求的url會被加上root指令中指定的地址,就是/data/www
,來組成本地檔案系統的訪問路徑。如果同時有多個location塊指令匹配滿足,nginx會選擇哪個最長的字首。上面配置的location塊指令是最短的字首,只有長度1,所以,nginx會在其他location沒有匹配上的時候才使用它。
接下來,新增一個如下的locatin塊指令
location /images/ {
root /data;
}
他會匹配請求url以/images/
開頭的請求(location /同樣匹配,但是長度比這裡短)
配置檔案最終的結果如下所示:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
上面的配置已經可以在一個標準的80埠下使用的配置了,並且可以在本地機器上使用http://localhost
地址訪問。處理以/images
開頭的url時,nginx會把/data/images
目錄下的檔案放回給請求。例如:一個請求為http://localhost/images/example.png
,nginx會返回/data/images/example.png
這個檔案。如果檔案不存在,nginx會返回一個404錯誤。沒有以/images
開頭的url會被定位到/data/www
目錄。例如,請求http://localhost/some/example.html
會返回/data/www/some/example.html
檔案。
想要應用新寫的配置檔案,啟動nginx或者重啟nginx用reload訊號。
./nginx -s reload
如果有些沒有按照你的期望來執行,你可以在路徑
/usr/local/nginx/logs
或者/var/log/nginx
檢視access.log和error.log檔案來尋找原因。
5.設定簡單的代理伺服器
nginx的一個常用功能就是用作代理伺服器,所謂代理伺服器就是一個接受請求,轉發請求到代理的伺服器中,接受伺服器的返回並把這個返回傳送會客戶端的一個伺服器。(這裡的描述說的實際上是反向代理伺服器,但是原文用的是Proxy Server而不是Reverse Proxy)
來配置一個簡單的反向代理伺服器,提供返回本地圖片伺服器的功能和反向代理的服務。在這個例子中,所有的服務都會被定義在一臺nginx例項伺服器中。
首先,給nginx的配置檔案新增多一個server塊指令用來定義代理服務:
server {
listen 8080;
root /data/up1;
location / {
}
}
這個會稱為一個監聽8080埠的服務(先前,listen
指令沒有設定,這樣的話就會預設使用80埠)並且把所有請求對映到本地檔案的/data/up1
路徑。建立這個路徑並準備一些html檔案。注意,root
指令是放在server上下文中的。這樣的root指令會用在哪些沒有包含root指令的location塊指令中。(這裡就是模擬一個其他伺服器的功能)
接下來,修改上一節的配置來實現代理服務的配置。在第一個location塊指令中,增加proxy_pass指令並在引數中指定需要代理的伺服器的協議、名稱和埠。
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
修改第二個location塊指令,原來這個塊指令會把請求Url帶有/images
字首的請求對映到/data/images
目錄,把它修改成匹配一些典型的檔案拓展名的請求。修改後如下所示:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
這個引數是一個正則表示式,匹配url以.gif,.jpg或者.png結尾的請求。一個正則表示式需要以~
符號開頭。對應的請求會被對映到/data/images
目錄。
當nginx選擇一個location塊指令來處理一個請求的時候,首先會檢查指定的字首,先記錄location指令中的最長字首,然後檢查正則表示式。如果一個正則表示式匹配了這個請求,nginx會用正則表示式的這個location,否則,使用之前記錄下的最長字首的location。
配置檔案的結果如下所示:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
6.設定 FastCGI代理
這部分不常用就省略了。
7.總結
- Nginx配置預設名稱為nginx.conf,一般放在/usr/local/nginx/conf、/etc/nginx或者/usr/local/etc/nginx路徑下。
nginx -s stop
快速停止nginx -s quit
流暢停止nginx -s reload
重新載入配置nginx -s reopen
重新開啟日誌檔案- 靜態檔案伺服器:配置server,location,root指令
- 方向代理伺服器:location中配置proxy_pass指令
- 多個location匹配上同一個請求url時,使用字首長的location配置
- location指令配置的路徑中,正在表示式的優先順序比普通路徑高