非 www 到 www 使用 AWS Elastic Load Balancer 和 Nginx
Posted
技术标签:
【中文标题】非 www 到 www 使用 AWS Elastic Load Balancer 和 Nginx【英文标题】:non www to www using AWS Elastic Load balancer and Nginx 【发布时间】:2013-03-28 16:37:17 【问题描述】:我有一个在 example.com 上运行的应用程序,现在我想将所有流量重定向到 www.example.com,因为我们正在与 Akamai 的 CDN 合作为您的网站。我的域停在 Route53 中,将 Elastic Load Balancer 的 CNAME 的 CNAME 添加到指向 *.example.com 并且我正在运行具有以下配置的 nginx Web 服务器。如果我使用此配置,ELB 会抛出实例,现在 domain.com 工作正常,www.domain.com 工作正常,但不会发生重定向。
server
listen 80;
server_name example.com;
# rewrite ^ http://www.example.com$request_uri? permanent;
root /home/ubuntu/apps/st/public;
passenger_enabled on;
但我无法实现重定向。
还尝试添加值为负载均衡器的 cname 的 PTR。
尝试更改nginx配置,如您所见
rewrite ^ http://www.example.com$request_uri? permanent
;
即使这样也行不通。
只要我添加了上述行,应用程序实例就会消失,ELB 就会从堆栈中抛出。
什么是解决方案,我从 3-4 天以来一直在努力实现这一目标,现在它变成了一场噩梦,请帮助我。我还在 aws 论坛中发布了帖子和主题,没有任何帮助。
【问题讨论】:
ELB 在这里并不是真正的变量。它只是盲目地将 HTTP 请求转发给实例。主机名无关紧要。 【参考方案1】:我在重定向时遇到了同样的问题(使用相同的 nginx conf 代码,如此处所示)。
然后,我将重定向配置作为最后一个 server 块(在我的 domain.com 配置文件的末尾),ELB 能够再次找到实例。
我没有进一步研究它,但似乎 vhost 处理是按顺序完成的,所以当 ELB 命中我的服务器的 IP 地址时,它会落在第一个定义的 server 块上,在我的例子中是重定向。 Nginx 抛出 301 返回码,ELB 吓坏了,因为它不是 200。
不过只是猜测。
所以,我的配置(真正的虚拟主机在上面,重定向在最后):
少 /etc/nginx/sites-enabled/domain.com
server
listen 80;
server_name domain.com;
.....
server
listen 80;
server_name www.domain.com;
return 301 http://domain.com$request_uri;
【讨论】:
【参考方案2】:我不熟悉 Amazon ELB,但也许我可以在 nginx 部分提供帮助。
对于您的场景,我通常在 nginx 中使用两个服务器块。一个处理重写/重定向(example.com),另一个处理常规站点(www.example.com)。两个块可以在同一个文件中。
# for redirecting only...
server
listen 80;
server_name example.com;
# re-written to www...
location /
rewrite ^(.*)$ $scheme://www.example.com$1 permanent;
# regular web site config here...
server
listen 80;
server_name www.example.com;
root /home/ubuntu/apps/st/public;
passenger_enabled on;
...
【讨论】:
chue x,我尝试了您在此处添加的更改,但它不起作用,当我点击 url 时,它显示,找不到网页。我是否错过了与上述更改一起需要进行的任何其他更改。 @ManjunathBavihal - 进行更改后是否重新启动了 nginx?关于错误信息,有没有提到nginx?我假设浏览器显示非 www url 地址? @chuex 如果我在 nginx 中重写或重定向 ELB 会将该实例抛出 ELB 并使其可访问 @JeevanDongre - 恐怕我根本不了解 ELB。上面的配置是一个非常简单的 nginx 配置,并且适用于我的网站。 @JeevanDongre - 只是一个想法。 ELB 是否根据地址 ping 您的站点?换句话说,它是否向example.com
或www.example.com
发出请求?如果它试图去第一个,你应该将它配置为去第二个。 (第一个将始终返回 http 301,第二个将返回 200)。这可能就是您的 Web 服务器被从集群中拉出的原因。【参考方案3】:
老问题,但因为它出现在搜索中。
现在可以使用 AWS 应用程序负载均衡器重定向到 www(或任何其他主机)。这可能比使用 nginx 配置更方便管理。
https://docs.aws.amazon.com/elasticloadbalancing/latest/application/listener-update-rules.html
【讨论】:
以上是关于非 www 到 www 使用 AWS Elastic Load Balancer 和 Nginx的主要内容,如果未能解决你的问题,请参考以下文章
使用负载均衡器在 AWS Elastic Beanstalk 上重定向所有 www 和 http ==>> 非 www https
使用 aws elastic beanstalk 将非 www 重定向到 www
eks使用efs dynamic provisioning 创建非root容器提示 Operation not permitted
Docker + Gunicorn + Nginx + Django:将非 www 重定向到 AWS Route 53 上的 www