本文主要對nginx的配置作重點說明,關於nginx的其餘基本概念。建議參考官網描寫敘述。這裏推薦Nginx Beginner's Guide這篇文檔。對剛開始學習的人高速認識nginx很是有幫助。php
顯然。發揮nginx強大優點的前提是熟悉其配置文件並進行合理的配置。而學習nginx配置時。最重要的一點是創建例如如下概念:html
The most important is that nginx is a reverse proxy first and HTTP server second, its first concern is not files but rather URLs, this changes the way we have to configure nginx.nginx
也即,nginx的強大之處在於其高性能的反向代理功能(接收請求並傳遞給下游真正處理請求的servers;等待下游響應並返回給請求發起方)。其次,它也能像普通webserver那樣提供靜態文件訪問功能。web
咱們以nginx源代碼編譯安裝後的默認配置文件(conf/nginx.conf.default)爲例。對重要的配置項進行說明。
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }
1. Nginx配置文件區塊層級關係express
要熟悉nginx配置文件,首先要清楚區塊劃分及區塊間的層級關係,關於這一點。UNDERSTANDING THE NGINX CONFIGURATION INHERITANCE MODEL一文對各區塊層級劃分、層級或配置項類型、配置項的繼承關係及嵌套區塊定義等方面均作了具體且帶實例的說明,這裏再也不贅述。2. Server區塊(Virtual Host)
server block主要目的是建立virtual server,其最重要的設置項有3個:
1) listen
設置偵聽地址、port號、UNIX-domain socket的路徑。可以僅僅設置偵聽地址(ip或hostname)。這樣的狀況下默認偵聽80port,也可以僅僅指定偵聽port號。此外,還可以設置是不是default server, connection是否ssl加密,proxy_protocol,等等。服務器
具體的設置語法和設置項可以參考這裏的官方文檔。
2) server_name
設置該server block的域名,支持精確域名、帶通配符的域名和正則表達式這3種格式,詳細規則見這裏。session
nginx接收到請求URL後,會根據各server block配置的server_name搜索處理本次請求的server,第1個match成功(請求URL的header指定的域名與server_name作匹配)的server block負責處理URL請求。從文檔可知,詳細的搜索順序優先級例如如下(由高到低):
a. the exact name
b. the longest wildcard name starting with an asterisk, e.g. 「*.example.com」
c. the longest wildcard name ending with an asterisk, e.g. 「mail.*」
d. the first matching regular expression (in order of appearance in the configuration file)
實際上,配置server_name時,精確域名、由*開頭的通配域名、由*結尾的通配域名被會分別存儲在與listen port關聯的3個hash表中。nginx依據server_name搜索server block時。會按上述順序依次搜索這3個hash表,僅僅要有1個hash表的某項配置命中。則搜索結束,此時,用戶請求URL會交給該成功匹配的server_name所屬的server區塊來處理。若3個hash表均搜索失敗,則會依次搜索正則表達式格式的server_name。由於reg exp match相對最慢。故其搜索優先級最低。app
所以。在實際使用時,咱們應該儘量配置精確域名。dom
此外,若需配置很是多server名或某個server域名很是長。則應該分別優化server_names_hash_max_size和server_names_hash_bucket_size這2個配置項。詳細說明可見這篇文檔的Optimization部分。socket
3) location
詳見下一小節的說明
3. Location區塊
關於location block,需要清楚例如如下幾個重要規則:
1) 除命名location(named location)區塊外。其他location區塊均做用在不帶query參數的URL上,且每次僅僅會有1個location區塊起做用。
這也是文件夾配置一般置於最頂層區塊的緣由,因爲定義在location /的root文件夾設置不能被用於location /images,而若將root文件夾設置在server區塊,則所有的location區塊都可使用該設置(固然,在location區塊中可以改寫本區塊的root文件夾設置)。不論是消除反覆代碼仍是興許維護方面,均要方便得多。
2) nginx會依據location區塊的server_name來分配請求URL。
nginx對URL和location區塊的match規則例如如下(官網文檔在這裏):
a. 首先查找由前綴字符串(prefix string)定義的location區塊。在前綴字符串匹配成功的所有location區塊中,最長前綴匹配的那個block會由nginx記錄下來;
b. 接着nginx按在配置文件裏定義的前後順序檢查由正則表達式定義的location區塊,當正則匹配成功某個區塊後。查找結束,該區塊負責處理URL,整個match過程隨之結束;
c. 若沒有由正則指定的location區塊匹配成功。則返回第1步記錄的最長前綴匹配的區塊。整個match過程結束。
幾點特別說明:
a. 由正則表達式定義的location區塊具備較低的搜索優先級。但具備較高的匹配優先級。
這一點與nginx搜索server_name的規則不一樣(server_name是按搜索優先級匹配,一旦匹配成功就立刻結束搜索)。需引發特別注意。
b. location還可以用等號(=)作精確配置,它具備最高的匹配優先級,僅僅要命中精確匹配的location。nginx對location區塊的搜索立刻結束。
3) 配置的詳細語法規則詳見官網文檔,這裏不贅述。
此外,還可以配置哪一個source address的request代理到哪一個下游服務(proxy_bind),是否對下游響應頭作buffer及buffer區大小(proxy_buffering/proxy_buffer_size)。是否對響應結果作cache(proxy_cache)。等等。
具體的配置語法可分別參考文檔Module ngx_http_proxy_module和Module ngx_http_fastcgi_module。
【參考資料】
1. UNDERSTANDING THE NGINX CONFIGURATION INHERITANCE MODEL