Flask Restplus Swagger 不在 Nginx 后面加载
Flask Restplus Swagger Not Loading Behind Nginx
我有一个 Flask API 和一个用 Flask Restplus 生成的 Swagger UI。 API 在 Nginx 容器后面的 Docker 容器中运行,该容器通过 HTTP 为它提供服务。
这是一个健康检查端点,它确认 API 是 运行:https://mobydq.net/mobydq/api/v1/health
{"message":"MobyDQ API running in production mode"}
然而,应该在以下 URL 加载的 Swagger 根本没有加载:https://mobydq.net/mobydq/api/doc
这里是 Nginx 配置:
http {
upstream api {
server api:5434;
}
upstream app {
server app:3000;
}
# Server for https
server {
listen 443 ssl http2;
server_name mobydq.net;
ssl_certificate /etc/letsencrypt/live/mobydq.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mobydq.net/privkey.pem;
# Location for MobyDQ Flask API
location /mobydq {
limit_req zone=default burst=20;
proxy_pass http://api;
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-Proto $scheme;
}
# Location for MobyDQ Web App
location / {
limit_req zone=default burst=20;
proxy_pass http://app;
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-Proto $scheme;
}
}
# Default server to redirect http requests to https
server {
listen 80 default_server;
server_name mobydq.net;
listen [::]:80 default_server;
location ~ /.well-known {
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}
}
知道为什么 Swagger 没有加载吗?我查看了加载页面时发送的 http 请求,但没有太大帮助。我只能看到图标加载:
我也查看了控制台并看到了一个错误,但我无法说出它的含义:
问题是 Nginx 在尝试从 Swagger(特别是 JSON 配置文件)获取资源时没有正确重定向 http 请求。
问题已通过更改 Nginx 配置解决,如下所示:
[...]
# Location for MobyDQ Flask API
location ~ ^/(mobydq|swaggerui) {
limit_req zone=default burst=20;
proxy_pass http://api;
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-Proto $scheme;
}
[...]
我有一个 Flask API 和一个用 Flask Restplus 生成的 Swagger UI。 API 在 Nginx 容器后面的 Docker 容器中运行,该容器通过 HTTP 为它提供服务。
这是一个健康检查端点,它确认 API 是 运行:https://mobydq.net/mobydq/api/v1/health
{"message":"MobyDQ API running in production mode"}
然而,应该在以下 URL 加载的 Swagger 根本没有加载:https://mobydq.net/mobydq/api/doc
这里是 Nginx 配置:
http {
upstream api {
server api:5434;
}
upstream app {
server app:3000;
}
# Server for https
server {
listen 443 ssl http2;
server_name mobydq.net;
ssl_certificate /etc/letsencrypt/live/mobydq.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mobydq.net/privkey.pem;
# Location for MobyDQ Flask API
location /mobydq {
limit_req zone=default burst=20;
proxy_pass http://api;
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-Proto $scheme;
}
# Location for MobyDQ Web App
location / {
limit_req zone=default burst=20;
proxy_pass http://app;
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-Proto $scheme;
}
}
# Default server to redirect http requests to https
server {
listen 80 default_server;
server_name mobydq.net;
listen [::]:80 default_server;
location ~ /.well-known {
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}
}
知道为什么 Swagger 没有加载吗?我查看了加载页面时发送的 http 请求,但没有太大帮助。我只能看到图标加载:
我也查看了控制台并看到了一个错误,但我无法说出它的含义:
问题是 Nginx 在尝试从 Swagger(特别是 JSON 配置文件)获取资源时没有正确重定向 http 请求。
问题已通过更改 Nginx 配置解决,如下所示:
[...]
# Location for MobyDQ Flask API
location ~ ^/(mobydq|swaggerui) {
limit_req zone=default burst=20;
proxy_pass http://api;
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-Proto $scheme;
}
[...]