nginx常用配置
1. 返向代理
server {
listen 29100; # 监听端口
server_name localhost; # 域名
location / {
proxy_pass http://172.19.0.1:9100; # 代理目标地址
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_set_header Host $host;
- 作用:将客户端原始请求的Host头传递给后端服务器。
- 说明:$host是Nginx变量,通常包含客户端请求的原始主机名(域名)。
- 如果不设置,后端服务器可能收到的是代理服务器的IP或主机名,而非客户端实际请求的域名。 常用于虚拟主机场景,确保后端服务器能正确识别客户端请求的域名。
- proxy_set_header X-Real-IP $remote_addr;
- 作用:将客户端的真实IP地址传递给后端服务器。
- 说明:$remote_addr是Nginx变量,表示客户端的真实IP地址。 由于请求经过代理,后端服务器默认看到的IP是代理服务器的IP(如172.19.0.1)。 通过此头,后端可以通过X-Real-IP获取用户真实IP,用于日志记录或访问控制。
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- 作用:记录请求链中的客户端和各级代理服务器IP。
- 说明: $proxy_add_x_forwarded_for会自动追加客户端IP到现有的X-Forwarded-For头(如果存在)。 格式示例:X-Forwarded-For: 客户端IP, 代理1IP, 代理2IP。 后端服务器可通过此头追踪完整的请求路径,常用于防止IP伪造或分析请求来源。
- proxy_set_header X-Forwarded-Proto $scheme;
- 作用:告知后端客户端与代理之间的原始协议(HTTP/HTTPS)。
- 说明: $scheme是Nginx变量,表示客户端请求使用的协议(http或https)。 如果代理服务器通过HTTPS接收请求但后端是HTTP,后端可通过此头知道原始请求是加密的。 常用于生成正确的重定向链接或启用HTTPS相关功能。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 作用:记录请求链中的客户端和各级代理服务器IP。
- 为什么需要这些设置?
- 解决IP和域名丢失问题:代理会隐藏客户端信息,这些头确保后端能获取原始请求的域名、协议和真实IP。
- 兼容性:许多后端应用(如Web框架、日志工具)依赖这些头信息正常工作。
- 安全与调试:X-Forwarded-For等头有助于识别攻击来源或分析流量路径。
2. 带/和不带/
- 配置一
location /prod-api/ {
proxy_pass http://rs/;
}
- 配置二
location /prod-api {
proxy_pass http://rs;
}
这两个Nginx配置的主要区别在于 URI的处理方式,具体差异如下:
- 关键区别:/prod-api/ 与 /prod-api
- 配置一:location /prod-api/
- 匹配规则:仅匹配以 /prod-api/ 开头的URI(必须有末尾斜杠)。
- 例如:
- /prod-api/user → 匹配 ✅
- /prod-api → 不匹配 ❌(缺少末尾斜杠)
- 例如:
- 代理行为:
- proxy_pass http://rs/; 中的末尾斜杠表示 移除/prod-api/前缀,将剩余部分拼接到后端地址。
- 示例:
- proxy_pass http://rs/; 中的末尾斜杠表示 移除/prod-api/前缀,将剩余部分拼接到后端地址。
- 匹配规则:仅匹配以 /prod-api/ 开头的URI(必须有末尾斜杠)。
- 配置二:location /prod-api
- 匹配规则:匹配以 /prod-api 开头的 任何URI(无论有无末尾斜杠)。
- 例如:
- /prod-api/user → 匹配 ✅
- /prod-api → 匹配 ✅
- /prod-api-test → 也匹配 ✅(因为前缀是/prod-api)
- 例如:
- 代理行为:
- proxy_pass http://rs; 中无末尾斜杠,表示 保留/prod-api前缀传递给后端。
- 匹配规则:匹配以 /prod-api 开头的 任何URI(无论有无末尾斜杠)。
- 对比总结
| 配置项 | 匹配的URI示例 | 代理结果(后端收到的路径) | 适用场景 |
|---|---|---|---|
location /prod-api/ | /prod-api/user | http://rs/user | 需要完全剥离前缀时(严格匹配目录) |
location /prod-api | /prod-api, /prod-api/user, /prod-api-test | http://rs/prod-api/user | 需要保留前缀或模糊匹配时 |
- 常见问题
- 为什么配置一会严格要求斜杠?
- Nginx将location /prod-api/视为目录匹配,通常用于精确剥离前缀的场景(如API网关)。
- 配置二可能的问题?
- 如果URI类似/prod-api-test也会被匹配,可能造成非预期的代理行为,需谨慎使用。
- 如何强制添加斜杠?
- 若希望/prod-api自动跳转到/prod-api/,可添加如下规则:
location = /prod-api { return 301 /prod-api/; }
- 选择建议
- 如果后端需要 不含/prod-api前缀的路径 → 用 配置一(/prod-api/ + http://rs/)。
- 如果后端需要 完整路径 或处理多种前缀 → 用 配置二(但需注意模糊匹配风险)。
3.nginx 发布若依系统vue3前台 到url子目录 /admin
- vue3前台配置
- 将项目中的路由修改 配置文件在src/ruoter/index.js中
history: createWebHistory(import.meta.env.VITE_APP_ENV == 'production' ? '/admin' : '/')- 修改.env.production , 设置api接口地址
# 若依管理系统/生产环境 VITE_APP_BASE_API = '/api'- 配置vite.config.js
base: VITE_APP_ENV === 'production' ? '/admin/' : '/',- 修改退出时页面地址
- 修改文件 /src/layout/components/NavBar.vue
// location.href = '/index' 修改为: location.href = import.meta.env.VITE_APP_ENV == 'production' ? '/admin/index' : '/index';
- nginx配置
- nginx配置文件, vue3前台
location /admin{ #url路径 alias /usr/share/nginx/html/hw.rstone.com.cn/admin; #物理路径 try_files $uri $uri/ @routerblog; #如果找不到文件,则跳转到@routerblog index index.html index.htm; #默认首页 } location @routerblog{ rewrite ^.*$ /admin/index.html last; #跳转到vue3前台的index.html }- nginx配置文件, 后台api接口
location /api/ { proxy_pass http://172.19.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; # 设置代理请求头 }
4.ssl配置
- 配置nginx
server {
listen 80;
server_name api.rstone.com.cn;
# 为 HTTP-01 验证设置例外规则
location /.well-known/acme-challenge/ {
root /usr/share/nginx/html/ssl/api.rstone.com.cn;
}
#重定向到 HTTPS
location / {
return 301 https://$host$request_uri;
}
}
- 重新测试和加载nginx
docker exec nginx-vts nginx -t
docker exec nginx-vts nginx -s reload
- 运行acmesh获取ssl证书,配置nginx ssl
server {
listen 443 ssl;
server_name api.rstone.com.cn;
ssl_certificate /etc/nginx/conf.d/ssl/cert.pem;
ssl_certificate_key /etc/nginx/conf.d/ssl//key.pem;
location / {
proxy_pass http://host_IP:8080;
}
}
- 重启nginx 测试https网站是否正常
5.访问、错误日志设置
server {
#日志设置「为server块单独数设置日志文件」
error_log /var/log/nginx/error.www.rstone.com.cn.log notice;
access_log /var/log/nginx/access.www.rstone.com.cn.log main;
}