Nginx配置文件詳細介紹
Nginx的主配置文件為“/etc/nginx/nginx.conf”,在主配置文件中使用指令又包含了其他的片段配置文件“/etc/nginx/conf.d/”(源代碼安裝時可以自己指定配置文件位置)。在配置文件中首先需要知道兩個名詞,一個是“context”,上下文,代表的是指令的容器或者是指令的生效範圍,即,如果一條指令的上下文是“http”,那麽就需要將這條指令寫到“http”後邊的大括號中,這條指令才能夠生效;另一個是“derective”,指令,能夠發揮nginx功能或特性的配置信息。在書寫配置文件時要註意以下幾點:
1.所有的指令都必須以“;”結尾
2.所有的上下文都必須使用“{}”括號括選起來,而且不需要使用“;”結尾
3.在設置指令時可以使用配置變量
由模塊包含並引入:內置變量
由用戶引入:自定義變量
定義變量:
set var_name value
引用變量:
$var_name
4.配置指令可以參考nginx官方網站幫助文檔:http://nginx.org/en/docs
或者參考http://tengine.taobao.org/documentation_cn.html
一、全局配置段
在配置文件中整個配置文件叫做“main”,所有上下文為“main”的指令,也稱為全局配置段的指令是直接寫在配置文件的最外邊,我們最常用的全局配置段指令有:
user user [group]; #用於指定運行worker子進程的用戶和組
worker_rlimit_nofile number; #每個worker進程所能打開的文件數量的最大值 #也可以通過修改/etc/security/limits.conf完成此設置
worker_cpu_affinity cpumask ...; worker_cpu_affinity auto [cpumask]; #設置每個CPU核心和worker進程的親緣性 #例如:worker_cpu_affinity 0010 1000; (意思是綁定在二號和四號cpu上) #四核心的內核寫法:0001 0010 0100 1000 #八核心的內核寫法:00000001 00000010 ... #ps axo psr(查看命令在哪個核心上運行)
worker_priority number; #設置每個worker進程啟動時候的nice值(優先級) #number的範圍:[-20,19]
daemon on | off; #是否以守護進程的方式啟動nginx:通常是在開發時選擇使用
master_process on | off; #是否以master/worker模型啟動nginx進程
error_log file [level]; #定義錯誤日誌文件的位置和記錄日誌的日誌級別
thread_pool name threads=number [max_queue=number]; #定義線程池的名稱,線程的數量以及每個線程的後援隊列長度 #默認有32個線程,隊列長度為65536
worker_processes [auto|#] #nginx在運行時產生一個master進程和多個worker進程,這條指令用來指定worker進程數量 #參數是數字或者auto,數字最好不要大過核心數,因為沒用,且在切換時浪費 #(不確定就寫auto)(通過“ps -aux”命令查看打開了多少個)
pid /var/run/nginx.pid #用於指定存放nginx的master進程編號的文件的路徑
二、events配置
events配置段內的指令和主配置中的指令一般情況下是不需要修改的,events中的配置指令有:
worker_connections number; #(默認情況下配置文件中只有這條指令,別的指令使用默認值,要想修改自行添加) #每個worker進程所能夠打開的並發連接的最大連接數;默認是512 #當前系統中所能夠響應的最大並發連接數: worker_connections * worker_processes(全局配置指令中指定的核心數量)
use method; #指明並發連接請求處理時使用的方法:epoll #use epoll;(只有這個,且只能寫這個) #註意:此指令不需要明確指定,nginx會默認使用最有效的方法
accept_mutex on | off; #當此功能啟用時,表示可以讓多個worker進程一次輪流響應新請求
multi_axccept on|off; #設置每個進程是否可以同時接收多個連接,默認關閉
三、http配置(註意Context上下文)
http的配置都寫在http後邊的大括號中,http配置段最多只能有一個,而且在對nginx進行配置時修改的最多的也是http配置段中的內容,它所包含的常用配置如下:
首先說http配置段中的server配置段中的內容(在配置文件中的位置為http{ server{ ... } }):
include /etc/nginx/conf/*.conf; #將片段配置文件包含進主配置文件中 #(不一定在此配置段中,要根據片段配置段中的配置將此指令放到對應的位置)
server_name name ...; #指定虛擬主機名稱;後面可以使用空白字符分隔多個主機名 #主機名可以支持使用“*”匹配任意長度的任意字符 #主機名還可以支持使用~起始的正則表達式
listen address[:port] [default_server] [ssl] [http2 | spdy] listen port [default_server] [ssl] [http2 | spdy] listen unix:path [default_server] [ssl] [http2 | spdy] #(以上的指令均是設定監聽端口和地址,選擇一種寫法即可) 參數為: default_server:默認虛擬主機的設定 ssl:支持https http2:支持http/2.0 spdy:支持Google的spdy功能 backlog=number:設定後援隊列的長度 rcvbuf=size:接收緩沖大小 sndbuf=size:發送緩存大小 示例: listen 127.0.0.1:8000; listen 127.0.0.1; listen 8000; listen *:8000; listen localhost:8000;
root path; Context: http,server,location,if in location #上下文(一條指令有可能有多個上下文,即能寫在不同的地方,下同) #設置web資源的路徑映射; #用於指定用戶請求的URL所對應的本地文件系統中的資源所在的目錄的路徑 path:可以是絕對路徑;也可以是相對路徑 相對路徑是相對nginx的安裝目錄而言的
location [ = | ~ | ~* | ^~ ] uri { ... }(這個寫法用的比較多) location @name { ... }(這個寫法用的比上面的少) Context: server,location #根據用戶請求的URI來匹配此處定義的location;當匹配到時, #此請求將被響應的location上下中的指令處理 =:表示用戶請求的URI與此處location定義的URI必須精確匹配 ~:表示用戶請求的URI與此處location定義的URI通過指定的正則表達式來進行匹配,並且嚴格區分字母的大小寫 ~*:同上,不過大小寫不區分 ^~:對用戶請求的URI的左半部分做匹配檢查,不區分大小寫 URI:URL中除去主機名的部分: URL:http://www.qhdlink.com/index.html URI:/index.html 匹配優先級:= , ^~ , ~/~* 書寫規則時在這裏還可以不帶符號,不過雖然能夠匹配成功,但是是在其他所有都不能匹配時才使用
alias path; Context: location #定義路徑映射的別名,文檔資源映射的機制
root和alias的區別:
用戶請求的URL:http://172.16.72.2/images/1.jpg
location /images/ {
root /myweb;
}
被請求資源在服務器文件系統中的存放路徑:/myweb/images;
location /images {
alias /myweb;(註意斜線)
}
被請求資源在服務器文件系統中的存放路徑:/myweb/1.jpg
總結:
root指令:將用戶請求的URI追加至root指令所指定的路徑之後,作為此次訪問資源所在的文件系統路徑
alias指令:將用戶請求的URI用root指令所指定的路徑替換,作為此次請求的資源所在的文件系統路徑
註意:在nginx/1.12.1中,URI和root的參數都不能在最後加“/”否則無法訪問
index file ...; Context: http,server,location #定義默認主頁的文件名 #file:是一個文件名或者由空白字符隔開的多個文件名
error_page code ... [=[response]] uri; Context: http,server,location,if in location #根據用戶請求的資源的http協議的響應狀態碼實現錯誤頁面的重定向 示例: error_page 404 =200 /404.html; #當獲取到404錯誤時返回指定的404錯誤頁面, #“=200”選項的功能是將錯誤代碼改為200,起到偽裝的效果(可以沒有) location = /404.html { root /myweb/error_page; #引用定義的錯誤頁面 }
與長連接相關的指令: keepalive_disable none \ browser ...; Context: http,server,location #對於某些瀏覽器禁用長連接 keepalive_request number; Context: http,server,location #通過設置最大請求數量的方式管理長連接; #即,只要在長連接上接收到的用戶請求達到最大限制值,則關閉此長連接 keepalive_timeout timeout [header_timeout]; Context: http,server,location #通過設置最大空閑時間的方式管理長連接; #即,只要該長連接在指定時間內沒有收到任何請求,則關閉此長連接
send_timeout time; Context: http, server, location #向客戶端發送響應報文的超時時長; #通常指兩次成功的寫操作之間的間隔時長, #如果在此時間內,客戶端沒有收到響應報文,則關閉連接
client_body_buffer_size size; Context: http, server, location #用於設置客戶端請求報文中的body部分的緩沖區的大小; #默認為16k,如果要緩存的body超過了此限制,則會將其臨時保存與磁盤的文件中 client_body_temp_path path [level1 [level2 [level3]]]; Context: http, server, location #用於設定存儲客戶端請求報文中的body部分的臨時存儲路徑, #以及此臨時目錄中子目錄的結構 #後邊的三個參數level的功能是定義臨時存儲的目錄的名字 示例: client_body_temp_path /var/tmp/client_body 2 1 2 (2:表示兩個16進制數字隨機構建的目錄名稱,即最多可以創建256個目錄) (1:代表下一級目錄中使用一個十六進制數字為名稱的目錄) (十六進制數字為0-f:0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f) 上面的這條語句就會創建出一個類似於下面這樣的目錄 /var/tmp/client_body/0a/f/8e /var/tmp/client_body/b3/e/d2 #這樣不僅能夠設置文件的不同名字,同時還可以設置總數量的多少, #比如上面這個例子,分別設置了2 1 2, #那麽它所能包含的文件的數量就是16*16=256個一級目錄,16個二級目錄,256個三級目錄 #一般會使用到level加上level2就夠用了
limit_rate rate; Context: http, server, location, if in location #限制響應給客戶端的傳輸速率,單位是Bytes/second,0表示無限制 location /download { root /; limit_rate 20480 #限制速度為20KB/s,即用戶到這個目錄下載的速度最大為20KB/s }
limit_except method ... { ... } Context: location #設置可以使用指定的請求方法之外的其他方法的客戶端 #在此上下文中,需要使用allow及deny指令
allow address | CIDR | unix: | all; Context: http,server, location, limit_except 對指定的客戶端進行訪問控制 註意: 1) 只有放置於 limit_except上下文中,才表示是否允許指定客戶端使用什麽樣的http方法 2) 如果放置於其他的上下文中,則表示對該上下文所包含的web資源的訪問控制 3) 規則的匹配順序:按照書寫順序依次檢查,直到第一個匹配項 CIDR:超網,用一串數字代表一個網段叫做CIDR,類似於172.16.0.0/16代表的172.16網段
AIO和DirectIO(選擇IO的方式) aio on | off | threads[=pool]; Context:http, server, location #是否啟用aio功能 directio size | off Context: http, server, location #是否啟用 directio,如果啟用,使用多大的空間來定義 directio
文件描述符緩存: open_file_cache off; open_file_cache max=N [inactive=time]; 在系統中打開的文件較多的時候,nginx可以緩存以下三種信息來提升系統的性能 1) 文件描述符、文件大小和最近一次修改的時間 2) 打開的目錄的結構 3) 沒有找到的或者沒有權限訪問的文件相關信息 max=N:可以緩存項的數量的上限; 當緩存的數量達到上限之後,通常會使用算法實現緩存清理
stub_status; Context: server, location 用於輸出nginx的基本狀態信息 location /ngx-status { stub_status; } 通過瀏覽器瀏覽 http://host/ngx-status,會顯示以下信息: Active connections -- 處於活動狀態的客戶端連接數量,包括waiting狀態的連接 accepts:當前服務器已經接受的客戶端請求的總量 handled:當前服務器已經處理完成的客戶端請求的總量 requests:客戶端發送到當前服務器的請求的總量 Reading:處於正在被讀取報文首部的客戶端請求的總量 Writing:處於正在向客戶端發送響應報文過程的連接的總量 Waiting:處於等待客戶端發送請求的空閑連接數
vaild_referers none | blocked | server_names | strings ...; Context: server, location 定義合法的Referer數據 none:在請求報文的首部中沒有Referer字段 blocked:在請求報文的首部中有Referer字段,但沒有值 server_names:在請求報文的首部中的Referer字段的值是主機名 arbitrary string:任意字符串(直接字符串),其中可以使用“*”做通配符 regular expression:被指定的正則表達式模式匹配到的字符串,一般要是有“~”起始 示例: vaild_referers none blocked server_name *.qhdlink.com ~\.qhdlink\. 要是遇見不合法,使用內建變量判斷: if ($invalid_referer) { return 403 } 合起來就是: location / { #判斷如果不是以“.haha.com”結尾或者不匹配“.haha.”則返回403錯誤 vaild_referers none blocked server_name *.haha.com ~\.haha\. if ($invalid_referer) { return 403; } }
ssl模塊:ngx_http_ssl_module #定義ssl
1) ssl on | off; Context: http,server #是否啟用給定虛擬主機的https協議 開啟的方法: listen 443 ssl; 或者額外添加一條語句 ssl on;(兩個選一個即可)
2) ssl_certificate file Context: http,server #當前虛擬主機使用的PEM格式的證書文件的路徑
3) ssl_certificate_key file Context:http,server #當前虛擬主機上與其證書匹配的私鑰文件的路徑
4) ssl_session_cache off | none | [builtin[:size]] [shared:name:size]; Context: http,server #將https的連接緩存下來減少CPU的壓力 off:不建立緩存 none:有緩存,但是不再匹配了 builtin:這個緩存只能被一個進程使用(容易產生內存碎片) shared:推薦使用 ssl_session_cache builtin:1000 shared:ssl:10m (不是10M大小,而是數量) #是否開啟ssl的會話緩存,如果開啟,選擇那種類型及使用多少存儲空間 #為了避免內存碎片,建議使用shared類型
5) ssl_session_timeout time; Context: http,server #客戶端連接可以復用ssl會話緩存中緩存的ssl參數的有效時長:默認為5分鐘
6) ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3]; Context: http,server #nginx服務器能夠兼容的協議的版本;默認是[TLSv1] [TLSv1.1] [TLSv1.2];
日誌模塊:ngx_http_log_module
1) access_log path [format [buffer-size] [gzip[-level]] [flush=time] [if=condition]]; access_log off; Context: http,server,location,if in location,limit_expect #是否記錄訪問日誌;如果記錄,以何種格式記錄;緩沖區大小的設定, #是否壓縮存儲並指明壓縮等級;刷新日誌文件的時間;
2) log_format name [escape=default|json] string ...; Context: http #定義存儲訪問日誌的格式; combined格式示例: log_format combined ‘$remote_addr - $remote_user [$time_local] ‘ ‘"$request" $status $body_bytes_sent ‘ ‘"$http_referer" "$http_user_agent"‘;
3) open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time]; open_log_file_cache off; Context: http, server, location 是否啟用訪問日誌文件的文件描述符緩存機制; max=N:緩存中緩存的文件描述符的最大數量; inactive:非活動時長;默認10秒; min_uses:在inactive的時間內,緩存中的緩存條目最少被命中的次數;默認值1; valid:驗證緩存中的緩存條目是否有效的時間周期;默認60秒;
修改URI模塊:ngx_http_rewrite_module
1) rewrite regex replacement [flag]; Context: server, location, if #將用戶請求的URI基於regex所描述的模式進行匹配檢測, #匹配到時將其替換為replacement指定的URI; 註意: 1.在同一上下文中存在多個rewrite規則時,會自上而下逐個檢測並匹配; 對於客戶端發送的每個請求,都要做檢查匹配,其中隱藏了一個循環機制; 可以利用flag來控制循環的方式; 2.如果replacement是以http://或者https://開頭的, 替換的結果會直接以重定向的方式返回給客戶端;狀態碼為301;否則,狀態碼為302; 例子: 將http://www.aaa.com 轉換成 http://www.bbb.com 重定向狀態碼: 3xx:重定向類的狀態碼(盡量使用301) 301:永久重定向:在訪問新定向的域名時使用新域名 302:臨時重定向:仍舊使用舊域名,如同多個域名指向同一網站 [flag]: last:重寫完成後停止對當前的URI在當前的location中後續的其他重寫操作後啟動新一輪的匹配檢查;重啟循環; break:重寫完成後,立刻停止對當前location中的rewrite規則的匹配檢查,轉而執行後續的其他配置;結束循環; redirect:臨時重定向,重寫完成後以臨時重定向方式向客戶端返回重寫後的URI,由客戶端重新請求;不以http://或https:開頭的URI的重寫; permanent:永久重定向,重寫完成後以永久重定向方式向客戶端返回重寫後的URI,由客戶端重新請求;以http://或https:開頭的URI的重寫; 示例: location / { root html; index index.html index.htm; rewrite ^/epel http://172.16.72.101; rewrite ^/(.*\.(jpg|jpeg|gif|png))$ http://172.16.72.1/images/$1; rewrite ^/(.*)\.htm$ /$1.html; }
2) return code [text]; return code URL; return URL; Context: server, location, if #停止處理所有的後續的請求,直接給客戶端返回一個指定的狀態碼或URL;
3) if (condition) { ... } Context: server, location #引入一個新的上下文並且在其中完成條件判斷;如果條件滿足,執行if上下文中的配置指令; condition: 比較操作符: ==:等於 !=:不等於 ~:模式匹配,區分字符大小寫; ~*:模式匹配,不區分字符大小寫; !~:不匹配 !~*:不匹配 文件及目錄的存在性判斷: -e, !-e:存在與否 -f, !-f:存在且是普通文件與否; -d, !-d: ... -x, !-x:
PHP相關模塊:ngx_http_fastcgi_module:
(以下指令均配置在“location ~ \.php$”中)
轉發相關:
1) fastcgi_pass address; #nginx通過反代機制,將php請求反代至address標明的服務器上;
2) fastcgi_index name; fastcgi默認反代的主頁資源;
3) fastcgi_param parameter value [if_not_empty]; 向後端php服務器傳遞參數;
緩存相關:
1) fastcgi_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] Context: http level:緩存的目錄結構及文件數量,最多3級,每級最對2個16進制數字,用":"分隔 例如:1:2:2 keys_zone:內存中緩存空間的名稱及大小; max_size:磁盤上用於緩存數據的緩存空間大小; inactive:緩存的最大時長;
2) fastcgi_cache zone | off; #調用指定的緩存空間緩存數據;
3) fastcgi_cache_key string; #定義用戶緩存項的key的字符串;
4) fastcgi_cache_min_uses number; #用戶請求的內容被請求多少次才會加入緩存;
5) fastcgi_cache_valid [code ...] time; #對於不同的響應碼的響應數據設置緩存時間;
註意:
設置緩存的時候使用fastcgi_cache_path指令;
調用緩存時,至少應該使用下列幾個指令:
fastcgi_cache
fastcgi_cache_key
fastcgo_cache_valid
示例:
http上下文的配置:
fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2:1 keys_zone=fcgicache:10m max_size=1g;
location上下文的配置:
location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; #fastcgi監聽端口,即將以php結尾的文件轉發給fastcgi進行處理 fastcgi_index index.php; #指定以php結尾的默認的主頁 fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name; include fastcgi_params; fastcgi_cache fcgicache; fastcgi_cache_key $request_uri; fastcgi_cache_valid 200 5m; fastcgi_cache_valid 301 302 1m; fastcgi_cache_valid 403 404 1m; }
負載均衡反向代理模塊:ngx_http_proxy_module
負載均衡根據在不同的協議上分別有最合適的軟件,在傳輸層有:lvs(Keepalived HA),nginx,haproxy;在應用層有:nginx(能夠代理:http, https, smtp, pop3, imap4), haproxy(能夠代理:http), httpd(能夠代理:http, https) ats, pound, perlbal, ...
使用nginx做反代的理由:
1.利用nginx的高並發處理能力降低後端RS的壓力;後端RS開啟長時間的長連接;
2.有效地阻斷來自某些用戶的惡意訪問;將添加iptables規則等安全操作在前端代理服務器上配置實現;
3.在前端nginx服務器上構建緩存,大大提高對用戶請求的響應效率;
4.通過更加精細的粒度完成後端RS的調度;
proxy_pass URL; Context: location, if in location, limit_except #設置一個被代理的服務器的地址和協議以及一個用於被映射位置的可選的URI; #可以反代http協議和https協議; #服務器地址可以是一個域名或者IP地址再加上一個可選的端口號; 註意: 1) proxy_pass後面的路徑不帶uri時,其會將location的uri傳遞給後端主機; location /uri/ { proxy_pass http://HOST; } 2) proxy_pass後面的路徑是一個uri,其會將location的uri替換成proxy_pass指令後面的uri; location /uri/ { proxy_pass http://HOST/new_uri/; } 3) 如果location定義uri時使用正則表達式的模式匹配(~|~*),則proxy_pass指令之後絕對不能使用uri;否則nginx會將之視為語法錯誤; location ~|~* PATTERN { proxy_pass http://HOST; }
proxy_set_header field value; Context: http, server, location #設置發往後端服務器的請求報文的首部及其值; 常用示例: proxy_set_header X-Forwarded-For $remote_add; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time]; Context: http #設置緩存路徑,包括內存中鍵的存儲空間大小,磁盤上的緩存文件的大小, #磁盤上緩存的目錄名稱及目錄結構2,緩存的非活動時間等; proxy_cache_path levels=1:2:2 keys_zone=proxycache:10m max_size=1g;
proxy_cache zone | off; Context: http, server, location #調用緩存的名稱開啟緩存機制或者關閉緩存;
proxy_cache_key string; Context: http, server, location #定義緩存條目的鍵;
proxy_cache_valid [code...] time; Context: http, server, location #各類響應碼的響應報文的緩存時長;
proxy_connect_timeout time; //從反代服務器到後端服務器建立TCP連接的超時時間; proxy_send_timeout time; //反代服務器向後端服務器發送的請求的超時時間; proxy_read_timeout time; //反代服務器從後端服務器得到響應報文的超市時間; Context: http, server, location #這三個超時時間的默認值都是60秒;
反代服務器向客戶端響應數據報文的首部管理模塊:ngx_http_headers_module
add_header name value [always]; Context: http, server, location, if in location #在向客戶端發送響應報文時,可以增加其首部中的內容;
expires [modified] time; expires epoch | max | off; Context: http, server, location, if in location #用於定義Expire或Cache-Control首部的值,或者可以添加其他自定義首部
轉發相關模塊(可以用來定義集群):ngx_http_upstream_module
upstream name { ... } Context: http #定義一個服務器組;
server address [parameters]; Context: upstream #定義後端服務器地址、端口及其他相關參數; address: IP[:PORT] HOSTNAME[:PORT] unix:/PATH/TO/SOCKET_FILE parameters: weight=number //設置後端服務器的權重;默認值為1; max_fails=number //嘗試連接後端RS的最大失敗次數;默認值為1; fail_timeout=time //設置後端RS服務器為不可用狀態的超時時長;默認值10s; backup //把服務器標記為"備用"狀態;相當於lvs中的sorry_server; down //將服務器手動標記為永久不可用;即,將服務器下線;
hash key [consistent]; Context: upstream #根據所指定的key進行hash運算,得到hash值;key可以是純文本或者變量值, #也可以是二者組合;可以支持一致性hash算法; consistent:參數,指定使用一致性hash算法;
ip_hash; Context: upstream #使用源地址hash算法,將來自於同一個源IP地址的請求始終發往後端同一個upstream server;
least_conn; Context: upstream #最少連接數調度算法;當後端RS的權重不一致時,自動換成wlc算法;
least_time header | last_byte [inflight]; Context: upstream #最短平均響應時長和最少連接數算法; header:對於來自於後端RS的響應報文的首部的接收時間的檢測; last_byte:對於來自於後端RS的響應報文完整接收的時間的檢測; (此選項僅對nginx plus(收費版)有效;)
四、stream配置段
集群模塊:ngx_stream_core_module
listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] Context: server #定義監聽的用於接受連接的地址和端口(套接字); 默認的協議:TCP協議,通常可以使用udp參數來定義監聽於udp協議的端口;
server { ... } Context: stream #定義一個集群服務;
stream { ... } Context: main #定義一個負載均衡器;
Nginx配置文件詳細介紹