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

image-20221110001057968

登录NPM后台,弹出用户设置页面,请自行修改,邮箱推荐使用可以收到邮件的邮箱,用来接收Let's Encrypt的邮件

设置登录密码

image-20221110001648039

这样,我们就正式进入了npm的管理界面,下面我们来了解一下NPM的界面。NPM下共分为4个主要模块,Proxy Hosts(反向代理)、Redirection Hosts(重定向)、Streams9(端口转发??)404 Hosts(懂得都懂),我们主要用的的模块是Proxy Hosts,即反向代理

image-20221110003012290

在这四个主模块之上,上面还有一列选项,它们代表的意思具体如下图所示,我们主要用到的是SSL Certificates(证书管理)Access Lists(访问控制)

image-20221110003928507

使用npm申请证书

首先我们打开SSL Certificates,进行域名证书的申请。这里我们默认域名为abcde.com,下列所有的教程都基于此域名,你只需要将域名更换为自己的域名即可

image-20221110012735957

点击Add SSL Certificate,输入自己的域名,可以申请单域名证书,也可以直接申请泛域名证书,此处直接申请泛域名证书,泛域名申请格式为*.abcd.com abcd.com,单域名直接填写即可

image-20221110013736345

找到Cloudflare,提示我们需要配置API token,我们打开Cloudflare官网,进入自己的域名配置,点击获取API令牌

image-20221110014628014

点击创建令牌

image-20221110014809363

找到编辑区域DNS,点击使用模板

image-20221110014957178

按下图设置令牌的权限,然后点击继续

image-20221110015355679

检查信息无误后,点击生成令牌

image-20221110022255712

复制令牌,令牌只会生成一次,请注意保存

image-20221110022519691

将令牌复制到API token处,点击确定,申请证书

image-20221110014155747

image-20221110023339775

等待证书申请成功,如出现错误,刷新网页再次生成即可,多试试总会成功的~~~

image-20221110023606081

生成后的证书如下图所示

image-20221110024224650

证书申请正式完成,npm将在证书到期时自动更新证书的有效期,无需自动配置。

使用npm进行反向代理

点击主页的Proxy Hosts,进入反向代理主页面,

image-20221110024642867

点击

image-20221110024733229

例如我添加emby

image-20221110025132540

切换到SSL选项卡,勾选此域名的证书,下方选项仅需勾选第一个,其余选项按需修改,这里不过多进行介绍

image-20221110025431928

修改完状态如下

image-20221110025551011

对于某些应用来说,自带的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;

  }

image-20221110030502292

点击保存,反向代理设置完成

image-20221110030911495

端口映射(家宽)

对于家宽来说,80、443端口已经被运营商封锁,对于v4来说,v4地址仅仅分配到了路由器,所以我们需要进行设置端口转发来完成外网访问

打开爱快的后台,依次点击 网络设置→端口映射→端口映射,点击右上角添加,添加刚刚安装npm设置的https端口,即这里的4443端口,具体设置方法如下图所示

image-20221110031340028

点击添加端口映射,设置npm安装的内网地址及内网端口,以及设置转发的外网端口,这里我设置为和内网端口相同,即4443。设置完成后点击保存。

image-20221110031617523

使用npm

家宽因为443、80端口被运营商封锁,我们不能免端口号运行,我们使用npm的时候,需要使用域名加端口进行访问。如果前面设置未更改的话,你可以使用域名https://emby.abcd.com:4443访问你所设置的服务,反向代理即完成设置。下面就可以愉快的时候域名来访问你的内网应用了。