Nginx(語法):08---HTTP模塊之(虛擬服務器:server模塊)

一、虛擬服務器(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指令中使用。你可以將其他變量用於配置文件的任何地方

七、域名解析

待續

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