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 → 不匹配 ❌(缺少末尾斜杠)

    • 代理行为:

  • 配置二:location /prod-api

  • 对比总结

  • 常见问题

  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

  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;
}

# nginx常用配置

## 1. **返向代理**

```nginx
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. **带/和不带/**

- 配置一

```nginx
location /prod-api/ {
    proxy_pass http://rs/;
}
```

- 配置二

```nginx
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/](http://rs/); 中的末尾斜杠表示 移除/prod-api/前缀,将剩余部分拼接到后端地址。
      - 示例:
        - 请求 [http://nginx/prod-api/user](http://nginx/prod-api/user) → 代理到 [http://rs/user(去除了/prod-api/)。](http://rs/user(去除了/prod-api/)。)
- 配置二:location /prod-api
  - 匹配规则:匹配以 /prod-api 开头的 任何URI(无论有无末尾斜杠)。
    - 例如:
      - /prod-api/user → 匹配 ✅
      - /prod-api → 匹配 ✅
      - /prod-api-test → 也匹配 ✅(因为前缀是/prod-api)
  - 代理行为:
    - proxy_pass [http://rs](http://rs); 中无末尾斜杠,表示 保留/prod-api前缀传递给后端。
      - 示例:
        - 请求 [http://nginx/prod-api/user](http://nginx/prod-api/user) → 代理到 [http://rs/prod-api/user(保留完整路径)。](http://rs/prod-api/user(保留完整路径)。)
- 对比总结

- 常见问题

1. 为什么配置一会严格要求斜杠?
  - Nginx将location /prod-api/视为目录匹配,通常用于精确剥离前缀的场景(如API网关)。
2. 配置二可能的问题?
  - 如果URI类似/prod-api-test也会被匹配,可能造成非预期的代理行为,需谨慎使用。
3. 如何强制添加斜杠?
  - 若希望/prod-api自动跳转到/prod-api/,可添加如下规则:
    ```nginx

    location = /prod-api {
        return 301 /prod-api/;
    }
    ```

- 选择建议
- 如果后端需要 不含/prod-api前缀的路径 → 用 配置一(/prod-api/ + [http://rs/)。](http://rs/)。)
- 如果后端需要 完整路径 或处理多种前缀 → 用 配置二(但需注意模糊匹配风险)。

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

1. vue3前台配置
  - 将项目中的路由修改 配置文件在src/ruoter/index.js中
    ```js
    history: createWebHistory(import.meta.env.VITE_APP_ENV == 'production' ? '/admin' : '/')
    ```
    - 修改.env.production , 设置api接口地址
    ```js
    # 若依管理系统/生产环境
    VITE_APP_BASE_API = '/api'
    ```
    - 配置vite.config.js
    ```js
    base: VITE_APP_ENV === 'production' ? '/admin/' : '/',
    ```
    - 修改退出时页面地址
      - 修改文件 /src/layout/components/NavBar.vue
2. nginx配置
  - nginx配置文件, vue3前台
    ```nginx
    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接口
    ```nginx
    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

```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

```bash
docker exec nginx-vts nginx -t
docker exec nginx-vts nginx -s reload
```

- 运行acmesh获取ssl证书,配置nginx ssl

```nginx
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.访问、错误日志设置

```nginx
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;
}
```