我正在尝试在 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;
}
}
}
我必须手动将 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 标头设置为自身,而不是它转发到的容器。
如果有人有更好的解释,请告诉我!