Docker Swarm单节点环境下Nginx配置问题:解决WordPress抢占/api路径无法访问FastAPI文档
修复Nginx配置让FastAPI /api路径正确转发
嘿,我懂你现在碰到的麻烦——WordPress把所有请求都给接管了,连你想留给FastAPI的/api路径也没放过。问题根源出在Nginx的代理转发配置上,咱们一步步来搞定它:
核心问题拆解
你当前location /api里写的proxy_pass http://backend:8888/api;会导致路径重复拼接:当你访问localhost/api/docs时,Nginx会把请求转发到http://backend:8888/api/api/docs,但FastAPI的文档页面是在根路径/docs下,这个拼接后的地址根本不存在,返回404之后,Nginx又 fallback 到了WordPress的首页规则,这就是为啥你看到的是WordPress页面。
修改后的完整Nginx配置
把你原来的Nginx配置里的location /api部分替换成下面的内容,其他规则保持顺序不变就行:
upstream php { server unix:/tmp/php-cgi.socket; server php:9000; } server { listen 80; server_name _; # 处理FastAPI的/api路径请求 location /api { # 关键:去掉proxy_pass后面的/api,用斜杠结尾,避免路径重复拼接 proxy_pass http://backend:8888/; # 配置必要的代理头,确保FastAPI能正确识别请求来源 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; # 关闭代理重定向和缓冲,提升API响应速度 proxy_redirect off; proxy_buffering off; } location / { root /var/www/html; index index.php index.html; try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; fastcgi_intercept_errors on; if ($uri !~ "^/images/") { fastcgi_pass php; } } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { root /var/www/html; expires max; log_not_found off; } }
额外要注意的点
- 验证FastAPI路由:确保你的FastAPI应用的路由是基于根路径
/的(比如/docs、/openapi.json),如果你的FastAPI本身挂载在/api路径下,那你需要把proxy_pass改成http://backend:8888/api/,但根据你访问/api/docs的需求,上面的配置是完全匹配的。 - 重启Nginx服务:修改配置后,记得在Docker Swarm里更新Nginx服务让新配置生效:
docker service update --force <你的nginx服务名称> - 检查WordPress固定链接:如果之后还是有问题,去WordPress后台的「设置-固定链接」里确认一下,有没有自定义规则把
/api路径映射到了WordPress的页面或帖子上。
这样修改之后,访问localhost/api/docs就会正确跳转到FastAPI的文档页面,其他路径则正常由WordPress处理啦。
内容的提问来源于stack exchange,提问作者O. Altun
相关产品推荐
相关产品推荐

