编辑
2024-05-15
技术
00
请注意,本文编写于 252 天前,最后修改于 170 天前,其中某些信息可能已经过时。

最近工作上的是多数在晚上完成,白天完全没有心情工作,只好倒腾一点和工作没什么关系的内容
之前在服务器上起的所有服务都是http的,存在一定的安全性问题,尤其是我的密码本服务,如果泄露的话问题就比较大了,故准备将大多数服务转换成https以供之后使用

将http服务都切换成https服务面临两个问题

  1. 如何获取ssl证书
  2. 如何使用ssl证书

第一步自然先去阿里云看一看,nnd居然要花钱,免费的当然也有,但是需要三个月更新一次,那我肯定不能三个月更新一次啊,自然要找自动更新的方案,那就是利用脚本设置定时任务然后去请求更新证书,总体流程不复杂,但是要自己写一下还是有点麻烦的。
第二步每个服务单独设置自己的https,管理维护成本肯定会比较大,不如用nginx统一进行管理,这样也方便进行二级域名的设置,更好地管理服务。

综上我搜索了一下找到了使用nginx_proxy_manager管理的方式,点击进入github

简单部署逻辑如下:

  1. 写好docker-compose.yml
yml
version: '3.8' services: app: image: 'docker.io/jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: - '80:80' - '81:81' - '443:443' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt
  1. 建好对应的挂载目录,也就是data和letsencrypt
  2. 启动服务docker compose up -d (不同的docker和docker compose版本可能略有差别)
  3. 访问127.0.0.1:81,默认的账号密码是 admin@example.com changeme

部署完成之后即可开始使用,浏览器打开对应的地址,重置好账号密码等基础配置,之后我面对的问题有如下几个

  1. 我的服务器是放在家里的,使用的网络是家庭网络,ipv4使用的是电信的动态ip, 电信对于这些ip封禁了80、8080、443等常用web端口的访问
  2. 如果要监听二级域名的话dns如何设置
  3. 我有多个服务,也就对应了多个二级域名,ssl证书如何申请是单个还是多个

针对问题1:
修改映射端口,80->8888,81->1022,443->7894,故访问nginx_proxy_manager本身http的话是通过1022端口,而访问https服务则都是通过7894端口,从体验上来说肯定是不好的,但是想不到什么好的办法姑且只能这样了,如果再其中再转一个机器的话就显得比较麻烦了
针对问题2:
要对二级域名进行解析,即解析*.uncleyiba.com到部署nginx_proxy_manager的服务器,说到这个域名,之后也可能换一个新的,毕竟com没啥卵用而且还贵,我记得我这个上次续费了五年,看了一眼,28年8月。。。那算了等到了那时候再说吧。ddns相关的文章好像还没写,可以自行了解一下jeessy/ddns-go。
针对问题3 申请通配符证书,比如我申请的就是*.uncleyiba.com

这些问题都有了解决方案之后开始配置nginx_proxy_manager

  1. 在SSL Certificates页签Add SSL Certificate, Domain Names即你需要申请整数的域名,与我而言就是*.uncleyiba.com这个通配符域名
  2. Email Address for Let's Encrypt好像随便填一个就行了,可能和验证域名的合法性有关,我们不通过这种方式进行验证
  3. Use a DNS Challenge需要选中,来验证你拥有域名的合法性,不然不会给你发放https证书
  4. 需要选择DNS Provider即dns供应商,我域名是在阿里云上的,DNS解析也是,于是选择Aliyun这个供应商
  5. 在阿里云里搜AccessKey服务,建一个子账号,获取对应的key和secret(注意最好复制出来,否则窗口关闭之后你无法再获取到),并且给该子账号赋予基于的DNS解析权限,我没细究,直接给了三个DNS相关的权限,分别是AliyunHTTPDNSFullAccess,AliyunDNSFullAccess,AliyunPubDNSFullAccess,之后把key和secret填入nginx_proxy_manager页面。
  6. 点击同意I Agree to the Let's Encrypt Terms of Service,再点击Save,等一端时间就会自动创建成功了(创建的时候可能会失败,有一个常见的网络问题在下文中补充)
  7. 回到Dashboard,点击Proxy Hosts,进行新增Add Proxy Host
  8. Details中Domain Names写入具体的二级域名,比如test.uncleyiba.com;Scheme就是http,因为我都是机器内部的服务,并且都没有单独开https;Forward Hostname/IP写入自己机器的内网ip,这里一定要注意网络问题,需要该网络在nginxProxyManager容器内部可以访问到;Forward Port就是自己服务对外公开的端口;下面的选项中我选择了Block Common Exploits和Websockets Support,大概能理解但是不知道具体干啥的。
  9. SSL中SSL Certificate选择刚才申请好的SSL证书,即*.uncleyiba.com,下面的四个选项我也都选了,也就是Force SSL,HTTP/2 Support,HSTS Enabled,HSTS Subdins,之后点击save,完成相关的配置
  10. 这时候我们访问对应的https://test.uncleyiba.com:7894 即可生效,当然实际上这个里面没东西只是我举个例子,实际可以看博客的地址就是这么配置的https://blog.uncleyiba.com:7894/

其他功能还在摸索中,等之后更新,以下是踩过的一些坑。

踩坑1,ip配置
配置New Proxy Host的Forward Hostname/IP 的时候,写了127.0.0.1以及localhost,ngxinProxyManager服务内部进行访问的时候就会有问题,用外网ip+端口的形式面对电信ip会变以及原本打算关闭端口对外访问两个问题,最终也是只能使用内网ip+端口的方式,这其实也不一定算得上坑点吧
踩坑2,证书获取失败 看了一下相关的日志信息显示

txt
[5/15/2024] [9:43:31 AM] [Global ] › ⬤ debug CMD: . /opt/certbot/bin/activate && pip install --no-cache-dir certbot-dns-aliyun~=0.38.1 && deactivate [5/15/2024] [9:45:29 AM] [Certbot ] › ✖ error WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out. (read timeout=15)")': /packages/a1/95/88da3bdf0488df92e73a5dc60f77a17d098b1dd0ecc0fa60802db1d6a5d2/certbot_dns_aliyun-0.38.1-py2.py3-none-any.whl.metadata

实际上也就是我们在使用阿里云的accessKey进行域名合法性验证的时候,nginxProxyManager需要安装阿里云对应的依赖从而去调用key验证,在安装依赖的时候通过pip源files.pythonhosted.org出现了失败,我好像没看到配置源的地方,只好手动进容器里帮它进行安装(如果服务挂了重启的话,可能需要再重新安装,毕竟容器内的操作是没同步到镜像层面的)

sh
docker ps | grep nginx # 获取到nginxProxyManager容器的id docker exec -it container_id bash # 进入nginxProxyManager容器 . /opt/certbot/bin/activate # 使用指定的python环境 pip install --no-cache-dir certbot-dns-aliyun~=0.38.1 -i https://mirrors.aliyun.com/pypi/simple # 使用阿里源进行相关的依赖安装 deactivate exit

之后再重新获取证书即可
踩坑3,按步骤操作了依旧无法访问服务 主要涉及ddns-go服务,目前还没头绪,可能和ddns-go的网络设置有关,等有空研究一下再说,其他服务都没啥问题
好好好解决了,太傻比了,ddns服务因为要获取到宿主机的ip所以才启动服务的时候采用的是--net=host方式,我原本访问的一直是1012端口,我就以为它就是这个端口了,也一直在用这个端口配置ngxinProxyManager的映射,但是我查看了一下配置文件启动命令!都没有1012相关的配置!我又搜了一下我使用的jeessy_ddns_go服务的默认端口是9876,尬住了,看了是我之前在使用的时候在路由器上配置了转发,是的路由器的1012端口转发到了内网机器的9876上面,真是坑啊。。。 映射改成了9876之后没问题可以正常访问了

本文作者:康恩

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 Copyright © 2024 KangEn 许可协议。转载请注明出处!