正向代理与反向代理

  • 反向代理:服务端将请求转发给其他应用程序,比如转给 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 版本
plaintext
1
cat /etc/redhat-release
  • 关闭防火墙:
plaintext
1
systemctl stop firewalld
  • 重启网络服务
plaintext
1
systemctl restart network

反向代理

代理网站

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

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

nginx

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

nginx
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

nginx
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 负载均衡,三台做服务器;

轮询

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

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/;
}
}
nginx
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;权重越大的访问的越多;

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 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/;
}
}
nginx
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 文件;
plaintext
1
sudo yum install epel-release
  1. 安装 nodejs
plaintext
1
sudo yum install nodejs
  1. 安装 npm (上面 yum 包里只有 node);
plaintext
1
yum install npm
  1. 安装 pm2
plaintext
1
npm install pm2 -g
  1. 检查
plaintext
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,键入如下代码:
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. 进行如下配置代理

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
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. 通过正则简化如上重复代码
nginx
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;

nginx
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,跳转到自定义界面;
nginx
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 页面上,不会向之前的防盗链一样图片裂开,而是展示设置的防盗链图片;

nginx
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 安装
nginx
1
yum install keepalived
  1. 修改 keepalived 配置
  • 配置文件在 /etc/keepalived/keepalived.conf
  • vrrp_instanceauthenticationvirtual_router_idvirtual_ipaddress 这几个一样的机器,才算是同一个组里。这个组才会选出一个作为 Master 机器;
  • 这里我们设置两台机器,分别下载好 keepalived,然后进行配置;
  • 机器一:192.168.209.111
nginx
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
nginx
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. 启动服务 (机器一,二都要启动)
nginx
1
systemctl start keepalived
  1. 检查状态是否报错
nginx
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 资源。(如果优化可以可以图片的生命周期设置长一点,让客户端来缓存);

常用配置

nginx
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;

参考文献