nginx反向代理的原理以及雷池waf的设置

鉴于上次搭建halo端口占用问题,雷池waf,反向代理,nginx的作用我又做了一次深刻的思考

本文我会讲解nginx,反向代理,waf的一些内容,才学疏浅如有不妥之处,敬请斧正

先说我的目标,我起初是想用二级域名把服务器上的另一个端口服务绑定上去,上网查了什么先绑定一个记录,然后再通过显性URL,隐形URL,但是并没有实现。

附上nginx的简介,我们可以看到nginx是一个非常强大的web服务器,有很多功能,反向代理,负载均衡……我主要讲nginx的反向代理功能,一文说懂什么是反向代理

Nginx 简介

Nginx(发音同engine x)是一个异步框架的 Web 服务器,也可以用作反向代理,负载平衡器 和 HTTP 缓存。该软件由 Igor Sysoev 创建,并于2004年首次公开发布。同名公司成立于2011年,以提供支持。Nginx 是一款免费的开源软件,根据类 BSD 许可证的条款发布。一大部分Web服务器使用 Nginx ,通常作为负载均衡器。

nginx和反向代理

直接说反向代理是什么,举例说明我也感觉很抽象,没有直接拿实例说的明白,这里我将会用nginx和雷池waf的反向代理来说

基于hexo的搭建,nginx的配置我是照搬参考博客的https://www.cnblogs.com/cheyaoyao/p/17836522.html

在那里我也有提到,说实话对于nginx我只知道它能实现一些功能,但是具体到底是什么,怎么实现的,我不知道。文章给了两个配置文件

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
user  nginx;
worker_processes auto;

error_log /var/log/nginx/error.log notice;
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;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;
}

conf.d->default.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80;
listen [::]:80;
server_name 公网IP/域名;

location / {
root /data/hexo;
index index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

先看下面default.conf的配置信息,监听IPV4和IPV6的80端口,然后指定虚拟主机的域名/IP,然后再指向指定文档根目录,从而实现访问

访问crispsheep.icu–>发送请求–>服务器接受请求–>nginx处理–>指向指定的文件–>返回响应

这样你就能看到我的博客内容了

上面nginx.conf的内容

我们看这里,这里有个include,是一个文件包含,意思是包含这个目录下所有.conf的文件

image-20241113161140396

conf.d->default.conf的文件内容就被包含进去了

再说nginx的反向代理,反向代理和上面的default.conf内的一些信息有些类似,下面是一个反向代理的配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
listen 80;
listen [::]:80;
server_name example.com;

# 反向代理配置
location / {
proxy_pass http://127.0.0.1:9999;
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;
}

# 错误页面配置
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

127.0.0.1是本地回环地址,当访问example.com的时候,它会指向proxy_pass后面的服务,也就是你本地的9999端口的服务

这就是反向代理,在客户端和服务端之间有个服务器负责完成这个操作,这里完成这个操作的就是nginx。

反向代理的原理是,在客户端和服务器之间添加一个代理服务器,客户端将请求发送给代理服务器,代理服务器将请求转发给服务器,服务器处理请求并返回响应,代理服务器再将响应转发给客户端。

这里我说两个点

1、有人可能会问为什么nginx总是监听80端口,这是因为http协议默认的就是80端口,所以访问网页进行通讯走的就是80端口,https则是443端口。

2、带端口的问题,假设你在服务器上开启了一个web应用服务,端口是9586,如果你没有域名,你每次访问都需要用公网IP+端口才能访问到,如果你有一个域名,就可以通过反向代理的方式,让域名指向这个端口,这样直接域名访问即可。如果服务器上就一个服务,可以直接把公网IP反向代理到这个端口服务,就不需要域名了(IP地址还是没有域名好记忆)

再说我上面的目标,用二级域名把服务器上的另一个端口服务绑定上去,用nginx的反向代理完全可以实现。

由于上次被挖矿的原因,我选择了雷池waf

雷池WAF

雷池waf安装很方便,一条命令,遇到选项y即可

1
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"

image-20241113170235217

雷池是基于nginx开发的,作为反向代理接入网络,我之前安装nginx和雷池,一直显示80端口被占用,就是我之前开启nginx的服务导致的,nginx占用了80端口,导致我之前用雷池添加站点80端口不能用,选择其他端口后,如果想经过雷池保护,就需要在域名添加端口号了,雷池添加站点保护的原理就是反向代理,选择需要被保护站点的域名或者IP,然后选择端口,如果这时候不是80端口,比如是666端口,那么只有你输入域名+666端口才能经由雷池,然后再代理到你的上游服务器。

设置雷池前,由于我的博客的配置文件是监听80端口的,我们需要先停止nginx的服务,让80端口空闲出来

1
sudo systemctl stop nginx

然后再修改我博客的配置文件

1
2
3
4
server {
listen 81;
listen [::]:81;
server_name 公网IP/域名;

把之前的80端口改成,81(只要是没被占有的端口皆可)

然后再设置雷池端口(http-80,https-443)

image-20241113171117358

这里我都是http服务,443那个端口删掉就行

设置好后再启动nginx

1
sudo systemctl restart nginx

这里我们使用的是雷池作为代理服务器进行转发的

由于雷池和我的web服务都在一个服务器,下面的上游服务器,就填写http://127.0.0.1:81即可

我们来捋一下访问我博客的流程

基于nginx

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80;
listen [::]:80;
server_name 公网IP/域名;

location / {
root /data/hexo;
index index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

访问–>发送请求–>nginx服务器接受–>指向到指定的文档–>返回响应

通俗点说就是你访问我博客域名,默认的http协议走80端口,我的配置文件就监听80端口,我收到你的请求之后,指向我本地的博客文件,这样你就能看到了

基于雷池的反向代理

1
2
3
4
server {
listen 81;
listen [::]:81;
server_name 公网IP/域名;

访问–>发送请求–>雷池–>雷池反向代理到指定上游服务器的端口服务(127.0.0.1:81)–>上游服务器接收–>指向我的博客的文件

上面的配置信息修改成81端口,我加了waf之后,你访问我的博客,会先经过雷池,然后雷池把你的请求指向本地的81端口(因为waf和博客在同一台服务器)相当于你访问了我本地的81端口,然后我的配置文件监听的就是81端口,再指向我的博客文件

至此你应该对反向代理,nginx,雷池waf有了一定的了解,今天我也算是彻底说明白了到底什么是反向代理和具体的原理,希望能帮到你~