docker运行nginx 并反代内网的一些服务2(nginxwebui修改版)

家里路由器是openwrt x86,内外有跑一些服务。这里用路由器上配置nginx+ssl,然后内网的所有web服务都经过nginx到公网,因为家用宽带不只

nginxwebui是国产基于java的开源nginx配置文件生成器,用于替代死板的nginx-proxy-manage 。

优点是 更加灵活 强大 支持中文,几乎支持所有的nginx功能的可视化配置。

缺点是 略微繁琐,尤其是不能自动载入配置文件,创建项目后,要手动在webui里面,点替换和重载。

docker安装

nginxwebui 官网docker实例是用的host模式运行,不建议。还是自定义端口映射。

我这里需要3个端口 nginxwebui管理端口50088,http 端口50081 https 端口50443

1
docker run -itd  --restart=always --name=nginxwebui --hostname nginxwebui -e BOOT_OPTIONS="--server.port=50088" -p 50081:50081  -p 50088:50088 -p 50443:50443 --privileged=true   cym1102/nginxwebui:latest

证书目录 是保存在: /home/nginxWebUI/.acme.sh/ 下面
配置文件/home/nginxWebUI/nginx.conf

如果需要对证书单独管理,可以映射出来。也恩可以用docker cp 定时复制出来。

1
docker run -itd -v /opt/docker_file/op_nginxWebUI:/home/nginxWebUI --restart=always --name=nginxwebui --hostname nginxwebui -e BOOT_OPTIONS="–server.port=50088" -p 50081:50081 -p 50088:50088 -p 50443:50443 --privileged=true cym1102/nginxwebui:latest

而后在 nginxwebui 内部 再反代 管理端口出来 套上ssl 即可从外网ssl访问。

为了方便备份,我这里没有映射目录出来。记得自行定时清理日志:/home/nginxWebUI/log/nginxWebUI.log

注意: http://10.0.0.1:50088/ web界面 打开可能会空白,这个….大概是因为java启动慢的原因,等一会 刷新一下就好了。

一个典型的反代配置

包括http自动跳转ssl

1
2
3
4
5
6
7
8
9
转发类型 http
监听端口:这个如果要开启ssl的话要输入ssl端口 50443
选择密码文件:这个是base的密码
开机ssl:是
选择内置证书:(提前配置)
开启https:是
ssl协议版本:全部勾选
http跳转https:是
从该端口跳转:第一个留空  第二个输入ssl的端口后 50081

这样就可以实现,访问http的时候自动跳转到ssl
最终配置文件大概如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
  server_name 域名;
  listen 50443 ssl http2;
  ssl_certificate /home/nginxWebUI/.acme.sh/jia.leiyanhui.com/fullchain.cer;
  ssl_certificate_key /home/nginxWebUI/.acme.sh/jia.leiyanhui.com/jia.leiyanhui.com.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  listen 50081;
  if ($scheme = http) {
    return 301 https://$host:50443$request_uri;
  }
  location / {
    # 自己;
    proxy_pass http://10.0.0.1:50088;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_redirect http:// https://;
  }
}

自动备份到阿里云镜像

https://dev.leiyanhui.com/docker/img-to-aliyun/

1
10 3 * * 6 sh /etc/docker_up_aliyun_nginxWebUi.sh

使用nginxWebUI反代 主路由的一个小问题

如果op主路由配置了 根据域名跳转(https://dev.leiyanhui.com/openwrt/acme-ssl/),op需要绑定一个不属于最终配置文件的域名 。或者 使用下面的方法。 另外 op里面的网页终端需要单独处理(我选择 直接弃用)。

还有一个方案 是 不传递host参数,然后直接访问 https://你的域名:端口/cgi-bin/luci/ 也可以解决。

关于使用http协议访问https端口的400错误处理

例如我正常访问我的路由器应该是https://域名:50443如果用http://域名:50443访问端口还是https的端口就会提示400错误。 因为服务是家人也用。 不能指望他们理解http(S)这些。所以我采取的方法是直接拦截错误,并跳转到正确的首页地址。

首先这个错误是 497 错误,nginxWebUI支持参数模板,添加一个参数模板,名字随意,添加参数error_page 497https://$host:50443; #解决http到ssl端口的400错误 然后用默认配置应用到反向代理。完毕

最好的解决方案

编辑对应的ningxWebUi反向代理配置, 添加一个 = / 自定义localtions 添加参数 return 301 https://$host:50443/cgi-bin/luci (意思就是网址后面没有东西的情况下跳转到后面地址)即可 (注意好要清理浏览器缓存不然不会生效)
最终代码如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
server {
  server_name op.jia.leiyanhui.com;
  listen 50443 ssl http2;
  ssl_certificate /home/nginxWebUI/.acme.sh/*.jia.leiyanhui.com/fullchain.cer;
  ssl_certificate_key /home/nginxWebUI/.acme.sh/*.jia.leiyanhui.com/*.jia.leiyanhui.com.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  listen 50081;
  if ($scheme = http) {
    return 301 https://$host:50443$request_uri;
  }
  error_page 497 https://$host:50443; #解决http到ssl端口的400错误;
  location = /  {
    # op自动跳转;
    return 301 https://$host:50443/cgi-bin/luci;
  }
  location / {
    # op代理;
    proxy_pass http://10.1.1.1/;
    proxy_redirect http:// https://;
  }
}

进阶

1、解决 在web界面直接点击 域名 链接打开的是不带端口的导致非标端口打不开的情况。 https://github.com/joyanhui/nginxWebUI 2、解决 定时续签2点拥堵的问题, 下载 我自己的修改的 jar,替换到docker里面

1
2
3
4
5
docker exec -it nginxwebui rm /home/nginxWebUI.jar #删除原版jar
wget https://github.com/joyanhui/nginxWebUI/releases/download/2st/nginxWebUI.jar
docker cp nginxWebUI.jar nginxwebui:/home/nginxWebUI.jar # 复制宿主机上的修改过的jar进去
docker restart nginxwebui  #重启
rm -rf nginxWebUI.jar

下载地址

https://www.123pan.com/s/EqorVv-n0nPA 提取码:yhjt

详细 https://github.com/joyanhui/nginxWebUI

其他问题

nginxwebui 和 nginx-proxy-manager 都同样的问题,就是在web界面直接点击 域名 链接打开的是不带端口的。在前者的github 提交过issues但是作者没有回应。后at作者后,作者表示:这个界面是展示信息用,不是给你高强度使用的 不知所云。

已经自己修改 https://github.com/joyanhui/nginxWebUI

不过nginxwebui 相对 nginx-proxy-manager 依旧适合非标端口的 如果是内网使用,家用宽带没有标准端口的情况下,可以通过一个简单方法实现,就是在路由器上转发跳转一次,详情:https://dev.leiyanhui.com/openwrt/acme-ssl/

另外 nginxwebui 的证书申请 有几个小遗憾,1 证书检查时间固定在凌晨2点不可以修改,还是很拥挤的。2 没有日志显示,如果出错你也不知道。。。只能等待。。。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计