一、虛擬服務器(server模塊)
- Nginx配置文件必須至少包含一個服務器指令來定義虛擬服務器。 當Nginx處理請求時, 它首先選擇提供請求的虛擬服務器,這些虛擬服務器響應HTTP請求,因此它們都包含在http模塊中
- 虛擬服務器由http模塊中的server模塊來定義,一個http模塊中可以有多個server模塊,每個server都相當於一個虛擬服務器實例
- 例如,下面有兩個http虛擬服務器,一個監聽8888,一個監聽9999
http {
server {
listen 8888;
}
server {
listen 9999;
}
}
- server模塊常用的幾個指令有:
二、listen指令
- listen指令定義了一個IP地址/端口組合或者是UNIX域套接字路徑
- 格式如下:
listen address[:port];
listen port;
listen unix:path;
- 相關注意事項:
- 如果省略端口,則使用標準端口
- 如果省略一個地址,服務器將偵聽所有地址
- 如果沒有包含listen 指令,則“標準”端口爲 80/tcp,“default”端口爲 8000/tcp,具體取決於超級用戶權限
listen指令支持的參數
- listen指令唯一標識了在Nginx下的套接字綁定,此外還有一些其他的可選參數。例如:
- 例如,下面是一個配置,其虛擬服務器監聽127.0.0.1:8080
htpp {
server {
listen 127.0.0.1:8080;
}
}
三、server_name指令
- 如果有多個服務器與請求的IP地址和端口相匹配,則Nginx將根據服務器塊中的server_name指令測試請求的主機頭域
- server_name用來表明主機名稱。server_name後面可以跟多個主機名稱
- 默認值:默認值爲""。對於沒有設置Host頭字段的請求,它將會匹配該server進行處理(這種情況可用於如丟棄這種缺乏Host頭的請求)
server_name支持的格式
- server_name的參數可以是完整名稱、通配符或正則表達式
- 完整名稱:例如:
htpp { server { listen 80; server_name example.org www.example.org; } }
- 通配符:通配符是一個字符串,其開頭,結尾或兩者都包含星號(*),星號匹配任何字符序列。例如:
- 匹配部分子域名:*.example.com
- 匹配部分頂級域名:www.example.*
- 一種特殊形式將匹配子域或域本身:.example(匹配*.example.com,也包括example.com)
- 正則表達式:Nginx將Perl語法用於正則表達式,在它們之前使用波浪號(~)。例如:
server_name ~^www\.example\.com$ #利用捕獲,可以在以後引用中進一步設置(用$1、$w等)指令中使用 server_name ~^www(\d+).example\.(com)$
四、虛擬服務器提供服務的匹配規則
- 在一個配置文件中可以配置多個server,當一個請求到達時,其會根據下面的規則來選擇哪一個server進行服務:
- 1.匹配IP地址和listen指令指定的端口
- 2.將Host頭字段作爲一個字符串匹配server_name指令
- 3.將Host頭字段與server_name指令值字符串的開始部分做匹配。例如:*.example.com
- 4.將Host頭字段與server_name指令值字符串的結尾部分做匹配。例如:www.example.*
- 5.將Host頭字段與server_name指令值進行正則表達式匹配。按照出現在配置文件中的順序
- 6.如果所有Host頭匹配失敗,那麼將會轉向listen指令標記的default_server(見下面介紹)
- 7.如果所有的Host頭匹配失敗,並且沒有default_server,那麼就去匹配配置文件中列出的第一個服務器
- 上面的整個邏輯如下圖所示:
default_server
- 該參數被用於處理其他沒有被處理的請求
- 因此,總是明確地推薦設置該參數,以便這些沒有被處理的請求通過這種定義的方式處理
- 例如:
htpp { server { listen 80; server_name example.org www.example.org; } # default_server server { listen 8080 default_server; } }
- 除了上面的用法外,該參數也可以使用同樣的listen指令配置若干個虛擬服務器。這裏設置的任何支付都將會在匹配的server區段有效
五、默認虛擬服務器
- 默認服務器有方式:
- 一種爲:在配置文件中監聽同一IP地址、同一端口作爲另一個服務器的第一個服務器
- 另一種爲:通過listen指令的default_server參數來實現(見上面演示案例)
不讓默認服務器處理無Host頭的請求
- 通過“四”和“五”的介紹我們知道,如果沒有Host頭的請求到來,那麼會使用默認服務器開處理
- 但是如果你不想讓默認服務器處理沒有Host頭的請求,那麼可以爲server_name指令設置一個空值,這個服務器將會處理相應的請求。例如:
htpp { # default_server server { listen 8080 default_server; } #這個服務器處理沒有Host頭的請求,而不是上面那個了 server { server_name ""; } }
六、日誌指令
- Nginx有一個非常靈活的日誌記錄模式。配置文件的每一個級別都可以有訪問日誌。
- http日誌指令如下:
- 此外,在每一個級別上可以指定多個訪問日誌,每一個日誌用一個不同的log_format指令。 log_ format指令允許你明確指定記錄要記載的內容,該指令需要在http部分內定義
- 日誌文件的路徑自身可以包括變量,以便你能構建一個動態的配置文件。下面的例子說明了在實踐中如何配置它們
http {
log_format vhost '$host $remote_addr - $remote_user [$time_local]'
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
log_format downloads '$time_iso8601 $host $remote_addr '
'"$request" $status $body_bytes_sent $request_time ';
open_log_file_cache max=lOOO inactive=60s;
access_ log logs/access.log;
server {
server_name ~^(www\.)?(.+)$;
access_log logs/combined.log vhost;
access_log logs/$2/access.log;
location /downloads {
access_log logs/downloads.log downloads;
}
}
}
- 在下面的例子中,日誌條目使用的gzi壓縮爲4級。緩存默認爲64KB,而且至少每分鐘都將緩存刷新到磁盤
access_log /var/log/nginx/access.log.gz combined gzip=4 flush=1m;
- 注意,當指定了gzip後,則不可選用log_format參數。 log_format指令的組合參數默認構造如下
log_format combined '$remote_addr - $remote_user [$time_local]'
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
- 正如你看到的,使用換行符可以增加可讀性。這種寫法不會影響log_format指令本身。任何變量都可以在log_format指令中使用 。下圖中標有星號(*)的變量是特定記錄,並且僅可以在log_format指令中使用。你可以將其他變量用於配置文件的任何地方
七、域名解析
待續