1. 程式人生 > >Nginx實戰入門教程

Nginx實戰入門教程

Nginx 簡介

Nginx是一個高效能的http和反向代理伺服器,它看起來好像不太符合英文單詞的拼寫習慣,因為Nginx是由名為 伊戈爾·賽索耶夫 的俄羅斯人開發的。Nginx主要特點為佔用記憶體小,處理併發能力強悍,在國內被廣泛採用。目前像阿里,京東,騰訊,百度,新浪,網頁等國內的網際網路巨頭公司都在使用。
下面我們來介紹Nginx的簡單使用,筆者認為學會一個工具最快的方式為先使用,然後明白為什麼。就像小時候你先學會騎自行車,然後在知道自行車如果壞了怎麼去修理它。

Nginx的下載和安裝

Nginx的下載和安裝非常簡單,直接在http://nginx.org/en/download.html

下載對應的平臺版本即可,筆者的實驗是在Windows下進行的(事實上對於Nginx的安裝和簡單配置來說,Windows和Linux並沒有太大異同),下載的Nginx版本為nginx/Windows-1.14.0。Nginx的壓縮包非常小,只有約1.5M,而且無需翻牆,數秒即可下載完成。
下載完成之後直接將壓縮包解壓即可,筆者將其解壓到D盤的根目錄下,此時檔案目錄內容如下:
這裡寫圖片描述

啟動,停止,和重新載入配置檔案命令

Nginx解壓完畢之後,直接雙擊nginx.exe 即可啟動,當Nginx啟動之後,通過nginx -s 命令可以實現停止nginx和重新載入配置檔案。

nginx -s stop # 立即停止
nginx -s quit # 停止,在Nginx停止前會等待當前正在進行的任務 nginx -s reload # 重新載入配置檔案

Nginx作為普通HttpServer

簡單來說,任何可以通過Http請求的方式訪問IO資源(檔案是對磁碟IO的一種抽象)服務都可以稱為HttpServer。你可以自己寫一個程式監聽一個埠,當使用瀏覽器輸入ip:port/path 訪問,程式獲取瀏覽器獲取到Http請求報文,然後對URI部分(也就是path部分)進行解析,在本地檔案系統或者其他IO資源中找到對應的資源,通過封裝一個Http響應報文,將資源內容放入響應體中寫回給瀏覽器,瀏覽器就會對其進行解析並展示(或者下載),這就完成了最簡單的Http伺服器。但我們平時應用的Http伺服器需要處理的細節是很多的,如IO複用,安全性等,在此不再贅述。

首先複製conf/nginx.confconf/nginx_bak.conf 備份原有的配置檔案檔案,在nginx的根目錄下建立www 目錄,並使用echo 01 > index.html 命令,在www目錄下建立index.html,作為HttpServer的靜態資源。

刪除nginx.conf 的內容並寫入如下配置:

worker_processes  1;
events {
    worker_connections  1024;
}
error_log  D:/nginx-1.14.0/error.log;
http {
    access_log  D:/nginx-1.14.0/access.log;
    server {
        location / {
            root D:/nginx-1.14.0/www;
        }
    }
}

開啟瀏覽器輸入http://localhost/ 結果如下圖:
這裡寫圖片描述
至此, 配置Nginx最基本的功能已經成功執行

注意:這裡有個細節, Windows下的路徑D:/nginx-1.14.0/www 在Nginx的配置檔案中要寫為正斜線/事實上從Windows資源管理器中直接複製路徑為D:\nginx-1.14.0\www,分隔符為反斜線在某些情況下也是可以的,但是這裡出現的\n連在一次會被nginx認為是一個換行符,從而請求會出現伺服器500錯誤,所以這裡推薦所有的分隔符都使用正斜線/,在Linux上由於路徑分隔符本身就是/,因此不存在此問題

Nginx配置檔案

前面我們已經對Nginx進行了簡單配置併成功的訪問,這裡對Nginx的配置檔案進行簡單介紹,nginx的配置檔案中配置項有兩種結構

  • 簡單指令(simple directive),形如key value;
  • 塊指令(block directive), 形如key {simple_key simple_value;} 塊指令中包含有簡單指令。

沒錯,像是json,但又不是json

worker_processes  1;
events {
    worker_connections  1024;
}

worker_processes 為工作程序的數量,這裡如果不填的話預設為CPU核心數,事實上數量為CPU核心數也是最優配置,因為此時,理論上作業系統發生程序切換的的代價最小。
events.worker_connections 每個工作程序的最大連線數,events有很多複雜的配置,詳情點選這裡
error_log 為發生錯誤時的日誌輸出路徑

http {
    access_log  D:/nginx-1.14.0/access.log;
    server {
        location / {
            root D:/nginx-1.14.0/www;
        }
    }
}

這一部分算是對映的主體了,整體包含在一個塊級指令http {}中,access_log指定該http的日誌路徑(此項也可以配置在server{}內),放到http{}內,其中所有的server訪問日誌都會輸出到此。server{}內有location / {}項,nginx會根據location後面的路徑和ip:port/path中的path做匹配,如果匹配到,則從裡面配置的D:/nginx-1.14.0/www本地目錄下尋找請求的資源。

注意:一個server{} 下也可以有多個location配置,而且location配置也可以跟正則表示式,如下:

server {
    location / {
        root D:/nginx-1.14.0/www;
    }
    location /static/ {
        root D:/nginx-1.14.0/static;
    }
    location ~ \.(gif|jpg|png)$ {
        root D:/nginx-1.14.0/images;
    }
}

nginx的匹配優先順序為,正則,長路徑,短路徑。關於正則的配置必須以~開頭,後面跟要匹配的檔名正則表示式,這裡以localhost/01.png為例,nginx會找到符合檔名的第三項配置,然後會從D:/nginx-1.14.0/images中找01.png檔案,這裡沒有任何問題。
如果路徑為/static/file.suffix,匹配到location /之後,還會往更深的location /static/配置的root目錄下匹配資源,此時會在本地找到D:/nginx-1.14.0/static/file.suffix檔案。此時如果刪除location /static/的配置,就會從location /的root目錄下尋找配置檔案,即此時的匹配路徑為D:/nginx-1.14.0/www/static/file.suffix。這點符合nginx優先匹配深層次的location配置這一特性。
有意思的是當路徑為/static/01.png時,此時符合location ~ \.(gif|jpg|png)$location /static/兩項配置,但由於正則優先,會尋找本地檔案系統中D:/nginx-1.14.0/images/static/01.png檔案

Nginx作為代理伺服器

Nginx經常作為代理伺服器,作為代理的訪問邏輯如下圖:

Created with Raphaël 2.1.2BrowserBrowserNginxNginxWebServerWebServerRequestRequestResponseResponse

這裡將上面配置好的靜態檔案伺服器作為目標WebServer,首先將配置檔案的http{}塊中追加以下內容

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

然後使用nginx -s reload重新載入配置檔案,在瀏覽器中輸入localhost:8080/index.html可以看到瀏覽器輸出如下:
這裡寫圖片描述

這裡對上面的配置進行簡單解釋:

server{listen 8080;}表明啟動一個http-server監聽在8080埠(注:此項不填預設為80埠,但前面的靜態伺服器已經佔用了80埠,此處就為其他埠)。
location / {proxy_pass http://localhost:80;} location的匹配規則前文已經講過,這裡當匹配上location /之後,就會從請求proxy_pass的URL,然後在將結果返回給瀏覽器。此時的localhost:8080/index.html請求相當於在請求localhost:80/index.html