Nginx快速入門


本文主要介紹nginx的基本組態和操作,並介紹了一些可以完成的簡單任務。假設您已經學習過並已經安裝好了nginx伺服器。 如果沒有,請參閱安裝nginx頁面(/12/121/3608.html )。 本指南介紹如何啟動和停止nginx,並重新載入其組態,解釋組態檔案的結構,並介紹如何設定nginx以提供靜態內容,如何組態nginx作為代理伺服器,以及如何將其連線到 一個FastCGI應用程式。

nginx有一個主進程和幾個工作進程。 主進程的主要目的是讀取和評估組態,並維護工作進程。 工作進程對請求進行實際處理。 nginx採用基於事件的模型和依賴於作業系統的機制來有效地在工作進程之間分配請求。 工作進程的數量可在組態檔案中定義,並且可以針對給定的組態進行修改,或者自動調整到可用CPU核心的數量(請參閱worker_processes)。

在組態檔案中確定nginx及其模組的工作方式。 預設情況下,組態檔案名為nginx.conf,並放在目錄:/usr/local/nginx/conf, /etc/nginx, 或 /usr/local/etc/nginx 中。

在前面安裝文章組態中,使用的安裝組態目錄是:/usr/local/nginx/conf 。所以可以在這個目錄下找到這個組態檔案。

1. 啟動,停止和重新載入Nginx組態

要啟動nginx,請執行可執行檔案。 當nginx啟動後,可以通過使用-s引數呼叫可執行檔案來控制它。 使用以下語法:

nginx -s signal

信號(signal)的值可能是以下之一:

  • stop - 快速關閉服務
  • quit - 正常關閉服務
  • reload - 重新載入組態檔案
  • reopen - 重新開啟紀錄檔檔案

例如,要通過等待工作進程完成服務當前請求來停止nginx進程,可以執行以下命令:

nginx -s quit

註:該命令應該在啟動nginx的同一使用者下執行。

在將重新組態命令的命令傳送到nginx或重新啟動之前,組態檔案中的更改將不會被應用。 要重新載入組態檔案,請執行:

nginx -s reload

當主進程收到要重新載入組態的信號,它將檢查新組態檔案的語法有效性,並嘗試應用其中提供的組態。 如果這是成功的,主進程將啟動新的工作進程,並向舊的工作進程傳送訊息,請求它們關閉。 否則,主進程回滾更改,並繼續使用舊組態。 老工作進程,接收關閉命令,停止接受新連線,並繼續維護當前請求,直到所有這些請求得到維護。 之後,舊的工作進程退出。

還可以借助Unix工具(如kill utility)將信號傳送到nginx進程。 在這種情況下,信號直接傳送到具有給定進程ID的進程。 預設情況下,nginx主進程的進程ID寫入目錄/usr/local/nginx/logs/var/run中的nginx.pid。 例如,如果主進程ID為1628,則傳送QUIT信號導致nginx的正常關閉,請執行:

kill -s QUIT 1628

要獲取所有執行的nginx進程的列表,可以使用ps命令,例如,以下列方式:

ps -ax | grep nginx

2. 組態檔案的結構

nginx由組態檔案中指定的指令控制的模組組成。 指令分為簡單指令和塊指令。 一個簡單的指令由空格分隔的名稱和引數組成,並以分號(;)結尾。 塊指令具有與簡單指令相同的結構,但不是以分號結尾,而是以大括號({})包圍的一組附加指令結束。 如果塊指令可以在大括號內部有其他指令,則稱為上下文(例如:eventshttpserverlocation)。

組態檔案中放置在任何上下文之外的偽指令都被認為是主上下文eventshttp指令駐留在主上下文中,serverhttp中的,而locationhttp塊中。

#號之後的一行的部分被視為註釋。

3. 提供靜態內容服務(靜態網站)

一個重要的Web伺服器任務是提供檔案(如影象或靜態HTML頁面)。這裡我們來學習如何實現一個範例,根據請求,檔案將從不同的本地目錄提供:/data/www(可能包含HTML檔案)和/ data/images(包含影象)。這將需要編輯組態檔案,並使用兩個位置塊在http塊內設定伺服器塊。

首先,建立/data/www目錄,並將一個包含任何文字內容的index.html檔案放入其中,並建立/data/images目錄並在其中放置一些影象。建立兩個目錄 -

[root@localhost ~]# mkdir -p /data/www
[root@localhost ~]# mkdir -p /data/images
[root@localhost ~]#

分別在上面建立的兩個目錄中放入兩個檔案:/data/www/index.html/data/images/logo.png/data/www/index.html檔案的內容就一行,如下 -

<h2> New Static WebSite Demo.</h2>

接下來,開啟組態檔案(/usr/local/nginx/conf/nginx.conf)。 預設的組態檔案已經包含了伺服器塊的幾個範例,大部分是註釋掉的。 現在註釋掉所有這樣的塊,並啟動一個新的伺服器塊:

http {
    server {
    }
}

通常,組態檔案可以包括伺服器監聽的埠和伺服器名稱區分的幾個server塊。當nginx決定哪個伺服器處理請求後,它會根據伺服器塊內部定義的location指令的引數測試請求頭中指定的URI。

將以下location塊新增到伺服器(server)塊:

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

location塊指定與請求中的URI相比較的「/」字首。 對於匹配請求,URI將被新增到root指令中指定的路徑(即/data/www),以形成本地檔案系統上所請求檔案的路徑。 如果有幾個匹配的location塊,nginx將選擇具有最長字首來匹配location塊。 上面的location塊提供最短的字首長度為1,因此只有當所有其他location塊不能提供匹配時,才會使用該塊。

接下來,新增第二個location塊:

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

它將是以/images/(位置/也匹配這樣的請求,但具有較短字首,也就是「/images/」比「/」長)的請求來匹配。

server塊的最終組態應如下所示:

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

    location /images/ {
        root /data;
    }
}

這已經是一個在標準埠80上偵聽並且可以在本地機器上存取的伺服器( http://localhost/ )的工作組態。 響應以/images/開頭的URI的請求,伺服器將從/data/images目錄傳送檔案。 例如,響應http://localhost/images/logo.png請求,nginx將傳送服務上的/data/images/logo.png檔案。 如果檔案不存在,nginx將傳送一個指示404錯誤的響應。 不以/images/開頭的URI的請求將對映到/data/www目錄。 例如,響應http://localhost/about/example.html請求時,nginx將傳送/data/www/about/example.html檔案。

要應用新組態,如果尚未啟動nginx或者通過執行以下命令將過載信號傳送到nginx的主進程:

[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload

如果錯誤或異常導致無法正常工作,可以嘗試檢視目錄/usr/local/nginx/logs/var/log/nginx中的access.logerror.log檔案中查詢原因。

開啟瀏覽器或使用CURL存取Nginx伺服器如下所示 -

完整的nginx.conf檔案組態內容如下:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    # '$status $body_bytes_sent "$http_referer" '
    # '"$http_user_agent" "$http_x_forwarded_for"';
    #access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;

    ## 新服務(靜態網站)
    server {
        location / {
            root /data/www;
        }
        location /images/ {
            root /data;
        }
    }
}

4. 設定簡單的代理伺服器

nginx的一個常見用途是將其設定為代理伺服器,這意味著它可作為一個接收請求的伺服器,將其傳遞給代理伺服器,從代理伺服器中檢索響應,並將其傳送給用戶端。

我們將組態一個基本的代理伺服器,它為來自本地目錄的檔案提供影象請求,並將所有其他請求傳送到代理的伺服器。 在此範例中,兩個伺服器將在單個nginx範例上定義。

首先,通過向nginx組態檔案新增一個server塊來定義代理伺服器,其中包含以下內容:

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

這將是一個監聽埠8080的簡單伺服器(以前,由於使用了標準埠80,所以沒有指定listen指令),並將所有請求對映到本地檔案系統上的/data/up1目錄。 建立此目錄並將index.html檔案放入其中。 請注意,root指令位於server塊上下文中。 當選擇用於服務請求的location塊不包含自己的root指令時,將使用此root指令。

在上面建立的目錄/data/up1中放入一個檔案:/data/www/demo.html,檔案的內容就一行,如下 -

<h2>About proxy_pass Page at port 8080</h2>

接下來,使用上一節中的伺服器組態進行修改,使其成為代理伺服器組態。 在第一個位置塊中,將proxy_pass指令與引數中指定的代理伺服器的協定,名稱和埠(在本例中為http://localhost:8080):

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

    location /images/ {
        root /data;
    }
}

我們將修改當前使用/images/prefix將請求對映到/data/images目錄下的檔案的第二個location塊,使其與典型檔案擴充套件名的影象請求相匹配。 修改後的位置塊如下所示:

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

該引數是一個正規表示式,匹配所有以.gif.jpg.png結尾的URI。正規表示式之前應該是~字元。 相應的請求將對映到/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目錄(通過向root指令的引數新增URI),並將所有其他請求傳遞到上面組態的代理伺服器。

要應用新組態,如果尚未啟動nginx或者通過執行以下命令將過載信號傳送到nginx的主進程:

[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload

首先測試上面組態的 8080 埠的服務,存取服務的8080埠,得到以下結果:

再次存取 80 埠(這裡只是一個代理,它會把請求轉發給8080的服務,由8080埠這這個服務處理並返回結果到用戶端),得到以下結果 -

完整的組態nginx.conf檔案內容如下 -


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    ## 新服務(服務處理)
    server {
        listen 8080;
        root /data/up1;

        location / {
        }
    }

    ## 代理組態,資料轉發
    server {
        location / {
            proxy_pass http://localhost:8080/;
        }

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

5. 設定FastCGI代理

nginx可用於將請求路由到執行使用各種框架和PHP等程式設計語言構建的應用程式的FastCGI伺服器。
使用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;
    }
}

這將設定一個伺服器,將除靜態影象請求之外的所有請求路由到通過FastCGI協定在localhost:9000上執行的代理伺服器。

有關Nginx+PHP+FastCGI伺服器,我們將在單獨的一篇文章:LANM安裝和組態中講解,請從左側選單中檢視文章標題進入。