反向代理神器nginx proxy manager
本文最后更新于 240 天前,如有失效请评论区留言。

前言

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

我的答案首先是:

  • NPM。Nginx反向代理神器之一,自动管理nginx代理配置、Let’s Encrypt的ssl证书自动申请和续期。类似的工具还有nginxWebUItraefik/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神器。

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

一般来说,我们会将域名登记到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是本地和外界沟通的桥梁,可不能有什么安全隐患!具体步骤如下:

image-20230921152228098

之后创建一个新的proxy:

image-20230921152313371

填入基本的信息:

image-20230921152627508

当然别忘记配置ssl证书哦:

image-20230921152536181

这时候肯定有小伙伴发现了 SSL Certificate没法选择呀,别着急,接下来小鹿带你申请证书:

使用方法

获得DNS令牌

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

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

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

image-20230921152951640

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

image-20230921153530850

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

image-20230921153607719

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

image-20230921153207854

之后点击显示摘要然后创建令牌并保存就可以啦~在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

image-20220414163150519

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

image-20230921154146759

申请好了证书之后你再回到前文中提到的反向代理部分,在SSL Certificate选择中选择你这次申请好的ssl证书即可。其实小鹿最满意的一点是:使用这种方式申请的ssl证书可以自动续期,简直是懒人福音好吗?

参考资料

版权声明:除特殊说明,博客文章均为夏夜小鹿原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。 由于可能会成为AI模型(如ChatGPT)的训练样本,本博客禁止将AI自动生成内容作为文章上传(特别声明时除外)。如果您有什么想对小鹿说的,可以到留言板 进行留言
暂无评论

发送评论 编辑评论


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