Nginx 是一個免費的,開源的,高性能的HTTP服務器和反向代理,以及IMAP / POP3代理服務器。 Nginx 以其高性能,穩定性,豐富的功能,簡單的配置和低資源消耗而聞名。不少高知名度的網站都使用 Nginx,如:Netflix,GitHub,SoundCloud,MaxCDN 等。 html
Nginx 有一個主線程( master process)和幾個工做線程(worker process)。主線程的目的是加載和驗證配置文件、維護工做線程。 nginx
工做線程處理實際的請求,Nginx 採用基於事件的模型和依賴操做系統的機制在工做線程之間高效地分發請求。工做線程的數量可配置,也可自動調整爲服務器CPU的數量。 正則表達式
Nginx 及其模塊的工做方式由配置文件肯定。 默認狀況下,配置文件名爲 nginx.conf
,放在 /usr/local/nginx/conf
、/etc/nginx
或者 /usr/local/etc/nginx
文件夾中。 服務器
Nginx 啓動以後,可使用如下命令控制:網絡
nginx -s <signal>
其中-s
意思是向主進程發送信號,signal
能夠爲如下四個中的一個: ide
stop
— 快速關閉 quit
— 優雅關閉 reload
— 從新加載配置文件 reopen
— 從新打開日誌文件 當運行nginx -s quit
時,Nginx 會等待工做進程處理完成當前請求,而後將其關閉。當你修改配置文件後,並不會當即生效,而是等待重啓或者收到nginx -s reload
信號。 性能
當 Nginx 收到 nginx -s reload
信號後,首先檢查配置文件的語法。語法正確後,主線程會開啓新的工做線程並向舊的工做線程發送關閉信號,若是語法不正確,則主線程回滾變化並繼續使用舊的配置。當工做進程收到主進程的關閉信號後,會在處理完當前請求以後退出。 網站
Nginx 配置的核心是定義要處理的 URL
以及如何響應這些 URL
請求,即定義一系列的虛擬服務器(Virtual Servers)控制對來自特定域名或者 IP 的請求的處理。 ui
每個虛擬服務器定義一系列的 location
控制處理特定的 URI 集合。每個location
定義了對映射到本身的請求的處理場景,能夠返回一個文件或者代理此請求。 操作系統
Nginx 由不一樣的模塊組成,這些模塊由配置文件中指定的指令控制。 指令分爲簡單指令和塊指令。
一個簡單指令包含指令名稱和指令參數,以空格分隔,以分號(;
)結尾。 塊指令與簡單指令相似,可是由大括號({
和}
)包圍。 若是塊指令大括號中包含其餘指令,則稱該指令爲上下文(如: events
, http
, server
和 location
)。
配置文件中的放在上下文以外的指令默認放在主配置文件中(相似繼承主配置文件)。 events
和 http
放置在主配置文件中,server
放置在http
塊指令中,location
放置在server
塊指令中。
配置文件的註釋以 #
開始。
Web 服務器一個重要的功能是服務靜態文件(圖像或靜態HTML頁面)。例如,Nginx 能夠很方便的讓服務器從/data/www
獲取 html 文件,從/data/images
獲取圖片來返回給客戶端,這隻須要在http
塊指令中的server
塊指令中設置兩個location
塊指令。
首先,建立 /data/www
目錄,並放入 index.html
,建立 /data/images
目錄並在其中放置一些圖片。
接下來,打開配置文件。 建立一個 server
塊:
http { server { } }
一般,配置文件能夠包括多個 server
塊,它們以端口和服務器名稱來區分。當 Nginx 決定某一個 server
處理請求後,它將請求頭中的 URI
和 server
塊中的 location
塊進行對比。
加入 location
塊指令到 server
中:
將如下位置塊添加到服務器塊:
location / { root /data/www; }
上面的 location
塊指定 /
前綴與請求中的 URI
對比。對於匹配的請求,URI
將被添加到 root
指令中指定的路徑,即 /data/www
,以此造成本地文件系統的路徑,如訪問http://localhost/bog/welcome.html
,對應服務器文件路徑爲/data/www/bog/welcome.html
。 若是 URI
匹配多個 location
塊,Nginx 採用最長前綴匹配原則(相似計算機網絡裏面的IP匹配), 上面的 location
塊前綴長度爲 1,所以只有當全部其餘 location
塊匹配時,才使用該塊。
接下來,添加第二個位置塊:
location /images/ { root /data; }
它將匹配以/images/
(/
也匹配這樣的請求,但具備較短的前綴)開始的請求。
server
塊的最終配置以下:
server { location / { root /data/www; } location /images/ { root /data; } }
到目前爲止,這已是一個能夠正常運行的服務器,它監聽端口80,而且能夠在本地計算機上訪問 http://localhost/
。 對於 /images/
開頭的請求,服務器將從 /data/images
目錄發送文件。 如,對於 http://localhost/images/example.png
請求,nginx 將響應 /data/images/example.png
文件。 若是不存在,nginx 將返回404。URI
不以 /images/
開頭的請求將映射到 /data/www
目錄。 例如,對於 http://localhost/some/example.html
請求,nginx 將響應 /data/www/some/example.html
文件。
Nginx 的一個常見應用是將其設置爲代理服務器(Proxy Server),即接受客戶端的請求並將其轉發給代理服務器,再接受代理服務器發來的響應,將它們發送到客戶端。
好比咱們能夠用一個 Nginx 實例實現對圖片文件的請求使用本地文件系統,而其餘請求轉發到代理服務器。
首先,向 Nginx 的配置文件中添加一個 server
塊來定義代理服務器:
server { listen 8080; root /data/up1; location / { } }
此服務器偵聽端口8080,並將全部請求映射到本地文件系統上的 /data/up1
目錄。 建立此目錄並將 index.html
放入其中。 注意,root
指令放在 server
上下文中,這樣 當 location
塊中不含 root
指令時將使用所屬 server
的 root
指令。
接下來,使用上一節中的服務器配置,並將其修改成代理服務器配置。 在第一個位置塊中,加上proxy_pass
指令:
server { location / { # proxy_pass指令的參數爲:協議+主機名+端口號 proxy_pass http://localhost:8080; } location /images/ { root /data; } }
修改第二個 匹配 /images/
前綴的 location
塊,使其與請求圖像文件的擴展名相匹配:
location ~ \.(gif|jpg|png)$ { root /data/images; }
該參數是一個正則表達式,匹配以.gif,.jpg或.png結尾的全部URI。 正則表達式應該以 ~
開頭。 相應的請求將映射到 /data/images
目錄。
當 Nginx 選擇一個 location
塊來處理請求時,它首先檢查指定 location
塊的前綴,記住具備最長前綴的 location
塊,而後檢查正則表達式。 若是與正則表達式匹配, Nginx 選擇此 location
塊,不然,選擇先前記住的 location
塊。
代理服務器的最終配置以下:
server { location / { proxy_pass http://localhost:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
此服務器將過濾以.gif,.jpg或.png結尾的請求,並將它們映射到 /data/images
目錄(經過向 root
指令的參數添加請求的URI),並將全部其餘請求發送給上面配置的代理服務器。
這樣,圖片和其餘請求就可使用不一樣的服務器來處理。
Nginx 可用於將請求路由到 FastCGI 服務器。快速通用網關接口(Fast Common Gateway Interface/FastCGI)是一種讓交互程序與Web服務器通訊的協議。所以 Nginx 能夠將請求路由到 FastCGI 運行的應用程序,如 PHP 程序。
使用 FastCGI 服務器的最基本的 Nginx 配置包括使用 fastcgi_pass
指令而不是 proxy_pass
指令,以及使用 fastcgi_param
指令來設置傳遞給 FastCGI 服務器的參數。 假設FastCGI服務器可在 localhost:9000
上訪問。 以上一節中的代理服務器配置爲基礎,使用fastcgi_pass
指令替換proxy_pass
指令,並將參數更改成 localhost:9000
。 在 PHP 中, SCRIPT_FILENAME
參數用於肯定腳本名稱,而 QUERY_STRING
參數用於傳遞請求參數。 生成的配置將是:
server { location / { fastcgi_pass localhost:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
這將設置一個服務器,將路由除靜態圖像之外的全部請求到運行在 localhost:9000
的 FastCGI 服務器。
文章來自:http://nginx.org/en/docs/beginners_guide.html
-- END