初識NGINX

前言

此文是翻譯的http://nginx.org/en/docs/beginners_guide.html,由於本人不做php部分的開發,所以去掉了最後一節關於php部分的引用。

正文

此文對nginx有一個基本的介紹,並提供了幾個nginx可以解決的任務。本文假設讀者在電腦上已經安裝了nginx,如果沒有安裝,可以按照nginx安裝頁面的介紹進行安裝。此文檔介紹瞭如何啓動和安裝nginx,根據配置文件重啓,介紹了配置文件的結構,並描述瞭如何設置nginx用於服務靜態文件,如何配置nginx爲代理,和如何設置nginx連接FastCGI應用。

nginx有一個master進程和幾個worker進程。master進程的作用是讀取和使得配置文件生效,並維護worker進程。worker進程則用於處理實際的請求。nginx使用的是基於事件模型和依賴於系統的機制來在worker進程之間有效的分配請求。worker進程的數量可由配置文件配置,也可由指定的配置文件進行修改(這句話的意思是nginx可以由指定的配置文件啓動)或者自動適應cpu的核數。

nginx和其模塊的工作方式是由配置文件決定的。文件的默認名爲nginx.conf,並且默認的存放在/usr/local/nginx/conf, /etc/nginx, 或者 /usr/local/etc/nginx文件夾下。

nginx的啓動,停止,重啓

可以通過執行nginx的執行文件來啓動nginx。一旦nginx啓動了, 它就可以由命令行參數-s來進行控制,控制方式如下:

nginx -s signal

其中signal可以爲如下四種:

  • stop - 快速的關閉
  • quit - 優雅的關閉
  • reload - 重啓配置文件
  • reopen - 重新打開log文件

例如,爲了在nginx處理了當前已經接受的請求之後再退出,可以使用如下的命令

nginx -s quit

此命令應該在同一個用戶的環境下執行

配置文件只有在使用重載配置文件或者重啓nginx之後纔會生效。爲了重啓配置,可以執行如下命令:

nginx -s reload

一旦nginx收到重啓配置的指令,它就會檢查新配置文件在語法上的有效性並嘗試應用新提供的配置文件。在執行成功之後,nginx會啓動新的worker進程,併發送消息給舊的工作進程,讓它們停止;否則,master進程會回滾,繼續讓舊的worker進程按照老的配置工作。舊的工作進程會接受停止命令,然後停止接受新的連接並把當前的連接處理完畢。然後,舊的工作進程會退出。

另外也可以使用Unix提供的kill命令來傳遞指令給nginx。這個時候指令是通過指定的進程ID來傳遞給nginx的。nginx的master進程的ID會默認寫到 /usr/local/nginx/logs 或者 /var/run目錄下nginx.pid文件裏。例如,在master進程的ID是1628的時候,可以使用如下命令來優雅的關閉nginx的:

kill -s QUIT 1628

爲了獲得所有正在運行的nginx進程,可以使用ps命令,例如:

ps -ax | grep nginx

可以看控制nginx,來獲取更多的發送指令給nginx的消息

配置文件的結構

nginx包含的模塊是由配置文件中的指令控制的。指令可以區分爲簡單指令和塊指令。一個簡單指令包含由空格分割的名稱和參數,並以分號(;)進行結尾。一個塊狀的指令整體的結構和簡單指令相同,但是這些指令由大小括號({和})包圍。如果在大括號內部之中還有大括號,那麼外部括號則是內部括號的上下文環境(例如: events, http, server, and location)。

置於任何括號之外的指令是main上下文環境。eventshttp指令在main上下文環境之中,server置於http環境之中,location置於server環境之中。

每行指令中置於#之後的是註釋

服務於靜態文件

web服務器的一個重要功能就是返回文件給客戶端(例如圖片或者靜態的HTML頁面).你可以實現一個實例,根據請求的不同來將文件由本地 /data/www (包含html文件) 和/data/images (包含圖片)進行分發。這將需要設置配置文件,設置一個置於 http 模塊之中的 server 模塊 ,並且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之後。如果有多個匹配的路徑,那麼會匹配最長匹配的路徑。定義的location塊可以提供一個最短的長度爲1的前綴,然後在其他location都不匹配的時候使用。

接下來添加第二個location塊:

location /images/ {
	root /data;
}

此塊可以用來匹配URI以/images/開頭的請求(以/開頭的location也會匹配,但是匹配的前綴更短)。

最後的server塊配置如下:

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

    location /images/ {
        root /data;
    }
}

這是一個服務器可以運行的配置,用來監聽標準的80端口,可以在本地通過 http://localhost/進行訪問。對於URI以/images/開頭的請求,服務器將從路徑/data/images中發送文件。例如,對於uri爲http://localhost/images/example.png的請求,nginx將會發送文件/data/images/example.png。如果此文件不存在,那麼nginx將會發送一個表示404錯誤的響應。對於不是以/images/開頭的請求,nginx將會從’/data/www’文件夾下發送文件。例如,對於URI爲http://localhost/some/example.html的請求,nginx將會發送文件/data/www/some/example.html

如果nginx沒有啓動,那麼使得新的配置文件生效只需要啓動nginx即可;如果nginx已經啓動了,那麼可以傳遞reload指令給nginx的master進程即可,命令如下:

nginx -s reload

設置一個簡單的代理服務器

nginx常常使用的一個方式是設置爲一個代理服務器,這意味着nginx接受請求,然後把請求傳遞給代理的服務器,再從這些代理的服務器中獲取相應,最後返回給客戶端。

接下來我們將配置一個基礎的代理服務器,此服務器將會把圖片和文件的響應直接從本地文件夾返回,而其他響應則傳遞給代理的服務器。在這個例子中,兩個服務器將會定義在一個nginx實例之中。

首先,通過添加一個server塊的方式添加一個代理服務器,server塊中包含如下內容

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

這是一個簡單的服務器,會監聽8080端口(在之前是沒有使用listen指令的原因是nginx默認監聽的是80端口),然後把所有請求映射到本地的/data/up文件夾。創建此文件夾,然後把index.html文件放在此文件夾下面啊。注意,root指令放在了server環境之中,此root指令會在處理請求的location塊中沒有自己的root指令的時候使用。

下一步就是修改上一步制定的配置文件,使得它可以作爲一個代理服務器使用。在第一個location塊,使用 proxy_pass 指令,並且參數中包括使用的協議、名稱以及端口。在我們的例子中是http://localhost:8080:

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

    location /images/ {
        root /data;
    }
}

接下來我們將修改第二個location塊,此時該locatinon指令塊會在請求的URI匹配/images/的時候將置於/data/images文件夾下的文件返回給客戶端。修改後的location塊如下

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

參數是一個匹配所有以.gif,.jpg.png結尾的URI。正則表達式之前需要一個符號~表示後面的是按照正則表達式匹配的。對的請求會映射到對應的/data/images文件夾下的文件。

在nginx選擇處理請求的location塊的時候,會首先檢查location指令,記住最長的location前綴,然後會檢查正則匹配。如果有正則匹配匹配上的location,那麼會使用此location指令,否則會使用之前記住的location指令。

最終的server配置如下:

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

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

此服務器會將以.gif,.jpg或者.png結尾的請求映射到文件夾/data/images下的文件。然後把其他請求傳遞給代理的服務器上。

要想使得配置的文件生效,需要想前面講到的一樣,把reload指令傳遞給nginx。

另外還有更多的指令,用於處理代理服務器。

發佈了183 篇原創文章 · 獲贊 25 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章