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


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

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

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

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

                                                           啟動、停止、重新加載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來操作。

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM