【问题标题】:Setting up Varnish Apache2 HTTP & HTTPS Ubuntu 16.04将 Varnish Apache2 HTTP 设置为 HTTPS Ubuntu 16.04
【发布时间】:2020-11-18 15:25:08
【问题描述】:

我有 Apache2,在 HTTPS(443,让我们加密)和 HTTP(80)上有几个站点,Ubuntu 16.04 上的多个 CMS,CPUx16,mem=48G。其中一个 HTTPS (Wordpress) 超载 - 一个非营利性网站,显示带有照片/视频的孤儿档案并接收捐款(每天最多 10k 访问者)。如何设置 Varnish 以缓存照片/视频请求以减少磁盘负载?
这里是 Apache2 ports.conf:

Listen 80

<IfModule ssl_module>
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

如果能提供详细的回答,我将不胜感激。

【问题讨论】:

    标签: ubuntu ssl https varnish


    【解决方案1】:

    Apache 端口配置

    调整ports.conf,将Listen 80变成Listen 8080

    在您的 vhosts 中,您还必须将 &lt;VirtualHost *:80&gt; 转换为 &lt;VirtualHost *:8080&gt;

    然后运行sudo systemctl restart apache2 以确保这些更改生效。

    清漆设置

    请运行sudo systemctl edit --full varnish 编辑 Varnish 的运行时设置。

    请确保 Varnish 在 port 80 上运行常规 HTTP,port 8443 上运行PROXY protocol

    ExecStart=/usr/sbin/varnishd -a :80 -a :8443,PROXY -f /etc/varnish/default.vcl -s malloc,20G
    

    VCL 设置

    请创建/etc/varnish/letsencrypt.vcl并添加以下代码:

    vcl 4.0;
    
    backend certbot {
        .host = "127.0.0.1";
        .port = "8081";
    }
    
    sub vcl_recv {
        if (req.url ~ "^/\.well-known/acme-challenge/") {
            set req.backend_hint = certbot;
            return(pipe);
        }
    }
    
    sub vcl_pipe {
        if (req.backend_hint == certbot) {
            set req.http.Connection = "close";
            return(pipe);
        }
    }
    

    请将此文件直接包含在您的常规/etc/varnish/default.vcl 中的vcl 4.0; 之后。这是一个例子:

    vcl 4.0;
    include "/etc/varnish/letsencrypt.vcl";
    
    backend default {
        .host = "127.0.0.1";
        .port = "8080";
    }
    

    如您所见,default.vcl 中的后端指向 8080 端口,即 Apache。

    请重新启动 Varnish 以确保这些 VCL 设置处于活动状态。

    TLS 终止问题

    HitchVarnish Software 开发的 TLS 代理。它功能强大、轻量级且可配置。

    请运行以下命令进行安装:

    sudo apt-get install -y hitch
    sudo systemctl enable hitch
    

    然后创建/etc/hitch/hitch.conf 并添加以下内容:

    frontend = "[*]:443"
    backend = "[localhost]:8443"
    write-proxy-v2 = on
    pem-file = "/etc/letsencrypt/live/yourdomain.com/hitch-bundle.pem"
    ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
    tls = on
    ssl = off
    prefer-server-ciphers = false
    

    为 LetsEncrypt 准备挂钩

    请创建/usr/local/bin/hitch-deploy-hook,并在其中放入以下内容:

    #!/bin/bash
    # Full path to pre-generated Diffie Hellman Parameters file
    dhparams=/etc/hitch/dhparams.pem
    
    if [[ "${RENEWED_LINEAGE}" == "" ]]; then
        echo "Error: missing RENEWED_LINEAGE env variable." >&2
        exit 1
    fi
    
    umask 077
    cat ${RENEWED_LINEAGE}/privkey.pem \
    ${RENEWED_LINEAGE}/fullchain.pem \
    ${dhparams} > ${RENEWED_LINEAGE}/hitch-bundle.pem
    

    然后运行以下命令:

    sudo chmod a+x /usr/local/bin/hitch-deploy-hook
    openssl dhparam 2048 | sudo tee /etc/hitch/dhparams.pem
    

    运行 Cerbot

    通过运行以下命令确保 LetsEncrypt cerbot 已安装:

    sudo apt-get install -y certbot
    

    然后运行以下命令安装证书:

    sudo certbot certonly --standalone --preferred-challenges http \
    --http-01-port 8081 -d yourdomain.com \
    --deploy-hook="/usr/local/bin/hitch-deploy-hook"
    

    验证后,证书将在/etc/letsencrypt/live/yourdomain.com/hitch-bundle.pem 提供,Hitch 将使用该证书。

    请运行 sudo systemctl restart hitch 以启用 Hitch。

    LetsEncrypt 续订也可以使用此二进制文件完成。更新时,请确保将 Hitch 重新加载为 更新后挂钩

    sudo certbot certonly --standalone --preferred-challenges http \
    --http-01-port 8081 -d yourdomain.com \
    --deploy-hook="/usr/local/bin/hitch-deploy-hook" \
    --post-hook="systemctl reload hitch"
    

    我在示例中使用yourdomain.com 作为域。请用实际值替换。

    【讨论】:

    • 网站更新后无法启动。所有 https 都不起作用:“页面未正确重定向”
    • 当运行'openssl dhparam 2048 | sudo tee /etc/hitch/dhparams.pem' 有警告消息:无法写入'随机状态'。然而,过程以 BEGIN/END DH PARAMETERS 和一些编码文本结束。
    • 您指令中的所有命令都运行成功。 Letsencript 成功更新了两次(每次我选择“更新并替换证书”)。但更新后所有网站都没有正确加载。现在我已经切换到旧配置和 pem-keys
    • 这对我来说很难调试。但您收到“页面未正确重定向” 的事实意味着 TLS 终止成功。可能导致问题的一件事是 PROXY 协议 在 Varnish 上不正确。在给你建议之前,我需要更多信息,以及更好地可视化问题。
    • 您好,感谢您的介绍,但我想再问一个问题 - 您如何设置多个域? apache 上的虚拟主机(我有),如何为 Hitch 制作 PEM 文件?是否只是将所有 ssl 文件合并为一个?还是?
    猜你喜欢
    • 2018-07-30
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2017-06-28
    • 2016-12-09
    • 2019-10-18
    相关资源
    最近更新 更多