CentOS 7服务器运行Shiny演示应用时Shiny Server崩溃求助
我看你在CentOS 7上部署了Shiny Server,能正常启动并看到欢迎页,但测试演示应用输入分箱数时服务器直接崩溃,Firefox提示无法连接,日志里只显示了启动监听的INFO信息,没有后续的崩溃详情。下面是几个实用的排查步骤和修复方案,你可以一步步尝试:
1. 捕获完整的崩溃日志
当前的/var/log/shiny-server.log只记录了启动信息,崩溃时的核心错误可能藏在系统日志里。你可以:
- 查看系统消息日志:
cat /var/log/messages | grep -i shiny - 查看Shiny Server的服务日志:
journalctl -u shiny-server.service -b(-b代表本次启动后的日志)
这些日志里可能会有进程崩溃的具体原因,比如内存不足、段错误或者依赖缺失。
2. 确认依赖包完整且可访问
演示应用用到的ggplot2(分箱绘图功能依赖它)和shiny包,必须确保Shiny Server的运行用户(默认是shiny用户)能正常访问。你可以切换到shiny用户重新安装依赖:
sudo su - shiny -c "R -e 'install.packages(c(\"shiny\", \"ggplot2\"), repos=\"https://cran.rstudio.com/\")'"
注意:不要用root用户安装包,否则shiny用户可能没有权限读取这些包。
3. 检查内存资源是否充足
当你输入较大的分箱数时,应用可能会占用大量内存,导致系统触发OOM(内存不足)杀死Shiny Server进程。你可以:
- 实时监控内存使用:测试时打开另一个终端运行
htop,观察内存占用变化 - 如果内存不足,要么升级服务器内存,要么在Shiny Server配置里限制单应用内存:
编辑/etc/shiny-server/shiny-server.conf,添加内存限制:
保存后重启Shiny Server:application / { app_dir /srv/shiny-server/; max_memory_usage 1024; # 限制每个应用最多使用1GB内存,单位MB app_init_timeout 300; app_idle_timeout 3600; }sudo systemctl restart shiny-server
4. 验证文件权限
Shiny Server运行用户shiny需要有演示应用目录的读取权限。检查权限:
ls -ld /srv/shiny-server/sample-apps/hello/ ls -l /srv/shiny-server/sample-apps/hello/
如果权限不足,调整权限:
sudo chown -R shiny:shiny /srv/shiny-server/sample-apps/ sudo chmod -R 755 /srv/shiny-server/sample-apps/
5. 排查SELinux的限制
CentOS 7默认开启SELinux,可能会阻止Shiny Server的文件访问或进程操作。临时关闭SELinux测试:
sudo setenforce 0
如果关闭后问题解决,就需要配置SELinux规则允许Shiny Server的正常操作:
sudo semanage fcontext -a -t httpd_sys_content_t "/srv/shiny-server(/.*)?" sudo restorecon -Rv /srv/shiny-server/
然后重新开启SELinux:sudo setenforce 1
6. 直接用R运行应用测试
跳过Shiny Server,直接用shiny用户运行演示应用,看是否会崩溃:
sudo su - shiny R -e 'library(shiny); runApp("/srv/shiny-server/sample-apps/hello/", port=3839)'
然后在浏览器访问http://你的服务器IP:3839,测试分箱数。如果这里也崩溃,说明问题出在R或依赖包上,你可以在R控制台里看到具体的错误信息,针对性修复。
内容的提问来源于stack exchange,提问作者Roee Anuar

