【Docker系列】一个反向代理神器——Nginx Proxy Manager

一个很简单的提供反向代理的工具~

本博客用什么VPS?创作不易,欢迎请咕咕喝杯咖啡☕☕☕

image-20211206175320893

YouTube:https://youtu.be/Z2zl2TlDzd8

哔哩哔哩: https://www.bilibili.com/BV1Gg411w7kQ

前言

上一期留了一个问题,我们怎么样才能把IP+端口变成域名来访问?

答案是用反向代理。

看过之前几期视频的小伙伴应该知道,之前有宝塔的时候,碰到这个情况,我们会先新建一个站点,然后修改Nginx配置文件:

location / {

        proxy_pass http://178.18.249.61:8123/;

        rewrite ^/(.*)$ /$1 break;

        proxy_redirect off;

        proxy_set_header Host $host;

        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header Upgrade-Insecure-Requests 1;

        proxy_set_header X-Forwarded-Proto https;

}

具体可以参考:【好玩的Docker项目】搭建一个简洁的记事本——minimalist-web-notepad 里面配置反向代理部分。

就可以反向代理的操作(域名访问)了。

很多小伙伴跟着做可以成功,但是可能对反向代理并不是很了解,我们就趁着今天来简单介绍一下。

操作环境

什么是代理

首先代理大家都懂 :)

代理就是第三方。

正向代理

4e46c87b-633d-4836-83e1-49585e65f127

你要买国外小G家的鞋子,你没有paypal和信用卡,买不了,于是你找到了叫小V的代购帮你到海外买,小V找到海外的卖家小G,帮你买了鞋子,然后寄回给了你。

这个小V就是正向代理。

正向代理的特点是,可以保护访问者的信息。因为小V是个职业代购,他在帮你代购鞋子的同时也帮别人代购鞋子,而且他不仅代购鞋子,还代购箱子、家具、电饭煲,卖家小G只知道有人买了我的鞋子,我交给了小V,但并不知道具体是谁买了他家的鞋子。

反向代理

反向代理,顾名思义,正好相反,可以保护卖家的信息。

66bfd3ce-c815-4568-97c2-3d135e33c3c8

具体可以看视频。

好了,回来。

没有了宝塔,我们今天用一个更简单的Docker项目来完成反向代理的操作。

Nginx Proxy Manager

Nginx proxy manager是一个很简单的反向代理工具。

官网:https://nginxproxymanager.com/

门槛极低,操作简单,不需要你掌握很复杂的Nginx配置知识,只需要几步就能很轻松完成反向代理的设置和SSL证书的部署。

it had to be so easy that a monkey could do it.

开始部署

服务器环境:Debian 10(Ubuntu 20.04也可以)或以上版本

登陆服务器

不建议用CentOS,具体原因请见:解释使用Debian而不是CentOS的原因

选择一款连接SSH的软件。

如果不会可以看这个文档:连接SSH的软件和相关操作

Mac 或者 Linux 用户可以直接用系统自带的终端(也叫Terminal)来登陆服务器。

输入:

ssh 你的用户名@你的服务器IP -P 22

如果你没有更改 ssh 的端口,默认就是22,当然为了服务器安全,建议你可以换一个别的端口,具体请见:保护好你的小鸡!保姆级服务器安全教程!

添加SWAP虚拟内存

注意:VPS 的内存如果过小,建议设置一下 SWAP,一般为内存的 1-1.5 倍即可,可以让系统运行更流畅!

设置 SWAP 可以用脚本:

wget -O box.sh https://raw.githubusercontent.com/BlueSkyXN/SKY-BOX/main/box.sh && chmod +x box.sh && clear && ./box.sh

image-20220528185512488

选择 18,然后输入你想要扩容的数值即可。

image-20220528185604586

升级 packages

sudo -i # 切换到 root 用户

apt update -y  # 升级 packages

apt install wget curl sudo vim git -y  # Debian 系统比较干净,安装常用的软件

安装 Docker 环境

安装 Docker(非大陆服务器)

wget -qO- get.docker.com | bash
docker -v  #查看 docker 版本
systemctl enable docker  # 设置开机自动启动

安装 Docker-compose(非大陆服务器)

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version  #查看 docker-compose 版本

安装 Docker(国内服务器)

curl -sSL https://get.daocloud.io/docker | sh
docker -v  #查看 docker 版本
systemctl enable docker  # 设置开机自动启动

安装 Docker-compose(国内服务器)

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.1.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose --version  #查看 docker-compose 版本

修改 Docker 配置(可选)

内容参考:烧饼博客

以下配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小,防止 Docker 日志塞满硬盘(泪的教训):

cat > /etc/docker/daemon.json <<EOF
{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "20m",
        "max-file": "3"
    },
    "ipv6": true,
    "fixed-cidr-v6": "fd00:dead:beef:c0::/80",
    "experimental":true,
    "ip6tables":true
}
EOF

然后重启 Docker 服务:

systemctl restart docker

安装 Nginx Proxy Manager

创建安装目录

创建一下安装的目录:

sudo -i

mkdir -p /root/data/docker_data/npm

cd /root/data/docker_data/npm

这边我们直接用 docker 的方式安装。

vim docker-compose.yml

英文输入法下,按 i

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'  # 保持默认即可,不建议修改左侧的80
      - '81:81'  # 冒号左边可以改成自己服务器未被占用的端口
      - '443:443' # 保持默认即可,不建议修改左侧的443
    volumes:
      - ./data:/data # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 data 文件夹中
      - ./letsencrypt:/etc/letsencrypt  # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 letsencrypt 文件夹中

按一下 esc,然后 :wq 保存退出,之后,

打开服务器防火墙并访问网页(非必需)

打开防火墙的端口 81

举例,腾讯云打开方法如下:

image-20220630215240864
image-20220630220546335

图中示例填的是 5230,备注填的是 memos,这边我们填 81,示例填 nginxproxymanager ,确定即可(如果你在 docker-compose 文件里换了 82,这边就需要填 82,以此类推)

image-20220819145844555

查看端口是否被占用(以 81 为例),输入:

lsof -i:81  #查看 81 端口是否被占用,如果被占用,重新自定义一个端口

如果啥也没出现,表示端口未被占用,我们可以继续下面的操作了~

如果出现:

-bash: lsof: command not found

运行:

apt install lsof  #安装 lsof

如果端口没有被占用(被占用了就修改一下端口,比如改成 82,注意 docker 命令行里和防火墙都要改)

运行并访问 Nginx Proxy Manager

最后:

cd /root/data/docker_data/npm   # 来到 dockercompose 文件所在的文件夹下

docker-compose up -d 

理论上我们就可以输入 http://ip:81 访问了。

默认登陆名和密码:

Email:    admin@example.com
Password: changeme

注意:

1、不知道服务器 IP,可以直接在命令行输入:curl ip.sb,会显示当前服务器的 IP。

2、遇到访问不了的情况,请再次检查在宝塔面板的防火墙和服务商的后台防火墙是否打开对应了端口。

更新 Nginx Proxy Manager

cd /root/data/docker_data/npm

docker-compose down 

cp -r /root/data/docker_data/npm /root/data/docker_data/npm.archive  # 万事先备份,以防万一

docker-compose pull

docker-compose up -d    # 请不要使用 docker-compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker-compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。

docker image prune  # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像

提示:

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] 

输入 y

利用 Docker 搭建的应用,更新非常容易~

卸载 Nginx Proxy Manager

cd /root/data/docker_data/npm

docker-compose down 

rm -rf /root/data/docker_data/npm  # 完全删除映射到本地的数据

可以卸载得很干净。

最后

NPM的功能还有很多,预计还有两期,一期讲泛域名证书的配置,一期讲安全防护,这次只是简单介绍一下,大家可以发挥钻研精神,自己先研究研究。

有了NPM,可以统一管理,的确方便了很多,但总觉得还缺少点什么?有没有类似NPM这种有UI界面的工具,可以让我们直观地看到Docker的容器呢?Docker容器如果也可以统一管理,查看状态就很棒,别急,下期给大家带来!

推荐阅读:

【Docker系列】反向代理神器NginxProxyManager——通配符SSL证书申请

【Docker系列】让网站更安全!开启NginxProxyManager网站访问登陆限制功能

如何在Nginx Proxy Manager(NPM)上部署静态网站

Nginx Proxy Manager忘记登陆账号/密码了怎么办?

【Docker魔法系列】NPM与XUI共存!Nginx Proxy Manager搭配X-UI实现Vless+WS+TLS 教程!

---------------
如何觉得文章内容不错,欢迎点击一下广告,支持一下咕咕😍😍😍

原创文章,作者:Roy,如若转载,请注明出处:https://iwanlab.com/nginx-proxy-manager/

(1)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Roy的头像Roy
上一篇 2023年6月15日 下午7:24
下一篇 2023年6月15日 下午7:24
   

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

评论列表(9条)

  • Sameal
    Sameal 2024年9月6日 下午12:05

    你好咕咕,想问一下npm怎么迁移到新的vps上,我把整个npm的文件夹迁移过去之后,up -d启动后,用IP加端口也访问不了

    • Roy的头像
      Roy 2024年9月12日 下午2:49

      @Sameal不应该呀,你的新服务器是国内的?

  • danboy
    danboy 2024年3月12日 上午2:39

    您好大佬,请教一下,就是腾讯云轻量+centos+docker的WordPress网站部署时配置nginx proxy manger反代时出现一个*内部错误*,然后不管怎么弄都不行,是什么原因呀?能用域名+端口访问nginx…的web页面,并且能申请证书

    • Roy的头像
      Roy 2024年3月12日 上午8:46

      @danboy你的服务器是不是在大陆的,在大陆的服务器需要备案才能使用

  • sos2
    sos2 2023年12月12日 下午12:35

    你好咕咕,我使用的是RackNerd的服务器。想请教一下docker的-p 穿透防火墙的问题 你是怎么解决的

    • Roy的头像
      Roy 2023年12月12日 下午1:33

      @sos2可以参考这个:https://github.com/chaifeng/ufw-docker

    • sos2
      sos2 2023年12月12日 下午1:55

      @Roy不知道是不是服务器的问题,我尝试了之后,重启了一下服务器,最后我就登不上了笑哭笑哭笑哭

  • drea
    drea 2023年9月6日 下午9:54

    你好咕咕,这个问题前几天我问过,但是没有收到回复(应该是我没有留下邮箱),所以重新问一下,ERROR: for npm_app_1 Cannot start service app: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error setting cgroup config for procHooks process: bpf_prog_query(BPF_CGROUP_DEVICE) failed: invalid argument: unknown

    ERROR: for app Cannot start service app: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error setting cgroup config for procHooks process: bpf_prog_query(BPF_CGROUP_DEVICE) failed: invalid argument: unknown
    ERROR: Encountered errors while bringing up the project.

    • Roy的头像
      Roy 2023年9月7日 上午9:06

      @drea你遇到的问题与Docker容器和cgroup有关。cgroup是Linux内核的功能,用于限制、记帐和隔离进程组的资源使用(如CPU、内存等)。

      出现这样的错误,可能是由于一些原因:

      1. Docker版本与宿主机的内核版本不兼容:Docker使用了Linux内核中的一些特性,如果Docker的版本和内核的版本不匹配,可能会导致一些问题。你可以尝试更新Docker到最近的版本或者降级Docker到一个与你的内核版本兼容的版本。

      2. Docker运行时(runc)出现错误:这种问题通常出现在尝试运行容器时。runc是用来启动容器的,如果在尝试创建或运行容器时遇到错误,可能是Docker的配置问题,也可能是容器的配置问题。

      建议的解决步骤:

      1. 确保你的操作系统已经更新到最新版本。
      2. 更新Docker和docker-compose到最新稳定版本。
      3. 确保Docker服务正在运行。
      4. 尝试重启Docker或者你的机器。
      5. 检查你的`docker-compose.yml`文件,确认没有错误的配置。
      6. 如果有更详细的日志,可以进一步提供,或者查阅Docker和runc的官方文档。

      如果以上的步骤都不能解决你的问题,建议在相关的技术社区(如Stack Overflow或Docker的官方论坛)发起讨论,详细地描述你的问题和你已经尝试过的解决办法。