如何配置Phoenix应用结合Nginx反向代理支持多域名访问?
配置Phoenix应用与Nginx支持多域名访问
要让单实例Phoenix应用处理多个域名的请求,需要分别调整Nginx反向代理配置和Phoenix应用自身配置,具体步骤如下:
一、修改Nginx配置
更新server块的域名匹配规则
找到你的Phoenix应用对应的Nginx server配置块,将原有的单个server_name替换为所有需要支持的域名(包括www前缀,若有需求):server { listen 80; listen [::]:80; server_name domain1.com www.domain1.com domain2.com www.domain2.com; # 启用HTTPS的场景,需补充SSL配置 listen 443 ssl http2; listen [::]:443 ssl http2; ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem; # 核心配置:传递真实请求的Host头给Phoenix location / { proxy_pass http://localhost:4000; # 指向Phoenix实例的运行地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }若需要分开记录不同域名的日志,也可以复制多个server块,每个块对应一个域名,但所有块的
proxy_pass都指向同一个Phoenix实例。更新SSL证书(启用HTTPS时)
如果使用Let's Encrypt生成证书,需重新申请包含所有域名的多域名证书:certbot certonly --nginx -d domain1.com -d www.domain1.com -d domain2.com -d www.domain2.com确保Nginx配置中的
ssl_certificate和ssl_certificate_key指向新生成的证书文件。
二、调整Phoenix应用配置
允许多个域名的Host请求
在Phoenix的生产环境配置文件(config/prod.exs)中,找到Endpoint配置项,修改check_origin参数,指定所有允许的域名(生产环境不建议直接设为false,避免安全风险):config :my_app, MyAppWeb.Endpoint, url: [scheme: "https", port: 443], # 移除硬编码的host,让应用动态获取请求域名 check_origin: [ "//domain1.com", "//www.domain1.com", "//domain2.com", "//www.domain2.com" ], # 保留其他原有配置...若为测试或完全信任的场景,可临时设置
check_origin: false允许任意域名访问。确保URL生成适配请求域名
移除Endpoint配置中硬编码的host值,这样Phoenix路由助手生成URL时会自动使用当前请求的Host,而非固定域名:# 错误示例:硬编码单个域名 # url: [host: "domain1.com", scheme: "https", port: 443] # 正确配置:动态匹配请求Host url: [scheme: "https", port: 443]重启Phoenix应用
配置修改后,重启应用使配置生效:# 假设使用systemd管理应用 sudo systemctl restart my_app
三、验证配置
- 重新加载Nginx配置:
sudo nginx -s reload - 分别访问每个域名,确认应用能正常响应,且页面内生成的URL与访问域名一致。
内容的提问来源于stack exchange,提问作者Duminamonri
相关产品推荐
相关产品推荐

