Nginx常用配置
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/前缀,将剩余部分拼接到后端地址。
配置二:location /prod-api
匹配规则:匹配以 /prod-api 开头的 任何URI(无论有无末尾斜杠)。
例如:
/prod-api/user → 匹配 ✅
/prod-api → 匹配 ✅
/prod-api-test → 也匹配 ✅(因为前缀是/prod-api)
代理行为:
proxy_pass http://rs; 中无末尾斜杠,表示 保留/prod-api前缀传递给后端。
对比总结
常见问题
为什么配置一会严格要求斜杠?
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
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;
}