【发布时间】:2021-11-22 17:38:55
【问题描述】:
我们有一个 Ruby/Rails 网站,我们正在从 Heroku 迁移到 AWS。原始开发人员不可用。我现在正在尝试完成迁移。我的背景是 Windows / .NET 世界。这个 Linux / Ruby/Rails 环境对我来说很陌生......
这是我设置的当前环境:
53 号公路
| Record Name | Record Type | Alias | Alias Route Traffic To |
|---|---|---|---|
| foo.example.com | A | yes | cloudfront: xyz.cloudfront.net |
云端
| Domain Name | Alternate Domain Names | Origin Domain | Origin Protocol | Behavior Protocol |
|---|---|---|---|---|
| xyz.cloudfront.net | foo.example.com | foo.us-west-2.elb.amazonaws.com | HTTP only | Redirect HTTP to HTTPS |
CloudFront 分布:
- 使用 AWS 颁发的 SSL 证书
- 处理 http 到 https 的重定向
- 通过http(不是https)将请求转发到ELB
负载均衡器
| DNS Name | Listener Rule | Forward To |
|---|---|---|
| foo.us-west-2.elb.amazonaws.com | HTTP 80: default action | Target Group: foo-ec2 |
Target Group: foo-ec2 包含一个运行 nginx/1.18.0 + Phusion Passenger 6.0.10 的 Ubuntu ec2 实例,用于为 Ruby/Rails 站点提供服务。
nginx 配置
server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL Config - we should NEVER receive 443/https traffic;
# CloudFront manages https traffic => AWS ELB => http to this server
#listen 443 ssl default_server;
#listen [::]:443 ssl default_server;
server_name foo.example.com
foo.us-west-2.elb.amazonaws.com;
# Tell Nginx and Passenger where the app's 'public' directory is
root /var/www/foo_example/public;
# Turn on Passenger
passenger_enabled on;
passenger_app_env production;
passenger_ruby /home/ubuntu/.rbenv/versions/2.6.8/bin/ruby;
}
问题
rails 应用程序启动时没有错误,并通过 https 提供服务。但是,当用户尝试登录/验证时,Devise gem 会使用 http 和 ELB 的 DNS 名称发回重定向。
示例
登录请求
Request URL: https://foo.example.com/users/sign_in
Request Method: POST
Status Code: 302
登录响应
location: http://foo.us-west-2.elb.amazonaws.com/users
server: nginx/1.18.0 + Phusion Passenger(R) 6.0.10
status: 302 Found
请注意,请求是通过 https 和我们的域:
https://foo.example.com
但现在我们已经结束了 http 和 ELB 的域:
http://foo.us-west-2.elb.amazonaws.com
我的假设
devise gem 从 ELB 中查看主机,然后从 ELB 主机生成 URL,从而产生两个问题:
- 我们现在使用 http,因为 ELB 通过 http 与 ec2 实例通信
- 我们现在使用的是 ELB 的主机名 foo.us-west-2.elb.amazonaws.com,而不是我们的名称 foo.example.com
我查看了devise 文档,看看我们是否可以在创建回帖时传入要使用的 http 协议和域,但我的 ruby 知识有限。另外,我认为这将是“坏”的道路; “好的”路径是让 AWS ELB 转发实际的域名,而不是它自己的。
我已经查看了几个具有类似问题的 SO 和相关堆栈站点,但我要么以无限循环重定向结束,要么各种配置更改导致 devise gem 的相同行为造成错误网址回发。
这两个问题似乎是最接近的,但我不太能够在答案和我对这个生态系统的有限知识之间建立“联系”。
- AWS Cloudfront + Load Balancer, url changes from main domain to load balancer subdomain
- cloudfront domain replaced by application load balancer dns name when redirecting from http to https
问题
如何让 AWS ELB 将我们的域 foo.example.com 转发到 ec2 目标组而不是 ELB 的域?
【问题讨论】:
标签: ruby-on-rails nginx devise amazon-cloudfront amazon-elb