gateway/nginx.conf.gateway

175 lines
7.5 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 30s;
keepalive_requests 1000;
# 安全响应头
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options SAMEORIGIN;
# --- 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;
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;
# --- 后端服务定义 ---
upstream sys_ui {
server sys-ui:80;
}
upstream lmg_ui {
server lmg-ui:80;
}
upstream sys_api {
server sys_api:19902;
}
upstream lmg_api {
server lmg_api:19904;
}
upstream auth_api {
server sys_api:19902; # 假设认证服务也由 sys_api 提供,并且端口是 19902
}
# --- 合并后的网关服务配置 ---
server {
listen 8000 ssl reuseport;
# 如果你的 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 设置)
# ssl_certificate /etc/nginx/certs/server.crt;
# ssl_certificate_key /etc/nginx/certs/server.key;
# ... 其他 SSL 设置 ...
# 统一代理头配置
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 静态资源服务 ---
# 所有以 /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 /index.html;
# 那么这里代理到 http://sys_ui/ 即可,它会代理到 http://sys_ui/sys/ 后,
# sys-ui 的 Nginx 会处理 /sys/index.html 的请求
}
# --- 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 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://lmg_api/ /lmg/api/; # 重写 Location 头
}
# --- 认证服务代理 ---
# 这个可以放在一个单独的 location 中,因为它不属于任何 UI
# 假设认证服务在 /auth/ 下
location /auth/ {
proxy_pass https://auth_api/auth/;
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://auth_api/ /auth/; # 重写 Location 头
}
# 如果有其他的根路径请求,可以单独处理,或者暂时不做处理
# 例如,如果你想让访问根目录 `/` 的时候显示一个默认页面或跳转到某个 UI
# location / {
# return 301 /sys/; # 例如,将所有直接访问根目录的请求重定向到 sys-ui
# }
# 如果你的 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/
# 那么上面的配置就基本是正确的。
}
}