非 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.comwww.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

将 React 应用程序部署到 AWS

AWS CloudFront 重定向到路径

Docker + Gunicorn + Nginx + Django:将非 www 重定向到 AWS Route 53 上的 www