正向代理与反向代理

  • 反向代理:服务端将请求转发给其他应用程序,比如转给Java;

  • 正向代理:客户端使用,比如vpn;

  • 一句话就是:正向代理代理客户端,反向代理代理服务器;

环境

win11、VMware17 Pro、CentOS Linux release 7.9.2009 (Core),Nginx-1.24.0、静态IP:192.168.209.111、192.168.209.112、192.168.209.113、192.168.209.114;

  • 查看centos版本
1
cat /etc/redhat-release
  • 关闭防火墙:
1
systemctl stop firewalld
  • 重启网络服务
1
systemctl restart network

反向代理

代理网站

1
2
3
location / {
proxy_pass http://www.atguigu.com/;
}

在浏览器地址栏输入192.168.209.111,然后地址栏不变,但访问的是尚硅谷的网站;

nginx

代理网站,地址栏url发生改变

1
2
3
location / {
proxy_pass http://www.csdn.net/;
}

在浏览器地址栏输入192.168.209.111,地址栏会变成https://www.csdn.net/;相当于做了一个跳转的操作,跳转到了https://www.csdn.net/

nginx

原因是:目标服务器做了重定向:目标服务器告诉nginx对http协议做301的https重定向,然后nginx再告诉浏览器,最后浏览器根据Location中的地址,重新加载界面;

代理网站,代理的为https

1
2
3
location / {
proxy_pass https://www.csdn.net/;
}

nginx报错:nginx: [emerg] https protocol requires SSL support in /usr/local/nginx/conf/nginx.conf:18

不支持代理https,需要证书。

ps:好像有的nginx版本可以;

负载均衡

开了四台虚拟机,分别为:192.168.209.111,192.168.209.112、192.168.209.113、192.168.209.114;一台做nginx负载均衡,三台做服务器;

轮询

轮询:负载均衡默认算法, 将请求依次分配给服务器,平均分担负载;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 111环境   
# 111的nginx做负载均衡,真正的机器有三个,分别为112、113、114;
# 负载均衡 fsllala是变量,需要和下面proxy_pass的保持一致;
upstream fsllala{
server 192.168.209.112:80;
server 192.168.209.113:80;
server 192.168.209.114:80;
}

server {
listen 80;
server_name localhost;

location / {
proxy_pass http://fsllala/;
}
}
1
2
3
4
5
# 112/113/114环境
location / {
root html;
index index.html index.htm;
}

现象:浏览器地址栏多次刷新访问192.168.209.111;112、113、114的页面交替出现;

权重

在upstream中配置 weight=xx;权重越大的访问的越多;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 111环境   
# 111的nginx做负载均衡,真正的机器有三个,分别为112、113、114;
# 负载均衡 fsllala是变量,需要和下面proxy_pass的保持一致;
upstream fsllala{
server 192.168.209.112:80 weight=8;
server 192.168.209.113:80 weight=2;
server 192.168.209.114:80 weight=1;
}

server {
listen 80;
server_name localhost;

location / {
proxy_pass http://fsllala/;
}
}
1
2
3
4
5
# 112/113/114环境
location / {
root html;
index index.html index.htm;
}

现象:浏览器地址栏多次刷新访问192.168.209.111;112、113、114的页面交替出现;其中112出现的次数最多,114最少;注意并不是8次112,2次113,1次114这样的顺序来搞的,而是整体出现的概率是这样的;例如:112出现的概率为8/(8+2+1);

动静分离

思路:当用户请求时,动态请求分配到Express业务服务器,静态资源请求放在Nginx服务器中;

安装node环境

  1. 安装yum。yum相当于在线下载安装,yum是包管理,类似win的msi文件;
1
sudo yum install epel-release
  1. 安装nodejs
1
sudo yum install nodejs
  1. 安装npm(上面yum包里只有node);
1
yum install npm
  1. 安装pm2
1
npm install pm2 -g
  1. 检查
1
2
3
node --version
npm --version
pm2 -V
  1. pm2常用命令
  • 启动进程/应用:pm2 start app.js
  • 重命名进程/应用:pm2 start app.js --name fsl123
  • 结束进程/应用: pm2 stop fsl123
  • 结束所有进程/应用:pm2 stop all
  • 删除进程/应用 :pm2 delete fsl123
  • 删除所有进程/应用:pm2 delete all
  • 列出所有进程/应用:pm2 list
  • 重新启动进程/应用:pm2 restart fsl132
  • 重新启动所有进程/应用:pm2 restart all

在win11本地进行NodeJs起本地服务

  1. 新建一个文件夹,然后npm install express --save
  2. 新建一个serve.js,键入如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
const express = require("express");
const path = require("path");

const PORT =3000;

const app =express();

let pubilcPath = path.resolve(__dirname,"public");
app.use(express.static(pubilcPath));

app.listen(PORT,()=>{
console.log(`server is running port:${PORT}`)
})
  1. 新建一个public文件夹,里面放入vue打包的代码;

  2. 将本地服务上传至centos;

  3. 在对应的目录下,通过pm2 start app.js启动express服务;

  4. 此时,便可以访问express起的服务192.168.209.111:3000

  5. 将express服务中public文件夹下的静态文件(css,js,img)删除;现在访问会报错,因为没有对应的资源;

  6. 通过nginx代理192.168.209.111:3000;并且在html目录下,引入静态文件(css,js,img);

  7. 进行如下配置代理

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

worker_processes 1;
events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;

server {
listen 80;
server_name localhost;

location / { # /的优先级比较低,如果下面的location没匹配到,就会走http://xxx这个地址的机器
proxy_pass http://192.168.209.111:3000/;
}
location /css { # root指的是html,location/css指的是root下的css,所以地址就是html/css
root html;
index index.html index.htm;
}
location /js {
root html;
index index.html index.htm;
}
location /img {
root html;
index index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
  1. 通过nginx代理express,并且负载均衡,访问192.168.209.111:80页面正常展示;(PS:这里如果访问exress服务192.168.209.111:3000依旧不能正常展示;)
  2. 通过正则简化如上重复代码
1
2
3
4
5
6
7
8
9
10
# ~* 这是一个标志,表示正则表达式匹配时不区分大小写
# ~ 区分大小写
# /(js|css|img):这部分正则表达式匹配路径中包含 js、css 或 img 这些字符串的 URL
location / {
proxy_pass http://192.168.209.111:3000/;
}
location ~*/(css|js|img) {
root html;
index index.html index.htm;
}

URLRewrite

作用:能够隐藏真实的后端服务器的物理地址;比如真实的URL为192.168.209.111/index.jsp?pageNum=2,这样看上去很长,而且传的参数也暴露了;隐藏成192.168.209.111/2.html这种的URL;

防盗链

还是用上面的项目做例子:现象为:除了没有referers或者referers为192.168.209.111的,别的referers都不能引用css/js/img,为403;

1
2
3
4
5
6
7
8
9
# 给 css/js/img做防盗链
location ~*/(css|js|img) {
valid_referers none 192.168.209.111; # 允许访问的(没有referers或者referers为192.168.209.111)
if ($invalid_referer){#无效的
return 403;#返回状态码403
}
root html;
index index.html index.htm;
}
  • 在newTab页单独打开css/js/img,跳转到自定义界面;
1
2
3
4
5
6
7
8
9
10
11
12
13
location ~*/(css|js|img) {  
valid_referers 192.168.209.111;
if ($invalid_referer){#无效的
return 403;#返回状态码403
}
root html;
index index.html index.htm;
}

error_page 403 500 502 503 504 /50x.html; #在这里将防盗链中的状态码403填入;
location = /50x.html {
root html;
}
  • 设置防盗链图片

将提示图片放在html/img/cc.jpg,访问设置防盗链图片时,就返回这cc.jpg张图;

现象:原来的html页面上,不会向之前的防盗链一样图片裂开,而是展示设置的防盗链图片;

1
2
3
4
5
6
7
8
location /img{
valid_referers 192.168.209.111;
if ($invalid_referer){#无效的
rewrite ^/ /img/cc.jpg break; #这里跟URLRewrite写法一样;
}
root html;
index index.html index.htm;
}

高可用场景

keepalived

用户访问时,访问的是一个虚拟IP,keepalived会选定一个主服务器使用这个虚拟IP;

每台机器上的keepalived会相互通信,根据其他机器上的keepalived进程是否存在,判断服务器状态,如果默认的Master停止了,就会在剩下的Backup机器中,竞选出一台Nginx服务器作为Master;

keepalived

  1. yum安装
1
yum install keepalived
  1. 修改keepalived配置
  • 配置文件在/etc/keepalived/keepalived.conf
  • vrrp_instanceauthenticationvirtual_router_idvirtual_ipaddress这几个一样的机器,才算是同一个组里。这个组才会选出一个作为Master机器;
  • 这里我们设置两台机器,分别下载好keepalived,然后进行配置;
  • 机器一:192.168.209.111
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
! Configuration File for keepalived

global_defs {
router_id fsl111 # 名字与其他配置了keepalive的机器不重复就行
}

vrrp_instance fsllala111 { #vrrp实例名可以随意取
state MASTER #只能有一个默认的Master,其他写BACKUP
interface ens33 # ip addr查看下网卡名,默认时ens33
virtual_router_id 51
priority 100 # 多台安装了keepalived的机器竞争成为Master的优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.209.200 #虚拟IP
}
}
  • 机器二:192.168.209.100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
! Configuration File for keepalived

global_defs {
router_id fsl100
}

vrrp_instance fsllala111 {
state BACKUP #只能有一个默认的Master,其他写BACKUP
interface ens33
virtual_router_id 51
priority 50 # 多台安装了keepalived的机器竞争成为Master的优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.209.200 #虚拟IP
}
}
  1. 启动服务(机器一,二都要启动)
1
systemctl start keepalived
  1. 检查状态是否报错
1
systemctl status keepalived
  1. 通过命令ip addr查看机器一的ip信息,可以看到虚拟IP;

keepalived

6.本地打开dos,ping虚拟的ip 192.168.209.200

现象:当主机断路的时候,丢包一次,然后自动连上备用机;

keepalived

  1. 浏览器URL访问虚拟的ip 192.168.209.200

现象:正常会展示主机的nginx代理的前端文件;当主机断路的时候,展示备用机代理的前端文件;

gzip

  • 启用Gzip压缩功能, 可以使网站的css、js 、xml、html 等静态资源在传输时进行压缩,经过Gzip压缩后资源可以变为原来的30%甚至更小,尽管这样会消耗一定的cpu资源,但是会节约大量的出口带宽来提高访问速度;
  • Gzip 的压缩页面需要浏览器和服务器双方都支持,实际上就是服务器端压缩,传到浏览器后解压并解析。浏览器那里不需要我们担心,因为目前的大多数浏览器都支持解析Gzip;
  • 注意:不建议压缩图片和大文件:图片如jpg、png文件本身就会有压缩,所以就算开启gzip后,压缩前和压缩后大小没有多大区别,所以开启了反而会白白的浪费CPU资源。(如果优化可以可以图片的生命周期设置长一点,让客户端来缓存);

常用配置

1
2
3
4
5
6
7
8
9
gzip  on;   #表示开启压缩功能
gzip_min_length 1k; #表示允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认值为0,表示不管页面多大都进行压缩,设置建议设大于1k。如果小于1k可能会越压越大。
gzip_buffers 16 8k; #压缩缓存区大小,默认32 4k,64位系统好像可以设置16 8k;
gzip_http_version 1.1; #使用gzip的最小版本
gzip_comp_level 5; #压缩比率,一般选择4-6;
#需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片;
gzip_types text/xml text/css text/plain text/javascript application/json application/javascript application/x-javascript;
#是否添加“Vary: Accept-Encoding”响应头
gzip_vary on;

参考文献