前言

proxy_ssl_server_name on

proxy_ssl_server_name on; 是 Nginx 中的一个指令,用于启用反向代理的 SNI(Server Name Indication) 支持。SNI 是一个扩展协议,允许客户端在握手时指定访问的目标主机名,从而使同一个 IP 地址的服务器能够区分不同的 SSL 证书。如果目标服务器使用了 SNI,但反向代理相关服务时没有启用 proxy_ssl_server_name,可能会导致握手失败或证书验证错误。比如想反向代理Cloudflare家worker搭建的服务(dockerhub镜像服务,订阅转换服务等),就必须开启proxy_ssl_server_name。当然本期分享的内容也可以代理其他服务,比如使用自己的域名加速访问在GitHub Pages上搭建的服务,访问自己的域名就能打开百度等。这些服务的共同点都是https服务且是域名形式。

反代流程

个人在使用Nginx proxy manage反代时,大多数目标服务都是ip:端口的形式,但有的时候想在其webui界面反向代理https协议的域名服务比如反代百度域名,尝试下来都失败,发现域名形式均无法创建成功。这样的话只能使用nginx来配置了,如果直接安装nginx,端口又会冲突(80和443已经被Nginx proxy manage占用)。因此Nginx proxy manage和nginx在同一服务器只能选一个,不过Nginx proxy manage的域名ssl证书申请和自动续期都非常方便,还是不想放弃使用,故使用docker再起个nginx容器,这样就可以通过宿主机的ip和nginx容器的外部端口访问nginx服务(实现ip:端口),用这个nginx服务再来反向代理https协议的域名服务。

简单说就是,Nginx proxy manage使用域名反代本机Nginx 服务(ip:端口形式),Nginx再反代目标服务的域名。

准备工作

  1. 一个域名
  2. 一台公网主机(VPS)
  3. 域名解析到vps主机的ip
  4. ssh连接工具(finalshell或Tabby Terminal或xshell等都可以)
  5. 小主机上安装好dockerdocker-compose
  6. docker安装Nginx proxy manage,和nginx

Nginx容器

创建文件目录

1
2
3
mkdir -p /root/data/docker_data/nginx-proxy
cd /root/data/docker_data/nginx-proxy
touch docker-compose.yml nginx.conf

文件目录

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
version: '3'
services:
nginx:
image: nginx:latest
container_name: nginx_reverse_proxy
ports:
- "8623:8623"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./logs:/var/log/nginx
restart: always

nginx.conf

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;

keepalive_timeout 65;

#gzip on;
include /etc/nginx/conf.d/*.conf;

# For HEXO
server {
listen 8623;
listen [::]:8623;
location / {
resolver 8.8.8.8; # 使用公共 DNS
proxy_pass https://psub.dekviw233.workers.dev;
proxy_ssl_server_name on;
proxy_set_header Host psub.dekviw233.workers.dev;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}
}

运行:

1
docker-compose up -d

浏览器输入IP:8623,出现和被反代的https://psub.dekviw233.workers.dev/一样的页面就说明成功了。

访问

后续再使用Nginx proxy manage反代ip:8623就可以使用https协议的域名访问了。

Nginx proxy manage搭建并反代

创建文件目录

1
2
3
mkdir -p /root/data/docker_data/npm
cd //root/data/docker_data/npm
touch docker-compose.yml

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
environment:
- TZ=Asia/Shanghai # 设置为 CST 时区
ports:
- '80:80'
- '9981:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt

运行:

1
docker-compose up -d

浏览器输入IP:9981,就可以访问Nginx proxy manage。

Nginx proxy manage使用流程

先点击页面1的添加代理(Add Proxy Host)

  1. 输入解析到主机的域名
  2. 输入主机ip
  3. 输入nginx容器映射到主机的端口
  4. 点击SSL
  5. 选择刚刚添加的域名
  6. 强制SSL
  7. 点击勾选同意协议
  8. 点击保存,等待证书申请下来

后面输入域名访问就可以了

npm添加代理步骤

随便再试试

反向代理百度,用自己的域名访问百度,还可以搜索。

反代百度

当然代理百度没啥实际意义,纯粹是玩,但是用线路好的vps反向代理国内访问线路不稳的github,githubpage(自己的博客服务等)等其他服务还是不错的。