docker nginx使用acme.sh为网站免费添加https
acme.sh和certbot一样,都是为站点获取、自动更新免费Let’s Encrypt证书的工具,
只是和 certbot 相比,acme.sh
更加小巧轻便,
基于这一点,用它在Docker Nginx容器中部署站点的https证书再合适不过了。
当然,下面的步骤一样适用非Docker环境的Nginx。
1 安装
首先,进入alpine
容器:
$ docker exec -it <container_name> /bin/sh
(接下来都是在alpine容器中完成)
改用中科大源,官方源实在有些慢(可选步骤):
sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories apk update
用curl
下载安装acme.sh
,并开启自动更新
apk add --no-cache curl openssl socat curl https://get.acme.sh | sh ~/.acme.sh/acme.sh --upgrade --auto-upgrade
这里有必要啰嗦一下:
因为
alpine
默认有wget没有curl
,所以曾经试过用wget
安装acme.sh,但是遇到的坑比较大,wget 1.25.1以前不支持header属性,在安装和更新acme.sh的时候,会提示错误:
wget: unrecognized option `--user-agent=' ... [Wed Mar 1 05:19:33 CET 2017] Please refer to https://www.gnu.org/software/wget/manual/html_node/Exit-Status.html for error code: 1 [Wed Mar 1 05:19:34 CET 2017] Download error.但是在1.27.1版本上就没有问题,如果坚持用wget安装,要更新
wget
也是一堆事情,还不如直接安装curl
来得方便。
2 生成证书
这里我们要生成awaimai.com
和garymeng.com
两个域名证书,所以首先确保这两个域名可以访问。
然后用下面的命令生成证书,生成后证书会在:~/.acme.sh
目录下:
~/.acme.sh/acme.sh --issue -d awaimai.com -d garymeng.com --nginx
安装证书到Nginx配置目录:
~/.acme.sh/acme.sh --installcert -d awaimai.com \ --key-file /etc/nginx/conf.d/ssl/awaimai.com/awaimai.key \ --fullchain-file /etc/nginx/conf.d/ssl/awaimai.com/fullchain.cer \ --reloadcmd "nginx -s reload"
值得注意的是, 这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用。
3 配置nginx
需要编辑的配置如下:
server {
listen 80;
server_name garymeng.com awaimai.com;
rewrite ^(.*) http://garymeng.com$1 permanent;
}
server {
listen 443 ssl;
ssl on;
server_name garymeng.com;
root /var/www/html/awaimai;
index index.php;
ssl_certificate /etc/nginx/conf.d/ssl/awaimai.com/fullchain.cer;
ssl_certificate_key /etc/nginx/conf.d/ssl/awaimai.com/awaimai.key;
# ...
}
第一个server
的作用是跳转原来http
到https
,
第二个server
作用是侦听443
端口,以及设置http
证书等其他所有功能。
重启nginx:
nginx -s reload
就OK了。
上一篇: MySQL kill process