1. 程式人生 > >寫給Web開發人員看的Nginx介紹

寫給Web開發人員看的Nginx介紹

譯者注:不知道其他開發者是否和我一樣,參與或者寫了很多Web專案,但是卻沒有真正的去完整的部署應用,很多時候都是交給ops即運維的同學幫忙來做。而作為一個有節操的開發者,我認為了解一些伺服器方面的知識是很有必要的,讀了這篇文章之後,自己對nginx也有了一個初步的認識,對自己很有幫助,不敢獨享,遂譯之。

如果你是一名Web開發人員,那麼你很有可能聽過nginx(讀音聽起來像engine-x). Nginx是一款速度快,功能強大的http以及反向代理伺服器,經過簡單的配置之後即可以用來託管頁面。

不幸的是,和很多其他系統管理工具一樣,相關的原理教程和配置說明文件都很少。雖然官方提供了一個wiki,但是內容多且複雜,卻沒有真正的介紹那些你可能真正需要的東西。在自己糾結這個wiki一段時間之後,我終於掌握了使用nginx的一些基礎知識,並把它們在這裡與其他開發者分享出來,希望你們能夠更加快速的去掌握這些知識。

下面進入正題。針對本教程,你需要一個VPS(虛擬主機),最好是剛剛建立的,這樣可以避免與先前的配置產生衝突。

初始化安裝

現在假設你已經擁有一個執行ubuntu的虛擬主機(比如說託管於 digital ocean),配置好登入選項並更新好 apt 之後,執行 apt-get install nginx 安裝nginx.在瀏覽器訪問你的IP地址,你會看到頁面顯示“welcome to ngnix”資訊。OK,一切正常。

查詢nginx目錄

在我們通過 apt 安裝完nginx後,它為我們提供了一個基本的結構,幫助我們迅速設定好配置檔案。所有的nginx配置檔案都在 /etc/nginx

下(譯者注:Mac OS X環境下使用homebrew路徑與linux有區別,文章結尾部分提供mac下解決方案),輸入 cd 進入該目錄。你需要新增新配置選項的地方位於 sites-enabled 資料夾。如果你開啟這個資料夾,你會發現一個名為 default 的txt文件,開啟後你就會找到nginx的配置選項以及 “welcome to nginx"歡迎選項的程式碼。接下來我們開始建立屬於我們自己的配置檔案用於顯示一個頁面。在sites-enabled目錄下新建一個空白檔案並命名為 test,用你自己喜歡的文字編輯器進行編輯。

注意: 在該目錄下會發現一個 /etc/nginx/sites-available

 的資料夾。這個資料夾一般在你需要建立和管理多個站點的時候非常有用,可以幫助你更好的組織不同的專案。你需要在這裡新增你的nginx配置文案並將他們連結至 sites-enabled 目錄下。命令如下:

ln -s /etc/nginx/sites-available/dotcom /etc/nginx/sites-enabled/dotcom

只有在 sites-enabled 目錄下的配置檔案才能夠真正被使用者訪問。但是你同樣可以將檔案放在 sites-available 目錄下用來存檔或者生成連結。

配置靜態伺服器

Nginx配置檔案有自己的格式,好訊息是檔案的格式相當簡單,看起來特別像CSS檔案,先指定變數名,然後在花括號內編寫指令。最頂層是 server ,程式碼為:

server {

}

在花括號內,我們仍然可以像書寫CSS一樣,鍵值對後接分號,或者說更像sass的語法,並新增巢狀程式碼塊。後面兩種風格的程式碼我們都會用到,也很容易理解。

這裡可以新增的鍵值對和程式碼塊(在本教程的後面我們把它稱為指令)有很多種,你可以轉到官方文件去具體檢視。對於基本的伺服器設定其實只用掌握一些重要的指令即可。我會給後面的每個指令連結官方的ngnix文件。官方文件是你深入理解nginx的唯一渠道,因此你必須掌握如何更好的去使用它。

宣告伺服器監聽的埠號。如果你瞭解rails,你一定知道本地伺服器的預設埠是3000. Roots執行在1111埠。SSL在443埠。網際網路的預設埠是80,因此在url中未定義埠的話一般預設為80。因為你很有可能是去執行一個線上的伺服器,因此最好定義成80埠。程式碼如下:

server {
    listen 80;    
}

注意預設埠嚴格來講不是必要的,但是為了能夠保證你對整個流程足夠了解最好加上。完成了第一步,我們進入下一步server_name.

server_name主要用來匹配url地址。任意請求通過nginx時,它會檢視url並尋找 server_name 片段。如果你的站點地址為 http://xvfeng.me, 那麼你的 server_name 應當也為 xvfeng.me . 如果你在域名解析時使用了A記錄並通過伺服器指向 http://snargles.com , 你可以新增另外一個 server 程式碼,將 server_name 指向 snargles.com, 這段程式碼就會匹配來自於這個域名的請求。

這個特性非常強大。這意味著你可以在單個nginx配置檔案裡託管無數個站點,甚至包括不同域名的網站。你需要做的只是將設定A記錄並指向虛擬機器所在的IP, 之後設定其他的nginx伺服器配置。

針對 server_name 還有兩點值得關注。首先是你可以設定子域名。如果你想匹配http://test.example.com ,設定相當簡單,甚至還可以指向一個完全不同的應用。第二點,你可以使用萬用字元, 即 * 或者正則來匹配路由。這個功能絕對強大。下面我們簡單的配置一下server_name到example.com .

server {
    listen 80;
    server_name example.com;
}

Nice.接下來再加一些配置就可以讓伺服器運轉了。

root

這個是託管靜態站點最關鍵的部分。如果你只是想用它來託管一些html和css檔案,root部分要定義的就是這些檔案存放的路徑。我喜歡把檔案放在 /var/www 目錄下,因此我們在這裡建立一個資料夾。使用 mkdir 建立 /var/www/example 目錄,建立一個空白的 index.html 檔案,隨便新增一些段落輸出hello world之類的內容。程式碼如下:

server {
    listen 80;
    server_name example.com;
    root /var/www/example;
}

基本變數設定完畢,下一步配置路由。

Location接受兩個引數,一個字串或者正則和一段程式碼。字串或者正則用於匹配某個特定目錄。如果你想讓使用者在訪問 example.com/whaterver 時訪問某個特定頁面,你需要將 whatever 設定為uri地址。在這裡我們只需要訪問root目錄,因此只需要加上 / 即可,內容暫時為空,後面再做解釋。

server {
    listen 80;
    server_name example.com;
    root /var/www/example;

    location / {

    }
}

第一引數可以有很多種寫法,你可以參考上面給出的連結。在以上區塊內,我們需要路由指向結果頁面。注意 / 會匹配所有的url地址,因為在這裡它被解釋為一個正則。如果你只想匹配某個準確的字串,只需要在前面加上一個等號,寫法如下:

location = / { ... }

現在我們需要完成之前的程式碼。我們可以在區塊內新增另外一段指令,用於載入名為 try_files 的檔案。Try fiels接受了一組檔名或者正則,用於在根目錄下查詢,並會載入查詢到的第一個結果。對於我們的靜態伺服器來講,我們希望找到一個在 / 之後緊跟著whatever的檔案,例如 whatever.html. 如果在斜線後面沒有任何內容,則會尋找 index.html. 在上面給出的文件連結中你可以找到更多的關於如何設定該選項的吸納關係介紹,這裡我們只寫一些簡單的配置:

server {
    listen 80;
    server_name example.com;
    root /var/www/example;

    location / {
        try_files $uri $uri/ /index.html;    
    }
}

你可能會奇怪上面的 $url 是從哪裡來的?其實是nginx所提供的。每次有請求時,nginx會生成一系列變數,這些變數儲存了請求的相關資訊。這裡的uri就是我們將要了解的內容之一。

  • 來自 http://example.com 的請求進入。
  • nginx找到server片段程式碼,其中 server_name 為 example.com ,並使用它來處理請求
  • nginx匹配任意請求。因為這裡的 / 會匹配根域名下的任意內容。
  • 在匹配到的location程式碼中,nginx開始試圖載入一個檔案。首先尋找一個未命名的檔案,因為這裡的uri匹配的就是沒有名稱的檔案,所以無法找到。接著開始查詢未命名的目錄,結果還是找不到。最後開始查詢並載入根目錄下 /index.html 。

接下來想象一下如果你新增一個名為 test.html 的檔案到根目錄下並訪問 http://example.com/test.html.自己試一下你就知道了。

你可以任意的去嘗試改變這裡的配置環境。例如,在carrot.is這個網站裡,但使用者訪問某個檔案並且沒有加上 .html 字尾時,try_files同樣會查詢 $uri.html 並匹配相應結果。因此在你訪問http://carrot.is.about 和 http://carrot.is/about.html 時你會得到相同的檔案。你可以充分發揮你的想象力去設定你的配置檔案。

啟動服務

總結一下我們所做的事情。首先添加了 server 選項,在nginx執行時,會查詢 /etc/sites-enabled 目錄下的所有配置檔案用於顯示對應內容。但是請等一下,你可能無法馬上得到結果-因為nginx並不知道你所作的這些改動。為了讓nginx真正讀取新配置檔案,你需要重啟伺服器,執行以下命令:

service nginx reload

注意:這裡的 service 命令實際上是呼叫了配置檔案裡內容,這些都在使用 apt 時被生成。這裡呼叫的實際上是 /etc/init.d/nginx reload .

接下來就是訪問伺服器IP地址便可得到你想要的頁面。