使用NGINX作为R Shiny应用反向代理时返回404错误求助
核心原因
原生通过shiny::runApp(包括runExample)启动的单实例Shiny应用默认仅处理根路径/下的请求,你当前的Nginx配置会将/hello路径完整转发给后端3001端口的Shiny服务,服务端无对应路由就会返回404。
你之前用Shiny Server代理无异常,是因为Shiny Server原生支持多应用按路径区分,自带前缀路由处理逻辑,和原生启动的单实例服务运行逻辑不同。
可行解决方案
方案1:调整Nginx配置,重写转发路径
修改location规则,将路径中的/hello前缀剔除后再转发给Shiny服务,同时补充必要的请求头配置避免资源加载异常:
location /hello/ { # 剔除/hello前缀后转发 rewrite ^/hello/(.*)$ /$1 break; proxy_pass http://localhost:3001; # 保留WebSocket相关配置 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 补充基础代理头 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; }
注意location后缀的/不要遗漏,保证路径匹配逻辑一致。
方案2:启动Shiny时直接指定路由前缀
无需修改Nginx配置,启动Shiny应用时增加appsPath参数,让服务本身适配/hello路径:
R -e "shiny::runExample('01_hello', host = '0.0.0.0', port = 3001L, appsPath = '/hello')"
内容的提问来源于stack exchange,提问作者cmhh
相关产品推荐
相关产品推荐

