關於Nginx虛擬主機

  • 定義

    任何由關鍵字server開始的部分都被稱爲“虛擬主機”部分。描述的是一組根據不同的server_name指令邏輯分割的資源,這些虛擬主機響應HTTP請求,都包含在http部分中。

    一個虛擬主機由listen和server_name指令組合定義。

    listen指令定義一個IP/端口組合或者是Unix域套接字路徑:

listen address[:port];
listen port;
listen unix:path;


    server_name指令的默認值是“”,意味着server部分沒有server_name指令,對於沒有設置Host頭字段的請求,將會匹配該server處理。可用於丟棄不含Host頭的請求。

server {
    listen 80;
    return 444;    # 444非標準代碼將會使得Nginx立即關閉一個連接。
}


    Nginx接受通配符和正則表達式作爲server_name指令的參數:

通配符可以替代部分子域名:*.example.com
通配符可以替代部分頂級域:www.example.*
匹配子域或域本身:.example.com(匹配.example.com,也包括example.com)
在域名前加上波浪號(~)說明使用正則表達式:
    server_name ~^www\.example\.com$;
    server_name ~^www(d+)\.example\.(com)$;



  • 特定請求匹配虛擬主機時遵循的邏輯

    1、匹配IP地址和listen指令指定的端口;

    2、將Host頭字段作爲一個字符串匹配server_name;

    3、將Host頭字段與server_name字符串的開始部分做匹配;

    4、將Host頭字段與server_name字符串的結尾部分做匹配;

    5、將Host頭字段與server_name進行正則表達式匹配;

    6、如果所有Host頭匹配失敗,將會轉向listen指令定義的default_server;

    7、如果所有的Host頭匹配失敗,並且沒有default_server,那麼將會轉向第一個server的listen指令。



  • Locations

    location指令可以用在虛擬主機server部分,提供來自客戶端的URI或者內部重定向訪問。location可以被嵌套使用。

    location定義如下:

location [=|^~|~|~*] /uri {
    ……
}
或者命名location:
location @name {
    ……
}


    location修飾符

使用精確匹配並且終止搜索

~

使用區分大小寫的正則表達式匹配

~*

使用不區分大小寫的正則表達式匹配

^~

如果該location是最佳匹配,那麼對於匹配這個location的字符串,不再進行正則表達式匹配。

這不是一個正則表達式,目的是優於正則表達式的匹配。


    匹配規則

        1、沒有正則表達式的location被優先匹配,獨立於含有正則表達式的location順序;

        2、在配置文件中按照順序進行正則表達式匹配。在查找到第一個正則表達式匹配之後結束查找。


    try_files

        try_files指令將會按照給定它的參數順序進行嘗試,第一個匹配的將會使用。經常被用於從一個變量去匹配一個可能的文件,然後將剩餘請求傳遞到一個命名location:

location / {
    try_files $uri $uri/ @app;
}
location @app {
    proxy_pass http://appserver;
}


    location的嵌套使用,不適用於使用“=”修飾符做前綴和命令location:

location / {                          # 首先,匹配根路徑
    location ^~ /css {                # 然後,找到一個最佳匹配/css。注意,這裏不是正則表達式
        location ~* /css/.*\.css$ {   # 最後,通過正則表達式找到了最佳匹配
        ……
        }
    }
}



  • 一個虛擬服務器的完整示例配置

server {
    listen 80;
    return 444;
}
server {
    listen 80;
    server_name localhost.myserver.com;
    location / {
        try_files $uri $uri/ @nginxserver;
    }
    location @nginxserver {
        proxy_pass http://127.0.0.1:8080;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章