前言
优化了下之前的流程。
现在仍然是将 Rancher 部署在集群外的机器上,但是新增了通过 acme.sh 自动申请证书的功能。
方案概述
- 安装最新的 Docker(环境)
- 启动
Rancher - 域名解析到服务器
- 安装最新的
Nginx - 安装
acme.sh - 申请和安装证书(包含证书更新时的 hook)
- 修改 Nginx 配置并重启
- 修改证书自动更新相关配置并测试
操作步骤
一、安装最新的 Docker(环境)
参考:Ubuntu 20.04 从官方源安装最新的 Docker
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
docker -v
二、启动 Rancher
- 容器内的
80端口映射到宿主机8080端口(之后会通过 Nginx 反代) - 容器内的
443端口映射到宿主机8443端口 - 使用
ectd作为数据存储,并通过映射到/rab/docker/rancher目录实现持久化
docker run -d \
--name rancher \
--privileged \
--restart=unless-stopped \
-p 8080:80 \
-p 8443:443 \
-v /rab/docker/rancher:/var/lib/rancher \
rancher/rancher:v2.8.6-rc3 \
--no-cacerts
三、域名解析到服务器
在域名托管处进行操作,如果是 Cloudflare 的话记得关掉小云朵。
直到 ping 域名得到正确 IP 后再进行下一步。
四、安装最新的 Nginx
参考:Installing Prebuilt Ubuntu Packages
之后隐藏默认证书的时候需要用到新的配置项。
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
sudo apt update
sudo apt install nginx
systemctl enable nginx
systemctl start nginx
五、安装 acme.sh
# 安装所需软件
apt-get install curl
apt-get install socat
# 安装 acme
curl https://get.acme.sh | sh
# 添加软链接
ln -s /root/.acme.sh/acme.sh /usr/local/bin/acme.sh
# 切换 CA 机构
acme.sh --set-default-ca --server letsencrypt
六、申请和安装证书(包含证书更新时的 hook)
我这里的域名是 rancher.ceshiku.cn。
先申请证书:
这里先用
--standalone模式申请证书,之后 Nginx 后启动后会占用 80 端口,需要改为使用--webroot模式更新证书。
acme.sh --issue -d rancher.ceshiku.cn --standalone -k ec-256
再安装证书:
- 指定证书的目录
- 在更新时执行 Nginx 的重新加载
# 建立证书的目录
mkdir -vp /etc/nginx/ssl/rancher.ceshiku.cn
# 安装
acme.sh --install-cert -d rancher.ceshiku.cn \
--fullchain-file /etc/nginx/ssl/rancher.ceshiku.cn/certificate.crt \
--key-file /etc/nginx/ssl/rancher.ceshiku.cn/private.key \
--reloadcmd "service nginx force-reload"
七、修改 Nginx 配置并重启
在 /etc/nginx/conf.d/ 目录下新建配置 rancher.ceshiku.cn.conf:
vi /etc/nginx/conf.d/rancher.ceshiku.cn.conf
文件内容:
server {
listen 80;
server_name rancher.ceshiku.cn;
# 强制跳转 HTTPS
location / {
return 301 https://$server_name$request_uri;
}
# 设置证书认证用的路径
location /.well-known/acme-challenge/ {
# acme.sh --webroot 模式,认证文件生成后放置的路径
root /var/acme/webroot/;
}
}
server {
listen 443 ssl;
server_name rancher.ceshiku.cn;
# SSL 配置
ssl_certificate /etc/nginx/ssl/rancher.ceshiku.cn/certificate.crt;
ssl_certificate_key /etc/nginx/ssl/rancher.ceshiku.cn/private.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
然后为 /etc/nginx/nginx.conf 添加配置来防止出现 nginx: [emerg] unknown "connection_upgrade" variable 错误:
vi /etc/nginx/nginx.conf
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

备份并重新建立 default.conf 来保证基础的安全,包括对 IP 的直接访问返回 500 错误,以及不返回默认的 SSL 证书:
mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
vi /etc/nginx/conf.d/default.conf
# 非域名访问返回 500 错误
server {
listen 80;
listen [::]:80;
server_name _;
location / {
return 500;
}
# 特殊的证书认证用的路径
location /.well-known/acme-challenge/ {
# acme.sh --webroot 模式,认证文件生成后放置的路径
root /var/acme/webroot/;
}
}
# 非域名访问防止发送 SSL 证书
server {
listen 443 ssl default_server;
server_name _;
ssl_protocols TLSv1.2 TLSv1.3;
# 启用拒绝 TLS 握手
ssl_reject_handshake on;
# SSL Session 缓存,不设置的话无缓存配置不生效
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# log 位置自行替换
access_log /var/log/nginx/host.access.log;
}
之后重启:
nginx -s reload
service nginx restart
最后访问域名即可:

八、修改证书自动更新相关配置并测试
看下当前申请的证书列表:
acme.sh --list
重新使用 --webroot 模式认证域名所有权,认证文件放在 /var/acme/webroot/ 中:
acme.sh --issue -d rancher.ceshiku.cn --webroot /var/acme/webroot/ -k ec-256 --force
acme.sh --install-cert -d rancher.ceshiku.cn \
--fullchain-file /etc/nginx/ssl/rancher.ceshiku.cn/certificate.crt \
--key-file /etc/nginx/ssl/rancher.ceshiku.cn/private.key \
--reloadcmd "service nginx force-reload"
然后执行 renew 确认一下可以正常更新:
acme.sh --renew -d rancher.ceshiku.cn --force

之后在证书即将过期时,就会自动更新了。
参考资料: