Azure 应用服务中的 Nginx 反向代理问题

Azure 应用服务中的 Nginx 反向代理问题

我已经为一个问题苦苦挣扎了几个星期,但我的知识还不够丰富,甚至不知道我试图实现的目标是否可行。FusionAuth 论坛并没有提供太多帮助,Azure 支持也没有提供太多帮助,除了应用服务配置帮助之外,它做不了什么。

简要说明一下我想要实现的目标。我在 App Service Linux 容器中运行 FusionAuth。它有一个类似于https://mycustomapp.azurewebsites.net,但我设置了一个自定义域https://auth.mycustomapp.com

FusionAuth 默认在其容器内监听端口 9011。这是 http 端口。在生产中运行时,我收到此警告:

在此处输入图片描述

FusionAuth 针对此问题推荐的解决方案是在应用程序前面设置一个反向代理来添加正确的请求标头。

我一直在尝试在同一应用服务计划中的另一个应用服务 Linux 实例中配置 Nginx 反向代理。容器正在使用 nginx:latest,我正在将我的自定义配置文件以及 SSL 证书复制到容器中。我还为此应用设置了一个自定义域,在 proxy.mycustomapp.com 上运行。

我的配置看起来像这样:

server {
    if ($host = proxy.mycustomapp.com) {
        return 301 https://$host$request_uri;
    }
    listen 0.0.0.0:80;
    server_name proxy.mycustomapp.com;
    return 404;
}

server {
  listen 443 ssl;
  server_name proxy.mycustomapp.com;

  access_log /var/log/nginx/mycustomapp.com.log;

  ssl_certificate /etc/nginx/ssl/auth.mycustomapp.com-chain.pem;
  ssl_certificate_key /etc/nginx/ssl/auth.mycustomapp.com-key.pem;
  ssl_dhparam /etc/nginx/ssl/dhparam.pem;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_ciphers HIGH:!aNULL:!MD5;

  location / {
    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;
    proxy_set_header        X-Forwarded-Port $server_port;
    proxy_read_timeout      90;
    proxy_http_version      1.1;

    proxy_pass https://mycustomapp.azurewebsites.net/;
  }
}

我的 nginx 服务器启动没有问题,但是当导航到 proxy.mydomain.com 时,我收到浏览器错误,提示页面重定向次数过多。

在此处输入图片描述

首先,我想做的事情是否可行,如果可行,我的配置有什么问题?

答案1

我认为你的 http 块不正确,请尝试以下操作:

server {
    listen 80;
    listen [::]:80;
    server_name proxy.mycustomapp.com;
    location / {
        return 301 https://$host$request_uri;
    }
}

答案2

拔掉头发 3 周后我才明白过来。这里有两个问题。

  1. Azure 应用服务 TLS/SSL 请求永远不会到达应用。它们在前端终止。这解释了为什么只有监听 80 的服务器块被命中,而其他服务器块没有被命中。

  2. 由于我代理到外部主机,因此我需要替换proxy_set_header 主机 $host;proxy_set_header 主机 $proxy_host;

考虑到这些要点,我可以删除监听 443 的服务器块,只保留监听 80 的服务器块。我的最终代码如下所示:

server {
  listen 0.0.0.0:80;
  server_name proxy.mycustomapp.com;

  location / {
      proxy_set_header        Host $proxy_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;
      proxy_set_header        X-Forwarded-Port '443';
      
      proxy_pass https://mycustomapp.azurewebsites.net/;
  }
}

相关内容