這篇教程簡單介紹了 nginx 而且講解了一些 nginx 能夠解決的簡單任務。這裏,咱們假設 nginx 已經安裝在讀者的機器上。若是沒有,能夠看一下如何安裝 nginx。這篇教程主要講解的是若是啓用和中止ngixn,和從新加載配置,描述配置文件的基本結構和怎樣搭建一個 nginx 靜態輔助器,怎樣配置 nginx 做爲一個代理服務器來。
nginx 有一個主進程和其餘子進程。主進程的主要工做是加載和執行配置文件,而且駐留子進程。子進程用來做爲實際的請求處理。nginx 採起基於事件的模型和 OS 依賴的機制,在多個子進程之間高效的分配請求。子進程的個數會直接寫在配置文件中而且,對於給定的配置能夠是固定的,或者根據可用的 CPU 核數自動的進行調整(參考 子進程)。
nginx 和它模塊的工做方式是在配置文件中寫好的。默認狀況下,這個配置文件一般命名爲 nginx.conf
而且會放置在 /usr/local/nginx/conf
,/etc/nginx
,或者 /usr/local/etc/nginx
。php
運行可執行文件就能夠開啓 nginx,好比:html
// -c 爲 nginx 的配置文件 nginx -c /usr/local/nginx/conf/nginx.conf
若是,nginx 已經開啓,那麼它就能夠經過使用 -s
參數的可執行命令控制。使用下列格式:nginx
nginx -s signal
signal 能夠爲下列命令之一:正則表達式
nginx -s quit執行該命令的用戶須要和啓動的 nginx 的用戶一致。
nginx -s reload一旦主進程接收到重載配置文件的命令後,它會先檢查配置文件語法的合法性,若是沒有錯誤,則會從新加載配置文件。若是成功,則主進程會從新建立一個子進程而且發送關閉請求給之前的子進程。若是沒有成功,主進程會回滾改動而且繼續使用之前的配置。老的子進程在接受關閉的命令後,會中止接受新的請求而且繼續處理當前的請求,直處處理完畢。以後,該子進程就直接退出了。
/usr/local/nginx/logs
或者 /var/run
目錄下。好比,若是主進程的 ID 是 1628,爲了發送 QUIT
信號來使 nginx 優雅退出,能夠執行:kill -s QUIT 1628
爲了獲得全部正在運行的 nginx 進程,咱們可能會使用到 ps 工具,好比,像下列的方式:數組
$ ps -ax | grep nginx // 結果爲:(下面是單核 CPU 的狀況) 516 pts/0 D+ 0:00 grep --color=auto nginx 1156 ? S 1:22 nginx: worker process 27999 ? Ss 0:00 nginx: master process ./nginx
更多關於發送信號給 nginx,能夠參考 nginx 控制。緩存
nginx 是由一些模塊組成,咱們通常在配置文件中使用一些具體的指令來控制它們。指令被分爲簡單指令和塊級命令。一個簡單的指令是由名字和參數組成,中間用空格分開,並以分號結尾。例如:服務器
// 簡單指令 root /data/www;
塊級指令和簡單指令同樣有着相似的結構,可是末尾不是分號而是用 {
和 }
大括號包裹的額外指令集。若是一個塊級指令的大括號裏有其餘指令,則它被叫作一個上下文(好比:events,http,server,和 location)。
在配置文件中,沒有放在任何上下文中的指令都是處在主上下文中。events
和 http
的指令是放在主上下文中,server
放在 http
中, location
放在 server
中。網絡
以 #
開頭的行,會被當作註釋。dom
# this is a comment events { worker_connections 4096; ## Default: 1024 } http { server { listen 80; server_name domain1.com www.domain1.com; access_log logs/domain1.access.log main; root html; location ~ \.php$ { fastcgi_pass 127.0.0.1:1025; } } }
一個重要的網絡服務器的任務是處理文件(好比圖片或者靜態 HTML 文件)。這裏,你會實踐一個例子,文件會從不一樣的目錄中映射(取決於請求):/data/www
(放置 HTML 文件)和 /data/images
(放置圖片)。這須要配置一下文件,將帶有兩個 location
的指令的 server
的塊級命令放在 server
指令中。
首先,建立一個 /data/www
目錄,而後放置一個事先寫好內容的 index.html 文件。接着,建立一個 /data/images
目錄,而後放置一些圖片。
下一步,打開配置文件。默認的配置文件已經包含了一些關於 server
指令的樣式,大多數狀況下直接把他們給註釋掉。如今,註釋掉其餘的區塊,而後寫一個新的 server
區塊:工具
http { server { } }
一般,該配置文件可能會包含多個 server
指令。這些 server
指令監聽不一樣的端口和服務器名。一旦 nginx 決定哪一個服務進程處理請求,它會根據在 server 塊級指令中定義好的 location
指令的參數,來匹配請求頭中指定的 URI。
將下列 location 指令添加到 server 指令中:
location / { root /data/www; }
該 location
指令相對於請求中的 URI 執行了 「/」 的前綴。爲了匹配請求,URI 會被添加到 root
命令指定的路徑後,即 /data/www
,獲得本地文件系統中請求文件的路徑。若是,有幾個 location
匹配到,那麼 nginx 會選擇最長的前綴。上面的 location
提供了長度爲 1 的前綴,因此,僅當其餘的 location
匹配失敗後,該指令纔會使用。
接着,添加第二個 location
區塊:
location /images/ { root /data; }
它會匹配到以 /images/
開頭的請求(location /
也會匹配到該請求,只是前綴更短)
server
塊級命令的配置結果以下:
server { location / { root /data/www; } location /images/ { root /data; } }
這已是一個可用的服務器配置,它監聽標準的 80 端口而且能夠在本地上經過 http://localhost/
訪問。對於 URI 以 /images/
開頭的請求,服務器會從 /data/images
目錄中,返回對應的文件。例如,nginx 會返回 /data/images/example.png
文件,當接收到 http://localhost/images/example.png
的請求響應時。若是該文件不存在,nginx 會返回一個 404 錯誤的響應。沒有以 /images/
開頭的 URI 的請求,將會直接映射到 /data/www
目錄中。好比,響應 http://localhost/some/example.html
的請求,nginx 會發送 /data/www/some/example.html
文件。
爲了使用新的配置文件,若是還沒開啓 nginx 須要先開啓,而後將重載信號發送給 nginx 的主進程,經過執行:
nginx -s reload
若是你發現有些地方出了問題,你能夠在 /usr/local/nginx/logs
或者 /var/log/nginx
目錄下的 access.log
和 error.log
文件中,找到緣由。
nginx 經常用來做爲代理服務器,這表明着服務器接收請求,而後將它們傳遞給被代理服務器,獲得請求的響應,再將它們發送給客戶端。
咱們將配置一個基本的代理服務器,它會處理本地圖片文件的請求並返回其餘的請求給被代理的服務器。在這個例子中,兩個服務器都會定義在一個 nginx 實例中。
首先,經過在 nginx 配置文件中添加另外一個 server
區塊,來定義一個被代理的服務器,像下面的配置:
server { listen 8080; root /data/up1; location / { } }
上面就是一個簡單的服務器,它監聽在 8080 端口(以前,listen
並沒被定義,是由於默認監聽的 80 端口)而且會映射全部的請求給 本地文件目錄 /data/up1
。建立該目錄,而後添加 index.html
文件。注意,root
指令是放在 server
上下文中。當響應請求的 location
區塊中,沒有本身的 root
指令,上述的 root
指令纔會被使用。
接着,使用前面章節中的 server
配置,而後將它改成一個代理服務配置。在第一個 location
區塊中,放置已經添加被代理服務器的協議,名字和端口等參數的 proxy_pass 指令(在這裏,就是 http://localhost:8080
):
server { location / { proxy_pass http://localhost:8080; } location /images/ { root /data; } }
咱們將修改第二個 location
區塊,使他返回一些典型後綴的圖片文件請求,如今它只會映射帶有 /images/
前綴的請求到 /data/images
目錄下。修改後的 location
指令以下:
location ~ \.(gif|jpg|png)$ { root /data/images; }
該參數是一個正則表達式,它會匹配全部以 .gif
,.jpg
或者 .png
結尾的 URIs。一個正則表達式須要以 ~
開頭。匹配到的請求會被映射到 /data/images
目錄下。
當 nginx 在選擇 location
去響應一個請求時,它會先檢測帶有前綴的 location
指令,記住先是檢測帶有最長前綴的 location
,而後檢測正則表達式。若是有一個正則的匹配的規則,nginx 會選擇該 location
,不然,會選擇以前緩存的規則。
最終,一個代理服務器的配置結果以下:
server { location / { proxy_pass http://localhost:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
該服務器會選擇以 .gif
,.jpg
,或者 .png
結束的請求而且映射到 /data/images
目錄(經過添加 URI 給 root 指令的參數),接着將其餘全部的請求映射到上述被代理的服務器。
爲了使用新的配置,像前幾個章節描述的同樣,須要向 nginx 發送重載信號。
這還有不少其餘的指令,能夠用於進一步配置代理鏈接。
本文轉載自騰雲閣,已得到做者受權。