Docker系列 两大神器NPM和ddns go的安装
本文最后更新于 42 天前,如有失效请评论区留言。

本博客用什么VPS?创作不易,请支持苯苯!推荐购买本博客的VIP喔,10元/年即可畅享所有VIP专属内容!也欢迎大佬对本文进行慈善承包(ฅ´ω`ฅ)

日志

  • 2023-04-26:新增从Cloudflare中获得DNS令牌的方案。详见“NPM——使用方法——获得DNS令牌”。
  • 2023-04-25:新增一种实用的防火墙方案。详见“NPM——注意事项——防火墙”。
  • 2023-04-08:新增关于Cloudflare重定向错误(ERR_TOO_MANY_REDIRECTS)的应对之策。
  • 2023-03-28:新增关于Cloudflare Proxy对ssl证书额外支持的说明。
  • 2023-02-12:新增404 HOST的NPM设置方法。
  • 2023-02-04:新增NPM注意事项警告,比如NPM可能导致网站无法访问,原因不明。

前言

如果有人问我:你觉得最重要的docker应用有些?

我的答案是:

  • ddns-go。非常好用的动态域名解析服务。家用NAS必备神器。
  • NPM。Nginx反向代理神器之一,自动管理nginx代理配置、Let’s Encrypt的ssl证书自动申请和续期。

当然,这里我不会说mysql/mariadb,因为它们往往不直接面对用户,我们很难感受到它们的存在,虽然它们在搭建docker应用的时候会经常出现。

本文主要解决如何安装和基本使用NPM/ddns-go。我之所以将两者合并讨论,是因为它们的组合可以很好地解决如何方便和安全地远程访问docker应用这个使用场景。

值得一说的是,如果你用的是VPS,有固定的公网ip,此时ddns-go不是必需的。你只需要去阿里云、cloudflare这样的域名托管商的后台一次性添加就行了!

当然,有些小伙伴可能都没怎么听说过这两个应用。除了之前测试用的Ward,这两个应用就是我们安装好Docker要首先安装的应用噢!

下面我们一起来看看吧 :satisfied:

测试环境

  • 操作系统: Linux openmediavault 5.4.174-2-pve #1 SMP PVE 5.4.174-2 (Thu, 10 Mar 2022 15:58:44 +0100) x86_64 GNU/Linux
  • Docker: Docker version 20.10.14, build a224086
  • docker-compose: Docker Compose version v2.4.1

准备工作

# 工作目录请按需修改
path_docker=~/docker

# 目录管理
mkdir -p ${path_docker}/ddns-go/ ${path_docker}/npm

# 有需要可以提前拉取好镜像
# docker pull jeessy/ddns-go:latest
# docker pull jc21/nginx-proxy-manager:latest

另外,你还需要在阿里云或者cloudflare进行域名托管,并且有至少1个域名。其它域名服务商应该也是类似的,我用是就是这两个,其它的不特别讨论。

DDNS-GO目前支持的DNS服务商有:Alidns(阿里云)、Dnspod(腾讯云)、Cloudflare、华为云和Callback。

NPM支持的服务商太多了,自己去看看吧,不再赘述。

NPM

Nginx proxy manager(NPM)是集Nginx设置和ssl证书申请的docker神器。

官方网站:https://nginxproxymanager.com/

一般来说,我们会将域名登记到DNS服务商(比如Cloudflare),那么域名——公网IP这条路已经打通。那么,NPM的作用是什么呢?它主要作用是反向代理服务器——NPM可以看作nginx的可视化面板(当然远不止于此,但你暂时可以这样理解)。

反向代理是位于一个或多个Web 服务器前面的服务器,拦截来自客户端的请求;然后,反向代理服务器将向源服务器发送请求并从源服务器接收响应。通俗地说,NPM可以决定该域名可以访问该IP源服务器的哪个端口,就是打通公网IP——端口这条路。

不管怎么说都有点抽象。自己在实际使用时多体会就行了 (ฅ´ω`ฅ) 实测资源占用也不是很高:

msedge_g9cIei9pCd

目录管理

cd ${path_docker}/npm

配置yml文件

不了解docker的小伙伴请先看:《Docker系列 配置Docker全局环境》;《Docker系列 了解Docker Compose的配置文件》。

创建新文件docker-compose.yml并添加内容如下:

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '<NPM-后台端口>:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

你可以使用默认端口或者自定义。

一般地,对于VPS来说,80和443端口应该使用默认的。可以使用80和443端口也是玩VPS的优势之一呀!想想你每次访问互联网服务都要加个端口号,看着就很难受。你的家用NAS一般是你或者你的家人等少数人用,有一些端口号也无伤大雅。

可是,如果你要建一个个人博客,用非443端口不合适吧?看着就很不正式呢!

一般地,新买的个人云服务器可以默认;而家用宽带一般不放行443端口,而要改用其它端口。

另外,这个81端口是NPM的默认后台端口,这个你可以改一个自己喜欢的。我建议不要用默认的81端口,这样可以使NPM更加隐蔽。

服务管理

# 上线服务
docker-compose up -d

# 下线服务
docker-compose down

# 更新服务(我还没用过。更新的话建议先对旧服务进行备份,以防新旧版本有兼容问题。)
docker-compose pull
docker-compose up -d

不要忘了用ufw开放你选择的NPM-后台端口端口喔!还记得ufw怎么用吗?44380端口在之前的演示中应该已经开放过了。自己用sudo ufw status numbered查询一下。

访问:http://<ip>:<NPM-后台端口>进行NPM管理。

根据官网,它的默认帐户和密码是:

默认帐户:[email protected]
默认密码:changeme

进入后台后,具体使用可以参考B站的咕咕鸽的演示:https://www.bilibili.com/video/BV1Gg411w7kQ。这里我也简单地介绍一下NPM的使用方式。

特别注意

个人宽带的公网ip不开放80端口,所以在NPM中一般用DNS challege而不是HTTP challege的方式申请Let’s Encrypt SSL证书。如果你使用的是DNS challege的方式,一般还要提供一些token信息,这个每个托管商都是不太一样的。你可以试一下,HTTP challege失败就换DNS challege。我在国内都可以成功申请到证书。

如果你用VPS的话,应该没有这个问题。这也是为什么推荐新手玩VPS嘛 :stuck_out_tongue_winking_eye:

这里值得一说的是,NPM是可以反向代理自己的!你第一次访问NPM的时候,是用http://<ip>:<NPM-后台端口>的方式访问,这个时候你输入的帐户和密码都是明文传播的。你设置好NPM的自身反代后,要尽快用https://domain.com的方式来访问它,然后将用户名和密码修改一下。NPM是本地和外界沟通的桥梁,可不能有什么安全隐患!

使用方法

获得DNS令牌

仅以苯苯使用的Cloudflare为例。其它域名托管商请自行Google/ChatGPT。

在NPM中,如果要申请类似*.hwb0307.comhwb0307.com的通配符证书,需要使用DNS Challenge的方式;而这其中需要依赖DNS API令牌。

登陆Cloudflare的后台,在概述页面中找到获取您的API令牌,点击进去:

msedge_QeCOUKSHOn

直接创建令牌。值得一提的是,该页面也可以看到既往申请并仍在使用中的API令牌:

msedge_akXiYOO4NQ

推荐使用自带模板编辑区域DNS。这种功能还是挺贴心的 (ฅ´ω`ฅ):

msedge_3H7KZ1toak

选好域名后,其它项目默认或者按需改动即可(图示是默认情况)。继续以显示摘要

msedge_ITw1SdDbth

最后,创建令牌即可:

msedge_Oh1EpVxWzB

获得令牌,请妥善保存。你也可以用curl测试令牌:

msedge_j4p1bO9wJB

在Cloudflare中,获得API令牌的整个过程是比较自然的,就算没人教,自己探索一下就会。这里点名批评一下阿里云,后台十分复杂和反人类 Σ( ° △ °|||)︴

申请SSL证书

我喜欢统一申请好二级域名证书(比如我自己,就只为hwb0307.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

image-20220414163150519

其它设置如下图。你可以申请一个二级域名的通用证书,或者专门为一个三级域名设置证书。下面我展示的是申请一个二级域名的通用证书。我个人推荐你申请一个二级域名证书给所有的三级域名使用。你要同时为两个域名申请*.hwb0307.comhwb0307.com*是一种常用的正则表达式,用来代表所有字符),这样才可以正常使用喔:

image-20220414163431775

个人的key和secret要注意保密。DNA provider可以选好多种,看你自己的情况。

对于腾讯云(DNSPod)的用户,ID和Token一定要填一起才可以使用喔!比如,你的后台Token信息如下:

QQ_GYSMFzg2LN

填写时应该是:

dns_dnspod_email = "自己的邮箱"
dns_dnspod_api_token = "31XXXX,7ccXXXXXXXXXXXXXXXXXXXXX7"

按要求填写好相关信息后,按save保存并申请SSL证书,稍等一会即可。如果有报错的话,再多试几次,检查一下自己的信息有没有填写错误。我在国内外的网络环境中通过DNS challenge的方法都可以成功申请证书。成功后如下图所示:

image-20220414163734570

添加反向代理记录

添加一个记录:

image-20220414164013580

这里以ddns-go为例。比如,ddns-go的反向代理设置如下。这个172.17.0.1是docker的默认主机ip地址,通过这个地址加上docker应用的ports即可访问具体的docker应用。当然用192.XXX之类的地址也是可以的,你都可以试试看。

值得一提的是,这里NPM和ddns-go都是在同一个局域网中,所以可以通过反代局域网地址加端口号成功实现。而且,你不需要在路由器中为ddns-go专门设置一个端口映射,这样在互联网使用的环境下,外部的应用只能通过NPM对ddns-go服务进行访问。由于这种访问是https加密的,因此具有较好的安全性。

image-20220414164216990

点击save保存,就会有一条记录:

image-20220414164749415

此时通过:https://exampledomain.com:<NPM-443端口>即可访问ddns-go。如果你用的是443端口,可以不加端口号,因为443是互联网中默认的https端口。

多数docker应用可以通过这样简单地设置即可以实现成功代理。不过,不是所有的docker服务都这么简单就可以设置好反代,它们还往往需要一些额外的Nginx基础才可以成功,比如Umami。具体情况具体分析。有机会再开一个专题来讨论NPM的nginx自定义配置吧。

自动更新证书

NPM托管的Let’s Encrytp证书是可以自动更新的,访过程基于certbot。在conf文件里,有一个renew_before_expiry的参数,默认是30 days。Let’s Encrytp证书的有效期一般是3个月,它会在证书还有1个月到期的时候自动更新证书。

我有一个关于*.hwb0307.com, hwb0307.com域名的证书,通过DNS challege的方法申请的。该证书由Cloudflare颁发,有效期是1年而不是3个月。当该证书没到仅剩30天过期时,尽管手动renew,证书依然不会被更新(日志信息提示Certificate not yet due for renewal):

npm-app-1  | [10/24/2022] [10:19:32 AM] [SSL      ] › ℹ  info      Renewing Let'sEncrypt certificates via Cloudflare for Cert #20: *.hwb0307.com, hwb0307.com
npm-app-1  | [10/24/2022] [10:19:32 AM] [SSL      ] › ℹ  info      Command: certbot renew --config "/etc/letsencrypt.ini" --cert-name "npm-20" --disable-hook-validation --no-random-sleep-on-renew
npm-app-1  | [10/24/2022] [10:19:34 AM] [SSL      ] › ℹ  info      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
npm-app-1  | Processing /etc/letsencrypt/renewal/npm-20.conf
npm-app-1  | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
npm-app-1  | Certificate not yet due for renewal
npm-app-1  |
npm-app-1  | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
npm-app-1  | The following certificates are not due for renewal yet:
npm-app-1  |   /etc/letsencrypt/live/npm-20/fullchain.pem expires on 2022-11-24 (skipped)
npm-app-1  | No renewals were attempted.
npm-app-1  | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

我另外一个非DNS challege申请的证书,应该是Let’s Encrypt直接颁发的证书。它可以随时更新:

npm-app-1  | [10/24/2022] [10:27:28 AM] [SSL      ] › ℹ  info      Renewing Let'sEncrypt certificates for Cert #22: XXX.org
npm-app-1  | [10/24/2022] [10:27:28 AM] [SSL      ] › ℹ  info      Command: certbot renew --force-renewal --config "/etc/letsencrypt.ini" --cert-name "npm-22" --preferred-challenges "dns,http" --no-random-sleep-on-renew --disable-hook-validation
npm-app-1  | [10/24/2022] [10:27:37 AM] [SSL      ] › ℹ  info      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
npm-app-1  | Processing /etc/letsencrypt/renewal/npm-22.conf
npm-app-1  | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
npm-app-1  | Renewing an existing certificate for XXX.org
npm-app-1  |
npm-app-1  | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
npm-app-1  | Congratulations, all renewals succeeded:
npm-app-1  |   /etc/letsencrypt/live/npm-22/fullchain.pem (success)
npm-app-1  | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

不过,不管哪种方式,如果证书快到期了,应该是可以自动续期的。这里建议:如果你想频繁地更换证书,不要使用DNS challenge的方式申请

此外,如果你使用了Cloudflare Proxy的方式(

msedge_k8jGJau0Mh
)解析域名,其实不太需要担心ssl证书的问题。因此Cloudflare会颁发共享的边缘证书:

msedge_GO1MfiFGmD

如果查看网站证书,可以看到访客其实使用的是边缘证书而不是NPM中的证书

image-20221024183801291

这是我最近替换证书后但网站仍可https访问(Kuma实时监测)之后发现的。所以说Cloudflare CDN确实不错 (ฅ´ω`ฅ)

404 Host

为旧域名添加提示信息。相对冷门的一种用法。

404 Host设置对于新旧域名交替是有利的。比如,域名A曾经是某博客的域名,但时过境迁A将不再被使用。如果弃之不顾,那么访客直接访问A时将会处于离线状态,这可能会让访客误会你已经放弃提供原来的服务。如果你设置了404 Host,并且添加一些提示信息(比如指向新网站),有利于让老朋友们知道你仍在维护该服务,从而保持用户粘性并逐渐完成过渡。

幸运的是,NPM也可以添加404 Host!方法很简单,如图所示:

image-20230212231252121

前面的步骤和添加Proxy是差不多的,就不演示了。这里的提示信息格式如下:

location / {
  default_type text/html;
  add_header Content-Type "text/html; charset=utf-8";
  return 200 '<font face="黑体" color="#dc566f" size=10>由于netdata会造成较大的资源占用,我已经暂时下线netdata。不便之处,敬请谅解!</font><br><p align="center">本页面的生成方法详见我的文章<a href="https://blognas.hwb0307.com/linux/docker/604" data-wpel-link="external" title="Docker系列 两大神器NPM和ddns go的安装"><strong>《Docker系列 两大神器NPM和ddns go的安装》</strong></a></p><br><p align="center">苯苯的博客用什么<a href="https://blognas.hwb0307.com/ad" data-wpel-link="external" title="VPS"><strong>VPS</strong></a>?创作不易,您可以<a href="https://blognas.hwb0307.com/thankyou" data-wpel-link="external" title="Sponsor"><strong>支持</strong></a>苯苯!感谢<a href="https://cdn.onmicrosoft.cn/" data-wpel-link="external" title="渺软公益CDN"><strong>渺软公益CDN</strong></a>提供支持(~ ̄▽ ̄)~ </p>';
}

其实就是一段Nignx代码,返回HTML格式的文本。最终效果大致如下:

NVIDIA_Share_z3imXpebkA

你可以访问https://wardrn2.hwb0307.com在线查看效果。

注意事项

不明原因连接失败

之前我的测试网站hwb0307.com忽然之间挂了,一直找不到明显的原因(可能与系统关机或重启时NPM正在工作有关)。后来在NPM里将原proxy记录删除了再重新添加新的Proxy记录即可。

如果你的网站莫名奇妙地挂了,又找不到明显原因,可以试试删除原proxy记录再重新录入

重定向错误

如果你使用Cloudflare作为域名托管商,很可能会出现ERR_TOO_MANY_REDIRECTS(重定向)的报错。这时你应该将SSL/TLS加密模式设置为完全。具体见《简单介绍Cloudflare和常用配置》:

msedge_d9FVAytSyn

防火墙

以后我们经常会搭建各种各样的docker应用,一般NPM通过http://172.17.0.1:<端口号>的方式对应用进行反向代理。

以前,我比较喜欢用类似这样的防火墙规则(以Ubuntu系统的ufw为例):

# 这是一个使用4145端口的wordpress示例
sudo ufw allow 4145/tcp comment 'wordpress'
sudo ufw reload

但我逐渐发现这种方案的弊端。假设某个攻击者知道了你的服务器IP,它可以用http://<服务器ip>:<端口号>访问你的服务(虽然访问总会报错,因为不符合https)。

那么,有没有一种一劳永逸的方案呢?我折腾了很久,终于让我想出一种比较巧妙的解决方案 (ฅ´ω`ฅ) 具体如下:

此隐藏内容仅限VIP查看。包年VIP仅10元,建议升级。VIP可享有哪些特权

ddns-go

ddns-go是一个动态域名解析神器,并提供漂亮的UI界面进行操作。简单好用的DDNS。支持阿里云DNS、腾讯云dnspod、Cloudflare、华为云 。官方镜像:https://registry.hub.docker.com/r/jeessy/ddns-go

温馨提示:使用VPS的小伙伴可以不安装这个ddns-go。每次有新的域名要解析,去域名托管商的后台进行操作即可。

ddns-go里,我们会展示一些Docker中相对特殊的用法:

  • PUID和PGID可通过在Shell中输入id进行查询。这个在Linux基础里已经学过了!当然你也可以用root来运行,我也觉得没什么问题。值得注意的是,不是所有的docker应用都有这两个参数。可能Dockerfile之类的方法可以指定,但我还没有尝试过。基于Docker系列 学习Docker之前中的讨论,你应该也知道一般情况下用root运行docker问题也不大的。
  • 我们用Shell命令行来安装ddns-go。其实Shell命令行是我最先接触的方法,对于一些比较简单的Docker应用,用它来安装也是毫无压力的。用docker-compose的方案也行,有兴趣的自己试试看吧!

我展示一下阿里云和cloudflare的使用。应该还是蛮简单的吧 😉

阿里云

# aliyun
mkdir -p ${path_docker}/ddns-go/aliyun
docker run -d \
    --restart=unless-stopped \
    --name ddns-go-aliyun \
    -e PUID=1000 \
    -e PGID=100 \
    -p <aliyun端口>:9876 \
    -v ${path_docker}/ddns-go/aliyun:/root \
    jeessy/ddns-go \
    -f 60 

访问http://<ip>:<aliyun端口>/进行aliyun的域名解析。

Cloudflare

# cloudflare
mkdir -p ${path_docker}/ddns-go/cloudflare
docker run -d \
    -e PUID=1000 \
    -e PGID=100 \
    --name ddns-go-cloudflare \
    --restart=unless-stopped \
    -p <cloudflare端口>:9876 \
    -v ${path_docker}/ddns-go/cloudflare:/root \
    jeessy/ddns-go \
    -f 60

访问http://<ip>:<cloudflare端口>/进行Cloudflare的域名解析。

ddns-go使用

NPM设置Nginx反代和ssl加密

在进行设置的时候,应该先用NPM进行反向代理和配置https加密。不然,你的所有信息都是明文传播,容易引发安全问题。强烈不推荐在http协议中使用ddns-go,因为它会传送你的DNS服务商的token,这意味着攻击者可以对你的帐号进行任何操作!

设置可以看上文的NPM的举例

绑定DNS服务商

阿里云的是这样的:

image-20220414161605326

Cloudflare的是这样的:

image-20220414161502271

IPv4设置

用默认的参数,然后在Domains里写上要解析的域名。注意,你不需要专门去域名服务商后台添加记录。

image-20220414161812374

其它配置

我喜欢设置用户名和密码,这样公网访问的时候会比较安全。

image-20220414161946558

设置完成后,就点击页面左上方的Save。这里会自动解析域名。右侧可以看到日志,会有IPv4未改变,将等待 5 次后与DNS服务商进行比对你的IP XXX 没有变化, 域名XXX或者XXX解析成功之类的字样。

参考资料

---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍

基于m2w创作。版权声明:除特殊说明,博客文章均为Bensz原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。VIP内容严禁转载!由于可能会成为AI模型(如chatGPT)的训练样本,本博客禁止将AI自动生成内容作为文章上传(特别声明时除外)。如有需要,请至学习地图系统学习本博客的教程。加Telegram群可获得更多帮助喔! | 博客订阅:RSS | 广告招租请留言 | 博客VPS | 致谢渺软公益CDN |

评论

  1. ddl战士
    Windows Edge 111.0.1661.51
    2月前
    2023-3-24 18:01:12

    centos 7.9 上按照博主的步骤安装npm,发现 domain:port 无法访问,查了一下是ip包转发没有打开,解决办法如下:
    永久修改IP转发,需要修改/etc/sysctl.conf文件,修改下面一行的值:
    net.ipv4.ip_forward = 1
    执行命令来使修改生效 sysctl -p /etc/sysctl.conf

    • 博主
      ddl战士
      Windows Edge 111.0.1661.51
      2月前
      2023-3-24 23:12:08

      感谢分享!

  2. Lt02r
    iPhone Safari 16.3
    3月前
    2023-3-22 14:31:38

    有个想法,所有的服务部署在家里,通过公网云服务器反代,也能实现不用带端口访问了,不过这样做可用性高吗?

    • 博主
      Lt02r
      Windows Edge 111.0.1661.44
      3月前
      2023-3-22 21:56:02

      可用性不高。因为在公网服务器里反代时是需要填写家里服务器的IP的。但是,这个IP一般情况下是一个动态IP。

      • Lt02r
        Bensz
        Windows Chrome 111.0.0.0
        3月前
        2023-3-22 22:02:21

        是的动态IP,但我设置了ddns,已经有一个域名绑定到这个动态ip了。那么我反代时填写这个域名就可以了,问题是不知道与把服务直接部署在云服务器上相比,这种反代家里的方法,除了速度会受到云服务器带宽的限制外,还会有别的劣势吗?

      • 博主
        Lt02r
        Windows Edge 111.0.1661.44
        已编辑
        3月前
        2023-3-22 22:07:54

        如果你在云服务器里反代的是: http://域名:端口号 ,可能会有安全性问题。因为整个连接中,家里→云服务器的过程没有加密。一般地,像你这种需求,比较常用的方法是内网穿透。你可以看看这个文章,它描述了一种基于frp的内网穿透方案: https://blognas.hwb0307.com/skill/1531

      • Lt02r
        Bensz
        Windows Chrome 111.0.0.0
        3月前
        2023-3-22 22:18:56

        明白了,我目前是http://域名:端口号的方式,忽略了安全性的问题。那么内网穿透的过程中会用明显的性能损耗吗?我在想 是反代改成https://域名:端口号的方法好,还是使用frp的方法好。

      • 博主
        Lt02r
        Windows Edge 111.0.1661.44
        3月前
        2023-3-22 22:22:08

        你可以试试看能不能反代https。性能损耗肯定是有的,因为毕竟多了一个中转站。至于性能损耗明不明显,这个要实际测试才知道,不好一概而论。其实有动态公网ip就直接在本地安装DDNS-GO和NPM就行,我觉得挺方便的。虽然有个端口号,但家里的应用基本上也不会给外人用,其实是感受不出有端口号的麻烦的。

      • Lt02r
        Bensz
        Windows Chrome 111.0.0.0
        3月前
        2023-3-22 22:33:21

        我主要想把博客也顺带部署在家里了,所以才有了这个云服务器中转的想法。实际我再测试一下吧,很感谢你的回复 🙂

      • 博主
        Lt02r
        Windows Edge 111.0.1661.44
        3月前
        2023-3-22 22:33:50

        加油 (ฅ´ω`ฅ)

  3. ugoos
    Windows Chrome 103.0.0.0
    6月前
    2022-12-14 0:45:28

    你好,我也是家里安装DOCKER安装的NPM和DDNS-GO,设置也跟你一样,可是反代不成功,这需要端口映射吗?因为我在内网IP+端口是可以访问的

    • 博主
      ugoos
      Windows Edge 108.0.1462.46
      已编辑
      6月前
      2022-12-14 8:29:42

      有几种情况你需要核实:(1)家里的宽带是否已经申请公网ip。(2)是否使用了80/443端口;这两个端口在目前的家庭宽带里是不可用的,所以当你使用http/https协议访问docker服务时,要换成其它端口;具体在Nginx Proxy Manager的docker-compose.yml文件里改动80/443映射的端口。(3)是否使用防火墙以及端口号是否被开放了。(4)外网访问时还需要在路由器上做好端口映射。

      • ugoos
        Bensz
        Windows Chrome 103.0.0.0
        6月前
        2022-12-14 10:46:07

        感谢回复!我也在老苏那边提了问,他回复提醒我的一个点,我知道我错在那了,就是NPM容器映射到主机的端口搞错了,我应该将那个端口再映射出去,原先我是直接将ARMBIAN上的443直接映射出去,所以不行,因为NPM映射到主机的端口不是这个!现在成功了!
        感觉这里电信还是有那么一点良心吧,可以申请公网IP,443居然没封。听朋友说用两天会就会封,不知道真假,

      • 博主
        ugoos
        Windows Edge 108.0.1462.46
        6月前
        2022-12-14 12:53:04

        从2022年11月起,443端口就不再可用了。家用场景不建议你使用443,反正有很多其它端口可以使用嘛!
        端口映射逻辑如下: 容器端口——宿主机端口——反向代理为某443类端口(比如端口A)——路由器端口映射(端口B→端口A)。然后,访问https://URL:端口B

      • ugoos
        Bensz
        Windows Chrome 103.0.0.0
        6月前
        2022-12-14 19:20:25

        我现在的443还可以。按你的意思用其他端口?https://URL:端口这样也行吗?我以为只可以443

      • 博主
        ugoos
        Windows Edge 108.0.1462.46
        6月前
        2022-12-14 20:47:55

        443你能用的话也可以用。 其实我们平时访问的 https://url, 本质上是 https://url:443 。只是,由于443是默认的https端口,所以浏览器会自动隐藏这个端口号。 如果你使用的不是默认的443端口号, 那么这个端口将不会自动隐藏。 本质上是一样的,只是看上去有点不同。

      • ugoos
        Bensz
        Windows Chrome 103.0.0.0
        6月前
        2022-12-15 10:04:59

        感谢回复,我大概了解了!

  4. jd
    Windows Chrome 107.0.0.0
    已编辑
    6月前
    2022-12-07 12:41:32

    贴下自己的vps(国外)+域名+本篇npm设置。
    namesil(这里买的域名): 删除dns record里默认的,nameserver里替换成cloudflare的。对应的cloudflare:添加上一些dns record,比如www, @ 和 cc。
    ddnsgo未使用
    npm端口设置自定义,举个栗子188。使用ip:188登录到后台。
    使用的是http challenge, 假设域名为good.com,具体如下:

    1. 为good.com添加证书,不选dns chanllenge,多尝试几次,有时出错
    2. Proxy host里设置反向代理:设置给npm用的domain name,比如aa.good.com

      查看图片
      https://img1.imgtp.com/2022/12/07/w7ICLbIj.png

    3. 同1为aa.good.com加证书
    4. 回到Proxy host,编辑-SSL-打开Force SSLHTTP/2
      5.在cloudflare里补充aa的dns record

    这下就可以用https://aa.good.com来直接进入npm后台了。之后如果有新的应用端口添加,那么就重复2-5步。
    虽然能运行ψ(`∇´)ψ,但不知道自己的理解对不对╮(╯▽╰)╭

    • 博主
      jd
      Windows Edge 107.0.1418.62
      已编辑
      6月前
      2022-12-07 12:45:39

      所谓DNS challenge,是80端口不可用或者说80端口可用但要申请根域名证书(比如hwb0307.com, *.hwb0307,com)时才推荐使用。否则,一般http申请Let’s Encrypt证书即可(这种方式申请的证书NPM会自动续期)。具体到某个子域名,比如blog.hwb0307.com,我们简单申请一个Let’s Encrypt证书。至于设置一个反向Proxy,步骤就是你说的那样,大同小异 ヾ(≧∇≦*)ゝ

      • jd
        Bensz
        Windows Chrome 107.0.0.0
        6月前
        2022-12-07 13:16:23

        (☆ω☆)原来如此!谢谢解答~

  5. shule
    Windows Chrome 107.0.0.0
    7月前
    2022-11-09 10:44:52

    大佬你好,申请 SSL 证书的 aliyun_access_key 在哪里找啊?

    • 博主
      shule
      Windows Edge 107.0.1418.35
      7月前
      2022-11-09 10:52:43

      如图所示:

      查看图片
      image-20221109105206446


      你也可以百度一下,教程应该也蛮多的。

  6. ff
    Windows Firefox 91.0
    9月前
    2022-9-04 18:44:23

    想问下,搭建完NPM后,查看运行状态,提示“Unit nginx.service could not be found.”怎么回事啊??系统是Ubuntu 20.04 LTSC的,装了几遍都是这个结果,NPM面板无法登录,防火墙关闭的,dockers container也运行

    • 博主
      ff
      Windows Chrome 104.0.0.0
      9月前
      2022-9-04 18:46:41

      和Ubuntu 20的系统没有关系,大概率是其它问题。从目前的状态来看还无法进行bug定位。如果可以的话,可以远程帮你看看。可以加Telegram群进一步了解。

  7. bob
    Windows Chrome 95.0.4638.69
    已编辑
    11月前
    2022-7-24 20:51:09

    感谢大佬的系列教程,现在遇到了好几个本地NAS的docker服务无法反代,比如

    • bitwarden
    • ddns-go
    • qbittorrent

    操作我感觉应该没问题,nas, 软路由, jellyfin, npm都可以,不知道为啥上面的就不行,大佬有空能一起探讨下吗。
    我是用的cloudflare,然后ddns家宽的

    • 博主
      bob
      Windows Chrome 103.0.0.0
      11月前
      2022-7-24 20:52:43

      bitwarden和ddns-go我都可以成功,没啥特别的呀 qb我没试过 但我的transmission也没问题啊

    • 博主
      bob
      Windows Chrome 103.0.0.0
      11月前
      2022-7-24 20:53:27

      可以加telegram群交流:https://t.me/benszhub

    • 奔腾心
      bob
      Android Chrome 81.0.4044.117
      8月前
      2022-10-03 0:18:08

      我的家宽用阿里ddns,反代总是不成功,能帮忙看看吗?

      • 博主
        奔腾心
        Windows Chrome 105.0.0.0
        8月前
        2022-10-03 8:20:01

        我用的就是aliyun,是可以成功的。你可以加一下群,大家看看你的情况:https://t.me/benszhub

  8. 郑在忙
    Windows Edge 103.0.1264.49
    11月前
    2022-7-09 22:53:05

    啊~~我这个小白。请教一波,
    要> 添加反向代理记录
    那一步之前,我是不是要把自己服务器所在的网络固定静态公网ip?而且在域名托管的平台设置好域名解析?

    • 博主
      郑在忙
      Windows Chrome 102.0.0.0
      11月前
      2022-7-12 21:02:13

      您这条评论之前被标记为了垃圾邮件(我也不知道为啥(๑•̀ㅁ•́ฅ) ),不好意思哈!
      VPS的公网ip是固定的,你可以不需要使用DDNS-go。那是给家用服务器设计的。
      大致的步骤是:域名管理后台将域名——公网ip的关系确定好即(通常是添加一条A记录)

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇