Nginx反向代理(七层代理)、Nginx的TCP/UDP调度器(四层代理)、
一、Nginx反向代理(七层代理)
步骤:
部署后端web服务器集群
配置Nginx代理服务器
配置upstream集群池
调节集群池权重比
<img src="/home/student/Desktop/QYF笔记&nsd2411/资源包/image-20241008213058281.png" style="zoom: 67%;" />
1.部署后端web服务器集群
两个服务器web1和web2安装httpd服务,并创建不同网页用以实验
```shell
#进入web1操作:
yum -y install httpd
echo "test web1" > /var/www/html/index.html
systemctl enable httpd --now
```
```shell
#进入web2操作:
yum -y install httpd
echo "test web2" > /var/www/html/index.html
systemctl enable httpd --now
```
2.配置Nginx代理服务器:/usr/local/nginx/conf/nginx.conf
> 配置upstream集群池并调节权重比
```shell
http {
...
#使用upstream集群池定义后端服务器集群,集群名称自定义
#使用server定义集群中的具体服务器和端口
upstream webtestserver {
#设置相同客户端访问相同Web服务器
ip_hash;
#设置权重控制weight后台服务器访问比例,权重越大任务的分配量就越大
server 192.168.99.100:80 weight=2;
#设置健康检查
#max_fails设置后台服务器连接失败的次数
#fail_timeout设置后台服务器连接失败后再次连接的等待时间
server 192.168.99.200:80 max_fails=2 fail_timeout=30;
#设置down标记使主机暂时不参与集群活动,用于停机修复或者做项目时临时借调
server 192.168.99.120:80 down;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
#通过proxy_pass将用户的请求转发给服务器集群,名称同上
proxy_pass http://webtestserver;
}
...
```
> 设置ip_hash后用户访问只会被分配给上次请求相同的服务器
二、Nginx的TCP/UDP调度器(四层代理)
使用Nginx实现TCP/UDP调度器功能,采用轮询的方式调用后端SSH服务器
<img src="image-20241008213311333.png" style="zoom: 67%;" />
```shell
添加stream参数开启4层代理模块
./configure --with-stream
/usr/local/nginx/sbin/nginx -V #查看安装模块情况
```
修改nginx配置文件:/usr/local/nginx/conf/nginx.conf
```shell
...
stream { #stream与http同级
upstream testssh { #创建集群,名称自定义
server 192.168.99.100:22; #后端SSH服务器的IP和端口
server 192.168.99.200:22;
}
server { #调用集群
listen 2222; #Nginx代理监听的端口,可以自己定义
proxy_pass testssh; #调用backend集群
}
}
http {
...
}
```
重载配置、测试连接到nginx代理服务器监听的2222接口,而不是代理服务器的22端口或者后端的web服务器
```shell
ssh 192.168.99.5 -p 12345 #使用该命令多次访问查看轮询效果
```
三、nginx的优化与查错
1.优化客户端使用浏览器访问不存在的页面192.168.99.5/xxxxxxx时提示404文件未找到
修改nginx配置文件:/usr/local/nginx/conf/nginx.conf
```shell
charset utf-8; #仅在需要中文时修改该选项,可以识别中文
error_page 404 /404.html; #当网站发生404报错时,给用户看的页面
echo "抱歉!您访问的页面不存在呢?" > html/404.html
------------------------------------------------------------------
HTTP常见状态码列表:
200 正常
301 & 302 重定向
400 请求语法错误
401 访问被拒绝
403 禁止访问
404 资源找不到
414 请求URI头部太长
500 服务器内部错误
502 代理服务器无法正常获取下一个服务器正常的应答
```
重载,测试
2.查看nginx服务网站的状态信息
需要使用--with-http_stub_status_module开启状态页面模块
```shell
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.22.1
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-10) (GCC)
configure arguments: --with-stream --with-http_stub_status_module
```
修改nginx配置文件:/usr/local/nginx/conf/nginx.conf
```shell
server {
listen 80;
server_name localhost;
location /status { #定义状态页面
stub_status on;
allow 192.168.99.5; #允许99.5访问
deny all; #其他人全部拒绝
}
charset utf-8;
}
```
重载,测试
```shell
[root@proxy nginx-1.22.1]# curl 192.168.99.5/status
Active connections: 1
server accepts handled requests
1 1 1
Reading: 0 Writing: 1 Waiting: 0
------------------------------------------------------------------
Active connections:当前活动的连接数量,有多少人访问网站
Accepts:已经接受客户端的连接总数量,有多少人曾经来过
Handled:已经处理客户端的连接总数量
Requests:客户端发送的请求数量
Reading:当前服务器正在读取客户端请求头的数量
Writing:当前服务器正在写响应信息的数量,指服务器正在给客户回应信息
Waiting:当前多少客户端在等待服务器的响应
```
3.优化Nginx并发量
并发测试,使用测试主机作为海量客户访问proxy主机
```shell
#-n任务量,-c是连接数
ab -n 10000 -c 10000 http://192.168.99.5/
socket: Too many open files (24) #linux系统有限制,文件打开数量不超过1024
```
优化Linux内核参数可打开最大文件数量(临时)
```shell
ulimit -n #查看最大文件数量
ulimit -n 100000 #临时设置最大文件数量
```
修改后,再次测试;
设置可打开最大文件数量目录(永久):/etc/security/limits.conf
```shell
* soft nofile 100000
* hard nofile 100000
#用户或组 软限制或硬限制 需要限制的项目 限制的值
```
重启系统生效
服务器主机增加并发量修改Nginx配置文件目录:/usr/local/nginx/conf/nginx.conf
```shell
worker_processes 2; #与真机CPU核心数量一致
events {
worker_connections 50000; 单个工作进程可接受访问的数量
}
```
重载,测试
4.优化Nginx数据包头缓存支持超长地址
默认情况下nginx无法支持长地址栏,会报414错误
修改Nginx配置文件,增加数据包头部缓存大小
```shell
http {
client_header_buffer_size 200k; #请求包头信息的缓存大小,默认1k
large_client_header_buffers 4 200k; #请求包头部信息的缓存个数与容量
include mime.types;
default_type application/octet-stream;
....
}
```
重载,测试
5.浏览器本地缓存静态数据
修改Nginx配置文件,定义对静态页面的缓存时间
```shell
server {
...
location ~* \.(jpg|txt|png|html|php)$ {
expires 30d; #新添加,定义客户端缓存时间为30天
}
....
}
```
重载,测试,火狐浏览器查看本地缓存数据访问about:cache