前言
如果有人问我:你觉得最重要的docker应用有些?
我的答案首先是:
NPM
。Nginx反向代理神器之一,自动管理nginx代理配置、Let’s Encrypt的ssl证书自动申请和续期。类似的工具还有nginxWebUI、traefik/traefik。
当然,这里我不会说mysql/mariadb
,因为它们往往不直接面对用户,我们很难感受到它们的存在,虽然它们在搭建docker应用的时候会经常出现。
本文主要解决如何安装和基本使用
NPM。我之所以将两者合并讨论,是因为它们的组合可以很好地解决如何方便和安全地远程访问docker应用
这个使用场景。
总而言之,我觉得如果想要特别方便的使用vps搭建后续很多的服务的话,是一定要有一个nginx proxy manager的~
下面我们一起来看看吧 :satisfied:
准备工作
# 工作目录请按需修改
path_docker=~/docker
# 目录管理
mkdir -p ${path_docker}/ddns-go/ ${path_docker}/npm
# 如果不习惯上述方式的人 可以直接
mkdir -p /mydata/npm
# 这将在你的根目录 创建一个mydata并且创建一个子目录npm
# 有需要可以提前拉取好镜像
# docker pull jeessy/ddns-go:latest
# docker pull jc21/nginx-proxy-manager:latest
另外,你还需要在阿里云或者cloudflare或者腾讯云等等服务商进行域名托管,并且有至少1个域名。其它域名服务商应该也是类似的,我用是就是这两个,其它的不特别讨论。就小鹿自己而言,我强烈推荐你使用cloudflare进行域名托管,尤其是当你用的是海外vps的时候,cloudflare会提供免费的cdn加速,一定程度上可以加快国内的访问速度,而且我真觉得cloudflare比阿里云等国内厂商良心很多诶😝
总的来说,NPM支持的服务商太多了,自己去看看吧,不再赘述。
NPM
Nginx proxy manager(NPM)是集Nginx设置和ssl证书申请的docker神器。
一般来说,我们会将域名登记到DNS服务商(比如Cloudflare),那么域名——公网IP
这条路已经打通。那么,NPM的作用是什么呢?它主要作用是反向代理
服务器——NPM可以看作nginx的可视化面板(当然远不止于此,但你暂时可以这样理解)。
反向代理
是位于一个或多个Web 服务器前面的服务器,拦截来自客户端的请求;然后,反向代理服务器将向源服务器发送请求并从源服务器接收响应。通俗地说,NPM可以决定该域名可以访问该IP源服务器的哪个端口,就是打通公网IP——端口
这条路。
不管怎么说都有点抽象。自己在实际使用时多体会就行了 (ฅ´ω`ฅ) npm在实际使用中资源占用也不是很高。
配置yml文件
创建新文件docker-compose.yml
并添加内容如下:
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- 'xxxx':81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
xxxx
表示的是你可以使用默认端口或者自定义,小鹿更推荐你自定义端口号。
一般地,对于VPS来说,80和443端口应该使用默认的。可以使用80和443端口也是玩VPS的优势之一呀!想想你每次访问互联网服务都要加个端口号,看着就很难受。你的家用NAS一般是你或者你的家人等少数人用,有一些端口号也无伤大雅。
可是,如果你要建一个个人博客,用非443端口不合适吧?看着就很不正式呢!
一般地,新买的个人云服务器可以默认;而家用宽带一般不放行443端口,而要改用其它端口。
另外,这个81端口是NPM的默认后台端口,这个你可以改一个自己喜欢的。我建议不要用默认的81端口,这样可以使NPM更加隐蔽,尤其是海外的vps一定要替换哦。这里值得一提的是:下面的挂载是一定不可少的,这样在后期你如果更换vps的时候,数据迁移会非常方便,之后我会出一个专门的数据迁移教程。
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
服务管理
# 上线服务
docker-compose up -d
# 下线服务
docker-compose down
# 更新服务(我还没用过。更新的话建议先对旧服务进行备份,以防新旧版本有兼容问题。)
docker-compose pull
docker-compose up -d
访问:http://<ip>:<你刚才填写的xxxx端口>
进行NPM管理。如果出现502错误,请先打开系统对应端口的防火墙哦~这里每个系统不一样,小鹿就不进行赘述了。
根据官网,它的默认帐户和密码是:
默认帐户:admin@example.com
默认密码:changeme
进入后台后,具体使用可以参考B站的咕咕鸽的演示:https://www.bilibili.com/video/BV1Gg411w7kQ。
这里值得一说的是,NPM是可以反向代理自己的!你第一次访问NPM的时候,是用http://<ip>:<NPM-后台端口>
的方式访问,这个时候你输入的帐户和密码都是明文传播的。你设置好NPM的自身反代后,要尽快用https://domain.com
的方式来访问它,然后将用户名和密码修改一下。NPM是本地和外界沟通的桥梁,可不能有什么安全隐患!具体步骤如下:
之后创建一个新的proxy:
填入基本的信息:
当然别忘记配置ssl证书哦:
这时候肯定有小伙伴发现了 SSL Certificate没法选择呀,别着急,接下来小鹿带你申请证书:
使用方法
获得DNS令牌
仅以小鹿使用的Cloudflare为例。其它域名托管商请自行Google/ChatGPT。
在NPM中,如果要申请类似*.xiayexiaolu.com
、xiayexiaolu.com
的通配符证书,需要使用DNS Challenge的方式;而这其中需要依赖DNS API令牌。
登陆Cloudflare的后台,在概述页面中找到获取您的API令牌
,点击进去:
直接创建令牌
。值得一提的是,该页面也可以看到既往申请并仍在使用中的API令牌:
推荐使用自带模板编辑区域DNS
。这种功能还是挺贴心的 (ฅ´ω`ฅ):
选好域名后,其它项目默认或者按需改动即可(图示是默认情况)。继续以显示摘要
:
之后点击显示摘要然后创建令牌并保存就可以啦~在Cloudflare中,获得API令牌的整个过程是比较自然的,就算没人教,自己探索一下就会。这里点名批评一下阿里云,后台十分复杂和反人类 Σ( ° △ °|||)︴
申请SSL证书
我喜欢统一申请好二级域名证书(比如我自己,就只为xiayexiaolu.com
申请1个证书),然后在建立新的反向代理记录后添加申请好的二级域名证书。
在国内,由于家庭宽带的80端口是被封锁的,所以用http challenge申请ssl证书的方式很容易失败。在Nginx proxmy manager中,国内用户推荐使用DNS challge的方式来申请Let’s Encrypt证书(其实国外用户我也推荐用这种方式)。这里也主要是讲述后者的方式。帐户设置等初始化工作就不再赘述。自己摸索一下,不是很难。
如果你想了解HTTPS证书相关的原理跟细节,可以阅读Ryan的博客文章《写给开发人员的实用密码学(八)—— 数字证书与 TLS 协议》。
在界面中点击SSL Certificates--Add SSL Certificate--Let's Encrypt
其它设置如下图。你可以申请一个二级域名的通用证书,或者专门为一个三级域名设置证书。下面我展示的是申请一个二级域名的通用证书。我个人推荐你申请一个二级域名证书给所有的三级域名使用。你要同时为两个域名申请*.xiayexiaolu.com
、xiayexiaolu.com
(*
是一种常用的正则表达式,用来代表所有字符),这样才可以正常使用喔:
申请好了证书之后你再回到前文中提到的反向代理部分,在SSL Certificate选择中选择你这次申请好的ssl证书即可。其实小鹿最满意的一点是:使用这种方式申请的ssl证书可以自动续期,简直是懒人福音好吗?