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