天天看點

Nginx 配置學習筆記

Nginx 配置學習筆記

最近在學習如何對 Nginx 進行配置,故而對 Nginx 的配置檔案的結構功能有了一些新的認識。剛開始接觸 Nginx 時,感覺它的配置十分高深、難以了解,需要配置什麼功能都是網上搜尋現成的代碼,複制粘貼,重新開機伺服器。雖然也能夠按照預期來工作,但是這種做法隻是知其然而不知其是以然,不可取。

俗話說,好記性不如爛筆頭。現在雖然能力了解看懂,但是過短時間之後還能不能記得那就得兩說了。

以下是筆記内容。

注意:這是針對 Linux 平台的筆記,有些内容可能對其他平台并不适用!

啟動、停止、重載配置

在安裝完 Nginx 程式之後,執行 nginx 可執行檔案即可啟動 Nginx 服務了。一旦啟動了服務之後,我們就可以使用那可執行檔案帶 -s 參數來控制 Nginx 伺服器了,它的文法如下:

nginx -s signal           

signal 是以下的信号之一:

  • stop 快速停止服務
  • quit 優雅地停止服務
  • reload 重新加載配置檔案
  • reopen 重新打開日記檔案

例如,重新加載配置檔案的指令如下:

nginx -s reload           

Nginx 的主程序接收到重載配置檔案的信号之後,它會對新配置檔案進行文法檢查并嘗試應用所提供的配置檔案。如果成功的話,主程序會啟動新的工作者程序,并且發送信号給舊的工作者程序,要求他們關閉。否則的話,主程序會将更新復原,然後繼續以舊的配置檔案運作。

配置檔案的子產品結構

根據使用的平台不同,你的配置檔案的路徑也會不同,大部分情況下它會在 /etc/nginx/nginx.conf 。如果不在這裡,它還可能會在 /usr/local/nginx/conf/nginx.conf 或 /usr/local/etc/nginx/nginx.conf。

Nginx 的配置檔案是按配置塊來組織的,從結構看起來一目了然。最外一層是 main 配置塊,它是一個全局配置的區域;main 配置塊下面有 events 和 http 配置塊;http 下面又有 upstream 和 server 配置塊;server 裡有 location 等配置塊。

從整體結構上來看,它基本上是這個樣子:

# main
....
events {
  ....
}
http {
    ....
    upstream myproject {
        .....
    }
    server  {
        ....
        location {
            ....
            if (test_condition) {
                ......
            }
        }
    }
    server {
        ....
        location {
            ....
        }
    }
    ....
}           

常用的基本上就這七大塊了:

  • main 全局配置塊
  • events 可以配置 Nginx 的工作模式、工作者程序連接配接數
  • http http 的相關配置塊
  • server 虛拟主機配置塊
  • upstream 負載均衡配置塊
  • location RUI 比對快
  • if 條件判斷塊
各個子產品的功能、常用指令

main 配置塊

在這裡配置全局的配置資訊,常用的有如下這些:

user nobody nobody;
worker_processes 2;
error_log  /usr/local/var/log/nginx/error.log  notice;
pid        /usr/local/var/run/nginx/nginx.pid;
worker_rlimit_nofile 1024;           
  • user 配置 Nginx 工作者程序的運作使用者,預設有 nobody 賬号運作
  • woker_process 工作者程序的數量 

    它的最優值取決于多種因素,比如 CPU 的核數,儲存資料的硬碟驅動的個數等等。一般情況下,可以将它設定為 CPU 的核數。

  • error_log 錯誤日記檔案配置 

    第一個參數是錯誤日記的檔案,第二個參數決定了日記的級别,可選的值有 debug, info, notice, warn, error, crit, alert 或者 emerg

  • pid 定義一個儲存主程序的程序 ID 的檔案
  • worker_rlimit_nofile 這是工作者程序的最大檔案打開數目

events 配置塊

用指定 Nginx 的工作模式和工作模式及連接配接數上限,

events {
    use kqueue; #mac平台
    worker_connections  1024;
}           
  • use 指定工作者程序的連接配接方法 

    一般情況下是不需要設定這個的,因為 Nginx 會預設會選擇最高效的方法

  • worker_connections 設定每個工作程序能夠同時打開的最大連接配接數 

    需要注意的是:這個連接配接數是指所有的連接配接數(包括與代理伺服器的連接配接數,還有其它的連接配接數),還有一點就是,最大連接配接數(worker_connections)的值不能超過目前工作者程序能夠打開的最大檔案數目(worker_rlimit_nofile)的限制。

還有一個關于最大用戶端數目的計算問題,有些困擾這我。當作為 HTTP 伺服器時,Max_clients=worker_processesworker_connections;當作為代理伺服器是,Max_clients=worker_processesworker_connections/4,這個為什麼是除以 4 ,而不是 2 呢?

http 配置塊

Nginx 的主要功能子產品都是在這裡配置的,可以在這裡配置 Nginx 作為 HTTP 伺服器,可以在這裡配置 Nginx 成為反向代理,也可以在這配置 Nginx 成為負載均衡器。可以說,這個配置塊裡的配置内容至關重要!

http{
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /usr/local/var/log/nginx/access.log  main;
    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    keepalive_timeout  10;
    upstream myproject {
        .....
    }
    server {
        ....
    }
}           
  • include 将其它的檔案包含到配置檔案中
  • default_type 定義一個相應的預設 MIME 類型
  • log_format 定義日記的格式
  • access_log 設定通路日記的路徑、格式
  • sendfile 啟用或者禁用 sendfile()
  • tcp_nopush 當 sendfile 啟用時,該指令才會生效。 

    它的作用是啟用或者關閉在 freeDSB 中使用 TCP_NOPUSH socket 選項,或者在 linux 中使用 TCP_CORK socket 選項

  • tcp_nodelay 啟用或者禁用 TCP_NODELAY 選項 

    隻有當一個連接配接是 keep-alive 狀态時,該指令才會生效

  • keepalive_timeout 設定 keep-alive 連接配接在服務端保持打開的時間 

    第一個參數表示連結打開的時間,0 表示關閉 keep-alive 在用戶端的連結;可選的第二個參數設定響應頭部的 “Keep-Alive: timeout=time”。這兩個參數可以不同

upstream 配置塊

upstream 配置塊用來定義一組服務,裡面的服務可以監聽不同的端口。另外,服務也可以将 TCP 和 UNIX-domain sockets 進行混合使用。

upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;

    server backup1.example.com  backup;
}           

上面的代碼中定義了一個名為 backend 的負載均衡器,裡面有三個後端服務,他們是按 weight 的方式進行輪詢的。在每七個請求中,其中的五個會配置設定到 backend1.example.com 伺服器,另外的兩個請求分别配置設定給另外兩個伺服器。

最後還定義了一個作為備份的伺服器,隻有當所有的非備份伺服器都挂掉之後才會請求備份伺服器,是以他的負載時最輕的。

在HTTP Upstream子產品中,可以設定後端伺服器的 socket 資訊,同時還可以設定每個後端伺服器在負載均衡排程中的狀态。常用的狀态有:

  • down 表示目前的 server 暫時不參與負載均衡。
  • backup 預留的備份機器。
    當其他所有的非 backup 機器出現故障或者忙的時候,才會請求 backup 機器,是以這台機器的壓力最輕。           
  • max_fails 允許請求失敗的次數,預設為1。
    當超過最大次數時,傳回 proxy_next_upstream 子產品定義的錯誤。           
  • fail_timeout,在經曆了 max_fails 次失敗後,暫停服務的時間。
    max_fails 可以和 fail_timeout 一起使用。
               

Nginx 支援四種負載均衡的方法,它們分别是 Round-robin 、least_conn、ip_hash 和 hash 。

  • Round-robin 這是根據權重的輪詢方式,Nginx 預設使用這種方法。
upstream backend {
   server backend1.example.com weight=3;
   server backend2.example.com;
}           
  • least_conn 具有最少活躍連接配接數的伺服器将會被發送請求。
upstream backend {
    least_conn;

    server backend1.example.com;
    server backend2.example.com;
}           
  • ip_hash 根據用戶端的 ip 位址來決定将請求發送給哪個伺服器。
upstream backend {
    ip_hash;

    server backend1.example.com;
    server backend2.example.com;
}           
  • hash 根據使用者自定義的 hash 值來決定将請求發送到哪個伺服器
upstream backend {
    hash $request_uri consistent;

    server backend1.example.com;
    server backend2.example.com;
}           

server 配置塊

server 配置塊是用來配置虛拟主機的資訊的,可以在這裡配置虛拟主機監聽的端口,域名,URL 重定向等。

server {
        listen       8080;
        server_name  localhost 192.168.12.10 www.yangyi.com;
        # 全局定義,如果都是這一個目錄,這樣定義最簡單。
        root   /var/www;
        index  index.php index.html index.htm; 
        charset utf-8;
        access_log  usr/local/var/log/host.access.log  main;
        aerror_log  usr/local/var/log/host.error.log  error;
        ....
}           
  • listen 用來設定虛拟主機要監聽的端口
  • server_name 設定虛拟主機的域名,多個域名使用空格隔開
  • root 設定虛拟主機目錄
  • index 定義目錄中沒有指定檔案時的預設通路的檔案。 

    伺服器會根據指定的順序來檢查所指定的檔案,檔案名可以包含變量,最好一個可以指定絕對路徑,例如:

    index index.$geo.html index.0.html /index.html;           
  • charset 指定特定的字元集到響應頭部的 “Content-Type” 首部。
  • access_log 設定通路日記的路徑及格式。
  • error_log 設定錯誤日記的路徑及格式。

location 配置塊

在這裡可以針對指定的請求 URI 來設定配置。

location / {
    root   /var/www/;
    index  index.php index.html index.htm;
}           
root 和 index 指令的作用上面已經提到過了,寫在這裡和寫在 server 裡面的差別是,前者是針對指定的 URI 生效,後者是全局生效的。

一個 location 可以比對字元串字首,也可以比對正規表達式。正規表達式會以 “~*”(大小寫不敏感) 修飾符開始,或者以 “~”(大小寫敏感) 修飾符開始。

為了尋找一個與目前請求比對的 location,Nginx 首先檢查那些以字首字元串定義的 location,然後選中其中比對的字首最長的 location 并将其記住。

接着再按照配置檔案中定義的順序來檢查那些以正規表達式定義的 location,一旦查找到比對的正規表達式就馬上停止查找,其相應的配置将會被使用。

如果沒有找到與之對應的正規表達式,那麼之前比對的字首字元串 location 裡面的配置将會被使用。

當然,可以使用 “=” 修飾符來定義一個對 URI 或者 location 的精确的比對,Nginx 一旦找到一個精确比對,檢查則立馬結束。舉個例子,假如 '/' 經常被請求,那麼定義一個 "location = /" 會加速這些請求的處理,因為在第一個比較之後就立馬停止了搜尋。

如果最長的字首比對包含有 "^~" 修飾符,那麼 Nginx 将不會再檢查正規表達式。

可以通過下面幾個小例子來了解上面的内容:

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}           

"/" 請求會比對配置 A 

"/index.html" 會比對配置 B 

"/documents/document.html" 會比對配置 C 

"/images/1.gif" 請求會比對配置 D 

"/documents/1.jpg" 請求将會比對配置 E。

if 配置塊

對特定的條件進行判斷,如果條件為真則執行配置塊裡面的配置項。

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}           
如果該請求是來自 IE 浏覽器的則進行重定向到指定的檔案夾。
  • rewrite 将 URI 重定向到另一個 URI

if 指令将會對特定的條件進行判斷,如果條件為真,大括号裡面的指令将會執行,if 指令裡面的配置将會配置設定到請求中。if 指令裡面的配置将會繼承上一級的配置。

條件可以是以下列舉的任意一項:

  • 一個變量名,如果變量的值是空或者 "0" 則為假。
  • 使用 "=" 或者 "!=" 進行比較的變量
  • 使用 "~*"(大小寫不敏感) 或者 "~"(大小寫敏感)的正規表達式進行比對的變量
  • 使用 "-f" 和 "!-f" 運算符來檢測檔案是否存在
  • 使用 "-d" 和 "!-d" 運算符來檢測目錄是否存在
  • 使用 "-e" 和 "!-e" 運算符來檢測檔案、目錄或者符号連結是否存在
  • 使用 "-x" 和 "!-x" 運算符來檢測檔案是否可執行

例子:

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
}

if ($request_method = POST) {
    return 405;
}

if ($slow) {
    limit_rate 10k;
}

if ($invalid_referer) {
    return 403;
}           
一些不常用的配置塊
  • split_clients
    該配置塊可以将伺服器接收到的請求根據百分比進行劃分成幾個類别。是以可以将不同的内容提供給不同的用戶端來進行 A/B 測試。           
  • map
    該配置塊可以根據一個變量的值來設定另一個變量的值。           
  • geo
    該配置快可以用來配置一個映射。           
  • types
    這也是用來配置映射的。
               
内嵌的變量
  • $args 這個變量等于請求行中的參數,同 $query_string
  • $content_length 請求頭中的 Content-length 字段
  • $content_type 請求頭中的 Content-Type 字段
  • $document_root 目前請求在root指令中指定的值
  • $host 請求主機頭字段,否則為伺服器名稱
  • $http_user_agent 用戶端 agent 資訊
  • $http_cookie 用戶端 cookie 資訊
  • $limit_rate 這個變量可以限制連接配接速率
  • $request_method 用戶端請求的動作,通常為 GET 或 POST
  • $remote_addr 用戶端的IP位址
  • $remote_port 用戶端的端口
  • $remote_user 已經經過 Auth Basic Module 驗證的使用者名
  • $request_filename 目前請求的檔案路徑,由root或alias指令與URI請求生成
  • $scheme HTTP方法(如http,https)。
  • $server_protocol 請求使用的協定,通常是 HTTP/1.0 或 HTTP/1.1。
  • $server_addr 伺服器位址,在完成一次系統調用後可以确定這個值
  • $server_name 伺服器名稱
  • $server_port 請求到達伺服器的端口号
  • $request_uri 包含請求參數的原始URI,不包含主機名,如:"/foo/bar.php?arg=baz"
  • $uri 不帶請求參數的目前 URI,$uri 不包含主機名,如 "/foo/bar.html"
  • $document_uri 與 $uri 相同

原文位址

https://www.cnblogs.com/zhangfu/p/10487792.html

繼續閱讀