Nginx
正向代理与反向代理
反向代理:服务端将请求转发给其他应用程序,比如转给 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 | location / { |
在浏览器地址栏输入 192.168.209.111
,然后地址栏不变,但访问的是尚硅谷的网站;
代理网站,地址栏 url 发生改变
1 | location / { |
在浏览器地址栏输入 192.168.209.111
,地址栏会变成 https://www.csdn.net/
;相当于做了一个跳转的操作,跳转到了 https://www.csdn.net/
;
原因是:目标服务器做了重定向:目标服务器告诉 nginx 对 http 协议做 301 的 https 重定向,然后 nginx 再告诉浏览器,最后浏览器根据 Location 中的地址,重新加载界面;
代理网站,代理的为 https
1 | location / { |
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 | # 111环境 |
1 | # 112/113/114环境 |
现象:浏览器地址栏多次刷新访问 192.168.209.111
;112、113、114 的页面交替出现;
权重
在 upstream 中配置 weight=xx;权重越大的访问的越多;
1 | # 111环境 |
1 | # 112/113/114环境 |
现象:浏览器地址栏多次刷新访问 192.168.209.111
;112、113、114 的页面交替出现;其中 112 出现的次数最多,114 最少;注意并不是 8 次 112,2 次 113,1 次 114 这样的顺序来搞的,而是整体出现的概率是这样的;例如:112 出现的概率为 8/(8+2+1);
动静分离
思路:当用户请求时,动态请求分配到 Express 业务服务器,静态资源请求放在 Nginx 服务器中;
安装 node 环境
- 安装 yum。yum 相当于在线下载安装,yum 是包管理,类似 win 的 msi 文件;
1 | sudo yum install epel-release |
- 安装 nodejs
1 | sudo yum install nodejs |
- 安装 npm (上面 yum 包里只有 node);
1 | yum install npm |
- 安装 pm2
1 | npm install pm2 -g |
- 检查
1 | node --version |
- 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 起本地服务
- 新建一个文件夹,然后
npm install express --save
- 新建一个 serve.js,键入如下代码:
1 | const express = require("express"); |
新建一个
public
文件夹,里面放入 vue 打包的代码;将本地服务上传至 centos;
在对应的目录下,通过
pm2 start app.js
启动 express 服务;此时,便可以访问 express 起的服务
192.168.209.111:3000
;将 express 服务中 public 文件夹下的静态文件 (css,js,img) 删除;现在访问会报错,因为没有对应的资源;
通过 nginx 代理
192.168.209.111:3000
;并且在 html 目录下,引入静态文件 (css,js,img);进行如下配置代理
1 |
|
- 通过 nginx 代理 express,并且负载均衡,访问
192.168.209.111:80
页面正常展示;(PS:这里如果访问 exress 服务192.168.209.111:3000
依旧不能正常展示;) - 通过正则简化如上重复代码
1 | # ~* 这是一个标志,表示正则表达式匹配时不区分大小写 |
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 | # 给 css/js/img做防盗链 |
- 在 newTab 页单独打开 css/js/img,跳转到自定义界面;
1 | location ~*/(css|js|img) { |
- 设置防盗链图片
将提示图片放在 html/img/cc.jpg,访问设置防盗链图片时,就返回这 cc.jpg 张图;
现象:原来的 html 页面上,不会向之前的防盗链一样图片裂开,而是展示设置的防盗链图片;
1 | location /img{ |
高可用场景
keepalived
用户访问时,访问的是一个虚拟 IP,keepalived 会选定一个主服务器使用这个虚拟 IP;
每台机器上的 keepalived 会相互通信,根据其他机器上的 keepalived 进程是否存在,判断服务器状态,如果默认的 Master 停止了,就会在剩下的 Backup 机器中,竞选出一台 Nginx 服务器作为 Master;
- yum 安装
1 | yum install keepalived |
- 修改 keepalived 配置
- 配置文件在
/etc/keepalived/keepalived.conf
; vrrp_instance
、authentication
、virtual_router_id
、virtual_ipaddress
这几个一样的机器,才算是同一个组里。这个组才会选出一个作为 Master 机器;- 这里我们设置两台机器,分别下载好 keepalived,然后进行配置;
- 机器一:192.168.209.111
1 | ! Configuration File for keepalived |
- 机器二:192.168.209.100
1 | ! Configuration File for keepalived |
- 启动服务 (机器一,二都要启动)
1 | systemctl start keepalived |
- 检查状态是否报错
1 | systemctl status keepalived |
- 通过命令
ip addr
查看机器一的 ip 信息,可以看到虚拟 IP;
6. 本地打开 dos,ping 虚拟的 ip 192.168.209.200
;
现象:当主机断路的时候,丢包一次,然后自动连上备用机;
- 浏览器 URL 访问虚拟的 ip
192.168.209.200
;
现象:正常会展示主机的 nginx 代理的前端文件;当主机断路的时候,展示备用机代理的前端文件;
gzip
- 启用 Gzip 压缩功能, 可以使网站的 css、js 、xml、html 等静态资源在传输时进行压缩,经过 Gzip 压缩后资源可以变为原来的 30% 甚至更小,尽管这样会消耗一定的 cpu 资源,但是会节约大量的出口带宽来提高访问速度;
- Gzip 的压缩页面需要浏览器和服务器双方都支持,实际上就是服务器端压缩,传到浏览器后解压并解析。浏览器那里不需要我们担心,因为目前的大多数浏览器都支持解析 Gzip;
- 注意:不建议压缩图片和大文件:图片如 jpg、png 文件本身就会有压缩,所以就算开启 gzip 后,压缩前和压缩后大小没有多大区别,所以开启了反而会白白的浪费 CPU 资源。(如果优化可以可以图片的生命周期设置长一点,让客户端来缓存);
常用配置
1 | gzip on; #表示开启压缩功能 |