本文爲【Beginner’s Guide】譯文,原文地址:http://nginx.org/en/docs/beginners_guide.html
Guide
本教程基礎的介紹了 nginx,以及能使用nginx完成的簡單任務。
本教程建立在讀者已經安裝了 nginx,如果並沒有,請移步 Installing nginx。
本教程將包括以下內容:
- nginx 的開啓和關閉
- nginx 重啓配置
- 配置文件結構說明
- 配置 nginx 提供靜態服務
- 配置 nginx 作爲代理服務器
- 連接 nginx 與 FastCGI 應用
nginx 擁有一個主進程和多個工作進程,主進程的主要任務是管理配置信息和調度工作進程。工作進程做真實的請求處理。
nginx 基於事件的模型和操作系統平臺依託的機制在工作進程間有效地分發請求。
工作進程的數量是配置文件定義的,可以通過配置文件固定,也可以根據cpu核心數自適應(詳見 worker_processes)。
nginx的工作方式和模塊情況取決於它的配置文件 nginx.conf ,而它的配置文件一般在
- /usr/local/nginx/conf 或者
- /etc/nginx 或者
- /usr/local/etc/nginx
啓動,關閉,刷新配置
運行可執行文件啓動nginx,nginx啓動後可以通過 -s 參數去 控制它
nginx -s SIGNAL
SIGNAL 可以是如下值
- stop —— 快速停止
- quit —— 優雅停止
- reload —— 刷新配置文件
- reopen —— 重新打開log文件
比如:你希望 等工作進程完成當前正在處理的請求後就停止 nginx 進程,可以使用
nginx -s quit
注意,執行這個命令的用戶要和啓動nginx的用戶是同一個。
如果你修改了配置文件,那麼你需要執行reload命令或者重啓nginx才能生效
nginx -s reload
主進程在收到reload命令時,會去 檢查配置文件的語法 並且 嘗試 去應用配置的內容。
如果成功,主進程就會啓動一個新的工作進程去發送信息命令其他工作進程關閉;
否則主進程將會 回滾,並應用回上一次的配置信息,工作進程繼續工作着。
工作進程收到關閉的命令後將不再接受新的客戶端請求,繼續完成手頭上的請求後關閉。
在類 Unix 系統平臺上也可以通過類似 kill 的命令向 nginx 發送消息,這樣的消息一般是直接發送給用進程ID標識的nginx 進程。
nginx 的主進程ID默認是寫在 /usr/local/nginx/logs 或者 /var/run 目錄下的 nginx.pid。
比如當前 nginx 主進程的進程ID是1628,可以這樣
# 優雅的關閉nginx
* kill -s quit 1628
# 通過 ps 可以獲取到 nginx 進程號
* ps -ax | grep nginx
更多的信息,請查看 Controlling nginx
配置文件
nginx 由模塊組成,這些模塊由配置文件中指定的指令控制。
指令分爲 簡單指令 和 指令塊。
- 簡單指令 - 由以分號結尾,空格分隔的鍵值對組成 [ key value ; ]
-
指令塊 - 和簡單指令結構相同,但是使用一對大括號(
{}
)去包裹一組指令。
包含其他指令的指令塊稱爲 上下文 (比如events,http, server和location)
在配置文件中,塊級指令之外的區域稱之爲 主(根)上下文(main context) 。比如:
events 和 http 指令是處在主上下文裏的,
server 指令是處在 http 上下文裏中,
location 指令又是處在 server 上下文裏中。
#主(根)上下文
http{
server{
location {
}
}
}
同一行內 # 字符後的都是註釋
靜態資源服務
Web服務器的一項重要功能就是能充當 靜態服務器(如:圖片,靜態HTML文本)。
比如你要實現這樣的情景:
根據不同的請求,nginx 能返回指定的文件資源
- /data/images 目錄下的圖片
- /data/www/ 目錄下的html文件。
只需要配置 nginx 文件,在 http 配置塊的 server 下寫兩個 location 塊。
首先創建 /data/www 目錄,在這個目錄下建立 index.html
文件,裏面隨便寫點什麼內容
創建 /data/images 目錄,裏面放一些圖片。
然後打開配置文件(文件中默認是配置有幾個 server 塊的,但大部分是被註釋掉的),把那些 server 都註釋掉
在http 塊下重新配置一個 server 塊。
http{
server{
}
}
一般來說,配置文件應該根據監聽端口號或者主機名分爲幾個 server 塊,而 nginx 到底把 http 請求交給哪個 server 處理,則是根據請求的 URI 和 server 裏 location 指令的值的 匹配情況 來處理的。
下面我們添加一個 location 到 server 中
location / {
root /data/www;
}
上述 location 的 "/
" 前綴,是用來匹配 http 請求 URI 的。而它會添加到 root 指定的路徑下,也就是 /data/www,以此來形成 請求資源(文件)和本地文件系統的對應。
如果有多個 location 和 URI 匹配的話,那就 優先選擇最長匹配的 location。
第一個 location /
只提供了最短的前綴,長度爲1。所以,只有其他 location 匹配失敗的情況下才能使用第一個。
現在,我們再添加一個location
location /images/ {
root /data;
}
}
上述的 location 將會匹配一個以 /images/ 開始的 http 請求(location /
也會被匹配但是它更短)。
配置好後,應該是類似下面的內容
http{
server{
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
}
這樣就配置了監聽標準 80 端口的 server,可以通過 http://localhost 驗證。
當請求 URI 以 /image/ 開頭,服務器將響應 /data/images/ 目錄下的文件
例如:訪問 http://localhost/images/example.png,Web服務器會響應
/data/images/example.png
如果該文件不存在,則返回 404 error。如果 URI 不是以 /images/ 開頭,那就映射到(更短的location /
) /data/www 目錄,例如:訪問 http://localhost/some/example.html,Web服務器將會把
/data/www/some/example.html
響應給客戶端。
修改 nginx 配置文件之後,記得讓主進程重新讀取配置文件才能生效
nginx -s reload
如果出錯的話,記得查看 access.log 和 error.log 日誌文件的內容。
日誌目錄一般在 /usr/local/nginx/log/ 或者 /var/log/nginx/ 裏。
配置簡單代理服務器
nginx 的一個常見用途是作爲 代理服務器
代理服務器是接受請求,轉發請求的到被代理的服務器,再從被代理的服務器獲取響應回傳給客戶端。
在下面這個例子中,我們會配置一個簡單的代理服務器,直接返回靜態文件,其他的則轉發給被代理的服務器。
首先,編寫個server塊
server {
listen 8080;
root /data/up1;
location / {
}
}
這樣就能提供一個簡單 監聽 8080 端口 的 server (這裏需要寫 listen 是因爲之前默認的 80 端口已經被佔用了),這個 server 映射所有請求到本地 /data/up1 目錄。創建一個 index.html
文件到這個目錄下。
注意,當 location 下未指定 root 目錄時將會使用 server 的 root 目錄(類似 默認值 )
然後,修改配置文件 在先前 server 的第一個 location 處放入 proxy_pass,指定 協議,域名,端口,如:
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
修改第二個 localtion(映射 /images/
開頭到本地目錄)成根據文件類型拓展名匹配
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
該參數是一個正則表達式,匹配以 .gif,.jpg 或 .png 結尾的所有 URI。正則表達式應該以〜開頭。相應的請求將映射到 /data/images 目錄。
nginx 在分發請求給 location 時,會 先選出最長的匹配前綴 的 location,然後去 檢查正則表達式,如果正則表達式匹配就選擇正則表達式所在的 location,否則就使用之前選出最長匹配 location
最終的代理服務器配置文件應該這樣:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
這個 server 將會映射以 .gif,.jpg 或 .png 結尾的 URI 到 /data/images/ (root 對應的路徑)目錄下,其他的請求將會 轉發給 proxy_pass 的代理服務器
更多代理配置的指令請移步 more
更多
更多優秀內容,可以通過關注微信公衆號【極客收藏夾】獲取