【问题标题】:nginx proxy_pass configuration for two services running on diff ports运行在不同端口上的两个服务的 nginx proxy_pass 配置
【发布时间】:2019-07-25 06:46:49
【问题描述】:

我需要重定向或代理传递以下内容:

每个以/api/v1/ 开头的请求到:@server 其他一切/ 到 @client

我有@server 在端口8080 上运行,@client 在端口8081 上运行 @client and @server 作为 docker 容器运行。

注意。一切都应该使用https。 以下配置是我所拥有的,但它不工作 idkw

server {
  server_name example.com;

  listen 80;
  listen [::]:80 ipv6only=on;

  return 301 https://example.com$request_uri;
}

server {
    server_name example.com;

    listen 443 ssl;

    ssl_certificate     /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    ...

    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;

    location /api/v1/ {
        try_files $uri @server;
    }

    location / {
        try_files $uri @client;
    }

    location @client {
        proxy_pass http://client:8081;
    }

    location @server {
        proxy_pass http://server:8080/api/v1/;
    }

}

【问题讨论】:

  • 您的问题是什么?您能否更具体地说明您的设置中哪些地方工作不正常?
  • @AlexanderAzarov 我的设置不起作用。我做错了什么将是问题

标签: docker nginx docker-compose


【解决方案1】:

如果您必须使用命名位置,那么您可以使用下面的error_page 方法。

通过returning 未使用 HTTP 状态代码和error_page 将这些代码设置为命名位置,我们可以将请求转发到这些命名位置:

server {
  server_name example.com;

  listen 80;
  listen [::]:80 ipv6only=on;

  return 301 https://example.com$request_uri;
}

server {
    server_name example.com;

    listen 443 ssl;

    ssl_certificate     /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    ...

    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;

    error_page 350 = @client;
    error_page 351 = @server;

    location /api/v1/ {
        return 351;
    }

    location / {
        return 350;
    }

    location @client {
        proxy_pass http://client:8081;
    }

    location @server {
        proxy_pass http://server:8080/api/v1/;
    }

}

【讨论】:

  • Danila,感谢您的回答,但可能有更好的方法来解决此问题。实际上,@client 和 @server 是已知主机,因此无需将它们作为错误页面重定向。
  • 如果您需要使用这些命名位置,我认为我的解决方案是唯一可行的。如果没有,那么显然您可以直接将proxy_pass-es 直接放入/ 和/api/v1/(同时完全删除命名位置)。否则,您可以使用第三方模块echo(查看echo_exec 指令)。最后,error_page 没有实际错误。实际上,它只是一个用于处理特定 HTTP 状态码的指令名称。
猜你喜欢
  • 2013-02-20
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2021-09-06
相关资源
最近更新 更多