基于Certbot为Nginx的Docker镜像添加HTTPS

Nginx是一个高性能的HTTP和反向代理web服务器,也是我本人在部署前后端项目时最常用的web服务器,无论是部署前端静态网站还是反向代理后端服务器,nginx都表现出无与伦比的便捷与高效。随着容器技术的普及,越来越多的应用开发者推出了官方Docker镜像,Nginx也不例外。本文教大家在Nginx官方镜像的基础上安装Certbot,让你的web应用随时随地插上https的翅膀。

Nginx官方Docker镜像简介

先上网站:
https://hub.docker.com/_/nginx

image.png

官网介绍了Nginx镜像的常用方法,有Docker基础的小伙伴使用起来很简单。构建好的镜像基本用法与官方镜像完全相同,具体的使用方法可以参考官网。

Certbot简介

先上网站:
https://certbot.eff.org/

image.png

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

介绍一下这几个参数:

  1. -v /docker/nginx/conf.d:/etc/nginx/conf.d 挂载配置文件夹,方便添加及修改配置
  2. -v /docker/nginx/logs:/var/log/nginx 挂载日志文件夹
  3. -v /docker/nginx/letsencrypt:/etc/letsencrypt 挂载证书文件夹
  4. -v /etc/localtime:/etc/localtime:ro 修改镜像时区与服务器同步
  5. -p 80:80 -p 443:443 端口映射
生成证书
$ docker exec -it nginx certbot-auto --nginx

更新证书

$ docker exec -it nginx certbot-auto renew

至于自动更新,参考官网的crontab方案吧

想动手的小伙伴可以自己构建一下镜像,不想动手的话可以使用我构建成功的镜像,我会不定期nginx版本。

你可能感兴趣的:(基于Certbot为Nginx的Docker镜像添加HTTPS)