【问题标题】:nginx docker container on aws ecs >> The plain HTTP request was sent to HTTPS portaws ecs 上的 nginx docker 容器 >> 普通 HTTP 请求已发送到 HTTPS 端口
【发布时间】:2020-02-23 13:04:45
【问题描述】:

我有一个在 aws ecs ec2 实例上运行的前端 Angular 应用程序,并且两者都连接到网络负载均衡器的 TCP 端口 443 和 80。我将在这个具有多个域名的 nginx docker 容器上配置许多 vhost。在 ecs 服务中,负载均衡的容器被指定为端口 443。我们必须选择容器的端口 443 或 80 来进行负载均衡。 https://prnt.sc/pocu41。在 https 上,网站加载正常。但是在http上我得到了错误

The plain HTTP request was sent to HTTPS port

我打算在 docker 容器上使用 ssl 证书,而不是在负载均衡器上使用 ssl。如果我在负载均衡器上选择 ssl,那么我们需要在应用程序负载均衡器默认证书中使用多域 ssl,并且在有数百个域时可能不可行。

我的 Nginx 配置文件看起来像这样

server {
        listen 80;
        server_name  example.com;

        root   /usr/share/nginx/html/docroot;
        index  index.html index.htm;
        include /etc/nginx/mime.types;

        gzip on;
        gzip_min_length 1000;
        gzip_proxied expired no-cache no-store private auth;
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        location / {
            try_files $uri $uri/ /index.html;
        }
    }


server {
    listen 443 ssl;
    listen [::]:443 ssl;

    ssl on;
    ssl_certificate /etc/nginx/ssl/example.com/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com/example.com.key;

    server_name  example.com;
    root           /usr/share/nginx/html/docroot;
    index          index.html;
    location / {
                try_files $uri $uri/ =404;
        }

}

知道我们如何解决这种情况吗?

【问题讨论】:

    标签: docker nginx amazon-ecs aws-load-balancer aws-application-load-balancer


    【解决方案1】:

    我打算在 docker 容器上使用 ssl 证书和 不是负载均衡器上的 ssl。如果我在负载均衡器上选择 ssl 然后我们需要在应用程序负载均衡器中使用多域 ssl 默认证书,当有数百个时可能不可行 域。

    您的这个假设似乎不正确,您可以从 LB 创建* 证书,也可以配置multiple from ACM as well。您可以将 AWS ACM 与负载均衡器一起使用,而且它完全免费,为什么我还要费心在应用程序级别管理 SSL?如果不需要 NLB,当我可以使用应用程序 LB 进行重定向时,为什么我应该在应用程序级别打开端口 80?

    AWS 证书管理器定价

    通过 AWS 证书预置的公共 SSL/TLS 证书 经理是免费的。您只需为创建运行的 AWS 资源付费 你的申请。

    certificate-manager-pricing

    第二个使用NLB的特殊原因?对于 Web 应用程序,我永远不会选择网络平衡器,NLB 对 TCP 级通信有意义,但我会选择 application LB 进行 HTTP 通信,它提供高级路由,如主机基础路由、重定向和基于路径 路由,这将消除对 Nginx 的需求。

    容器专为轻量级任务而设计,AWS 建议内存在 300-500MB 左右,CPU 建议相同。

    您知道在容器级别终止 SSL 的成本吗?

    SSL 流量可能是计算密集型,因为它需要对流量进行加密和解密。 SSL 依靠公钥加密来加密客户端和服务器之间的通信,从而安全地跨网络发送消息。

    在 LB 级别终止 SSL 的优势

    需要在负载平衡器处终止 SSL,因为解密是资源和 CPU 密集型的。 将解密负担放在负载平衡器上,使服务器能够将处理能力用于应用程序任务,这有助于提高性能。它还简化了 SSL 证书的管理。

    new-tls-termination-for-network-load-balancers

    ssl-termination

    10-tips-to-improve-the-performance-of-your-aws-application

    因此,基于此,我不会像@Linpy 建议的那样回答您的问题,如果您仍然想去,您也可以这样做dealing-with-nginx-400-the-plain-http-request-was-sent-to-https-port-error

    【讨论】:

    • 是的,我明白了,我使用的是应用程序负载平衡器 ssl 证书。但是当我们有多个域名(如 domain1.com、domain2.com 等)指向同一个容器时,我们可以使用默认规则来路由该请求,但它会采用负载均衡器上的默认 ssl,这可能是单个证书领域。负载均衡器也有 100 个规则和 25 个证书的限制。我认为使用多域 ssl 证书作为默认 ssl 证书可以在一定程度上有所帮助。
    • 如果您达到了 aws 设置的所有这些限制,那么这意味着应用程序设计存在问题,您将如何扩展此类与 nginx 配置紧密相关的应用程序?你将如何处理 DDOS?您将如何处理大量请求?最好审查应用程序设计并让这些东西负载均衡器
    猜你喜欢
    • 1970-01-01
    • 2015-09-08
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多