nginx 初學者指引

nginx 初學者指引
==================

編譯自:
http://nginx.org/en/docs/beginners_guide.htmlhtml


目錄:
    nginx 啓動、中止、從新加載配置
    nginx 配置文件的結構
    nginx 提供靜態內容的服務
    將 nginx 配置爲簡單的代理服務器
    nginx 設置 FastCGI 代理,鏈接 FastCGI 應用
nginx


本文會簡單介紹 nginx 並演示相關的簡單任務。首先你須要安裝好 nginx。web

nginx 擁有一個主進程和幾個 worker 進程。主進程的主要工做是讀取和處理配置,維護 worker 進程。worker 進程負責處理實際的用戶請求。nginx 採用 event-based 模型和 OS-dependent 機制對用戶請求進行高效的分發。worker 進程的數量在配置文件中定義,可在配置中修改,或者根據可用的 CPU 核心數進行自動調整。正則表達式

參考 http://nginx.org/en/docs/ngx_core_module.html#worker_processes
    
    Syntax:    worker_processes number | auto;
    Default:     worker_processes 1;
    Context:    main
    Defines the number of worker processes.編程

    worker 進程的最佳個數受許多因素影響,好比 CPU 核心數,磁盤驅動的個數,nginx 負載模式等。若是不肯定設爲多少合適,可設置爲 CPU 核心數。若是設置爲 auto,nginx 會嘗試自動檢測CPU核心數並設置爲 worker 進程數。(auto 參數從 1.3.8 和 1.2.5 版開始支持)後端

nginx 及其模塊的工做由配置文件定義,默認的配置文件爲 nginx.conf,該配置文件可能位於:
/usr/local/nginx/conf, /etc/nginx, or /usr/local/etc/nginx.瀏覽器

 

nginx 啓動、中止、從新加載配置
-------------------------------

執行 nginx 命令啓動 nginx。啓動 nginx 以後,可以使用以下命令:
 bash

    nginx -s stop  快速關閉 nginx
    nginx -s quit  優雅的關閉 nginx
    nginx -s reload  從新加載配置
    nginx -s reopen  從新打開日誌文件


    

優雅地關閉 nginx,這是說 nginx 主進程會等待 worker 進程完成當前用戶請求的處理。
執行:nginx -s quit (以啓動 nginx 時的用戶身份執行該命令)服務器

更改配置以後,必須執行從新加載配置的命令,或者從新啓動 nginx,以使得配置生效:併發

nginx -s reload 

    
當主進程接收到 reload 信號,它會檢查配置文件的語法,而後嘗試應用該配置。若是成功,主進程啓動新的 worker 進程,併發送消息給原來的 worker 進程要求他們關閉。若是加載配置失敗,主進程會對改動進行回滾,繼續以原來的配置進行工做。當原來的 worker 進程接收到消息要他們關閉,他們會中止接收新的鏈接,並繼續處理當前的請求直到完成。完成以後,原來的 worker 進程將會退出。

給 nginx 發送信號,可藉助於 kill 命令。kill 命令使用進程 pid 發送信號。nginx 主進程的 pid 存儲在pid 文件中,默認爲 nginx.pid,位於 /usr/local/nginx/logs 或 /var/run 目錄下。

例如,若是 nginx 主進程 pid 爲 1628,使用 kill 命令發送 QUIT 信號給 nginx,使其優雅地關閉:

    kill -s QUIT 1628

    
若是要獲取全部運行中的 nginx 進程的列表,使用 ps 命令:

    ps -ax | grep nginx

    

關於發送信號給 nginx 的更多信息,請參考:http://nginx.org/en/docs/control.html

 

配置文件的結構
-------------------

nginx 由許多模塊組成,這些模塊可在配置文件中進行配置。nginx 的配置指令分爲:簡單配置指令,區塊配置指令。

簡單配置指令由 「名稱」 和 「參數」 組成, 「名稱」 和 「參數」 以空格分隔,指令的最後以分號 「;」 爲結尾。

區塊配置指令和簡單配置指令擁有一樣的結構,區塊指令不以分號結尾。區塊指令使用花括號 「{}」 將一組設置包含於其中。若是在區塊指令的括號中包含其餘指令,這個區塊指令就被稱爲 「context」 (上下文)。例如 events,http,server,location 指令。

全部在 context 以外的指令,被認爲處於 main context 之中。

events 和 http 指令用於 main context 之中。

server 指令用於 http 之中。

location 指令用於 server 指令之中。

配置文件中以 # 起始的行爲註釋行。

 

nginx 提供靜態內容的服務
---------------------------

web 服務器的重要任務之一是提供文件服務(好比 image 文件、靜態 HTML 頁面等)。
咱們將實現一個示例,根據請求的不一樣,nginx 經過不一樣的目錄提供文件給用戶。咱們經過
/data/www 目錄提供 HTML 文件,經過 /data/images 目錄提供 image 文件。

爲達到這個目標,須要在配置文件中設置 server 區塊,並在 server 區塊中設置兩個 location 區塊。server 區塊位於 http 區塊之中。首先,建立 /data/www 目錄,並在其中建立 index.html 文件,文件內容任意,好比:

    echo "<h1>HTML File</h1>" > /data/www/index.html

而後建立 /data/images 目錄,放一些圖像文件到該目錄中。以後打開配置文件。默認的配置文件已經包含一些 server 區塊的示例,大多數被註釋了。
如今將全部 server 區塊註釋掉,而後建立一個新的 server 區塊:
  

    http {
        server {
        }
    }

通常來講,配置文件可能包含幾個 server 區塊,它們擁有不一樣的監聽端口和 server name。
一旦 nginx 決定好使用哪個 server 處理用戶請求,nginx 測試請求首部的 URI 字段,
將它與 server 區塊中的 location 指令定義的參數進行對比。

在 server 區塊中添加以下 location 區塊:
    
 

   location / {
        root /data/www;
    }

這個 location 區塊指定 「/」 前綴,並將它和請求首部中的 URI 進行比較。對於匹配的請求,
URI 將被添加到 root 指令所指定的路徑的末尾,這裏 root 指令定義的路徑是 /data/www,
這樣造成用戶所請求的文件的本地路徑。若是有多個 location 區塊與請求的 URI 匹配,nginx
選擇其中前綴最長的那個 location 區塊。

這裏的 location 提供了最短的前綴,長度爲 1,因此只有當全部其餘 location 區塊都匹配失敗,
纔會選擇這個 location 區塊。

下一步,添加第二個 location 區塊:

    location /images/ {
        root /data;
    }


這個 location 區塊可以匹配 URI 以 /images/ 起始的請求 (location / 也能匹配這樣的請求,但它的
前綴比 /images/ 短,因此優先匹配 location /images/)

咱們的 server 區塊的配置是這樣的:

    server {
        location / {
            root /data/www;
        }

        location /images/ {
            root /data;
        }
    }


這已是一個可工做的服務配置,nginx 監聽於 80 端口,可經過本地訪問 http://localhost/ 。
對於 URI 以 /images/ 起始的請求,nginx 會將 /data/images 目錄中的文件發送給客戶端。

例如,對於訪問請求:http://localhost/images/example.png,nginx 會發送 /data/images/example.png 文件。若是這個文件不存在,nginx 會發送 404 error 響應給客戶端。

對於 URI 不是以 /images/ 起始的請求,會被映射到 /data/www 目錄。
例如,對於訪問請求:http://localhost/some/example.html,nginx 會發送 /data/www/some/example.html 文件。

修改了配置文件以後,爲使新配置生效,可重啓 nginx ,或者使用 nginx 命令發送 reload 信號給 nginx 主進程:

    nginx -s reload

    
    Note:
    當出現了錯誤,請查看 access.log 和 error.log 文件尋找可能的緣由。
    這兩個文件的位置若是是 yum 安裝,在 /var/log/nginx 目錄下,若是是編譯安裝,
    默認在 prefix/logs/ 目錄下。

 

將 nginx 配置爲簡單的代理服務器
--------------------------------

nginx 常常被用來設置成一個代理服務器,這時 nginx 接收請求,而後將請求轉發給被代理的後端服務器,並從後端服務器取回響應報文,而後發送給客戶端。

咱們將配置一個基礎的代理服務器,服務器對於 image 文件的請求選擇從本地響應,對於其餘請求,服務器轉發給一個後端服務器。在這個示例中,這兩個服務器將被定義在同一個 nginx 實例之上。首先定義後端服務器,添加一個 server 區塊定義:
    

server {
        listen 8080;
        root /data/up1;

        location / {
        }
    }


    
這個服務器監聽在 8080 端口(在前一小節的配置中,咱們並無指定 listen 指令,nginx 默認使用 80 端口),並將全部請求映射到本地的 /data/up1 目錄中。建立 /data/up1 目錄,並在其中建立一個 index.html 文件。注意 root 指令被放置於 server context 中,這樣只有當一個沒有包含本身的 root 指令的 location 區塊被選中時,這個 server 區塊中的 root 指令纔會被使用。

[root@lamp1 nginx]# mkdir /data/up1
[root@lamp1 nginx]# echo "<h1>backend server</h1>" > /data/up1/index.html


下一步,沿用前一小節的配置,將其修改成一個代理服務器的配置。在第一個 locaiton 區塊中加入 proxy_pass 指令,指定後端服務器的:協議、主機名、端口(本例中,指定爲 http://localhost:8080):
    

    server {
        location / {
            proxy_pass http://localhost:8080/;
        }

        location /images/ {
            root /data;
        }
    }

咱們將修改第二個 location 區塊,目前這個 location 區塊將 URI 以 /images/ 起始的請求映射到
/data/images 目錄。將其修改成可以匹配對於典型圖像文件的請求,這些圖像文件有典型的後綴名:

    location ~ \.(gif|jpg|png)$ {
        root /data/images;
    }

在 「location ~ \.(gif|jpg|png)$」 語句中, ~ EXPRESSION 表示使用正則表達式匹配,
正則表達式爲:\.(gif|jpg|png)$。

這個正則表達式可以匹配全部以 .gif, .jpg, .png 結尾的 URI。匹配的請求將被映射到 /data/images 目錄中。

當 nginx 選擇以哪一個 location 區塊匹配請求時,nginx 首先檢查指定了 prefix 前綴的 location 指令,nginx 會記住被匹配的擁有最長 prefix 的 location 指令,而後開始檢查正則表達式。
若是有一個正則表達式被匹配了,nginx 會選擇這個正則表達式的 location,若是沒有正則表達式被匹配,它選擇以前記下的那個擁有最長前綴的 location。

最終咱們的配置文件是這樣的:

    server {
        location / {
            proxy_pass http://localhost:8080/;
        }

        location ~ \.(gif|jpg|png)$ {
            root /data/images;
        }
    }

nginx 服務器會過濾以 .gif, .jpg, .png 爲結尾的 URI 的請求,將它們映射到 /data/images 目錄中(將 URI 添加到 root 指令的參數後面),並將其餘請求轉發給後端服務器。

使新的配置生效,執行 nginx -s reload。

在另外一個 Linux 虛擬機中測試訪問:

[root@vm1 nginx]# curl http://192.168.0.171
<h1>backend server</h1>


    
在瀏覽器中訪問:
http://192.168.0.171/p1035007771.jpg

關於配置代理鏈接,更深刻的探討可參考:

http://nginx.org/en/docs/http/ngx_http_proxy_module.html

 

設置 FastCGI 代理
------------------------

nginx 可用於將請求路由到 FastCGI 服務器,在 FastCGI 服務器上運行着以各類框架和編程語言構建的應用,好比 PHP。

配置 nginx 與 FastCGI 服務器協同工做,最基礎的配置包括:使用 fastcgi_pass 指令替代 proxy_pass指令,並使用 fastcgi_param 指令設置傳遞給 FastCGI 服務器的參數。

假設 FastCGI 服務器可經過 localhost:9000 訪問,咱們之前面的配置爲基礎,首先將 proxy_pass 指令替換爲 fastcgi_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;
        }
    }

經過這個配置,對於靜態圖形文件的請求由本地服務響應,除此以外的請求將經過 FastCGI 協議 被路由到工做於 localhost:9000 的服務器上。

相關文章
相關標籤/搜索