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 → 不匹配 ❌(缺少末尾斜杠)
    • 代理行为:
  • 配置二:location /prod-api
    • 匹配规则:匹配以 /prod-api 开头的 任何URI(无论有无末尾斜杠)。
      • 例如:
        • /prod-api/user → 匹配 ✅
        • /prod-api → 匹配 ✅
        • /prod-api-test → 也匹配 ✅(因为前缀是/prod-api)
    • 代理行为:
  • 对比总结
配置项匹配的URI示例代理结果(后端收到的路径)适用场景
location /prod-api//prod-api/userhttp://rs/user需要完全剥离前缀时(严格匹配目录)
location /prod-api/prod-api, /prod-api/user, /prod-api-testhttp://rs/prod-api/user需要保留前缀或模糊匹配时
  • 常见问题
  1. 为什么配置一会严格要求斜杠?
    • Nginx将location /prod-api/视为目录匹配,通常用于精确剥离前缀的场景(如API网关)。
  2. 配置二可能的问题?
    • 如果URI类似/prod-api-test也会被匹配,可能造成非预期的代理行为,需谨慎使用。
  3. 如何强制添加斜杠?
    • 若希望/prod-api自动跳转到/prod-api/,可添加如下规则:
    
    location = /prod-api {
        return 301 /prod-api/;
    }
    
  • 选择建议
  • 如果后端需要 不含/prod-api前缀的路径 → 用 配置一(/prod-api/ + http://rs/)。
  • 如果后端需要 完整路径 或处理多种前缀 → 用 配置二(但需注意模糊匹配风险)。

3.nginx 发布若依系统vue3前台 到url子目录 /admin

  1. 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';
      
  2. 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;
}