Nginx子域配置,加载API定义失败

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

我在为子域配置 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;
        }
    }
}

我错过了什么?

nginx fastapi config subdomain
2个回答
0
投票

我制定了一个临时解决方案,当我请求 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 给了我关于问题根源的正确提示,但我不想在这里更改内部链接。


-1
投票

swagger 端点期望从

/openapi.json
加载 openapi 规范 - 因为您已将子路径直接安装在
/
上,所以根目录下不再存在
openapi.json

您可以通过在创建 FastAPI 实例时提供

openapi_url
参数来更改 FastAPI 公开 openapi 规范的位置:

FastAPI(openapi_url="/docs/openapi.json")

但是,这意味着

/docs
端点可能会尝试从文档本身下的
/docs
加载它,因此您可能必须手动定义要使用的 url。

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