ngnix有一個主程序和多個工作程序。主程序的工作是讀取和驗證配置檔案,和維護工作程序。工作程序處理實際的請求。nginx應用基于事件的模型和系統相關的機制來有效地将請求配置設定給工作程序。工作程序的數量在配置檔案中定義,可以給一個固定的數字,也可以根據可用的CPU核心數動态調整。
nginx和其子產品的工作方式是由配置檔案決定的。預設的配置檔案名是nginx.conf。預設的放置路徑在 /usr/local/nginx/conf, /etc/nginx (CentOS), 或者 /usr/local/etc/nginx (MAC OS). 根據你的系統而有所不同。
啟動,停止,重新加載配置檔案
啟動, 直接運作nginx就啟動了。
一旦程式啟動了,可以執行如下指令來控制nginx
nginx -s signal
其中signal是下面其中之一。
stop — 快速關閉
quit — 優雅關閉
reload — 重新加載配置檔案
reopen — 重新打開log檔案
舉個例子,關閉程序并且等待工作程序完成目前的請求,使用如下指令
nginx -s quit
這個指令應該使用啟動nginx時的使用者來執行。
直接修改配置檔案,并不會立刻生效。必須要重新開機nginx或者執行如下指令
nginx -s reload
一旦主程序接收到重新加載配置檔案的信号,它會檢查新配置檔案的合法性,然後試着應用其中的配置。如果成功的話,主程序啟動新的工作程序,然後發送消息給老的工作程序,要求他們關閉。否則,主程序復原更改,然後繼續用舊的配置檔案來工作。老的工作程序收到關閉指令後,停止接收新的連接配接,繼續服務目前的請求,直到所有的請求都結束了,之後,老的工作程序退出。
也可以是用linux的 kill指令給nginx的程序發信号。這種情況下直接給程序号發信号,應該給主程序發信号,程序号在nginx.pid檔案中,這個檔案在 /usr/local/nginx/logs ,/var/run 或者 /usr/local/var/run/ (MAC)下。
假設程序号是 1628 ,執行如下指令來關閉nginx
kill -s QUIT 1628
也可以用ps指令來找程序号
ps -ax | grep nginx
配置檔案的結構
nginx包含許多子產品。子產品由配置檔案中指令控制。指令分為簡單指令和塊指令。一條簡單指令包含名字和參數,以空格分開,分号結尾。塊指令和單條指令的結構一樣,但是結尾不是分号,而是用一對大括号包起來。如果一個塊指令的大括号中包含其他指令,構成一個上下文。 (如: events, http, server, and location).
如果一個指令不在任何一個大括号裡,那這個指令就是在main上下文。
event和http在main上下文, server在http中,location在server中。
在
#
後面的是注釋内容。
靜态資源伺服器
web伺服器的一個重要任務就是提供檔案服務(如圖檔和靜态的html網頁)。
首先建立一個/data/www檔案夾,裡面放一個index.html檔案。在建一個/data/images檔案夾,裡面放一些圖檔。
然後,打開配置檔案。預設的配置檔案中已經有幾個 server塊了,還有大量被注釋的配置。現在将server的配置都注釋掉,或删除也行。然後開始一個新的server快。
http {
server {
}
然後在server中再添加一個 location塊, 現在配置檔案變成這樣
server {
location / {
root /data/www;
這個location塊指定了
'/'
字首的請求。為了比對請求,URI 會加上在root指令中的path。即 /data/www ,這樣構成了請求的檔案 在 本地檔案系統的路徑。如果有多個比對的本地location塊,nginx會選擇最長的字首比對。上面例子中的字首是最短的字首,隻有1個長度。隻有所有其他的都無法比對時,才會選擇這個。
下面 添加第二個 location 塊
location /images/ {
root /data;
這個塊會比對以“/images/” 開頭的請求。
現在server的配置看起來像是這樣
http {
server {
location / {
root /data/www;
}
location /images/ {
root /data;
現在這已經是一個可以工作的配置了。預設會綁定80端口。可以在機器上通路 http://localhost/ 打開。也可以用 http://localhost/images/example.png 來通路 檔案 /data/images/example.png。
使配置生效的方法是 給Master程序發信号
nginx -s
備注:
有時候,你這樣做了之後,還是不能通路,具體的原因就需要看一下 nginx的錯誤日志了。錯誤日志error.log可能在 /usr/local/nginx/logs 或 /var/log/nginx 下面 。如果你在nginx配置中指定錯誤日志的地方的話,那就去那裡看。
備注1:
配置檔案中 user 這個指令 接口兩個參數。username 和 group username。 如果你隻寫一個參數,它會假定你的 group name 和 username 一樣。 但是在mac上 root的 group name 是 wheel. 是以,你需要顯示的都寫出來,不然在啟動的時候,會報
nginx: [emerg] getgrnam("root") failed in /usr/local/etc/nginx/nginx.conf:2
應寫成
user root wheel
備注2
如果你執行 nginx -s reload後在nginx的錯入日志裡看到
2018/08/11 12:06:14 [emerg] 460#0: bind() to 0.0.0.0:80 failed (13: Permission denied)
說明你的nginx啟動時,不是用的root使用者,這是,即使已經切換到root使用者 再執行這個指令也是沒用的了。 正确的做法是,先把原來的nginx停掉 ,然後再用root使用者啟動,這樣就可以了。
設定一個簡單的代理服務
nginx經常被用來作為一個代理服務,代理服務的意思是,收到請求,然後轉到一個被代理的服務上面,然後從被代理服務上獲得響應,再傳回給用戶端。
首先再增加一個server塊到配置檔案中
server {
listen 8080;
root /data/up1;
這是一個簡單的服務,監聽8080端口,之前的配置中沒有指定監聽端口,那就會使用預設的80端口。把所有的請求都映射到 /data/up1 目錄上。在本地建立這個目錄,然後放一個index.html到裡面。注意,root指令是在server上下文中的。
接下來,修改前一部分的server配置,把它作為一個代理服務的配置。在第一個location塊中, 增加一個 proxy_pass 指令。參數是 protocal,name,port。 在我們的例子中是
http://localhost:8080
如下:
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
還要修改第二個location塊,目前是映射以 /images/ 開頭的 到 /data/images 目錄。要改成比對特定的檔案擴充名。如下:
location ~ \.(gif|jpg|png)$ {
root /data/images;
參數是一個正規表達式,比對所有以.gif, .jpg, .png結尾的URI。正規表達式應該以 ~ 開始。關聯的請求會映射到 /data/images 目錄下。
當nginx選擇一個location塊去處理請求時,首先檢查指定的字首。記住,最長字首的location比對原則。然後檢查正規表達式。 如果有一個正規表達式比對成功,nginx會選擇這個,否則,選擇之前的一個。
現在代理伺服器server的配置如下:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
這個服務會把 .gif, .jpg, or .png 結尾的映射到 /data/images目錄,其他的代理到 8080 的服務上。
nginx -s