Play服务器启动遇java.nio.file.AccessDeniedException疑prod.conf密钥错误?
首先明确说:这个java.nio.file.AccessDeniedException异常和play.http.secret.key配置错误完全无关,也不是其他凭证配置的问题。从错误日志就能直接看出问题根源:Play服务器在初始化临时文件创建器时,无法在/tmp目录下创建名为playtemp5604435787006203928的临时目录,因为没有读写权限。
具体排查和解决步骤:
检查/tmp目录的权限设置
先通过终端执行命令查看/tmp的权限:ls -ld /tmp正常情况下,
/tmp的权限应该是drwxrwxrwt(带有粘性位t,允许所有用户读写自己创建的临时文件)。如果权限不符,执行以下命令修复:sudo chmod 1777 /tmp确认运行Play服务器的用户权限
确保启动Play服务器的系统用户对/tmp目录有读写权限。比如如果你用普通用户启动,但/tmp被意外设置了仅root可访问,就会触发这个错误。可以切换到启动服务器的用户,尝试手动在/tmp下创建一个测试文件验证:touch /tmp/test-play-perm如果这个命令失败,说明用户确实没有权限,需要调整用户权限或者切换到有权限的用户启动服务。
自定义Play的临时目录
如果无法修改系统/tmp的权限(比如受限于运维政策),可以在prod.conf中指定一个自定义的临时目录,要求这个目录已存在且运行服务器的用户有完全读写权限:play.temporaryFile.path = "/opt/play-app/temp"配置后记得创建这个目录并设置正确权限:
mkdir -p /opt/play-app/temp chown your-play-user:your-play-group /opt/play-app/temp chmod 755 /opt/play-app/temp排查系统级别的权限限制
如果上面的步骤都无效,可能是SELinux、AppArmor这类安全模块阻止了Play进程访问/tmp。可以临时关闭SELinux测试(仅用于排查):sudo setenforce 0如果重启服务器后正常了,就需要为Play进程添加SELinux规则,或者联系运维人员调整安全策略。
内容的提问来源于stack exchange,提问作者abby

