nginx 常用配置記錄

lindong發表於2018-04-26

HTTP模組(核心模組,也是主要用到的模組)

server模組

server模組是http的子模組,它用來定義一個虛擬主機

例子:

server {
    listen      80;
    server_name localhost www.example.com;
    root        /Users/yangyi/www;# 全域性定義,表示在該server下web的根目錄
    client_max_body_size 100M;
    keepalive_timeout 20;
    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之類的
    ....
}
複製程式碼

以上一些配置為在該server下具有全域性性,例如 root,可在location中重新定義root

關於server_name

用來指定IP地址或者域名,多個域名之間用空格分開

當我們想定義多個server監聽同一個埠但訪問的host不一樣時,server_name就派上用場了。nginx會根據HTTP請求的header Host選擇nginx配置檔案裡符合條件的server_name的server配置

匹配順序如下

  1. 完全匹配的server_name;
  2. 字尾匹配: *.example.com;
  3. 字首匹配: www.example.*;
  4. 正則匹配: ~\w+.com;
  5. listen指令裡配置了default或default_server的server;如`listen 80 default`
  6. 第一個匹配上listen的server。

所以當我們監聽的的埠只有一個server配置的時候,server_name 可以不填

關於root和alias的區別

兩者作用差不多,區別在於最終對映的地址不同,例:

location /request_path/image/ {
    # 如果現在訪問 /request_path/image/a/b.jpg,root映
    # 射的地址為/local_path/image/request_path/image/a/b.jpg,
    # 而alias為/local_path/image/a/b.jpg
    root    /local_path/image/;
    alias   /local_path/image/; 
}
複製程式碼

location模組

最主要和最複雜的配置,通過定位和解析url,判斷該選擇什麼配置,支援正則和條件判斷;

簡單例子,匹配所有請求

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;
}

複製程式碼

vue-router、react-router等路由框架要開啟history模式可以選擇的nginx配置的例子

location / {
  alias     static/;
  try_files $uri $uri/ /index.html;
}
複製程式碼

location的匹配規則和順序

  1. 第一種是 = 型別,表示精確匹配,優先順序最高,一旦匹配到忽略之後的正則匹配

  2. ^~ 型別,表示字首匹配,是字串開頭匹配而非正則匹配,當匹配到該規則時,停止往下面的搜尋,所以如果存在兩個**^~** 匹配的時候要注意有順序之分。優先順序比正則高。

  3. ~~*,正則匹配,兩者區別是後者不區分大小寫。有順序之分,匹配到第一個正則停止搜尋。

  4. /uri,普通字串匹配,無順序之分,會選擇匹配長度最長的配置。

  5. / 通用匹配,匹配所有請求

還有一種特殊匹配型別 @url,只用於nginx內部跳轉,例:

location / {
    root /var/www/html;
    error_page 404 @40x;
}
location @40x {
  root /var/www/errors/40x.html;
}
複製程式碼

upstream模組

upstream後端伺服器提供簡單的負載均衡(輪循排程和客戶端 IP)。

例子:

upstream backend  {
  server backend1.example.com weight=5;
  server backend2.example.com:8080;
  server unix:/tmp/backend3;
}
 
server {
  location / {
    proxy_pass  http://backend;
  }
}
複製程式碼

有常用兩種負載均衡支援排程演算法,分別是 weightip_hash 。weight 模式下可以為每個 server 設定weight值,weight值越大,分配到的訪問機率越高,ip_hash 為同一個ip的 分配同一個後端伺服器,這樣我們不用解決session共享問題。

include

include指令 使nginx配置更加靈活,將部分配置直接拆分出來,分成不同的配置檔案

例子:

http {
    include mime.types;
    include vhost/*.conf; # 虛擬主機配置
}
複製程式碼

關於 mime.types:

mime type 和 副檔名的對應關係一般放在 mime.types 裡,然後 用 include mime.types; mime.types作用:通過檔案的副檔名設定了Content-Type,Nginx如果沒找到對應檔案的副檔名的話,就使用預設的Type,預設Type通用 default_type 定義,比如 default_type application/octet-stream ; 完整的 mime.types 配置:github.com/h5bp/server…

關於 vhost/*.conf :

一個虛擬主機對一個檔案配置,放到vhost資料夾下面,然後通過include指令包含進來,這樣更便於維護和管理

gzip

gzip 壓縮,用來對靜態資源進行壓縮,需要客戶端同時支援才有效。

配置:

http {
    #開啟gzip壓縮
    gzip  on;
    #IE6的某些版本對gzip的壓縮支援很不好,故關閉
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    #HTTP1.0以上的版本都啟動gzip
    gzip_http_version 1.0#指定哪些型別的相應才啟用gzip壓縮,多個用空格分隔
    gzip_types 
    application/javascript 
    application/json 
    text/css 
    text/plain;
    # 壓縮等級,可選1-9,值越大壓縮時間越長壓縮率越高,
    # 通常選5,能壓縮到原來的1/4
    gzip_comp_level 5;
}
複製程式碼

參考:

tool.oschina.net/apidocs/api… www.jianshu.com/p/bed000e18…

相關文章