You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:31:58