【Nginx筆記】nginx配置文件具體解釋

       本文主要對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一文對各區塊層級劃分、層級或配置項類型、配置項的繼承關係及嵌套區塊定義等方面均作了具體且帶實例的說明,這裏再也不贅述。
       咱們需要牢記當中3個區塊間的層級關係:http->server->location,它們是nginx配置過程當中的關鍵區塊。

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) 配置的詳細語法規則詳見官網文檔,這裏不贅述。

4. 反向代理設置
       在熟悉主要區塊(http/server/location)基本配置規則的前提下。配置nginx來實現反向代理服務器事實上很是easy。在location區塊經過配置proxy_passfastcgi_pass就能夠實現。


       此外,還可以配置哪一個source address的request代理到哪一個下游服務(proxy_bind),是否對下游響應頭作buffer及buffer區大小(proxy_buffering/proxy_buffer_size)。是否對響應結果作cache(proxy_cache)。等等。


       具體的配置語法可分別參考文檔Module ngx_http_proxy_moduleModule ngx_http_fastcgi_module


【參考資料】

1. UNDERSTANDING THE NGINX CONFIGURATION INHERITANCE MODEL  
2. NGINX CONFIGURATION PRIMER  
3. Nginx Beginner’s Guide  ======================= EOF ===================
相關文章
相關標籤/搜索