閱讀之前,建議先閱讀初識 Nginx。 之后,我們來了解一下 Nginx 配置。
抽象來說,將 Nginx 配置為 Web 服務器就是定義處理哪些 URLS 和如何處理這些URLS 對應的請求。具體來說,就是定義一些虛擬服務器(Virtual Servers),控制具有特定 IP 和域名的請求。
更具體的來說, Nginx 通過定義一系列 locations 來控制對 URIS 的選擇。每一個 location 定義了對映射到自己的請求的處理場景:返回一個文件或者代理請求,或者根據不同的錯誤代碼返回不同的錯誤頁面。另外,根據 URI 的不同,請求也可以被重定向到其它 server 或者 location 。
設置虛擬服務器
listen:
Nginx 配置文件至少包含一個 server 命令 ,用來定義虛擬服務器。當請求到來時, Nginx 會首先選擇一個虛擬服務器來處理該請求。
虛擬服務器定義在 http 上下文中的 server 中:
http { server { # Server configuration }}
注意: http 中可以定義多個 server
server 配置塊使用 listen 命令監聽本機 IP 和端口號(包括 Unix domain socket and path),支持 IPv4、IPv6,IPv6地址需要用方括號括起來:
server { listen 127.0.0.1:8080; # IPv4地址,8080端口 # listen [2001:3CA1:10F:1A:121B:0:0:10]:80; # IPv6地址,80端口 # listen [::]:80; # 聽本機的所有IPv4與IPv6地址,80端口 # The rest of server configuration}
上述配置,如果不寫端口號,默認使用80端口,如果不寫 IP ,則監聽本機所有 IP。
server_name:
如果多個 server 的 listen IP 和端口號一模一樣, Nginx 通過請求頭中的 Host 與 server_name 定義的主機名進行比較,來選擇合適的虛擬服務器處理請求:
server { listen 80; server_name lufficc.com www.lufficc.com; ...}
server_name 的參數可以為:
完整的主機名,如:api.lufficc.com 。 含有通配符(含有 *),如:*.lufficc.com 或 api.* 。 正則表達式,以 ~ 開頭。通配符只能在開頭或結尾,而且只能與一個 . 相鄰。www.*.example.org 和 w*.example.org均無效。 但是,可以使用正則表達式匹配這些名稱,例如 ~^www/..+/.example/.org$ 和~^w.*/.example/.org$ 。 而且 * 可以匹配多個部分。 名稱 * .example.org 不僅匹配www.example.org,還匹配www.sub.example.org。
對于正則表達式:Nginx 使用的正則表達式與 Perl 編程語言(PCRE)使用的正則表達式兼容。 要使用正則表達式,且必須以 ~ 開頭。
命名的正則表達式可以捕獲變量,然后使用:
server { server_name ~^(www/.)?(?<domain>.+)$; location / { root /sites/$domain; }}
小括號 () 之間匹配的內容,也可以在后面通過 $1 來引用,$2 表示的是前面第二個 () 里的內容。因此上述內容也可寫為:
server { server_name ~^(www/.)?(.+)$; location / { root /sites/$2; }}
一個 server_name 示例:
server { listen 80; server_name api.lufficc.com *.lufficc.com; ...}
同樣,如果多個名稱匹配 Host 頭部, Nginx 采用下列順序選擇:
完整的主機名,如 api.lufficc.com。 最長的,且以 * 開頭的通配名,如:*.lufficc.com。 最長的,且以 * 結尾的通配名,如:api.* 。 第一個匹配的正則表達式。(按照配置文件中的順序)新聞熱點
疑難解答