玩NAS的朋友对反向代理多少都有所耳闻,一般来说NAS系统也会内置反向代理服务器,比如群晖、威联通等主流NAS,都是可以直接使用的。但是也有一些不足(不是所有NAS,勿喷),有的不能自动管理SSL证书,有的设置繁琐,总之用着不是那么舒服。今天笔者介绍的NginxProxyManger(NPM)就是一款解放双手的宝藏,用起来相当简单高效。
NPM 底层实际就是Nginx,只不过基于Nginx开发了SSL证书、代理、用户等管理模块,支持直接在WebUI中管理你的网站。即使你完全不懂Nginx,也可以非常轻松的申请SSL证书、设置网站代理等等。核心的功能和特性主要有以下几点:
- 安全而漂亮的Web管理界面
- 可以轻松创建反代、重定向、流处理和404错误页面,而无需了解Nginx
- 可以使用Let's Encrypt直接申请免费的SSL证书
- 主机的访问列表和基本HTTP身份验证
- 支持高级Nginx配置,有能力的可以玩的花
- 用户管理、权限和审核日志
老规矩,笔者使用Docker来部署,无非是三板斧:准备、安装和配置,下面逐步介绍:
准备工作
- 创建应用目录,例如在/share/Container下创建文件夹npm
- 在homer文件夹下再创建
data
和letsencrypt
文件夹 - NAS上安装好docker-compose
安装NginxProxyManger
第一步、 在/share/Container/npm文件夹下创建文件docker-compose.yml
,
第二步、 并将下面内容复制粘贴到docker-compose.yml
中,保存:
version: '3.8'
services:
npm:
image: 'jc21/nginx-proxy-manager:latest'
container_name: npm
restart: unless-stopped
network_mode: bridge
environment:
- TZ=Asia/Shanghai
- PUID=1000
- PGID=100
- HTTP_PROXY=http://192.168.31.20:7890
- HTTPS_PROXY=http://192.168.31.20:7890
ports:
- '20080:80'
- '20081:81'
- '20443:443'
volumes:
- /share/Container/npm/data:/data
- /share/Container/npm/letsencrypt:/etc/letsencrypt
参数说明
参数 | 说明 |
---|---|
-p 80 | HTTP协议的访问端口,这里笔者映射到宿主机的20080端口 |
-p 443 | HTTPS协议的访问端口,这里笔者映射到宿主机的20443端口 |
-p 81 | NPM管理界面的端口,这里笔者映射到宿主机的20081端口 |
-e PUID=1000 | 设置PUID的值,请改成自己的 |
-e PGID=100 | 设置PGID的值,请改成自己的 |
-e TZ=Asia/Shanghai | 设置时区 |
HTTP_PROXY=http://192.168.31.20:7890 | HTTP代理服务器,如果有的话建议设置,可以加快依赖安装速度 |
HTTPS_PROXY=http://192.168.31.20:7890 | HTTPS代理服务器,如果有的话建议设置,可以加快依赖安装速度 |
-v /data | 数据文件的保存位置,宿主机的位置可以修改成你自己喜欢的 |
-v /etc/letsencrypt | SSL证书文件的保存位置,宿主机的位置可以修改成你自己喜欢的 |
image: 'jc21/nginx-proxy-manager:latest' | 镜像名称,不支持中文。如果想用中文可以换另一个镜像:chishin/nginx-proxy-manager-zh |
第三步、 在NAS的SSH中,切换到npm文件夹下,执行下面命令启动:
docker-compose up -d
第四步、 等待应用启动完成后,打开WebUI
在浏览器中输入NAS的IP+端口,例如:192.168.31.91:20081
打开管理Web界面后,使用下面的默认帐号和密码就能登陆了:
Email: [email protected]
Password: changeme
关于数据库
NPM
支持SQLite和MySQL/MariaDB做数据库,默认是SQLite,如果你想改为MySQL/MariaDB的话,在上面部署命令的environment
节点中增加以下配置即可:
environment:
DB_MYSQL_HOST: "db" #数据库地址
DB_MYSQL_PORT: 3306 #数据库端口
DB_MYSQL_USER: "npm" #数据库用户
DB_MYSQL_PASSWORD: "npm" #数据库密码
DB_MYSQL_NAME: "npm" #数据库名称
不过,笔者建议直接用SQLite就好了,完全够用,不必自找烦恼。
配置NPM
登录以后,就可以开始进行正式的配置了,主要三件事:改邮箱&密码、申请SSL证书和添加网站代理。下面逐个进行说明。
1、修改邮箱和密码
首先,点击Users
,可以看到刚才登录时的默认账号,点击右边三个点,在弹出的菜单中分别点击Edit Details
和Chage Password
来修改管理账号的邮箱和密码即可。
其次,除了修改默认的账号,你还可以增加新的账号。点击Add User
按钮,然后填写姓名、邮箱和角色。
第三,在弹出的权限框中设置新用户的权限范围,按照自己实际情况选择即可。
最后,设置完权限后,记得回到列表页,找到新创建的用户,点击三个点,选择Change Password
,为这个新用户设置个密码,否则不能使用。
2、申请SSL证书
与大多数免费SSL证书一样,NPM的SSL证书也是使用Let's Encrypt
实现的,特点就是完全免费、期限比较短。但是,NPM支持泛域名SSL证书申请,最最重要的是可以自动续期
,这可比各大云厂商的免费域名厚道多了。
首先,点击SSL Certificates
打开证书管理页面,然后点击右上角Add SSL Certificates
按钮,并在菜单中选择:
接着,重点来了,这一步非常关键,详见下图:
填写说明:
字段 | 说明 |
---|---|
Domain Names | 就是你要申请SSL证书的域名,建议填写泛域名,一步到位。比如你的域名是imissyou.com,你就填*. imissyou.com,填完后回车即可。 |
Email Address for Let's Encrypt | 你的邮箱,建议填真实的,如果证书快到期了,Let's Encrypt 会通过这个邮箱通知你,当然我们不需要它通知。 |
Use DNS Challenge | 勾选。勾完以后才能选择你的域名解析服务商。 |
DNS Provider | 域名解析服务商,就是你的域名是在哪解析的,笔者是在Cloudflare解析的,就选Cloudflare。 |
Credentials File Content | 进行DNS Challenge需要用到的授权信息,每一个DNS Provider都不一样,比如Cloudflare就是需要API TOKEN,那么到Cloudflare上创建一个复制上去就行。其他的也类似。 |
Propagation Seconds | 解析生效时间,可不填。 |
最后,勾选I Agree to the Let's Encrypt Terms of Service
,再点击Save
即可。
注意,这一步点击
Save
后有可能会报错,一般是下载python依赖失败导致的,可以进入容器中,手工安装相关的依赖即可。例如
# 进入容器
docker exec -it npm /bin/sh
# 安装dnspod的依赖(如果你选择DNSPod作为DNS Provider
pip install certbot-dns-dnspod -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/
# 安装cloudflare的依赖(如果你选择Cloudflare作为DNS Provider
pip install certbot-dns-cloudflare -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/
3、添加反向代理
等第二步成功以后,下面就简单了,直接无脑操作就行。
首先,点击Hosts
-->Proxy Hosts
,打开代理设置页面:
然后,点击Add Proxy Host
按钮,弹出添加面板,一般只需要填写Details
和SSL
两个页签下的内容即可。
先填写Details
中的内容
Detail填写说明:
字段 | 说明 |
---|---|
Domain Names | 就是你要代理的网站的域名,比如你要代理NPM本身,就可以填写npm.imissyou.com,然后回车 |
Scheme | 协议,一般填http |
Forward Hostname / IP | 代理对象的地址或ip,一般填内网代理对象的ip,比如代理NPM本身,就填NPM所在机器的IP |
Forward Port | 代理对象端口,一般填内网代理对象的端口,比如代理NPM本身,就填NPM的管理端口20081 |
Cache Assets | 无脑勾选 |
Blocks Common Exploits | 无脑勾选 |
Websockets Support | 无脑勾选 |
Access List | 默认的Publicly Accessible |
切换到SSL
页签继续填写:
SSL填写说明:
字段 | 说明 |
---|---|
SSL Certificate | 选择你的SSL证书,就是第二步中申请的证书 |
Force SSL | 是否强制SSL,建议开启 |
HTTP/2 Support | 建议开启 |
HSTS Enabled | 不建议开启 |
HSTS Subdomains | 不建议开启 |
最后,全部填写完以后,点击Save
按钮,一个反向代理的网站就添加好了。这时候就可以使用域名+NPM的HTTPS端口打开你的内部网站了。以后访问自己NAS上的各种服务或系统,就不用记一大堆端口号了,毕竟记域名相对更容易些吧!
总结
以上就是NginxProxyManger搭建的简单过程,当然由于每个人的机器环境、网络情况等等都不尽相同,可能在搭建过程中会遇到一些意外情况,搞不定的话可以在本文后面留言,笔者也会尽量帮大家解答。
原创不易,如果觉得此文对你有帮助,不妨点赞+收藏+关注,你的鼓励是我最大的动力!

文章评论