我们的应用程序托管在 EC2 上,但是由于应用程序的性质,它需要极高的可用性。我们有一个在 Linode 上运行的应用程序图像作为故障转移。
但是,对 Linode 进行 DNS 转换需要一些时间。我们想出了一个策略来最大限度地减少停机时间,但我想就如何最好地实施它提供一些建议。
该应用程序是一个 ROR 应用程序。我们在 EC2 上运行 6 个前端节点,并使用 Nginx 作为带有 proxy_pass 的负载均衡器。
然而,我们在 Linode 上的负载均衡器不会平衡到 Linode 节点,而是平衡到 EC2 节点。这样我们的 DNS 记录中就有了 Linode LB 的 IP。因此,当客户端连接时,DNS 循环到 EC2 或 Linode LB。然后,所选的 LB 会将请求重定向到 EC2 上的节点之一。在 EC2 中断的情况下,我们只需更改 Linode LB 的配置以平衡到它自己的节点(加上其他东西,如 DB 翻转等)。
我知道这对性能来说不是很好,但可靠性对我们来说更重要。
问题是,无论出于何种原因,Linode LB 都无法连接到 EC2。在这种情况下,Nginx 将返回 502 Bad Gateway 错误,这不会导致客户端使用 DNS 故障转移。
我们希望有一种方法可以强制客户端在出现这种情况时使用 DNS 回退。有没有办法做到这一点?最好使用 Nginx,但如果它不支持此功能,则会考虑其他解决方案。
谢谢!
我们使用 Nginx 作为 Rails 应用程序的负载均衡器。由于我们正在转向多云托管解决方案,我们希望我们的负载均衡器在将请求转发到前端时开始对每个连接使用 SSL,因为其中一些可能会通过 Internet。
我面临的问题是非 https 页面创建了一个重定向循环。这似乎是由于 X-Forwarded-Proto 标头设置不正确造成的。因此,当 rails 在 http 上收到一个请求时,它认为它是一个 https 请求,即使它不是,所以它会将它重定向到 http,并认为它是一个 https 请求等等。
没有多少谷歌搜索帮助我解决这个问题。所以我想知道:
谢谢!
user www-data;
worker_processes 2;
events {
worker_connections 1024;
use epoll;
}
http {
passenger_root /opt/ruby-enterprise/lib/ruby/gems/1.8/gems/passenger-3.0.2;
passenger_ruby /opt/ruby-enterprise/bin/ruby;
passenger_pool_idle_time 0;
passenger_max_pool_size 20; # Over all apps
passenger_min_instances 5; # Over each app
passenger_use_global_queue on;
rails_env production;
include mime.types;
default_type application/octet-stream;
log_format main '"$remote_addr", "$remote_user", "$time_local", "$request", '
'"$uid_got", "$uid_set", "$status", "$body_bytes_sent", "$http_referer", ' …Run Code Online (Sandbox Code Playgroud)