用Nginx Proxy Manager软件搞定iobroker的https远程访问。

1、名词解释

Nginx

引用下百度百科:

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。 其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。

NginxProxyManager

NginxProxyManager是一个基于WEB操作、比较简单就可以上手的反代配置软件(镜像),比较适合有外网环境、跟我一样的小白玩玩。

用它,你可以省掉很多单独给一些软件(比如iobroker)配置web管理端SSL的时间,直接一个简单的二级域名就行了,很多内网设备都可以通过https+二级域名进行访问,相对安全一点吧,还有就是路由器不用再去做那么多映射,只映射NginxProxyManager需要用到的https端口就行了。

2、前置条件

  • 顶级域名;

  • 泛域名证书;

  • 外网IP, 当然最好要有443端口;

可能很多人都被封了,如果不介意拖着小尾巴也可以用,自己家里简单玩玩不能太讲究了。

3、适用(演示)环境

  • 适用环境:Debian+Docker

  • 演示环境:N1+armbian+docker,SSH登陆用户为root用户。

4、教程开始

第一步:域名购买及阿里DDNS解析设置

详情见:

  • antsunzj 大佬的帖子:

[iobroker–n1版–通过阿里云获取自己域名,随时随地外网访问](iobroker--n1版--通过阿里云获取自己域名,随时随地外网访问

  • LFPlus大佬的帖子:

通过Docker部署阿里云DDNS使自己的域名可以外网访问](通过Docker部署阿里云DDNS使自己的域名可以外网访问

第二步:证书申请

证书申请利用acme.sh,相关的帖子比较多,N1的话直接用命令就可以了,放个链接:

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书

x86环境的docker可以直接用docker命令(这个镜像好像是不支持N1的aarch64平台,我也没有特意去找没有大佬编译好的aarch64版本):

mkdir ~/acme.sh

docker run --rm \
-v ~/acme.sh:/acme.sh \
-e Ali_Key="修改成你自己的阿里云Access Keys里面申请的Access Key ID " \
-e Ali_Secret="修改成你自己的阿里云Access Keys里面申请的Access Key Secret " \
neilpang/acme.sh --issue --dns dns_ali -d *.你的顶级域名

如果顺利的话,就可以在“~/acme.sh”目录下看到你的证书文件了。

第三步:安装mariadb数据库

我用的这个镜像没有集成数据库,需要自己安装,其他我看到的基本都内置了,不用这一步。

顺便解释一下,我把所有容器的数据都映射到N1的/var/lib/docker/data/文件夹下了,需要根据自己的情况调整,下面那些命令当然直接运行也没问题,docker会自动创建那些文件夹。

SSH连接你的N1,然后:

docker pull mariadb

然后运行:


docker run --name mariadb --restart=always -e TZ="Asia/Shanghai" -e MYSQL_ROOT_PASSWORD=你的数据库密码 -d -p 3306:3306 -v /var/lib/docker/data/mariadb:/var/lib/mysql mariadb

“/var/lib/docker/data/mariadb”这个路径你可以随意定义,记住就好,可能需要手动设置它的权限为777。

这样就装好了。

  • 创建NginxProxyManager需要的数据库

还是通过SSH,输入:

docker exec -it mariadb /bin/bash

进入mariadb容器内不,创建相关文件,先登陆mysql:

mysql -u root -p你的数据库密码

创建名称为nginxproxymanager的数据库:

CREATE DATABASE nginxproxymanager DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

设定密码:

CREATE USER ‘nginxproxymanager’@‘localhost’ IDENTIFIED BY ‘你的密码’;

设置访问权限:

grant all privileges on nginxproxymanager.* to ‘nginxproxymanager’@’%’ identified by ‘你的密码’;

刷新一下:

flush privileges;

然后 exit 可以退出了。

docker版的数据库创建差不多就这个意思,用到的地方其实很多哒。

  • 手动创建NginxProxyManager的配置文件

在编辑器里面输入:


{
  "database": {
   "engine": "mysql",
   "host": "安装数据库的设备的IP",
   "name": "nginxproxymanager",
   "user": "nginxproxymanager",
   "password": "你的密码",   #就是上面的“你的密码“,不是“你的数据库密码”
   "port": 3306
  }
}

然后保存为"config.json"备用,也可以用命令创建,路径在:/var/lib/docker/data/nginx-proxy-manager/文件夹下,我用了WinSCP程序,提前编辑好,然后手动放进去,注意看权限,设置权限和其他文件相同应该就可以了。

第四步:安装Nginx Proxy Manager


docker run -d \
   --restart=always \
   --name nginx-proxy-manager \
   -p 8080:80 \
   -p 8181:81 \
   -p 4443:443 \
   -v /var/lib/docker/data/nginx-proxy-manager/config.json/:/app/config/production.json \
   -v /var/lib/docker/data/nginx-proxy-manager/data:/data \
   -v /var/lib/docker/data/nginx-proxy-manager/letsencrypt:/etc/letsencrypt \
   jc21/nginx-proxy-manager:latest-arm64

WinSCP进入/var/lib/docker/data/nginx-proxy-manager/目录,删掉config.json,将上面创建的config.json文件放进去,注意看看权限(Linux的权限问题我也解释不清,遇到提示权限问题,我都是直接777的主)。

重启下容器,顺利的话Nginx Proxy Manager就搞定了,然后通过N1的“IP:8181“打开WEB界面。

解释一下上面的端口:

  • “8080:80” 将本机的8080端口映射给nginx-proxy-manager容器内的80端口,就是nginx-proxy-manager用来代理http端口,基本也用不到;

  • “8181:81” 将本机的8181端口映射给nginx-proxy-manager容器内的81端口,这个是nginx-proxy-manager的web管理端口,全部做好了,这个也可以反带出去,所以路由器本身也不用映射这个端口了,外网管理也很方便;

  • “4443:443” 将本机的4443端口映射给nginx-proxy-manager容器内的443端口,这个是nginx-proxy-manager用来代理https端口,也就是我们需要用到的,如果你的443没有被封,回头路由器映射就将443映射为4443,如果被封了,就算这么搞了,也需要拖着你映射4443的端口尾巴,可能不是很爽。

多说一句,docker命令中所有写了有-p xxxx:xxxx 都是类似的意思,内部端口号得看镜像发布者本身的说明,外部端口号就看你本机有没有被占用咯。

第五步:配置路由器端口转发

如果你的443没有被封,那就果断将路由器的443端口转发到N1的8181上,我的是梅林,登陆你的路由器,选择左侧栏中的高级设置——外部网络——端口转发,见图:

萝卜大佬的帖子有某个路由的配置,拿个图过来:

意思是一样的。

第六步:配置Nginx Proxy Manager

浏览器输入你的N1 IP:8181。

默认用户名:admin@example.com

默认密码:changeme

进去之后会提示你改成自己的账号和密码。

准备好你的证书,先导入自定义证书:

选择Custom,如图:

TIM截图20190625183344.png

完成之后看一下EXPIRES的日期,跟证书本身到期日期差不多的话应该就没问题了。

然后点第一个Dashboard——第一个Proxy Hosts,进去配置一下iob的代理。

点击左上角的Add Proxy Host

选择刚才导进去的证书。

TIM截图20190625184214.png

然后就可以愉快的玩耍了。

比如我的IOB是安装在群晖上的,我设置了一条代理规则给IOB:

然后你就可以直接输入iobroker.xxxx.xxx就可以打开了。

11111111111.png

举个配置Nginx Proxy Manager本身的web管理界面的例子:

新增一个代理设置(Add Proxy Host)

然后Domain Names设置为nginx.luoboluobo.xxoo,注意要回车:

然后选择你的证书,确认之后,就可以用过nginx.luoboluobo.xxoo直接在公网去更改和配置这些东西了,很方便很爽(有443的话)。

附:Docker的WEB端管理可以看这个帖子:

[iobroker–docker网页版管理界面安装及使用](iobroker--docker网页版管理界面安装及使用

命令:

docker run --restart=always -it -d -p 3010:3000 -v /var/run/docker.sock:/var/run/docker.sock smarthomefans/easydockerweb:arm64v8-latest

映射的端口可以自己定义的,记住就好,然后”宿主IP:3010“打开docker管理界面,可以管理加看日志等操作了。

习惯portainer的话:

docker run -d -p 9010:9000 --name docker-portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

致谢

  • Nero

Nginx这个东西和思路,都是跟他学的,还学(抄)了好多东西,真心非常感谢。

  • 萝卜、花大、老妖

发掘并维护了一个好的平台,群里硬件大神也很多,只剩膜拜了。

后续可能会补充一些自动更新证书配合这个的东西,N大告诉我了我还没搞,最近事情有点多,回头再补充吧,我发帖子就像做笔记一样,比较啰嗦,文章写的有点长了,将就将就看吧。

等你一个星期了 终于发了 !现在就操作起来!

配置nodered以及iob之类的应该是需要勾选配置界面的Websockets Support,注意一下。

可能还需要在阿里云的域名解析记录里面添加泛解析的A记录。。。不知道这一步是不是必须的,个人理解aliddns应该是会自动创建的。

还有就是设置解析的时候,可能需要将原帖中的-e “DOMAIN=www.myweb.top” \ 改为*.myweb.top

待验证。

域名解析不能泛域名,解决办法是 x.abc.xx A记录解析到IP,然后新增的域名全部使用 CNAME 指向 x.abc.xx

N大,我好像不是太明白,因为我的IP好像很久没有变过了,而且aliddns也换来换去的装,都是手动去添加的。

我看阿里的域名DDNS解析是支持泛域名的啊,主机记录直接写“ * ”就行,然后我的aliddns解析容器用的是你做的那个add-on,domain直接就写的“ *.abc.xx ”,这么做思路对么?

我的理解这样搞的话所有的xxxx.前缀都能得到我的IP,好处就是不用手动去cname二级域名了。
aliddns是会自动在阿里云控制台里面添加解析记录吗?比如我的控制台里面本身一条解析都没有,aliddns插件启动之后是不是会自动创建解析记录,或者说第一次需要手动添加,以后会自动更新? 查了一下,好像第一次是需要手动。

诶,我错了,原来还真是支持 *.a.com 这样写法。

不过家个cname感觉灵活性更好

没摸透 NginxProxyManager,暂时投降,不过我会回来的