前言

Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。作为有公网IP的NAS用户常用其为NAS进行反向代理服务。使用反向代理实现多域名访问不同应用,规避IP+端口访问,不仅免去记端口号的麻烦,还可以只留下一个端口进行访问,提高了局域网环境的安全性。与此同时,还可以利用NAS作为跳板,反向代理其他的内外设备,例如路由器后台等服务。
原生Nginx并没有WebUI,而是使用配置文件进行配置,但对于普通用户来说自己写Config难度较高,因此大多数人使用带有WebUI的Nginx-Proxy-Manager进行反向代理,但是NPM本身有些BUG导致使用体验下降,今天则带来教程解决这些问题。Nginx-Proxy-Manager的安装教程可以看往期教程利用FRP和Nginx-Proxy-Manager为内网设备提供内外穿透服务

DNSPod域名免费证书申请错误

大多数人的NAS使用的是家用带宽,普通情况下运营商会封锁80和443端口,因此在使用反向代理时往往会使用其他的端口进行配置,而NPM中的免费证书申请并不能使用80以外的端口,所有大多数人使用DNS验证进行域名验证,而其中DNSPod又是国人较为常用的域名解析服务商。而NPM中自带的SSL证书申请脚本在申请DNSPod域名证书时会失败。此问题在2.9.19版本开始就已经存在,原因是zope引起的,由于ARM架构一直安装失败所以无法打包到镜像中,建议使用如下方法修复此问题

进入容器命令行环境

Uraid用户

Unraid用户可以先进入Unraid的WebUI,直接在【Docker】页面,点击NPM的头像,再点击【控制台】进入容器的命令行界面

其他用户

其他用户可以先使用SSH连接NAS,输入以下命令查看容器名

1
docker ps

这里假设容器名为Nginx-Proxy-Manager
输入以下命令进入容器内部

1
2
3
docker exec -it 容器名 bash
# 将容器名替换为你的容器名
# 我这里的容器名为【Nginx-Proxy-Manager】,则应输入:docker exec -it Nginx-Proxy-Manager bash

安装zope

依次输入以下命令

1
2
3
python3 -m pip install --upgrade pip
pip install certbot-dns-dnspod
pip install zope

等待安装完成,退出容器:

1
exit

最后刷新浏览器重新申请DNSPod域名证书即可

端口丢失

相信有很多小伙伴在使用NPM反代的时候经常会出现一些站点代理后会出现端口丢失(自动跳转到80端口)、502错误,或者需要加路径才能访问。
以unraid登录页面为例,添加一个站点,填写外网访问的域名,和内网代理ip、端口,启用ssl,选择对应证书,一般网站到此之后,点保存就能够愉快的进行访问了,但是unraid页面就不行了,登录页面并没有很顺利打开。此处可能会碰到各种错误,有人可能会端口丢失,有人可能需要手动在域名后面加上 /unraid才能打开页面等情况。原因是我们使用的是非标准80端口,访问unraid页面的时候有个自动重定向的动作,导致路径和端口丢失。

解决方法

Unraid

在配置反代页面时,点击高级/Advanced
输入以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
location / {
proxy_pass https://192.168.2.2:4443/;
proxy_set_header Host $http_host;
proxy_redirect http:// https://;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Scheme $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;
}

需要改动的只有第2行,将http(s)、IP和端口修改为自己需要代理的真实地址

NextCloud

其实NextCloud的端口丢失问题和NPM没有关系不大(主要是在第一次登录时NPM把端口省去了导致NextCloud获取URL错误)
这里主要是修改NextCloud的配置文件即可正常访问
找到下面这个文件(可以直接进入容器内部进行修改,也可以直接在映射出来的目录中修改

1
/var/www/html/config/config.php

大概在24行附近,有这么一个参数

1
2
3
array (
0 => '192.168.66.6',
),

这个就代表了第一次登录是从192.168.66.6(应该是将NextCloud的端口映射出来的主机地址)这个局域网地址登录的
假设我需要用nextcloud.akimio.top这个域名和端口号2580访问我的NextCloud服务,也就是说URL为https://nextcloud.akimio.top:2580,在正常设置完NPM的反向代理后还需要在之前找到文件改成下面这样:

1
2
3
4
5
6
7
array (
0 => '192.168.66.6',
1 => 'nextcloud.akimio.top', # 这里新增一行,代表这个域名(地址)可以访问
),
'overwritehost' => 'nextcloud.akimio.top', # 这里代表将服务的域名重写为nextcloud.akimio.top
'overwriteprotocol' => 'https', # 这里代表使用https加密访问
'overwrite.cli.url' => 'http://nextcloud.akimio.top:2580', # 这里为访问URL,填写方式为:http + 域名 + : + 端口,如果上一步有写https的参数的话这里的http会被自动替换成htts访问;如果没有写上一步的那个参数就会默认使用http访问

这里之后重启一下NextCloud容器就应该可以在浏览器正常访问了,APP登录时也不会丢失端口造成登录错误

兰空图床Lsky-pro

NPM修改

兰空图床在反代时也会丢失端口,先正常配置NPM的反向代理,然后在自定义位置处选择添加一个位置,再点击一下旁边的小齿轮
定义位置那里填/代表该反向代理所有路径都要遵守这个规则
协议转发主机/IP转发端口就按自己的实际情况填写就好,例如http172.18.0.3:2280(前面反代怎么填,这里就怎么填)
然后那个方框就填入下面这行参数就好

1
proxy_set_header X-Forwarded-Host $http_host;

内部配置修改

找到下面这个文件(可以直接进入容器内部进行修改,也可以直接在映射出来的目录中修改

1
/var/www/html/.env

然后修改APP_URL这个参数,并新增一个参数ASSET_URL,值都填写外部访问的URL,例如:

1
2
APP_URL=https://lsky.akimio.top:2580
ASSET_URL=https://lsky.akimio.top:2580

然后还是重启兰空图床容器就应该可以正常访问了

尾巴

PS:不知道是什么原因,Unraid主页可以正常访问,但是NextCloud和兰空图床访问有问题(2023.5.7)
目前我已经找到解决方法(详细请看上文),如果大家还遇到某个容器反代错误也欢迎在下面留言