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配置
匹配順序如下
- 完全匹配的server_name;
- 字尾匹配: *.example.com;
- 字首匹配: www.example.*;
- 正則匹配: ~\w+.com;
- listen指令裡配置了default或default_server的server;如`listen 80 default`
- 第一個匹配上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的匹配規則和順序
-
第一種是 = 型別,表示精確匹配,優先順序最高,一旦匹配到忽略之後的正則匹配
-
^~ 型別,表示字首匹配,是字串開頭匹配而非正則匹配,當匹配到該規則時,停止往下面的搜尋,所以如果存在兩個**^~** 匹配的時候要注意有順序之分。優先順序比正則高。
-
~
和~*
,正則匹配,兩者區別是後者不區分大小寫。有順序之分,匹配到第一個正則停止搜尋。 -
/uri
,普通字串匹配,無順序之分,會選擇匹配長度最長的配置。 -
/
通用匹配,匹配所有請求
還有一種特殊匹配型別 @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;
}
}
複製程式碼
有常用兩種負載均衡支援排程演算法,分別是 weight 和 ip_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;
}
複製程式碼
參考: