初識 Nginx

Nginx 是一個免費的,開源的,高性能的HTTP服務器和反向代理,以及IMAP / POP3代理服務器。 Nginx 以其高性能,穩定性,豐富的功能,簡單的配置和低資源消耗而聞名。不少高知名度的網站都使用 Nginx,如:Netflix,GitHub,SoundCloud,MaxCDN 等。 html

Nginx 有一個主線程( master process)和幾個工做線程(worker process)。主線程的目的是加載驗證配置文件、維護工做線程。 nginx

工做線程處理實際的請求,Nginx 採用基於事件的模型和依賴操做系統的機制在工做線程之間高效地分發請求。工做線程的數量可配置,也可自動調整爲服務器CPU的數量。 正則表達式

Nginx 及其模塊的工做方式由配置文件肯定。 默認狀況下,配置文件名爲 nginx.conf,放在 /usr/local/nginx/conf/etc/nginx 或者 /usr/local/etc/nginx 文件夾中。 服務器

基本命令

Nginx 啓動以後,可使用如下命令控制:網絡

nginx -s <signal>

其中-s意思是向主進程發送信號,signal能夠爲如下四個中的一個: ide

  1. stop — 快速關閉
  2. quit — 優雅關閉
  3. reload — 從新加載配置文件
  4. reopen — 從新打開日誌文件

當運行nginx -s quit時,Nginx 會等待工做進程處理完成當前請求,而後將其關閉。當你修改配置文件後,並不會當即生效,而是等待重啓或者收到nginx -s reload信號。 性能

當 Nginx 收到 nginx -s reload 信號後,首先檢查配置文件的語法。語法正確後,主線程會開啓新的工做線程並向舊的工做線程發送關閉信號,若是語法不正確,則主線程回滾變化並繼續使用舊的配置。當工做進程收到主進程的關閉信號後,會在處理完當前請求以後退出。 網站

配置文件

Nginx 配置的核心是定義要處理的 URL 以及如何響應這些 URL 請求,即定義一系列的虛擬服務器(Virtual Servers)控制對來自特定域名或者 IP 的請求的處理。 ui

每個虛擬服務器定義一系列的 location 控制處理特定的 URI 集合。每個location定義了對映射到本身的請求的處理場景,能夠返回一個文件或者代理此請求。 操作系統

Nginx 由不一樣的模塊組成,這些模塊由配置文件中指定的指令控制。 指令分爲簡單指令塊指令

一個簡單指令包含指令名稱指令參數,以空格分隔,以分號(;)結尾。 塊指令與簡單指令相似,可是由大括號({})包圍。 若是塊指令大括號中包含其餘指令,則稱該指令爲上下文(如: events, http, serverlocation)。

配置文件中的放在上下文以外的指令默認放在主配置文件中(相似繼承主配置文件)。 eventshttp 放置在主配置文件中,server 放置在http塊指令中,location放置在server塊指令中。

配置文件的註釋以 # 開始。

靜態內容

Web 服務器一個重要的功能是服務靜態文件(圖像或靜態HTML頁面)。例如,Nginx 能夠很方便的讓服務器從/data/www 獲取 html 文件,從/data/images獲取圖片來返回給客戶端,這隻須要在http塊指令中的server塊指令中設置兩個location塊指令。

首先,建立 /data/www 目錄,並放入 index.html,建立 /data/images 目錄並在其中放置一些圖片。

接下來,打開配置文件。 建立一個 server 塊:

http {
    server {
    }
}

一般,配置文件能夠包括多個 server 塊,它們以端口服務器名稱來區分。當 Nginx 決定某一個 server 處理請求後,它將請求頭中的 URIserver 塊中的 location 塊進行對比。
加入 location 塊指令到 server 中:

將如下位置塊添加到服務器塊:

location / {
    root /data/www;
}

上面的 location 塊指定 / 前綴與請求中的 URI 對比。對於匹配的請求,URI 將被添加到 root 指令中指定的路徑,即 /data/www,以此造成本地文件系統的路徑,如訪問http://localhost/bog/welcome.html,對應服務器文件路徑爲/data/www/bog/welcome.html。 若是 URI 匹配多個 location 塊,Nginx 採用最長前綴匹配原則(相似計算機網絡裏面的IP匹配), 上面的 location 塊前綴長度爲 1,所以只有當全部其餘 location 塊匹配時,才使用該塊。

接下來,添加第二個位置塊:

location /images/ {
    root /data;
}

它將匹配以/images// 也匹配這樣的請求,但具備較短的前綴)開始的請求。

server 塊的最終配置以下:

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

    location /images/ {
        root /data;
    }
}

到目前爲止,這已是一個能夠正常運行的服務器,它監聽端口80,而且能夠在本地計算機上訪問 http://localhost/。 對於 /images/ 開頭的請求,服務器將從 /data/images 目錄發送文件。 如,對於 http://localhost/images/example.png 請求,nginx 將響應 /data/images/example.png文件。 若是不存在,nginx 將返回404。URI 不以 /images/ 開頭的請求將映射到 /data/www 目錄。 例如,對於 http://localhost/some/example.html 請求,nginx 將響應 /data/www/some/example.html 文件。

代理服務器

Nginx 的一個常見應用是將其設置爲代理服務器(Proxy Server),即接受客戶端的請求並將其轉發給代理服務器,再接受代理服務器發來的響應,將它們發送到客戶端。

好比咱們能夠用一個 Nginx 實例實現對圖片文件的請求使用本地文件系統,而其餘請求轉發到代理服務器。

首先,向 Nginx 的配置文件中添加一個 server 塊來定義代理服務器:

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

此服務器偵聽端口8080,並將全部請求映射到本地文件系統上的 /data/up1 目錄。 建立此目錄並將 index.html 放入其中。 注意,root 指令放在 server 上下文中,這樣 當 location 塊中不含 root 指令時將使用所屬 serverroot 指令。

接下來,使用上一節中的服務器配置,並將其修改成代理服務器配置。 在第一個位置塊中,加上proxy_pass指令:

server {
    location / {
           # proxy_pass指令的參數爲:協議+主機名+端口號
        proxy_pass http://localhost:8080;
    }

    location /images/ {
        root /data;
    }
}

修改第二個 匹配 /images/ 前綴的 location 塊,使其與請求圖像文件的擴展名相匹配:

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

該參數是一個正則表達式,匹配以.gif,.jpg或.png結尾的全部URI。 正則表達式應該以 ~ 開頭。 相應的請求將映射到 /data/images 目錄。

當 Nginx 選擇一個 location 塊來處理請求時,它首先檢查指定 location 塊的前綴,記住具備最長前綴的 location 塊,而後檢查正則表達式。 若是與正則表達式匹配, Nginx 選擇此 location 塊,不然,選擇先前記住的 location 塊。

代理服務器的最終配置以下:

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

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

此服務器將過濾以.gif,.jpg或.png結尾的請求,並將它們映射到 /data/images 目錄(經過向 root 指令的參數添加請求的URI),並將全部其餘請求發送給上面配置的代理服務器。

這樣,圖片和其餘請求就可使用不一樣的服務器來處理。

FastCGI代理

Nginx 可用於將請求路由到 FastCGI 服務器。快速通用網關接口(Fast Common Gateway Interface/FastCGI)是一種讓交互程序與Web服務器通訊的協議。所以 Nginx 能夠將請求路由到 FastCGI 運行的應用程序,如 PHP 程序。

使用 FastCGI 服務器的最基本的 Nginx 配置包括使用 fastcgi_pass 指令而不是 proxy_pass 指令,以及使用 fastcgi_param 指令來設置傳遞給 FastCGI 服務器的參數。 假設FastCGI服務器可在 localhost:9000 上訪問。 以上一節中的代理服務器配置爲基礎,使用fastcgi_pass指令替換proxy_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;
    }
}

這將設置一個服務器,將路由除靜態圖像之外的全部請求到運行在 localhost:9000 的 FastCGI 服務器。

文章來自:http://nginx.org/en/docs/beginners_guide.html

-- END

相關文章
相關標籤/搜索