diff --git a/nginx.conf.gateway b/nginx.conf.gateway index 45a5cac..4221343 100644 --- a/nginx.conf.gateway +++ b/nginx.conf.gateway @@ -1,4 +1,3 @@ -# 这是网关 Nginx 的配置文件 user nginx; worker_processes auto; @@ -30,11 +29,10 @@ http { # 安全响应头 add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always; add_header X-Content-Type-Options nosniff; - # 对于 X-Frame-Options,根据你的需求设置 SAMEORIGIN 或 DENY add_header X-Frame-Options SAMEORIGIN; - # add_header Referrer-Policy "strict-origin-when-cross-origin"; # 可选 # --- SSL 配置 --- + # 可以在 http 块中统一配置 SSL,然后 server 块继承,或者在 server 块中重复配置以覆盖 ssl_certificate /etc/nginx/certs/server.crt; ssl_certificate_key /etc/nginx/certs/server.key; ssl_protocols TLSv1.2 TLSv1.3; @@ -43,42 +41,35 @@ http { ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; - # --- 后端服务定义 (在 Docker 网络中通常使用服务名) --- - # 如果 sys-ui 和 lmg-ui 的服务名是 "sys-ui-container" 和 "lmg-ui-container" - # 它们需要在同一个 Docker 网络中运行,并且可以通过这些服务名访问到它们的 80 端口 - upstream sys_ui_backend { - server sys-ui-container:80; + # --- 后端服务定义 --- + upstream sys_ui { + server sys-ui:80; } - upstream lmg_ui_backend { - server lmg-ui-container:80; + upstream lmg_ui { + server lmg-ui:80; } - # 你的后端 API 服务 upstream sys_api { - server sys_backend_service:19902; # 替换为你的实际后端服务名或IP + server sys_api:19902; } upstream lmg_api { - server lmg_backend_service:19904; # 替换为你的实际后端服务名或IP + server lmg_api:19904; } - # 认证服务 upstream auth_api { - server auth_backend_service:19902; # 替换为你的实际后端服务名或IP + server sys_api:19902; # 假设认证服务也由 sys_api 提供,并且端口是 19902 } - # --- 网关服务配置 --- - - # sys-ui Server Block + # --- 合并后的网关服务配置 --- server { listen 8000 ssl reuseport; - server_name your-domain.com; # 替换为你的域名或IP + # 如果你的 IP 106.52.199.114 是你对外的服务地址,可以用它。 + # 如果你有一个域名,比如 www.your-domain.com,那么 server_name 应该指向那个域名。 + # 如果只有一个 IP,可以不写 server_name,或者写 IP 地址。 + # server_name 106.52.199.114; # 或者你的域名 - # SSL 证书配置 (如果与 http 块重复,server 块配置会覆盖) - ssl_certificate /etc/nginx/certs/server.crt; - ssl_certificate_key /etc/nginx/certs/server.key; - ssl_protocols TLSv1.2 TLSv1.3; - ssl_prefer_server_ciphers on; - ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; - ssl_session_cache shared:SSL:10m; - ssl_session_timeout 10m; + # SSL 配置 (如果 http 块已配置,这里可以省略,除非需要特定 server 的 SSL 设置) + # ssl_certificate /etc/nginx/certs/server.crt; + # ssl_certificate_key /etc/nginx/certs/server.key; + # ... 其他 SSL 设置 ... # 统一代理头配置 proxy_set_header Host $host; @@ -86,34 +77,68 @@ http { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - # --- sys-ui 静态资源服务 --- - location / { - proxy_pass http://sys_ui_backend; # 将所有请求代理到 sys-ui 容器 + # --- Sys UI 静态资源服务 --- + # 所有以 /sys/ 开头的请求,都代理到 sys_ui 容器 + # nginx 的 location 会处理路径的匹配和剥离 + location /sys/ { + proxy_pass http://sys_ui/; # 注意这里的 / 后面的斜杠很重要,它会使代理到上游时保持路径 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; - # 如果 sys-ui 的 Nginx 配置了 try_files,这里不需要再配置 - # 理论上 Nginx 是直接代理到 sys-ui 的 80 端口,所以 sys-ui 内部的 Nginx 会处理 try_files - # 如果你想让网关直接提供静态文件,可以像之前一样复制 dist 文件到网关目录,但这样就不是单独部署 UI 容器了 + # 如果 sys-ui 的裏面 Nginx 配置了 try_files /index.html; + # 那么这里代理到 http://sys_ui/ 即可,它会代理到 http://sys_ui/sys/ 后, + # sys-ui 的 Nginx 会处理 /sys/index.html 的请求 } - # --- sys-ui 后端 API 代理 --- - location /api/sys/ { - proxy_pass https://sys_api/api/; + # --- Sys API 代理 --- + # 所有以 /sys/api/ 开头的请求,都代理到 sys_api + location /sys/api/ { + proxy_pass https://sys_api/api/; # 注意这里,代理目标路径是 /api/,并且会保留原始请求的 /sys/api/ 之后的路径 proxy_ssl_server_name on; proxy_ssl_session_reuse off; - proxy_ssl_verify off; # 生产环境建议开启验证 + # 生产环境建议开启证书验证:proxy_ssl_verify on; + # 如果后端 sys_api 是 HTTP 而不是 HTTPS,请去掉 proxy_ssl_... 配置,直接使用 proxy_pass http://sys_api/api/; + proxy_ssl_verify off; + + proxy_set_header Host $proxy_host; # 使用上游服务的 Host + proxy_set_header Authorization $http_authorization; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $host:$server_port; + + # 这是一个很关键的重写,确保上游的 Location Header 也正确指向新的路径 + proxy_redirect https://sys_api/ /sys/api/; + } + + # --- Lmg UI 静态资源服务 --- + # 所有以 /lmg/ 开头的请求,都代理到 lmg_ui 容器 + location /lmg/ { + proxy_pass http://lmg_ui/; # 同样,这里的 / 后面的斜杠很重要 + 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; + } + + # --- Lmg API 代理 --- + # 所有以 /lmg/api/ 开头的请求,都代理到 lmg_api + location /lmg/api/ { + proxy_pass https://lmg_api/api/; + proxy_ssl_server_name on; + proxy_ssl_session_reuse off; + proxy_ssl_verify off; proxy_set_header Host $proxy_host; proxy_set_header Authorization $http_authorization; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host:$server_port; - proxy_redirect https://sys_api/ /api/sys/; # 重写 Location 头 + proxy_redirect https://lmg_api/ /lmg/api/; # 重写 Location 头 } # --- 认证服务代理 --- + # 这个可以放在一个单独的 location 中,因为它不属于任何 UI + # 假设认证服务在 /auth/ 下 location /auth/ { proxy_pass https://auth_api/auth/; proxy_ssl_server_name on; @@ -127,65 +152,23 @@ http { proxy_redirect https://auth_api/ /auth/; # 重写 Location 头 } - } - # lmg-ui Server Block - server { - listen 8001 ssl reuseport; - server_name your-domain.com; # 替换为你的域名或IP + # 如果有其他的根路径请求,可以单独处理,或者暂时不做处理 + # 例如,如果你想让访问根目录 `/` 的时候显示一个默认页面或跳转到某个 UI + # location / { + # return 301 /sys/; # 例如,将所有直接访问根目录的请求重定向到 sys-ui + # } - # SSL 配置 - ssl_certificate /etc/nginx/certs/server.crt; - ssl_certificate_key /etc/nginx/certs/server.key; - ssl_protocols TLSv1.2 TLSv1.3; - ssl_prefer_server_ciphers on; - ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; - ssl_session_cache shared:SSL:10m; - ssl_session_timeout 10m; - - # 统一代理头配置 - 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; - - # --- lmg-ui 静态资源服务 --- - location / { - proxy_pass http://lmg_ui_backend; # 将所有请求代理到 lmg-ui 容器 - 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; - } - - # --- lmg-ui 后端 API 代理 --- - location /api/lmg/ { - proxy_pass https://lmg_api/api/; - proxy_ssl_server_name on; - proxy_ssl_session_reuse off; - proxy_ssl_verify off; - - proxy_set_header Host $proxy_host; - proxy_set_header Authorization $http_authorization; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Forwarded-Host $host:$server_port; - - proxy_redirect https://lmg_api/ /api/lmg/; # 重写 Location 头 - } - - # --- 跨系统访问 Sys API (如果 lmg-ui 需要访问 sys API) --- - location /api/sys/ { - proxy_pass https://sys_api/api/; - proxy_ssl_server_name on; - proxy_ssl_session_reuse off; - proxy_ssl_verify off; - - proxy_set_header Host $proxy_host; - proxy_set_header Authorization $http_authorization; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Forwarded-Host $host:$server_port; - - proxy_redirect https://sys_api/ /api/sys/; # 重写 Location 头 - } + # 如果你的 sys-ui 和 lmg-ui 的构建配置是输出到 dist 目录, + # 并且它们的 index.html 都在根目录下,那么代理到上游的时候, + # Nginx 的 location directive 会处理路径。 + # 例如访问 http://your-gateway:8000/sys/ 会代理到 http://sys-ui:80/ + # 此时 sys-ui 内部的 Nginx 会去查找 / (或者 /sys/) 下的 index.html + # 如果 sys-ui 的 Nginx 配置了 try_files $uri $uri/ /index.html; + # 并且它的 index.html 在根目录,那么 Nginx 代理到 http://sys-ui:80/ 会找到 /index.html 并返回。 + # 如果你希望它能处理 /sys/ 的路由,那么 sys-ui 的前端路由也需要支持 /sys/ 开头的路径。 + # 在很多 SPA 应用中,前端会配置一个基础路径(base path),例如 Vue.js 的 publicPath。 + # 如果你的 sys-ui 的 publicPath 是 /sys/,lmg-ui 的 publicPath 是 /lmg/ + # 那么上面的配置就基本是正确的。 } }