Shiny Server应用初始化时无法加载digest包的问题求助
看起来你遇到的核心矛盾是:明明已经在服务器上安装了digest包,且它存在于你查询到的库路径中,但Shiny Server运行应用时就是无法加载它。结合日志里的su提示和renv环境的情况,我给你几个实用的排查和解决思路:
1. 确认Shiny Server运行时的实际库路径
你在控制台查询的.libPaths()是当前登录用户的环境,但Shiny Server通常是用shiny用户来运行应用的,两者的环境可能完全不一样。你可以在应用的global.R(或者app_ui.R的最开头)添加一段调试代码:
# 打印运行时的库路径和已安装包 cat("Current lib paths:\n") print(.libPaths()) cat("\nInstalled packages:\n") print(installed.packages()[, "Package"])
然后重启Shiny Server,查看日志(一般在/var/log/shiny-server/目录下),确认运行时的库路径是否包含那两个存放digest的目录。如果不包含,说明Shiny Server的运行环境没有加载到正确的库路径。
2. 修复Shiny Server的用户配置冲突
日志里的su: ignore --preserve-environment, it's mutually exclusive to --login提示非常关键——这说明你的Shiny Server配置里同时用了--preserve-environment和--login选项,这两个选项是互斥的,会导致环境变量被强制重置,进而影响renv的激活和库路径的加载。
你可以打开/etc/shiny-server/shiny-server.conf,找到类似这样的配置行:
run_as shiny --preserve-environment;
把它改成:
run_as shiny;
保存后重启Shiny Server(执行sudo systemctl restart shiny-server),再测试应用是否能启动。
3. 确保renv环境正确同步且权限正常
因为你用了renv管理依赖,可能存在环境未同步或者权限不足的问题:
- 首先切换到应用目录,以
shiny用户的身份重新恢复renv环境:
这样能确保所有依赖(包括sudo su - shiny -c "cd /var/www/others/formations_vne/shiny/vigie-analyse && R -e 'renv::restore()'"digest)都正确安装到renv的库路径,且shiny用户拥有访问权限。 - 检查应用目录下的
.Rprofile文件,确认里面有source("renv/activate.R")这一行——这是启动时激活renv环境的关键配置。
4. 检查digest包的文件权限
即使包存在,如果shiny用户没有读取权限,也会加载失败。你可以用以下命令检查权限:
ls -l /var/www/others/formations_vne/shiny/vigie-analyse/renv/library/R-4.0/x86_64-pc-linux-gnu/digest
如果权限显示只有所有者能读,你可以调整权限让其他用户也能访问:
sudo chmod -R 755 /var/www/others/formations_vne/shiny/vigie-analyse/renv/library/R-4.0/x86_64-pc-linux-gnu/digest
5. 临时禁用renv排查问题
如果上面的方法都没解决,可以临时禁用renv来排除环境问题:
- 把应用目录下的
.Rprofile重命名(比如改成.Rprofile.bak),这样启动时就不会激活renv。 - 确保
shiny用户能访问全局安装的digest包(你可以用sudo su - shiny -c "R -e 'library(digest)'"测试)。 - 重启Shiny Server,如果应用能启动,说明问题肯定出在renv的环境配置上,再回到步骤3仔细排查renv的同步和激活。
内容的提问来源于stack exchange,提问作者sbenateau

