0%

Nginx Reverse Proxy

我们这里以简单的案例来对Nginx的反向代理实现进行解析,这里的Nginx配置作用为:拦截来自某个路径的信息请求,去除广告请求API。

Nginx的具体配置规范和入门参见:

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
server {
# Ubuntu 22.04 的 nginx 是 1.18,http2 只能用这种老写法,新版的 "http2 on;" 在你这会报错
listen [Nginx_port] ssl http2;
server_name SITE_ADDR;

ssl_certificate [/root/cert/SITE_ADDR/fullchain.pem];
ssl_certificate_key [/root/SITE_ADDR/privkey.pem];

# sponsors 拦截:路径带 basePath 前缀,少了拦截不到
location = [/LOCATION_ADDR/sponsors] {
access_log off;
default_type application/json;
add_header Cache-Control "no-store";
return 200 '{"success":true,"msg":"","obj":{"contact":"","sponsors":[]}}';
}
# 命中规则后将会返回{"success":true,"msg":"","obj":{"contact":"","sponsors":[]}}'
location ^~ [/LOCATION_ADDR/sponsors/] {
access_log off;
return 404;
# 命中规则后将会返回404,被黑洞。假如仅仅是要404某个服务,精准定位可以使用上面的=进行配置,使用正则表达式则使用本
形式进行匹配。
}
location / {
[proxy_pass https://127.0.0.1:port]; # 面板是 SSL 的,所以是 https;端口后不要加任何路径
proxy_ssl_verify off;
proxy_set_header Host $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 $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
proxy_ssl_server_name on;
proxy_ssl_name %host;
}
}

配置中有几个需要用户自行修改的地方:

1
listen [Nginx_port] ssl http2;

Nginx监听的端口,该端口是Nginx服务工作的端口,和实际服务的端口不能是同一个,也不是能使任何服务已经占用的端口。使用反向代理后,被代理的服务将会在本端口继续提供服务。

假如需要被反向代理的服务开启了HTTPS服务,那这里就需要使用ssl http2 写法,假如没有域名使用IP:PORT的形式提供服务,则不用写ssl https , 直接写: listen 8080; 即可,其中端口号可以自行设置,不必非要是8080.

1
2
ssl_certificate [/root/SITE_ADDR/fullchain.pem];
ssl_certificate_key [/root/SITE_ADDR/privkey.pem];

在这两段需要配置ssl证书的路径,包括公钥和私钥,而且全部要使用绝对路径

1
location = [/LOCATION_ADDR/sponsors] {

这里是使用location确认Nginx需要处理的对象路径,使用= 指的是要精准匹配等于号后面的服务路径。和下面是用头匹配作用范围不同。

1
location ^~ [/LOCATION_ADDR/sponsors/] {

这里使用正则表达式进行泛匹配,策略性匹配

1
2
3
4
5
`=`      精确匹配(最高)
`^~` 前缀匹配且阻止正则
`~` 正则(区分大小写)
`~*` 正则(不区分大小写)
普通前缀 location /

使用^~ 就是匹配任何以/LOCATION_ADDR/sponsors/ 开头的服务,比如:

  1. /LOCATION_ADDR/sponsors/index.html
  2. /LOCATION_ADDR/sponsors/service.php
  3. /LOCATION_ADDR/sponsors/site.htnl
  4. /LOCATION_ADDR/sponsors/index/index.html

命中该匹配规则的服务按预设的逻辑进行处理。

1
[proxy_pass https://127.0.0.1:port];   # 服务是 SSL 的,所以是 https;端口后不要加任何路径

原始服务在公网暴漏的地址为:https://127.0.0.1:port 开头, 表示Nginx将要使用https://example.com:Nginx_port 来代替https://127.0.0.1:port 端口所在的服务,在服务器将https://127.0.0.1:port监听的范围从0.0.0.0 改为127.0.0.1 就可以将原始服务的可访问范围从所有设备限制为局域网访问,同时Nginx将对内网提供的服务通过反向代理映射到公网来代替原始服务地址。