Nginx Proxy Manager反代实现HTTPS
Nginx Proxy Manager简介
Nginx Proxy Manager简称NPM,是一个简单、易用的nginx,它具有易用的WEB管理界面,可以通过Let’s encrypt 来自动申请 SLL 证书并自动部署证书。NPM通过docker部署,极大的减少了安装部署的难度。如果你有兴趣,就继续看下去吧!
安装前准备
已经安装docker
已经安装docker-compose服务
SSH客户端,本文采用的ssh客户端为MobaXterm
域名(如未有请自行购买,国内推荐阿里云,腾讯云,国外推荐namesilo)
云服务商DNS解析页面(家宽),固定ip设置好域名解析
ddns服务(家宽),如未设置可参考我上篇docker安装ddns-go的教程
开始安装
教程以debian为例子,其余系统安装方式相同(经测试,群晖使用br类型的网络时,有概率无法反向代理群晖本地ip,请修改网络模式为host)
首先打开ssh终端,连接服务器
docker安装
输入下面命令,-v 地址映射参数和 -p 端口映射参数自行修改
家宽
docker run -d \
--name npm \
--restart unless-stopped \
-v /root/docker/npm/letsencrypt:/etc/letsencrypt \
-v /root/docker/npm/data:/data \
-p 4443:443 \
-p 4480:80 \
-p 4481:81 \
-e TZ=Asia/Shanghai \
jc21/nginx-proxy-manager
vps(开放80 443 端口)注意:npm会占用3000端口,请确定host模式下3000端口未被占用
docker run -d \
--name npm \
--net=host \
--restart unless-stopped \
-v /root/docker/npm/letsencrypt:/etc/letsencrypt \
-v /root/docker/npm/data:/data \
-e TZ=Asia/Shanghai \
jc21/nginx-proxy-manager
docker更新
#! /bin/bash
docker pull jc21/nginx-proxy-manager:latest
docker rm -f npm
docker run -d --name npm -v /root/docker/npm/letsencrypt:/etc/letsencrypt -v /root/docker/npm/data:/data -p 4443:443 -p 4480:80 -p 4481:81 jc21/nginx-proxy-manager:latest
docker rmi $(docker images | grep 'none' | grep 'nginx' | awk '{print $3}')
dockers-compose安装
docker-compose的优势对比docker更简洁好用,下面我们使用docker-compose来部署npm
采用内置的数据库部署
version: "3"
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
# These ports are in format <host-port>:<container-port>
- '4480:80' # Public HTTP Port
- '4443:443' # Public HTTPS Port
- '4481:81' # Admin Web Port
# Add any other Stream port you want to expose
# - '21:21' # FTP
# Uncomment the next line if you uncomment anything in the section
# environment:
# Uncomment this if you want to change the location of
# the SQLite DB file within the container
# DB_SQLITE_FILE: "/data/database.sqlite"
# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
采用mariadb部署npm(多人使用性能更好)
注意:需要对数据库有较深的理解,建议使用第一种方式
version: "3"
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx
restart: unless-stopped
ports:
# These ports are in format <host-port>:<container-port>
- '4480:80' # Public HTTP Port
- '4443:443' # Public HTTPS Port
- '4481:81' # Admin Web Port
# Add any other Stream port you want to expose
# - '21:21' # FTP
environment:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "password"
DB_MYSQL_NAME: "npm"
# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'
volumes:
- /home/shinev/docker/NPMO/data:/data
- /home/shinev/docker/NPMO/letsencrypt:/etc/letsencrypt
depends_on:
- db
db:
image: 'jc21/mariadb-aria:latest'
container_name: mariadb-aria
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'npm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'password'
volumes:
- /home/shinev/docker/NPMO/db-data:/var/lib/mysql
登录npm
登录设备ip+端口号,本次我们使用192.168.1.2:4481来访问npm
-
默认账号:
[email protected]
-
默认密码:
changeme
登录NPM后台,弹出用户设置页面,请自行修改,邮箱推荐使用可以收到邮件的邮箱,用来接收Let's Encrypt
的邮件
设置登录密码
这样,我们就正式进入了npm的管理界面,下面我们来了解一下NPM的界面。NPM下共分为4个主要模块,Proxy Hosts(反向代理)、Redirection Hosts(重定向)、Streams9(端口转发??)404 Hosts(懂得都懂)
,我们主要用的的模块是Proxy Hosts,即反向代理
在这四个主模块之上,上面还有一列选项,它们代表的意思具体如下图所示,我们主要用到的是SSL Certificates(证书管理)
,Access Lists(访问控制)
使用npm申请证书
首先我们打开SSL Certificates
,进行域名证书的申请。这里我们默认域名为abcde.com
,下列所有的教程都基于此域名,你只需要将域名更换为自己的域名即可
点击Add SSL Certificate
,输入自己的域名,可以申请单域名证书,也可以直接申请泛域名证书,此处直接申请泛域名证书,泛域名申请格式为*.abcd.com abcd.com
,单域名直接填写即可
找到Cloudflare
,提示我们需要配置API token
,我们打开Cloudflare官网,进入自己的域名配置,点击获取API令牌
点击创建令牌
找到编辑区域DNS,点击使用模板
按下图设置令牌的权限,然后点击继续
检查信息无误后,点击生成令牌
复制令牌,令牌只会生成一次,请注意保存
将令牌复制到API token处,点击确定,申请证书
等待证书申请成功,如出现错误,刷新网页再次生成即可,多试试总会成功的~~~
生成后的证书如下图所示
证书申请正式完成,npm将在证书到期时自动更新证书的有效期,无需自动配置。
使用npm进行反向代理
点击主页的Proxy Hosts
,进入反向代理主页面,
点击
例如我添加emby
切换到SSL
选项卡,勾选此域名的证书,下方选项仅需勾选第一个,其余选项按需修改,这里不过多进行介绍
修改完状态如下
对于某些应用来说,自带的nginx模板在反向代理后会出现错误,例如esxi无法显示虚拟机网页vnc,unraid无法正常跳转登录等等,则需要修改nginx默认配置。我们点击Advanced
选项卡,复制下面我提供的模板,粘贴到命令框,保存即可。
ESXI模板
location / {
set $upstream http://127.0.0.1:1234;
proxy_pass $upstream;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_set_header Host $http_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-Proto https;
proxy_set_header X-Nginx-Proxy true;
proxy_redirect off;
}
UNRAID模板
location / {
set $upstream http://192.168.1.1:80;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_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-Proto http;
proxy_set_header X-Nginx-Proxy true;
proxy_redirect http:// https://;
proxy_buffering off;
proxy_pass $upstream;
}
点击保存,反向代理设置完成
端口映射(家宽)
对于家宽来说,80、443端口已经被运营商封锁,对于v4来说,v4地址仅仅分配到了路由器,所以我们需要进行设置端口转发来完成外网访问
打开爱快的后台,依次点击 网络设置→端口映射→端口映射,点击右上角添加,添加刚刚安装npm设置的https端口,即这里的4443端口,具体设置方法如下图所示
点击添加端口映射,设置npm安装的内网地址及内网端口,以及设置转发的外网端口,这里我设置为和内网端口相同,即4443。设置完成后点击保存。
使用npm
家宽因为443、80端口被运营商封锁,我们不能免端口号运行,我们使用npm的时候,需要使用域名加端口进行访问。如果前面设置未更改的话,你可以使用域名https://emby.abcd.com:4443
访问你所设置的服务,反向代理即完成设置。下面就可以愉快的时候域名来访问你的内网应用了。