假设您在负载平衡器后面有两台服务器a
,b
并且服务器终止 SSL。
假设服务器正在运行支持代理请求到另一台服务器的 NGINX(我想 Apache 也可以处理这个问题,但无法确认)。
假设您不控制由服务器提供的域的 DNS(也许您正在运行 SaaS 并允许用户在您的服务上使用他们自己的域)。
以下是我们在Lickstats使用的步骤,以在DigitalOcean 负载均衡器背后实现这一目标。
步骤 1.安装certbot
在a
.
步骤 2.将 NGINX 配置b
为代理 Let's Encrypt 验证请求到a
.
以下设置使用代理协议,因此我们需要将 NGINX 绑定到a
.
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.同步证书以作为 rootb
使用。rsync
#! /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.b
以rsync
root 身份应用证书。
#! /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-available
通过创建指向sites-enabled
.
#!/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 作业每月尝试更新一次。