个人网站搭建之一:docker、nginx-proxy、https

一时兴起购买了这个域名和conoha的 VPS,查了查拿 VPS 能干些什么,无非是以下几点:

  • 建立个人网站
  • 托管一些需要长期在线的服务(比如MC服务器、爬虫脚本、git服务之类)
  • 搭梯子
  • 内网穿透

于是我分析了一下自己的需求,家里的NAS和Home Assistant可以通过公网ip访问,所以(暂时)用不到内网穿透,人在墙外用不着梯子,脚本可以跑在家里的服务器上。这样只剩下个人网站这一个选择。

其实VPS服务商一般都会提供一些一键建站的服务,比如conoha就提供了WordPress环境的预安装选项,如果目的只是为了建站,那完全没必要自己折腾。可咱们的目的本来就是折腾,所以(

预期成果

  • 一个个人博客,使用二级域名(chamochi.moe)或www+二级域名访问
  • 一个摄影作品集,使用三级域名snap.chamochi.moe访问
  • 上述两个网站要运行在同一个服务器上
  • https支持

nginx-proxy

如果我们有多台服务器,一台上面跑一个网站,那只需要设置dns,把每个域名指向对应的IP就可以了,但是……实际上应该没有人这么做。
这里我们使用docker:两个容器来建立网站,一个nginx容器设置反向代理来作为网站的入口,根据域名把请求发送给上游对应的容器。

最直接的方法是使用nginx的官方docker镜像,然后自己编辑nginx的conf文件,将不同子域名指向对应的容器ip。但是这种做法有以下的问题:

  • 容器发生变化时需要手动更新nginx设置
  • 更改nginx配置需要进入nginx容器的shell环境,无法直接通过ssh用vscode编辑conf文件
  • 需要手动配置ssl证书

这里我们使用Jason Wilder开发的nginx-proxy镜像来规避这些问题。

nginx-proxy的用法非常简单,它会监听docker事件(比如容器的create, recreate, start等等),并自动为具有VIRTUAL_HOST环境变量的容器建立反向代理。我们只需要在创建网站容器时设置这个环境变量为对应的一个或多个域名就可以了。

如果容器只暴露了一个端口,nginx-proxy默认会把请求转发给这个端口;如果容器暴露了多个端口,则默认转发给80端口。很多服务会使用一些奇奇怪怪的端口,这时只需给容器添加一个VIRTUAL_PORT环境变量为对应的端口就可以了。需要注意的是每个容器只能通过这个方法设置一个端口,如果想让不同域名指向同一容器的不同端口,则需要增加端口转发容器来迂回一下。

SSL支持

在创建nginx-proxy容器时,如果给它的:/etc/nginx/certs位置挂载一个目录或者volume,并且在其下放置对应域名的证书.crt,私钥.key文件(可以用openssl生成),在访问该域名时就会使用https连接。但是自签名证书会导致浏览器警告,手机端不添加证书甚至没法访问。

我们使用另一个方便的镜像acme-companion来自动完成Let’s Encrypt证书的创建、更新。


个人网站搭建之一:docker、nginx-proxy、https
https://chamochi.moe/2022/08/29/个人网站搭建之一:docker与nginx-proxy/
作者
ChaMochi
发布于
2022年8月29日
许可协议