假设您在负载平衡器 a 和 b 后面有两台服务器,并且服务器终止 SSL。
假设服务器正在运行支持代理请求到另一台服务器的 NGINX(我想 Apache 也可以处理这个问题,但无法确认)。
假设您不控制服务器提供的域的 DNS(也许您正在运行 SaaS 并允许用户在您的服务上使用他们自己的域)。
以下是我们在Lickstats 使用的步骤,以在DigitalOcean load balancers 背后实现这一目标。
第 1 步。 在 a 上安装 certbot。
第 2 步。 在 b 上配置 NGINX 以将 Let's Encrypt 验证请求代理到 a。
以下设置使用Proxy Protocol,因此我们需要在a 上使用bind NGINX to another port。
server {
listen 80 proxy_protocol;
listen 443 proxy_protocol ssl;
server_name example.com www.example.com;
...
location ^~ /.well-known/acme-challenge {
proxy_pass http://a.example.com:8080;
}
...
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}
第 3 步。 使用 webroot 插件获取证书(此操作方法可能使用 apache 插件,但我建议使用较少的自动化来进行负载平衡器后面的精细设置)。
certbot -d example.com -d www.example.com --webroot --webroot-path /path/to/public/folder certonly
第 4 步。 以 root 身份使用 rsync 将证书同步到 b。
#! /bin/bash
if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root"
exit 1
fi
declare -a files=("/etc/letsencrypt/live" "/etc/nginx/nginx.conf" "/etc/nginx/sites-available")
for file in "${files[@]}"; do
rsync -axLS --delete $file admin@b.example.com:sync
done
echo "Done"
第 5 步。 以 root 身份使用 rsync 在 b 上应用证书。
#! /bin/bash
if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root"
exit 1
fi
data="/home/admin/sync"
if [ ! -d $data ]; then
echo "$data folder not found"
exit 1
fi
rsync -axS --delete $data/live/ /etc/letsencrypt/live
rsync -axS --delete $data/nginx.conf /etc/nginx/nginx.conf
rsync -axS --delete $data/sites-available/ /etc/nginx/sites-available
chown -R root:root /etc/letsencrypt/live
chown -R root:root /etc/nginx/nginx.conf
chown -R root:root /etc/nginx/sites-available
if nginx-ensites.sh; then
rm -r $data
echo "Done"
fi
第 6 步。 通过创建指向 sites-enabled 的符号链接来启用 sites-available 中的网站。
#!/bin/bash
if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root"
exit 1
fi
nginx=/usr/sbin/nginx
rm /etc/nginx/sites-enabled/*
files=( /etc/nginx/sites-available/* )
for file in "${files[@]}"
do
src=../sites-available/${file##*/}
dest=/etc/nginx/sites-enabled/${file##*/}
if [ ! -f $dest ]; then
ln -s $src $dest
fi
done
if $nginx -t; then
$nginx -s reload
echo "All available sites have been enabled"
fi
第 7 步。使用 cron 作业每月尝试更新一次。