FastAPI Azure 容器应用程序的 Nginx 反向代理返回 404

问题描述 投票:0回答:1

我正在尝试在 Azure 容器应用程序上设置 nginx 反向代理。我在容器应用程序环境中有一个 nginx 容器和一个 FastAPI 容器,具有简单的手动虚拟网络 + 子网 + 私有 DNS 区域。 nginx 入口设置为外部,API 入口设置为内部。

当我转到 nginx 容器的公共 URL 时,我看到蓝色的 Azure 屏幕:

“错误 404 - 此容器应用程序已停止或不存在。”

我可以访问 nginx 容器本身,因为我在 nginx 配置中包含了一个 /nginx 位置,该位置提供了一个我可以访问的 html 文件。

我还可以从 nginx 容器内访问 API 容器:当我附加到 Azure 上的 nginx 容器应用程序时,我可以在 http://api-container:80 处卷曲 API 并获得预期的响应。

这让我觉得 nginx 配置存在(特定于 Azure 的?)问题。 nginx 反向代理也可以在本地与 Docker Compose 配合使用。

一些建议将不胜感激! nginx 配置如下所示:

error_log /var/log/nginx/error.log debug;

worker_processes auto;

events {
    worker_connections 1024;

}

http {

    upstream chat_api_group {
        server chat-api:80; # Container name
    }
    
    server {
        listen 80;

        # Forward all requests to the chat api webserver
        location / {
            proxy_pass http://chat_api_group/;

            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            
            proxy_http_version 1.1;
            proxy_ssl_server_name on;

            # For some people these lines helped, for me they don't
            proxy_pass_request_headers on;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_redirect off;
            proxy_buffering off;

        }


        # To verify that the nginx server is running regardless of its proxy forwarding
        location /nginx {
            alias /usr/share/nginx/html/;
            index index.html;
        }
    }
}
azure nginx reverse-proxy azure-container-apps
1个回答
0
投票

我必须手动将 Host 标头设置为主机名(在我的例子中是容器名称):

proxy_set_header Host chat-ui;  # Set Host header explicitly to chat-ui

当我从 nginx 容器内运行

nslookup <api-container-name>
时,我注意到
curl <resolved-ip-address>
给出了 404,而
curl <api-container-name>
给出了 200。

我不完全明白发生了什么,但似乎Azure的内部路由系统使用Host标头来找到正确的服务,并且该服务的内部IP并不意味着直接使用。我猜 nginx 将 Host 标头设置为自身,而不是它转发到的容器。

如果有人有更好的解释,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.