Nginx、代理传递到 Apache 和 SSL

Nginx、代理传递到 Apache 和 SSL

我已设置 Nginx 和 Apache,其中 Nginx 代理将除静态资源之外的所有内容传递给 Apache。我已为端口 80 设置了一台服务器,如下所示:

server {
    listen 80;
    server_name *.example1.com *.example2.com;

    [...]

    location ~* \.(?:ico|css|js|gif|jpe?g|png|pdf|te?xt)$ {
        access_log off;
        expires max;
        add_header Pragma public;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        add_header Vary: Accept-Encoding;
    }

    location / {
        proxy_pass      http://127.0.0.1:8080;
        include /etc/nginx/conf.d/proxy.conf;
    }
}

而且由于我们有多个 SSL 站点(具有不同的 SSL 证书),因此我server{}为每个站点都设置了一个块,如下所示:

server {
    listen 443 ssl;
    server_name *.example1.com;

    [...]

    location ~* \.(?:ico|css|js|gif|jpe?g|png|pdf|te?xt)$ {
        access_log off;
        expires max;
        add_header Pragma public;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        add_header Vary: Accept-Encoding;
    }

    location / {
        proxy_pass      https://127.0.0.1:8443;
        include /etc/nginx/conf.d/proxy.conf;
        proxy_set_header X-Forwarded-Port 443;
        proxy_set_header X-Forwarded-Proto https;
    }
}

server {
    listen 443 ssl;
    server_name *.example2.com;

    [...]

    location ~* \.(?:ico|css|js|gif|jpe?g|png|pdf|te?xt)$ {
        access_log off;
        expires max;
        add_header Pragma public;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        add_header Vary: Accept-Encoding;
    }

    location / {
        proxy_pass      https://127.0.0.1:8445;
        include /etc/nginx/conf.d/proxy.conf;
        proxy_set_header X-Forwarded-Port 443;
        proxy_set_header X-Forwarded-Proto https;
    }
}

首先,我认为这里有一个非常明显的问题,那就是我对所有内容进行了双重加密,首先是在 nginx 级别,然后再次由 Apache 加密。更糟糕的是,我刚刚开始使用 Amazon 的 Elastic Load Balancer,因此我将证书添加到 ELB,现在 SSL 加密进行了三次。这对性能来说一定很糟糕。

处理此问题的明智方法是什么?我应该在 ELB 上转发 https -> 在 nginx 上转发 http -> 在 apache 上转发 http 吗?

其次,上面有太多重复。最好的方法是不是将所有静态资产处理都放在一个包含文件中,然后直接将其包含在服务器中?

答案1

第一部分:传递加密流量

只让第一台服务器“终止”来自客户端连接的 SSL 是可以的。您应该设置一个由您控制的机器,使其能够以受信任的方式(例如在专用网络上)交换流量,而不必一遍又一遍地运行 SSL。SSL 实际上仅用于传输安全。浏览器 -> 第一个 Web 服务器是不受信任的传输。Web 服务器 -> 内部服务应该值得信赖,因为您还将与文件服务器、数据库服务器甚至其他服务器(如 memcache、redis 等)进行通信。

第二部分:nginx 配置重复

nginx 的 include 语句允许非常自由的重用形式,我可以看到您已经开始使用它 - 继续重构该配置,直到它看起来“正确”。此外,nginx 的变量扩展非常有用,可以制作出很好的可重用包含,而不会留下混乱。

相关内容