Nginx反向代理下Plumber POST API返回404错误求助
Plumber API在Ubuntu 22.04升级+PHP安装后404故障排查
原本在DigitalOcean的Nginx上正常运行的Plumber API,在安装PHP 8.0.2并将Ubuntu升级至22.04(配置文件被覆盖重配)后失效。当前状态:
- R进程已正常监听3000端口
- myApi-plumber.service配置指向该端口
- 本地直接访问
http://127.0.0.1:3000返回404错误(预期是POST API的405 Method Not Allowed) - 未修改plumber.R文件,本地运行正常,排除代码问题
- 已尝试:统一尾斜杠、重启Nginx、重启Droplet、重建环境、配置防火墙,均无效
相关配置信息
Nginx配置
版本:Nginx 1.18.0/etc/nginx/sites-available/default内容:
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.php index.html; server_name _; location / { try_files $uri $uri/ =404; } location /myApi/ { proxy_pass http://127.0.0.1:3000/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; }
本地curl测试结果
执行命令:curl -i http://127.0.0.1:3000
预期:返回405 - Method not allowed
实际返回:
HTTP/1.1 404 Not Found Date: Fri, 27 Jan 2023 13:11:52 GMT Access-Control-Allow-Origin: * Content-Type: application/json Content-Length: 36
前端POST请求情况
前端AJAX代码:
function foo(myCallback) { $.ajax({ type: "POST", url: "http://XX.XX.XX.XX/myAPI/", data: myAPIString, dataType: "json", success: myCallback, }) }
浏览器返回:404 xhr错误
进程监听状态
执行命令:sudo lsof -i -P -n | grep LISTEN
输出:
R 717 root 15u IPv4 XXXXX 0t0 TCP 127.0.0.1:3000
Systemd服务状态
plumber-API.service状态:
plumber-API.service - Plumber API Loaded: loaded (/etc/systemd/system/plumber-API.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2023-01-27 10:40:03 UTC; 2h 45min ago Main PID: 717 (R) Tasks: 4 (limit: 1131) Memory: 210.8M CGroup: /system.slice/plumber-myTree.service └─717 /usr/lib/R/bin/exec/R --no-echo --no-restore -e pr~+~<-~+~plumber::pr('/var/plumber/myApi/plumber.R');~+~pr$setDocs(FALSE);~+~~+~pr$run(port=3000) Jan 27 10:40:03 ShakenPolygamy systemd[1]: Started Plumber API. Jan 27 10:40:10 ShakenPolygamy Rscript[717]: Loading required package: maps Jan 27 10:40:13 ShakenPolygamy Rscript[717]: Running plumber API at http://127.0.0.1:3000
排查与修复步骤
1. 检查Plumber API路由加载情况
- 临时修改服务启动命令,去掉
pr$setDocs(FALSE),重启服务后访问http://127.0.0.1:3000/__docs__,确认API路由是否正确加载 - 直接访问API的具体端点(如
http://127.0.0.1:3000/your-endpoint),验证是否能正常响应
2. 修复Nginx配置语法错误
当前Nginx配置的location /myApi/块未闭合(缺少}),会导致配置失效。修复后执行:
sudo nginx -t # 验证配置语法 sudo systemctl restart nginx
同时补充完整代理头信息,确保Plumber能正确识别请求:
proxy_set_header Host $host:$server_port; 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;
3. 验证Plumber服务的文件路径与权限
- 确认plumber.R文件存在且权限正确:
ls -l /var/plumber/myApi/plumber.R,确保R进程用户有读取权限 - 手动执行服务启动命令,查看控制台是否有加载错误:
/usr/lib/R/bin/exec/R --no-echo --no-restore -e "pr <- plumber::pr('/var/plumber/myApi/plumber.R'); pr$setDocs(FALSE); pr$run(port=3000)"
4. 检查系统权限限制
- 确认3000端口无其他进程占用:
sudo ss -tulpn | grep 3000 - 检查AppArmor/SELinux是否限制R进程网络访问:
若启用,可临时关闭测试,或添加规则允许R进程监听端口。sudo aa-status sudo sestatus
5. 调整Nginx请求转发规则
若默认location /的try_files规则拦截请求,可修改为:
location / { try_files $uri $uri/ @proxy_api; } location @proxy_api { proxy_pass http://127.0.0.1:3000; }
(注:此配置适用于API为站点主要服务的场景,否则保持原有/myApi/代理配置即可)
内容的提问来源于stack exchange,提问作者onthedl
相关产品推荐
相关产品推荐

