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端口就行了。
-
还有个群晖和unraid也可以用的(自带这两个环境的安装教程)](https://github.com/jlesage/docker-nginx-proxy-manager) ,当然群晖本身就有反代程序,不过我没用过。
-
还有其他平台自带的,可以自己找找。
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,如图:
完成之后看一下EXPIRES的日期,跟证书本身到期日期差不多的话应该就没问题了。
然后点第一个Dashboard——第一个Proxy Hosts,进去配置一下iob的代理。
点击左上角的Add Proxy Host
选择刚才导进去的证书。
然后就可以愉快的玩耍了。
比如我的IOB是安装在群晖上的,我设置了一条代理规则给IOB:
然后你就可以直接输入iobroker.xxxx.xxx就可以打开了。
举个配置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大告诉我了我还没搞,最近事情有点多,回头再补充吧,我发帖子就像做笔记一样,比较啰嗦,文章写的有点长了,将就将就看吧。