- http模組
- server模組(虛擬主機配置)
- location模組
- 基本語法
- 匹配型別
- 等號匹配(
=
) - 正則匹配(
~
) - 忽略大小寫的正則匹配(
~*
)
- 等號匹配(
- 常見指令
- 巢狀
location
- 反向代理
- 負載均衡
- 步驟 1: 定義 Upstream 塊
- 步驟 2: 配置 Server 和 Location 塊
- 示例配置
- 負載均衡策略
- Q&A
- 1.location裡root和alias的區別是什麼?
Nginx 配置檔案通常位於
/etc/nginx/nginx.conf
或者 /usr/local/nginx/conf/nginx.conf
,具體位置取決於你的系統和安裝方式。配置檔案是 Nginx 的核心,用於定義伺服器如何執行以及如何處理請求。
http模組
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/mime.types;
}
解釋各個部分
-
user:定義執行 Nginx 程序的使用者和組。
-
worker_processes:指定 Nginx 應該啟動的工作程序數量。
-
error_log:定義錯誤日誌的位置。
-
pid:定義 Nginx 程序 ID 檔案的位置。
-
events:配置事件處理模型,如 worker_connections 設定每個工作程序可以同時開啟的最大連線數。
-
http:這是 Nginx 配置的主要部分,包括全域性設定、虛擬主機配置等。
-
include
:用於包含其他配置檔案。 -
log_format
和access_log
:用於定義訪問日誌的格式和位置。 -
sendfile
,tcp_nopush
,tcp_nodelay
,keepalive_timeout
:這些是提高效能和最佳化網路傳輸的選項。 -
types_hash_max_size
:用於快取 MIME 型別的大小限制。 -
include
:最後兩個include
語句用於包含額外的配置檔案,比如站點配置或模組配置。
server模組(虛擬主機配置)
在 http
塊中,你可以定義多個 server
塊來配置不同的虛擬主機。每個 server
塊可以有以下引數:
server {
listen 80;
server_name example.com;
root /var/www/example;
index index.html index.htm;
# 直接指定“/”可代替上面的“root”,能更靈活的配置其他選項
location / {
try_files $uri $uri/ =404;
}
# 更多 location 塊用於更詳細的 URL 路徑匹配和處理
}
- listen:定義伺服器監聽的埠和地址。
- server_name:定義域名或 IP 地址。可配置二級域名。
- root:定義網站根目錄。
- index:定義預設索引檔案,如果根目錄下的預設檔案不叫index.html而叫app.html,那麼需配置index為app.html。
- location:定義 URL 的路徑匹配規則和處理方式。
location模組
server模組中的 location
塊是用來定義如何處理與特定 URL 模式匹配的 HTTP 請求的。location
塊允許你針對不同的 URL 路徑指定不同的處理邏輯,比如靜態檔案服務、動態內容處理、重定向、反向代理、負載均衡等。下面詳細解釋 location
的不同用法和語法:
基本語法
location
塊的基本語法如下:
location [=|~|~*|^~] /pattern {
# 處理邏輯
}
其中 /pattern
是 URL 路徑的模式,可以是精確的字串、正規表示式或其他匹配型別。
匹配型別
假設我在/data/icons/目錄下有三個檔案favicon1.ico、favicon2.ico、favicon3.ico
等號匹配(=
)
當使用等號作為字首時,location
將只匹配完全相等的 URL 路徑。這是最高效的匹配型別,因為 Nginx 可以直接查詢而無需進行正規表示式匹配。
location = /favicon1.ico {
root /data/icons;
}
正則匹配(~
)
使用波浪線作為字首時,location
將使用正規表示式來匹配 URL 路徑。
location ~ /favicon[2-3].ico {
root /data/icons;
}
忽略大小寫的正則匹配(~*
)
類似正則匹配,但忽略大小寫。我們將favicon3.ico改成Favicon3.ico。
location ~* /favicon[2-3].ico {
root /data/icons;
}
此時按照我們所理解的,訪問example.com/favicon3.ico應該能正常顯示,其實不然!需要訪問example.com/Favicon3.ico才能正常顯示。
為什麼呢?
因為,只是url和nginx這行配置忽略大小寫,讓url走這行配置的規則,並不是url和實際訪問資源忽略大小寫。實際訪問的時候還是要和資源名稱大小寫一致。
常見指令
在 location
塊內,你可以定義一系列指令來處理匹配到的請求。常見的指令包括:
root
:設定該location
下的文件根目錄。alias
:與root
類似,但是alias
直接對映 URL 到檔案系統路徑。try_files
:嘗試按給定順序查詢檔案。如果找不到,可以指定一個預設處理程式,如轉發到後端應用。proxy_pass
:用於設定反向代理,訪問服務而非靜態資源用這個。rewrite
:用於重寫 URL 或重定向請求。return
:立即返回一個 HTTP 響應碼和可選的內容。
巢狀 location
location
塊可以巢狀在另一個 location
塊內,允許更精細的控制。例如:
location / {
root /www/;
location ~ \.php$ {
root /var/www/;
fastcgi_pass 127.0.0.1:9000;
}
}
在這個例子中,所有請求都預設指向 /www/
根目錄,但 .php
副檔名的請求會被特殊處理,指向 /var/www/
並透過 FastCGI 傳送給 PHP 處理器。
反向代理
假設你有一個後端應用伺服器執行在本地的 8000 埠,並且你想透過 Nginx 將所有對 example.com
的請求代理到這個後端伺服器,你可以使用以下配置:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 可選的其他配置
proxy_redirect off;
proxy_buffering off;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
send_timeout 60s;
}
}
解釋配置
listen 80;
:監聽 80 埠上的請求。server_name example.com;
:指定伺服器名稱,確保只有對example.com
的請求被處理。location / { ... }
:定義所有請求都應該被代理。proxy_pass http://127.0.0.1:8000;
:將請求轉發到本地的 8000 埠。proxy_set_header
:設定代理傳遞的頭部資訊。這很重要,因為後端伺服器可能需要知道原始客戶端的資訊。- 其他
proxy_
配置:這些設定用於最佳化代理連線的效能和可靠性。
負載均衡
在 Nginx 中配置負載均衡可以讓你在多臺後端伺服器之間分配客戶端的請求,以提高應用程式的可用性和響應速度,同時也可以增加系統的冗餘度。以下是使用 Nginx 配置基於輪詢(round-robin)策略的簡單負載均衡的步驟和示例配置:
步驟 1: 定義 Upstream 塊
首先,你需要定義一個 upstream
塊,它將包含一組後端伺服器的列表。這個 upstream
塊可以被多個 location
塊引用,用於負載均衡。
步驟 2: 配置 Server 和 Location 塊
接著,在 server
塊中使用 location
塊來指定哪些請求應該被代理到定義好的 upstream
。這樣,Nginx 將根據負載均衡策略將請求分發到不同的後端伺服器。
示例配置
假設你有兩臺後端應用伺服器,分別執行在 backend1.example.com:8000
和 backend2.example.com:8000
,你可以使用以下配置來實現負載均衡:
upstream backend {
server backend1.example.com:8000;
server backend2.example.com:8000;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
解釋配置
upstream backend { ... }
:定義了一個名為backend
的上游伺服器組,包含了兩臺後端伺服器。server backend1.example.com:8000;
和server backend2.example.com:8000;
:指定了後端伺服器的地址和埠。proxy_pass http://backend;
:告訴 Nginx 將請求代理到backend
上游伺服器組。
負載均衡策略
Nginx 預設使用輪詢(round-robin)策略,但你也可以使用其他策略,如最少連線(least connections)或雜湊(hash)策略。例如,為了使用最少連線策略,你可以修改 upstream
塊如下:
upstream backend {
least_conn;
server backend1.example.com:8000;
server backend2.example.com:8000;
}
在這個配置中,least_conn;
指令告訴 Nginx 選擇連線數最少的伺服器來處理新的請求。還有其他策略配置可自行百度,這裡不做贅述。
以上是我在實際使用nginx時常用的配置,剩餘的配置在實際使用後再做持續補充~
Q&A
1.location裡root和alias的區別是什麼?
在 Nginx 的 location
塊中使用 root
和 alias
指令時,它們之間的主要區別在於如何解析 URL 到實際的檔案系統路徑。儘管這兩個指令都用於指定檔案的根目錄,但它們的工作方式有所不同。
**root**
指令
root
指令用於設定一個基準目錄,當與 location
結合使用時,Nginx 會將請求的 URI(統一資源識別符號)附加到 root
目錄的後面,然後查詢對應的檔案或目錄。這意味著,如果 root
設定為 /data/icons
,並且 URL 請求為 /img/favicon1.ico
,那麼 Nginx 會嘗試在 /data/icons/img/fabicon1.ico
查詢檔案。
示例:
location / {
root /data/icons;
# 請求 /img/favicon1.ico 會查詢 /data/icons/img/favicon1.ico
}
**alias**
指令
alias
指令則是用來做 URL 到檔案系統路徑的直接對映。當使用 alias
時,URL 的路徑部分將被完全替換為 **alias**
指定的路徑,而不是附加到其後。這意味著,如果 alias
設定為 /data/icons/img/
,並且 URL 請求為 /img/favicon1.ico
,那麼 Nginx 將在 /data/icons/img/favicon1.ico
直接查詢檔案,而不會把 /img/
加在 alias
指定的路徑後面。
示例:
location /img/ {
alias /data/icons/img/;
# 請求 /img/favicon1.ico 會查詢 /data/icons/img/favicon1.ico
}
選擇使用 root
還是 alias
主要取決於你的具體需求。
一般情況下,nginx配置的良好習慣是:
- 在location /中配置root目錄
- 在location /path中配置alias目錄