我正在尝试使用单个 Nginx 服务器配置将请求路由到客户端或其后面的微服务:
server {
listen 80;
listen [::]:80;
# My client.
location /app/ {
root /usr/share/nginx/html;
try_files $uri$args $uri$args/ /index.html;
}
# My server.
location /api/ {
proxy_pass http://server:8080;
proxy_redirect off;
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-Host $server_name;
}
}
这个想法是,客户端会<base>/api/<some-rest-url>
调用微服务。然后这些调用会被 nginx 路由到服务。
通过给定的设置我看到以下结果:
- 服务可在 /api/ 获得
- 客户端在 /app/ 上不可用(404 未找到)
我认为这是位置定义方式的问题,但不知道如何解决这个问题。
注意:我不希望该服务在 nginx 的不同端口上可用,它应该在同一个端口上,但在不同的路由上(例如在本例中为 /api/)。
答案1
root
nginx在查找文件时将 URI 路径附加到路径末尾。
就您而言,对的请求http://example.com/app/index.html
会使 nginx 在中查找文件/usr/share/nginx/html/app/index.html
。
使用alias
而不是root
阻止 nginx 附加 URI 路径。
答案2
我找到了一个很好的解决方案。/app/
我不是使用 来为我的客户端服务,而是使用/
来为我的客户端服务,只需将服务请求重定向到 即可/api/
。 中服务器 URL 后面的斜杠表示proxy_pass
路径/api/
不重复:
server {
listen 80;
listen [::]:80;
location / {
root /usr/share/nginx/html;
try_files $uri$args $uri$args/ /index.html;
}
location /api/ {
proxy_pass http://server:8080/; # Important trailing slash!
proxy_redirect off;
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-Host $server_name;
}
}