Nginx 的 nginx.conf 看起來復雜,其實核心就五個配置塊:main、events、http、server、location。把這五個搞明白,Nginx 就算入門了。
其中最讓人頭疼的是 location 的匹配規則。什么時候用 =,什么時候用 ^~,正則匹配怎么生效,很多人配完心里都沒底。
這篇文章把 nginx.conf 的結構拆開講清楚,把 location 匹配規則說明白。
一、為什么是 Nginx?
Nginx 是現代 Web 服務的“交通樞紐”,負責接收所有請求,然后根據配置精準分發給對應的服務(靜態文件、后端應用、緩存服務器等)。
選擇它的理由:
- 功能強大:反向代理、負載均衡、緩存、HTTPS、限流,應有盡有
- 配置靈活:用一個配置文件就能管理整個站點的路由規則
二、nginx.conf 的骨架:從外到內的五個核心塊
Nginx 的配置文件從外到內,層層嵌套:
# 第一層:全局塊 (main)
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
# 第二層:事件塊 (events)
events {
worker_connections 1024;
}
# 第三層:HTTP塊 (http)
http {
# HTTP全局配置
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 第四層:Server塊 (server)
server {
listen 80;
server_name localhost;
# 第五層:Location塊 (location)
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
各層級的作用:
三、核心攻堅:location 匹配規則
location 決定了一個請求 URL 應該由哪個塊來處理。
匹配語法與優先級
| | |
|---|
| location = /path | 最高 |
| location ^~ /static/ | 次高 |
| location ~ \.php$ | |
| location / | 最低 |
核心規則:
- 如果沒有正則匹配成功,就使用之前記錄的最長普通前綴匹配
案例:一個域名下的兩個服務
假設要配 www.example.com:
- API 服務運行在
http://127.0.0.1:3000
server {
listen 80;
server_name www.example.com;
location / {
root /var/www/html;
index index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header Host $host;
}
}
用戶訪問 www.example.com/api/users:
- 檢查前綴匹配,
location / 和 location /api/ 都匹配 - 沒有正則匹配,所以最終使用
/api/ → 代理轉發成功
幾點建議:
- 優先用
location ^~ /path/ 做路徑明確的靜態資源和 API 路由,跳過正則匹配,效率更高 - 正則匹配只用于特殊場景,如處理
.php 文件、圖片防盜鏈 - 精確匹配
= 用于精準路徑,如網站根路徑或特殊頁面
四、兩個很好用的用法
1. 用 location = / 攔截敏感文件
# 精確匹配根路徑
location = / {
root /var/www/project;
index index.html;
}
# 攔截 .git 目錄
location ~ /\.git {
deny all;
return 403;
}
# 其他請求正常處理
location / {
root /var/www/project;
try_files $uri $uri/ /index.html;
}
location = / 優先級最高,根路徑請求不受后面規則干擾。正則匹配 ~ /\.git 攔截所有帶 .git 的路徑。
2. 用 try_files + 命名 location 實現“靜態優先,動態兜底”
location /blog/ {
root /var/www/blog-static;
try_files $uri $uri/ @backend;
}
location @backend {
proxy_pass http://127.0.0.1:3000;
}
請求先找靜態文件,找到了直接返回;找不到就自動跳轉到 @backend 代理給后端。整個過程不用 if,邏輯清晰。在舊項目遷移時這個很好用。
五、配置建議:不同場景怎么配
| | |
|---|
| location / { root /path; index index.html; } | |
| location ^~ /static/ { root /path; } | |
| location ^~ /api/ { proxy_pass http://backend; } | |
| location ~ \.php$ { fastcgi_pass ...; } | |
| | |
六、我的配置文件模板
每次新項目直接復制,改改路徑和端口就能用:
server {
listen 80;
server_name your-domain.com;
access_log /var/log/nginx/your-domain.com.access.log;
location / {
root /var/www/your-project/frontend;
try_files $uri $uri/ /index.html;
}
location ^~ /api/ {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
閱讀原文:原文鏈接
該文章在 2026/4/2 12:25:50 編輯過