一、基础环境准备
-
安装 Nginx
-
Linux(如 Ubuntu):
sudo apt update sudo apt install nginx -
Windows/Mac:
前往 nginx 官网 下载并解压即可。
-
Linux(如 Ubuntu):
-
启动 Nginx
sudo systemctl start nginx -
查看 Nginx 配置文件路径
通常为/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf。
二、反向代理基本配置
1. 反向代理单个服务
假设你有一个后端服务,地址为 http://127.0.0.1:8080,希望通过 Nginx 的 http://yourdomain.***/ 访问。
server {
listen 80;
server_name yourdomain.***;
location / {
proxy_pass http://127.0.0.1:8080;
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_pass:指定后端服务地址。 -
proxy_set_header:转发请求头,保证后端可以获取真实来源信息。
2. 路径转发/多服务代理
假设 /api 转发到后端 API 服务,/static 转发到静态文件服务器。
server {
listen 80;
server_name yourdomain.***;
location /api/ {
proxy_pass http://127.0.0.1:8081/;
proxy_set_header Host $host;
}
location /static/ {
proxy_pass http://127.0.0.1:8082/;
proxy_set_header Host $host;
}
}
注意:
proxy_pass 后面如果有 /,会直接拼接后端路径;如果没有 /,会保留原始路径。
3. 端口转发
将外部 80 端口请求转发到内网 8080 端口:
server {
listen 80;
server_name yourdomain.***;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
4. HTTPS 代理(SSL 配置)
如果需要支持 HTTPS,需要证书(如 ssl.crt 和 ssl.key)。
server {
listen 443 ssl;
server_name yourdomain.***;
ssl_certificate /etc/nginx/ssl/ssl.crt;
ssl_certificate_key /etc/nginx/ssl/ssl.key;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
三、常用优化参数
location / {
proxy_pass http://127.0.0.1:8080;
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_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
send_timeout 60s;
}
四、完整配置示例
server {
listen 80;
server_name www.example.***;
# API 转发
location /api/ {
proxy_pass http://127.0.0.1:7001/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 前端静态资源
location / {
root /var/www/html;
index index.html index.htm;
}
}
五、重载/重启 Nginx
修改配置后需重载 Nginx:
sudo nginx -t # 检查配置语法是否正确
sudo systemctl reload nginx # 重载配置
六、常见问题排查
- 404/502 错误:检查后端服务是否启动,端口是否正确,防火墙是否放行。
- 配置未生效:确认 Nginx 配置文件路径,是否已 reload。
-
路径拼接问题:
proxy_pass后面有无/,影响转发路径。
七、路径重写(rewrite)
有时需要将外部路径重写后再转发给后端,比如将 /api/v1/user 转为 /user。
示例1:去除前缀
location /api/ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:8080;
}
效果:请求 /api/user 实际转发为 /user。
示例2:正则匹配重写
location ~ ^/v1/(.*) {
proxy_pass http://127.0.0.1:8080/$1;
}
效果:请求 /v1/test 转发为 /test。
八、WebSocket 代理
WebSocket 需要特殊头部支持,Nginx 1.3+ 支持 WebSocket 代理。
location /ws/ {
proxy_pass http://127.0.0.1:9000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
九、跨域(CORS)配置
如果前端和后端分离,且通过 Nginx 代理,可能需要允许跨域。
location /api/ {
proxy_pass http://127.0.0.1:8080;
add_header A***ess-Control-Allow-Origin *;
add_header A***ess-Control-Allow-Methods 'GET, POST, OPTIONS, PUT, DELETE';
add_header A***ess-Control-Allow-Headers 'Content-Type,Authorization';
if ($request_method = 'OPTIONS') {
return 204;
}
}
十、负载均衡(多后端)
Nginx 支持多后端服务的负载均衡。
1. 定义后端服务器组
upstream backend_servers {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
# 可以加权、健康检查等
}
2. 配置代理到后端组
server {
listen 80;
server_name yourdomain.***;
location /api/ {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
}
}
十一、防盗链配置
防止图片、视频等资源被其他网站盗用。
location ~* \.(jpg|png|gif)$ {
valid_referers none blocked yourdomain.*** *.yourdomain.***;
if ($invalid_referer) {
return 403;
}
}
十二、常见问题解析
1. proxy_pass 路径拼接规则
-
proxy_pass http://127.0.0.1:8080/;
去除 location 匹配部分,直接拼接后端。 -
proxy_pass http://127.0.0.1:8080;
保留 location 匹配部分。
2. 配置生效但无响应
- 检查后端服务是否监听 127.0.0.1(有时只监听 0.0.0.0 也可以)。
- 检查防火墙端口是否放通。
- 检查 SELinux(CentOS)是否限制。
3. 502 Bad Gateway
- 后端服务未启动或端口错误。
- Nginx 用户权限问题(可尝试更改 user 或关闭 SELinux)。
十三、完整多场景配置示例
upstream myapp {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name www.example.***;
# 静态资源
location /static/ {
root /var/www/html;
}
# API 负载均衡
location /api/ {
proxy_pass http://myapp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# WebSocket
location /ws/ {
proxy_pass http://127.0.0.1:9000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# 防盗链
location ~* \.(jpg|png|gif)$ {
valid_referers none blocked www.example.***;
if ($invalid_referer) {
return 403;
}
}
}
十四、调试与日志
-
访问日志(默认开启):
/var/log/nginx/a***ess.log -
错误日志:
/var/log/nginx/error.log - 可临时增加日志级别,排查问题。
十五、动静分离
动静分离指的是将静态资源(如图片、JS、CSS)和动态请求(如 API、后端服务)分开处理,提高性能。
server {
listen 80;
server_name www.example.***;
# 静态资源直接由 Nginx 处理
location /static/ {
root /var/www/html;
expires 7d;
a***ess_log off;
}
# 动态请求转发给后端
location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
# 其他请求转发给前端应用
location / {
proxy_pass http://127.0.0.1:3000;
}
}
十六、健康检查(负载均衡后端)
Nginx 的 openresty 或 ***mercial 版本支持主动健康检查,开源版可以用第三方模块或简单被动健康检查(如max_fails和fail_timeout)。
upstream backend_servers {
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
}
说明:如果某个后端连续失败3次,30秒内不再转发请求给它。
十七、灰度发布 / AB 测试
通过 Nginx,可以实现按 IP、Cookie、Header 等进行灰度流量分流。
1. 按 Cookie 灰度
map $http_cookie $gray {
default 0;
"~*gray_user=1" 1;
}
upstream v1 {
server 127.0.0.1:8080;
}
upstream v2 {
server 127.0.0.1:8081;
}
server {
listen 80;
server_name www.example.***;
location /api/ {
if ($gray) {
proxy_pass http://v2;
}
proxy_pass http://v1;
}
}
2. 按 IP 灰度
geo $gray_ip {
default 0;
192.168.1.100 1;
}
server {
listen 80;
server_name www.example.***;
location /api/ {
if ($gray_ip) {
proxy_pass http://127.0.0.1:8081;
}
proxy_pass http://127.0.0.1:8080;
}
}
十八、IP 访问控制(黑白名单)
1. 只允许某些 IP 访问
location /admin/ {
allow 192.168.1.100;
allow 10.0.0.1;
deny all;
}
2. 禁止某些 IP 访问
location /api/ {
deny 123.123.123.123;
allow all;
}
十九、限流配置(防止接口被刷)
Nginx 的 limit_req_zone 和 limit_req 可实现简单限流。
http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
listen 80;
server_name www.example.***;
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://127.0.0.1:8080;
}
}
}
说明:每个 IP 每秒最多10次请求,突发流量允许20次。
二十、缓存配置(提升静态资源访问效率)
location /static/ {
root /var/www/html;
expires 30d;
add_header Cache-Control "public";
}
二十一、动静分离+负载均衡+限流综合示例
http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;
upstream backend_servers {
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name www.example.***;
# 静态资源
location /static/ {
root /var/www/html;
expires 7d;
a***ess_log off;
}
# API 限流+负载均衡
location /api/ {
limit_req zone=api_limit burst=10 nodelay;
proxy_pass http://backend_servers;
}
# 其他请求
location / {
proxy_pass http://127.0.0.1:3000;
}
}
}
二十二、调试与排错建议
- nginx -t 检查配置语法。
- systemctl reload nginx 或 nginx -s reload 重载配置。
- 查看 a***ess.log 和 error.log。
- 用 curl 工具测试转发效果,例如:
curl -I http://yourdomain.***/api/test