启动Phoenix生产服务器时遇SSL证书文件EACCESS权限拒绝
解决Phoenix生产环境HTTPS启动失败的问题
我来帮你排查这个SSL证书加载失败的问题,从你给出的错误日志来看,核心是Ranch(Cowboy的底层监听组件)无法正常读取SSL证书文件,咱们一步步来解决:
1. 先确认证书文件的路径与完整性
你的日志里certfile路径被截断了,首先要核实:
- 检查
/Users/FJ/projects/elixir/my_app/_build/prod/lib/my_app/priv/ssl/目录下,是否存在Let's Encrypt颁发的证书文件(通常是fullchain.pem和privkey.pem),文件名有没有拼写错误 - 可以直接用命令验证文件是否存在:
ls -l /Users/FJ/projects/elixir/my_app/_build/prod/lib/my_app/priv/ssl/
2. 检查证书文件的权限
生产环境下,运行Phoenix服务器的用户必须拥有证书文件的读取权限:
- 不要给文件设置过松的权限(比如
777),用chmod 644设置合理的可读权限即可:chmod 644 /Users/FJ/projects/elixir/my_app/_build/prod/lib/my_app/priv/ssl/*.pem - 同时要确保父目录的权限也允许运行服务器的用户访问(比如
priv/ssl目录权限至少为755)
3. 核对prod.exs中的SSL配置
打开config/prod.exs,找到Endpoint的HTTPS配置块,确保参数完全正确:
config :my_app, MyAppWeb.Endpoint, https: [ port: 443, cipher_suite: :strong, # 注意certfile指向fullchain.pem,keyfile指向privkey.pem,别搞混 certfile: "priv/ssl/fullchain.pem", keyfile: "priv/ssl/privkey.pem", # 如果需要OCSP Stapling,加上cacertfile指向chain.pem cacertfile: "priv/ssl/chain.pem" ]
- 建议使用绝对路径避免编译后路径混乱,比如把
certfile写成"/Users/FJ/projects/elixir/my_app/priv/ssl/fullchain.pem"
4. 确认证书文件已同步到prod构建目录
有时候mix编译生产环境时,priv目录的新文件(比如你刚添加的证书)可能没被自动复制到_build目录:
- 可以手动把证书文件复制到
_build/prod/lib/my_app/priv/ssl/目录,或者重新运行mix compile --prod(如果用release工具则运行mix release)来确保文件被正确打包
5. 验证证书与密钥的匹配性
用openssl命令检查证书和私钥是否配对:
# 提取证书的模值并计算MD5 openssl x509 -noout -modulus -in fullchain.pem | openssl md5 # 提取私钥的模值并计算MD5 openssl rsa -noout -modulus -in privkey.pem | openssl md5
两个命令输出的MD5值必须完全一致,否则说明证书和密钥不匹配,需要重新从Let's Encrypt获取有效证书对
另外,日志里显示Running MyAppWeb.Endpoint with Cowboy using http://:::4000,说明你的HTTP监听也在运行,生产环境建议配置HTTP重定向到HTTPS,或者直接关闭HTTP监听,不过这不是当前启动失败的直接原因。
内容的提问来源于stack exchange,提问作者fjahr
相关产品推荐
相关产品推荐

