天天看點

Nginx常用配置

Nginx常用配置

Nginx (Engine X)

是一個輕量級的高性能的

HTTP

和反向代理

web

伺服器,同時也提供了電子郵件

IMAP/POP3/SMTP

服務,在

BSD-like

協定下發行,其特點是占有記憶體少,并發能力強,事實上

nginx

的并發能力在同類型的網頁伺服器中表現較好。

常用指令

  • -c </path/to/config>

    : 為

    Nginx

    指定一個配置檔案,來代替預設的配置檔案。
  • -t

    : 不運作而僅僅測試配置檔案,

    nginx

    将檢查配置檔案的文法的正确性,并嘗試打開配置檔案中所引用到的檔案,這個指令也可以檢視

    nginx

    檔案的所在位置。
  • -v

    : 顯示

    nginx

    的版本。
  • -V

    nginx

    的版本,編譯器版本和配置參數。
  • nginx -s ${signal}

    : 通過執行

    nginx

    -s

    參數來控制

    nginx

    的一些行為,

    ${signal}

    通常可以取

    stop

    快速停止、

    quit

    平滑停止、

    reload

    重新加載配置檔案、

    reopen

    重新打開日志檔案。

配置子產品

Nginx配置檔案的分塊下,基本就分為以下幾塊:

main # 全局設定
events { # Nginx工作模式
    ....
}
http { # http設定
    ....
    upstream myproject { # 負載均衡伺服器設定
        .....
    }
    server  { # 主機設定
        ....
        location { # URL比對
            ....
        }
    }
    server  {
        ....
        location {
            ....
        }
    }
    ....
}

           

main子產品

main

區域是一個全局的設定。

user www www; # user 來指定Nginx Worker程序運作使用者以及使用者組,預設由nobody賬号運作。 
worker_processes auto; # worker_processes 來指定了Nginx要開啟的子程序數。每個Nginx程序平均耗費10M~12M記憶體。根據經驗,一般指定1個程序就足夠了,如果是多核CPU,建議指定和CPU的數量一樣的程序數即可。如果這裡寫2,那麼就會開啟2個子程序,總共3個程序。
error_log /usr/local/var/log/nginx/error.log notice; # error_log 來定義全局錯誤日志檔案。日志輸出級别有debug、info、notice、warn、error、crit可供選擇,其中,debug輸出日志最為最詳細,而crit輸出日志最少。
pid /usr/local/var/run/nginx/nginx.pid; # pid 來指定程序id的存儲檔案位置。
worker_rlimit_nofile 1024; # worker_rlimit_nofile 來指定一個nginx程序可以打開的最多檔案描述符數目。
include /www/server/vhost/nginx/*.conf; # 将部配置設定置直接拆分出來,分成不同的配置檔案。
           

events子產品

events

子產品通常用來指定

nginx

的工作模式和工作模式及連接配接數上限。

events {
    use epoll; # use 用來指定Nginx的工作模式。Nginx支援的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll,其中select和poll都是标準的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系統中。
    worker_connections  1024; # worker_connections 用于定義Nginx每個程序的最大連接配接數,即接收前端的最大請求數,預設是1024。最大用戶端連接配接數由worker_processes和worker_connections決定,即Max_clients = worker_processes * worker_connections,在作為反向代理時,Max_clients變為:Max_clients = worker_processes * worker_connections / 4。
}
           

http子產品

http

子產品可以說是最核心的子產品了,它負責

HTTP

伺服器相關屬性的配置,它裡面的

server

upstream

子子產品。

http {
    include mime.types; # 用來設定檔案的mime類型,類型在配置檔案目錄下的mime.type檔案定義,來告訴nginx來識别檔案類型。
    default_type application/octet-stream; # 設定了預設的類型為二進制流,也就是當檔案類型未定義時使用這種方式,例如在沒有配置asp的locate 環境時,Nginx是不予解析的,此時,用浏覽器通路asp檔案就會出現下載下傳視窗了。
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"'; # 用于設定日志的格式,和記錄哪些參數,這裡設定為main,剛好用于access_log來紀錄這種類型。
    access_log /usr/local/var/log/nginx/access.log  main; # 用來記錄每次的通路日志的檔案位址,後面的main是日志的格式樣式,對應于log_format的main。
    sendfile on; # 用于開啟高效檔案傳輸模式。
    tcp_nopush on; # 用于防止網絡阻塞。
    tcp_nodelay on; # 用于防止網絡阻塞。
    keepalive_timeout 10; # 設定用戶端連接配接保持活動的逾時時間,在超過這個時間之後,伺服器會關閉該連接配接。
    gzip on; # gzip 壓縮,用來對靜态資源進行壓縮,需要用戶端同時支援才有效。
    gzip_disable "MSIE [1-6]\.(?!.*SV1)"; # IE6的某些版本對gzip的壓縮支援很不好,故關閉。
    gzip_http_version 1.0; # HTTP1.0以上的版本都啟動gzip
    gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml; # 指定哪些類型的相應才啟用gzip壓縮,多個用空格分隔
    gzip_comp_level 5; # 壓縮等級,可選1-9,值越大壓縮時間越長壓縮率越高,通常選2-5
    upstream myproject {
        .....
    }
    server {
        ....
    }
}
           

server

子產品是

http

的子子產品,它用來定義一個虛拟主機,這些配置為在該

server

下具有全局性例如

root

,當然也可以在

location

中重新定義

root

server {
    listen      80; # 用于指定虛拟主機的服務端口。
    server_name localhost www.example.com; # 用來指定IP位址或者域名,多個域名之間用空格分開。
    root        /www/wwwroot/www.example.com; # 全局定義,表示在該server下web的根目錄,注意要和locate {}下面定義的區分開來。
    index       index.php index.html index.htm; # 全局定義通路的預設首頁位址。
    charset     utf-8; # 設定網頁的預設編碼格式。
    access_log  logs/host.access.log  main; # 用來指定此虛拟主機的通路日志存放路徑,輸出格式為main。
    error_log   logs/host.error.log  error; # 錯誤日志存放路徑,輸出格式為error。
    error_page  404  /404.html; # 狀态碼為404時的時候的網頁位址,還可定義500,502之類的
    ....
}
           

location子產品

location

server

的子子產品,是用來定位的,定位

URL

與解析

URL

,是以它也提供了強大的正則比對功能,也支援條件判斷比對,使用者可以通過

location

指令實作

Nginx

對動、靜态網頁進行過濾處理。

location

的比對規則和順序:

  • 第一種是

    =

    類型,表示精确比對,優先級最高,一旦比對到忽略之後的正則比對。
  • ^~

    類型,表示字首比對,是字元串開頭比對而非正則比對,當比對到該規則時,停止往下面的搜尋,是以如果存在兩個

    ^~

    比對的時候要注意有順序之分,優先級比正則高。
  • ~

    ~*

    正則比對,兩者差別是後者不區分大小寫,有順序之分,比對到第一個正則停止搜尋。
  • /uri

    普通字元串比對,無順序之分,會選擇比對長度最長的配置。
  • /

    通用比對,比對所有請求。
  • 還有一種特殊比對類型

    @url

    ,隻用于

    nginx

    内部跳轉,例

    location @40x { root /var/www/errors/40x.html; }

    ;
# 簡單例子,比對所有請求

location / {
    root   /home/www/html;
    index  index.php index.html index.htm;
}
           
# 使用正則比對的例子 
# 比對.php結尾的請求

location ~ \.php$ {
    ....
}
           
# 反向代理的例子 
# 比對到/api開頭的路由時候,将請求轉發到http://192.168.0.1,但是通常不是直接填寫位址,而是設定一個upstream配置

location /api {
    proxy_pass  http://192.168.0.1; #請求轉向位址192.168.0.1
    #不修改被代理伺服器傳回的響應頭中的location頭
    proxy_redirect off;
    #使用nginx反向代理後,如果要使服務擷取真實的使用者資訊,通常用請求頭攜帶
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

# 比對到攜帶example字元串的請求 将請求轉發到其他HOST并攜帶path
location ~ /example/ {
    proxy_set_header Host example.example.top;
    if ($request_uri ~*  [.]*?/example/(.*)){
       set $path $1;
       proxy_pass http://127.0.0.1/$path;
     }
}

# vue-router、react-router等路由架構要開啟history模式可以選擇的nginx配置的例子
location / {
  alias     static/;
  try_files $uri $uri/ /index.html;
}
           

upstream子產品

upstream

可以為後端伺服器提供簡單的負載均衡。

Nginx

的負載均衡子產品目前支援

4

種排程算法,其中

fair

url_hash

需要加載其他軟體包:

  • weight

    輪詢(預設)。每個請求按時間順序逐一配置設定到不同的後端伺服器,如果後端某台伺服器當機,故障系統被自動剔除,使使用者通路不受影響,

    weight

    可以指定輪詢權值,

    weight

    越大,配置設定到的通路機率越高,主要用于後端每個伺服器性能不均的情況下。
  • ip_hash

    ,每個請求按通路

    IP

    hash

    結果配置設定,這樣來自同一個

    IP

    的訪客固定通路一個後端伺服器,有效解決了動态網頁存在的

    session

    共享問題。
  • fair

    (第三方),比上面兩個更加智能的負載均衡算法。此種算法可以依據頁面大小和加載時間長短智能地進行負載均衡,也就是根據後端伺服器的響應時間來配置設定請求,響應時間短的優先配置設定。

    Nginx

    本身是不支援

    fair

    的,如果需要使用這種排程算法,必須下載下傳

    Nginx

    upstream_fair

    子產品。
  • url_hash

    (第三方)。按通路

    url

    hash

    結果來配置設定請求,使每個

    url

    定向到同一個後端伺服器,可以進一步提高後端緩存伺服器的效率。

    Nginx

    url_hash

    的,如果需要使用這種排程算法,必須安裝

    Nginx

    hash

    軟體包。

HTTP Upstream

子產品中,可以通過

server

指令指定後端伺服器的

IP

位址和端口,同時還可以設定每個後端伺服器在負載均衡排程中的狀态,常用的狀态有:

  • down

    表示目前的

    server

    暫時不參與負載均衡。
  • backup

    預留的備份機器,當其他所有的非

    backup

    機器出現故障或者忙的時候,才會請求

    backup

    機器,是以這台機器的壓力最輕。
  • max_fails

    允許請求失敗的次數,預設為

    1

    ,當超過最大次數時,傳回

    proxy_next_upstream

    子產品定義的錯誤。
  • fail_timeout

    ,在經曆了

    max_fails

    次失敗後,暫停服務的時間,

    max_fails

    可以和

    fail_timeout

    一起使用。
  • 注:當負載排程算法為

    ip_hash

    時,後端伺服器在負載均衡排程中的狀态不能是

    weight

    backup

upstream backend_name {
    server 192.168.12.1:80 weight=5;
    server 192.168.12.2:80 down;
    server 192.168.12.3:8080  max_fails=3  fail_timeout=20s;
    server 192.168.12.4:8080;
}

server {
  location / {
    proxy_pass  http://backend_name/;
  }
}
           

每日一題

https://github.com/WindrunnerMax/EveryDay
           

參考

https://www.jianshu.com/p/f04733896a48
https://juejin.cn/post/6844903598824882183
https://blog.csdn.net/weixin_37610397/article/details/106608265