Nginx是一个高性能的HTTP和反向代理web服务器,也是我本人在部署前后端项目时最常用的web服务器,无论是部署前端静态网站还是反向代理后端服务器,nginx都表现出无与伦比的便捷与高效。随着容器技术的普及,越来越多的应用开发者推出了官方Docker镜像,Nginx也不例外。本文教大家在Nginx官方镜像的基础上安装Certbot,让你的web应用随时随地插上https的翅膀。
Nginx官方Docker镜像简介
先上网站:
https://hub.docker.com/_/nginx
官网介绍了Nginx镜像的常用方法,有Docker基础的小伙伴使用起来很简单。构建好的镜像基本用法与官方镜像完全相同,具体的使用方法可以参考官网。
Certbot简介
先上网站:
https://certbot.eff.org/
Certbot可以为服务器免费申请及自动部署Let's Encrypt证书,支持大多数Linux发行版和web服务器(我记得另一个工具支持IIS,回头找找),在官网选择服务器软件及操作系统后,会出现使用教程,还是很贴心的。需要注意的是,Let's Encrypt证书有效期只有三个月,过期后访问网站会提示证书无效,所以需要定期更新或者配置自动更新,自动更新的方法在官网有教程。
在Nginx官方Docker镜像中安装Certbot
Certbot在生成证书时,会扫描/etc/nginx/conf.d/文件夹下的conf配置文件,将配置文件中的域名生成SSL证书并修改配置文件,所以如果应用部署在Nginx的Docker镜像中,则需要在镜像中安装Certbot。
当然可以选择每次部署应用时都安装一遍Certbot,但这违背了Docker的初衷。Docker的就是为了一次打包,随时使用,所以我们应该在Nginx镜像的基础上安装Certbot,并生成新的镜像上传至DockerHub。
先上Dockerfile
FROM nginx:latest
ADD https://dl.eff.org/certbot-auto /usr/local/bin/certbot-auto
RUN chown root /usr/local/bin/certbot-auto && \
chmod 0755 /usr/local/bin/certbot-auto && \
certbot-auto -n --install-only
这里用的是Debian8的安装方法(后来才知道Nginx镜像中的Linux版本是Debian9,不过没什么影响),而且走了很多弯路。一开始并不知道 --install-only
这个参数,手动改了certbot-auto
文件好久,就是为了只安装而不执行操作(官网教程并没有告诉我......)。certbot-auto
是一个sh脚本,在certbot-auto
文件里发现了--install-only
这个参数,加上之后就可以只安装而不执行了。直到后来脑子突然反应过来,我TM应该先--help
一下。不过这也不是一件坏事,读sh脚本可以学到很多东西,就当是交学费了。
由于国内你懂得的网速,镜像的构建需要相当长的时间,所以我把构建放在了DockerHub上,这是镜像地址:
https://hub.docker.com/r/yuhaow/nginx
使用方法
下载镜像
$ docker pull yuhaow/nginx
启动镜像
$ docker run -d -v /docker/nginx/conf.d:/etc/nginx/conf.d -v /docker/nginx/logs:/var/log/nginx -v /docker/nginx/letsencrypt:/etc/letsencrypt -v /etc/localtime:/etc/localtime:ro -p 80:80 -p 443:443 --restart=always --name nginx yuhaow/nginx
介绍一下这几个参数:
-
-v /docker/nginx/conf.d:/etc/nginx/conf.d
挂载配置文件夹,方便添加及修改配置 -
-v /docker/nginx/logs:/var/log/nginx
挂载日志文件夹 -
-v /docker/nginx/letsencrypt:/etc/letsencrypt
挂载证书文件夹 -
-v /etc/localtime:/etc/localtime:ro
修改镜像时区与服务器同步 -
-p 80:80 -p 443:443
端口映射
生成证书
$ docker exec -it nginx certbot-auto --nginx
更新证书
$ docker exec -it nginx certbot-auto renew
至于自动更新,参考官网的crontab
方案吧
想动手的小伙伴可以自己构建一下镜像,不想动手的话可以使用我构建成功的镜像,我会不定期nginx版本。