nginx 學習筆記(2) nginx新手入門

這篇手冊簡單介紹了nginx,並提供了一些能夠操做的簡單的工做。前提是nginx已經被安裝到你的服務器上。若是沒有安裝,請閱讀上篇:nginx 學習筆記(1) nginx安裝。這篇手冊主要內容:1. 如何啓動和中止nginx,如何加載nginx配置;php

2.配置文件的結構;3.如何安裝nginx來作靜態內容的服務器;4,如何配置nginx做爲代理服務器;5:如何鏈接FastCGI應用。html

nginx有一個主進程和多個工做進程。主進程的做用是讀和驗證配置文件,啓動工做進程。工做進程正在處理請求。nginx應用事件驅動模型和os依賴機制來在工做進程之間有效的分發請求(負載均衡)。工做進程的數目定義在配置文件中,在一個特定的配置中通常是固定的或者能夠根據可用的cpu 內核來動態修改這個數量。工做進程參考:http://nginx.org/en/docs/ngx_core_module.html#worker_processesnginx

nginx及其模塊如何工做取決於配置文件的定義。默認狀況下,配置文件爲:nginx.confand 目錄爲/usr/local/nginx/conf, /etc/nginx, 或者/usr/local/etc/nginx.web

                                                           啓動、中止、從新加載ngnix配置文件正則表達式

啓動nginx,直接執行可運行文件便可。一旦nginx啓動完成,能夠經過可運行參數s來控制nginx的運行。編程

語法以下:服務器

 

nginx -s signal

 signal可選項併發

  • stop — 快速中止
  • quit — 完整中止
  • reload —從新加載
  • reopen — 從新打開日誌文件

例如,中止nginx但等待工做進程處理完成當前的請求,可使用下面的命令:負載均衡

nginx -s quit

注意:這個命令的執行者必須是和啓動nginx的是同一個用戶。框架

直接修改配置文件將不會當即生效,須要重啓nginx或者向nginx發送reload配置文件命令:

nginx -s reload

   當主進程收到從新加載配置的信號後,它先檢測新配置的語法是否規範,而後開始嘗試加載新的配置。若是上面的步驟成功,主進程開始啓動新的工做進程而且發中止信號給舊的工做進程;不然,主進程回滾到改變前的配置,並繼續使用舊的配置工做。舊的工做進程接受到中止工做信號,它中止接受新的鏈接請求,但繼續處理當前的請求知道這些請求被處理完成。最後,舊的工做進程退出。

   nginx進程也能夠經過unix工具進行處理,例如kill命令。unix工具能夠經過進程ID做爲參數來進行處理。默認狀況下,nginx主進程的id寫入/usr/local/nginx/logs或者/var/run文件中。例如,若是主進程的id是1628,發送quit信號將會使nginx完整退出,命令以下;

   kill -s Quit 1628

一樣,也能夠功過ps命令來獲取nginx運行的全部進程列表,例以下面的方法:

   ps -ax | grep nginx

想獲取更多nginx信號的信息,請參考下一篇:nginx控制。

                                             配置文件的結構

ngnix的配置包含了許多模塊,每一個模塊使用指令來運行。指令包含簡單指令和塊指令。簡單指令經過空格來分離名稱和參數,使用分號(;)做爲結尾;塊指令和簡單指令有相同的結構,但不是以分號結尾而是以大括號({})包含指令。若是一個塊指令中大括號內含有其它指令,那麼括號內的叫作上下文(例如:事件、http、服務器、位置)。

       在配置文件中,不在任何上下文的指令被認爲存在於主上下文。事件和http指令就存在於主上下文中,server在http上下文中,位置在server上下文中。

      配置文件使用#號做爲註釋符號。

                                              爲靜態文件提供服務

一個web服務器的重要工做就是爲靜態文件服務。例如,你想根據請求的不一樣,去不一樣目錄去請求服務:/data/www存放html文件,/data/images存放圖片信息。這就須要修改配置文件,創建一個服務器塊,在這個http塊中創建服務器塊,服務器塊內再創建兩個不一樣的位置塊。

   首先,建立/data/www目錄並把一個包含任意內容的index.html文件放入該目錄;建立/data/images目錄,放置一些圖片。

   而後,打開配置文件。默認配置文件中已經包含了一些server塊的實例,大部分被註釋掉了。如今註釋掉全部的相似塊,新寫一個server塊:

http {
    server {
    }
}

一般,配置文件可能會包含幾個server塊,server一般指定名稱和監控端口。當nginx決定哪一個server進程處理請求時,它測試uri請求報文頭而不是定義在server塊中的位置指令的參數。

   增長下面的位置塊到服務器塊中:

location / {
    root /data/www;
}

位置包括中定義的「/」前綴和請求uri進行比較。若是和uri中請求匹配,uri將增長root指令的路徑到uri中,亦即到本地文件系統的路徑/data/www下去響應請求。若是有多個位置塊匹配,nginx選擇最長後綴的那個。以上的位置塊提供了最短的前綴(長度爲1),所以當只有全部別的位置塊都不能提供匹配時,這個模塊才能使用到。

接下來,增長第二個位置塊:

location /images/ {
    root /data;
}

它將匹配以/images/開頭的請求(位置「/」也匹配這些request,但它的前綴更短)。

上述完整的配置以下:

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

    location /images/ {
        root /data;
    }
}

上述已是一個能夠運行的服務器的配置了,該服務器監聽http標準端口80,能夠經過htt://localhost/來訪問本地機器。若是請求以/images/開頭,那麼該服務器將從目錄/data/images/下獲取文件來應答請求。例如:請求http://localhost/images/example.png發送後,nginx將發送/data/images/example.png文件應答請求。若是該文件不存在,nginx將發送404返回。不是以/images/開頭的請求將會被映射到/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實例。

首先,定義被代理服務器,這能夠經過在配置文件中增長一個或者多個服務器塊,具體內容以下:

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

這個簡單的服務器監聽端口8080(上個例子中沒有使用listen是由於使用http標準端口80),映射全部的請求到本地文件系統的/data/up1目錄,建立此目錄並放置index.html文件到該目錄。注意root指令被放置到服務器上下文。當選擇提供服務的位置塊不包含本身的root指令時該root指令將被使用。

接下來,使用上篇服務器的配置並修改,使之成爲一個代理服務器的配置。在第一個位置塊中,在第一行的參數中添加proxy_pass指令加代理服務器的協議、名稱、端口。(在咱們的例子中是http://localhost:8080):

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

    location /images/ {
        root /data;
    }
}

咱們將修改第二個位置塊的配置,之前是映射/image/前綴的請求到/data/images/目錄下的文件,爲了和典型圖片的文件擴展名相匹配,修改的位置塊配置文件以下:

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

這個參數是一個正則表達式,它匹配以.gif,.jpg或者.png結尾的url。一個正則表達式應該以~開頭。響應的請求將被映射到/data/images目錄。

當nginx選擇一個位置塊爲請求提供服務時,它首先檢測指定帶前綴的位置指令,別忘記優先選擇最長前綴的,再檢測正則表達式。若是和一個正則表達式匹配,nginx選擇這個位置塊,不然選擇最初的那個。

完整的代理服務器配置以下:

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

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

這個服務器將過濾以以.gif,.jpg或者.png結尾的請求,而後映射到目錄/data/images 下(經過增長url到root指令參數),轉發其它請求到配置的被代理服務器中。

更多用來配置代理鏈接的指令能夠參考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html

                                                      創建FashCGI代理

nginx能夠用來追蹤到FastCGI 服務器上的請求,FastCGI服務器能夠運行不一樣框架不一樣編程語言(例如php)構建的應用程序。

適用FastCGI服務器運行的nginx最基本配置包括:使用fastcgi_pass指令而非proxy_pass;fastcgi_param指令設置發送參數到Fastcgi服務器。假定能夠經過http://localhost:9000來訪問FastCGI服務器。使用上章的代理服務器配置,替換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來操做。

相關文章
相關標籤/搜索