从单个 Nginx 服务器配置路由到客户端和服务器

从单个 Nginx 服务器配置路由到客户端和服务器

我正在尝试使用单个 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

rootnginx在查找文件时将 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;
  }
}

相关内容