Nginx配置异常:/api请求被Node.js SSR拦截,无法转发至Rails API
解决Nginx中/api请求被Node.js SSR拦截的问题
你的核心问题是Nginx未优先将/api路径转发到Rails API,反而被Node.js SSR的/location拦截。结合你的配置,问题出在全局Passenger配置和location匹配优先级上,以下是具体修复方案:
修改后的Nginx配置
listen 80; server_name didsomeonesayfrankerz.com; passenger_friendly_error_pages on; passenger_app_group_name didsomeonesayfrankerz; passenger_min_instances 15; passenger_max_request_queue_size 200; passenger_app_env production; client_max_body_size 10M; # API server - 优先匹配/api路径 location ^~ /api { passenger_enabled on; passenger_app_type ruby; passenger_ruby /home/ost/.rvm/gems/ruby-3.0.0/wrappers/ruby; root /home/ost/didsomeonesayfrankerz/server/public; passenger_app_root /home/ost/didsomeonesayfrankerz/server; } # SSR 服务 location / { passenger_enabled on; root /home/ost/didsomeonesayfrankerz/client/dist/ssr; passenger_app_type node; passenger_nodejs /home/ost/.nvm/v18.16.0; passenger_startup_file /home/ost/didsomeonesayfrankerz/client/dist/ssr/index.js; } charset utf-8; location ~ /\.(?!well-known).* { deny all; }
关键修改说明
- 移除全局
passenger_enabled on:原全局开启会让所有location默认继承Passenger配置,导致不同应用的Passenger设置冲突,改为在每个需要的location单独启用。 - 给/api location添加
^~前缀:这个标记会让Nginx优先匹配所有以/api开头的请求,直接跳过后面的/location,彻底避免被SSR服务拦截。 - 添加
passenger_app_root:Passenger需要该参数明确Rails项目的根目录,确保正确加载Rails应用。 - 保持/api location在/之前:虽然
^~已保证优先级,这样的顺序让配置逻辑更清晰。
后续检查步骤
- 重启Nginx服务生效配置:
sudo systemctl restart nginx
- 验证Rails应用目录权限:确保Nginx进程用户(通常是www-data)能访问
/home/ost/didsomeonesayfrankerz/server目录及文件。 - 查看错误日志排查问题:如果仍有异常,检查
/var/log/nginx/error.log中的具体报错信息。
内容的提问来源于stack exchange,提问作者OST
相关产品推荐
相关产品推荐

