我在为子域配置 nginx 时遇到问题。 我的目标最终是:
- example.com
- swagger.example.com
- api.example.com
我目前在使用 swagger.example.com 时遇到问题。 我的后端是用 FastAPI 编写的,我希望来自 localhost:8000/docs 的 swagger 在该域上可用。 但我得到的只是无法加载 API 定义。 不知何故 api.example.com/docs 工作得很好,尽管我还没有在 nginx 中配置它。
user nginx;
worker_processes 4;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
server {
listen 80;
listen [::]:80;
server_name .example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name triptip.pro;
server_tokens off;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://example_service:8000;
proxy_ssl_session_reuse off;
proxy_set_header Host $http_host;
proxy_cache_bypass $http_upgrade;
proxy_redirect off;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name swagger.example.com;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://example_service:8000/docs;
proxy_ssl_session_reuse off;
proxy_set_header Host $http_host;
proxy_cache_bypass $http_upgrade;
proxy_redirect off;
}
}
}
我错过了什么?
我制定了一个临时解决方案,当我请求 swagger.example.com 时,它会重定向到正在工作的 swagger
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name swagger.example.pro;
ssl_certificate /etc/letsencrypt/live/api.example.pro/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.pro/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location = / {
return 301 https://$host/docs;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://example_service:8000;
proxy_ssl_session_reuse off;
proxy_set_header Host $http_host;
proxy_cache_bypass $http_upgrade;
proxy_redirect off;
}
}
但是如果我尝试通过返回 404 来阻止其他端点,或者更改“location /” 在某种程度上,由于缺少 openapi.json,再次出现 swagger 错误。
@MatsLindh 给了我关于问题根源的正确提示,但我不想在这里更改内部链接。
swagger 端点期望从
/openapi.json
加载 openapi 规范 - 因为您已将子路径直接安装在 /
上,所以根目录下不再存在 openapi.json
。
您可以通过在创建 FastAPI 实例时提供
openapi_url
参数来更改 FastAPI 公开 openapi 规范的位置:
FastAPI(openapi_url="/docs/openapi.json")
但是,这意味着
/docs
端点可能会尝试从文档本身下的 /docs
加载它,因此您可能必须手动定义要使用的 url。