Nginx基础(03)

Nginx基础(02)

Nginx调度器

Nginx调度器是一种负载均衡工具,可以将客户端请求分配到多个后端服务器上,以提高系统的可用性和性能。

  • Nginx的作用

    • web服务器
    • 反响代理服务器
  • 代理服务器相当于/中介

  • 代理服务器的过程

    • 客户端访问代理服务器要页面

    • 代理服务器没有页面

    • 代理服务器帮你访问服务器

    • 由后台服务器把访问结果交回代理服务器

    • 代理服务器把结果传回客户端

  • 代理服务器也叫 调度器

  • 调度器 : 负载均衡 / 健康检查

    • **负载均衡 : **

      • 将客户端的并发访问量均衡的分配给够台服务器
      • 对于高并发量来说 , 负载均衡旧显得重要
    • **健康简称 : **

      • 时不时检查后台服务器的健康状态

      • 发现了服务器有问题就不会把客户端的请求发送给它 ( 默认每10秒再检测 )

      • 服务器健康状态则处理客户端请求

  • Nginx 调度算法

    • 轮询 : 逐一循环调度(默认)

    • weight : 指定轮询机率 , 权重值和访问比率成正比

    • ip_hash : 根据客户端IP分配固定的后端服务器

  • Nginx 服务器组主机状态

    • ** down : **表示当前server暂时不参与负载

    • ** max_fails : **允许请求失败的次数 ( 默认为1 )

    • ** fail_timeout : **max_fails 次失败后 , 暂停提供服务的时间

  • Nginx 反向代理语法

  • Nginx支持的调度器

    • HTTP反向代理 : 7层代理 OSI应用层

      • 处理网络任务
    • TCP/UDP调度 : 4层代理 TCP/UDP , 第四层传输层的传输协议代理

      • 处理数据任务

Web反向代理

  • 功能

    • 后端web服务器两台 , 可以使用httpd

    • Nginx采用轮询方式调用后端Web服务器

    • 两台Web服务器的权重要求生物质不同的值

    • 最大失败次数为2 , 失败超时时间为30秒

1. 部署实施后端Web服务器

环境准备,同网段要互通,检查yum

安装 : vim net-tools bash-completion psmisc httpd

1) 部署后端 web1 服务器

写入 /var/www/html/index.html

2)部署后端 web2 服务器

写入 /var/www/html/index.html

3)主机测试连接

curl web1 web2

2. 配置Nginx服务器 , 添加服务器池

重置Nginx

1)修改 /usr/local/nginx/conf/nginx.conf 配置文件
复制代码
  vim /usr/local/nginx/conf/nginx.conf
    .. ..
    http {
    .. ..
    #使用upstream定义后端服务器集群,集群名称任意(如webserver)
    #使用server定义集群中的具体服务器和端口
    upstream webserver {
                    server 192.168.99.100:80;
                    server 192.168.99.200:80;
            }
    .. ..
    server {
            listen        80;
            server_name  localhost;
                location / {
                .. ..
    #通过proxy_pass将用户的请求转发给webserver集群
                proxy_pass http://webserver;
                .. ..
            }
    }
    .. ..
    }
    
	/usr/local/nginx/sbin/ngiipnx -s reload

curl多次访问proxy主机可以看到网站的轮询效果

3. 配置 upstream 服务器集群池属性
1) 设置权限

weight 可以设置后台服务器的权重,权重越大任务的分配量就越大

复制代码
vim /usr/local/nginx/conf/nginx.conf
upstream webserver {
                server 192.168.99.100 weight=2;  #设置权重为2
                server 192.168.99.200;           #默认权重为0 
        }
        	# 优先调用权重为2的 192.168.99.100 服务器
        /usr/local/nginx/sbin/nginx -s reload
2) 优化健康检查

max_fails 可以设置后台服务器的失败次数 , 默认 1 次

fail_timeout 可以设置后台服务器的失败超时时间 , 默认 10 秒

复制代码
vim /usr/local/nginx/conf/nginx.conf
upstream webserver {
                server 192.168.99.100;
                server 192.168.99.200 max_fails=2 fail_timeout=30;
        }
        	#失败次数 2 , 失败超时时间30秒
        /usr/local/nginx/sbin/nginx -s reload

测试时,先将web2的httpd服务关闭,回到proxy访问集群页面curl 192.168.99.5

只会显示web1的页面,此时即使将web2的httpd服务开启也无效,因为要等

待30秒

4. 配置 upsteam 服务器集群的调度算法
1) 设置相同客户端访问相同Web服务器
  • ip_hash : 根据IP地址固定后端服务器

    vim /usr/local/nginx/conf/nginx.conf
    upstream webserver {
    ip_hash; #根据客户端IP分配固定的后端服务器
    server 192.168.99.100 ;
    server 192.168.99.200 ;
    }
    /usr/local/nginx/sbin/nginx -s reload

客户端使用浏览器访问代理服务器测试只会见到一个页面

添加 down 标记

down 标记可以让集群主机暂时不参加集体活动

复制代码
vim /usr/local/nginx/conf/nginx.conf
upstream webserver {
                server 192.168.99.100 ;
                server 192.168.99.200 down;  #暂时不参与任务分配
        }
	/usr/local/nginx/sbin/nginx -s reload

客户端使用浏览器访问代理服务器测试只会见到192.168.99.100

TCP/UDP 调度器

  • 四层代理 , 第四层的传输层代理

  • 功能

    • 后端SSH服务器两台

    • Nginx 编译安装时需要使用 --with-stream , 开启 ngx_stream_core_module模块

    • Nginx 采用轮询的方式调用后端 SSH 服务器

1. 部署四层代理Nginx服务器

Nginx-1.9 版本以前Nginx没有第四层代理功能

现Nginx默认不存在 第四层代理功能 , 需要安装

Nginx-1.22版本 的 ./configure 设置需要添加 --with-stream

复制代码
    [root@proxy nginx]# cd ~/lnmp_soft/nginx-1.22.1/
    [root@proxy nginx-1.22.1]# killall nginx
    [root@proxy nginx-1.22.1]# rm -rf /usr/local/nginx/
    [root@proxy nginx-1.22.1]# ./configure   \
    > --with-stream                                  #开启4层代理功能
    [root@proxy nginx-1.22.1]# make && make install       编译并安装
    [root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx -V   
    												#查看安装模块情况
2. 配置Nginx服务器 , 添加服务器池
1) 修改/usr/local/nginx/conf/nginx.conf配置文件

新添加的内容不在 http函数内 , 属于网络外的操作 , 新添加 stream 函数.

复制代码
vim /usr/local/nginx/conf/nginx.conf
stream {
            upstream backend {
               server 192.168.99.100:22;    #后端SSH服务器的IP和端口
               server 192.168.99.200:22;
}
            server {
                listen 12345;                    #Nginx监听的端口
                 proxy_pass backend;
             }
}
http {
.. ..
}
/usr/local/nginx/sbin/nginx -s reload

Nginx 优化

  • 优化服务器性能

    1. 自定义返回客户端 404 错误页面

    2. 查看服务器状态信息

    3. 解决客户端访问服务器提示 "Too many open files"

    4. 解决客户端访问头部信息过长

    5. 客户端浏览器缓存数据

  • 测试客户端性能

    1. 使用ab压力测试软件并发量

    2. 编写测试脚本生成头部信息并访问

    3. 客户端访问不存在的页面 , 测试404错误页面是否重定向

1. 自定义报错页面
  • HTTP常见错误代码

  • 200 正常

  • 301 \& 302 重定向

  • 400 请求语法错误

  • 401 访问被拒绝

  • 403 禁止访问

  • 404 资源找不到

  • 414 请求URI头部太长

  • 500 服务器内部错误

  • 502 代理服务器无法正常获取下一个服务器的正常应答

1) 优化前 , 查看404代码

客户端使用浏览器访问不存在的页面,会提示404文件未找到

2)修改Nginx配置文件 , 自定义报错页面
复制代码
vim /usr/local/nginx/conf/nginx.conf
.. ..
        charset utf-8;                    #仅在需要中文时修改该选项
error_page   404  /test.jpg;    
						#自定义错误页面为一张图片,图片可以从真机拷入
						#图片文件放在/usr/../nginx/html下
.. ..

/usr/local/nginx/sbin/nginx -s reload

优化后,客户端再次使用浏览器访问不存在的页面,会看到图片

2. 查看服务器状态信息
1) 安装Nginx模块

编译安装时使用 --with-http_stub_status_module 开启状态页面模块

复制代码
    [root@proxy nginx]# cd ~/lnmp_soft/nginx-1.22.1/
    [root@proxy nginx-1.22.1]# ./configure   \
    > --with-stream                                #开启4层代理模块
    > --with-http_stub_status_module              #开启status状态页面
    [root@proxy nginx-1.22.1]# make     #编译
    [root@proxy nginx-1.22.1]# killall  nginx
    [root@proxy nginx-1.22.1]# cp  objs/nginx \ /usr/local/nginx/sbin/   #覆盖原文件
    [root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx   #开启nginx
2) 修改Nginx配置文件 , 定义状态页面
复制代码
cat /usr/local/nginx/conf/nginx.conf
... ...
location /status {
                stub_status on;
                 #allow IP地址;     #只允许对应IP地址的人查看
                 #deny all;		   #拒绝对应的人查看
        }
... ...
 /usr/local/nginx/sbin/nginx -s reload
3) 查看状态页面信息
复制代码
curl  http://192.168.99.5/status
Active connections: 1 
server accepts handled requests
 10 10 3 
Reading: 0 Writing: 1 Waiting: 0

Active connections:当前活动的连接数量。

​ Accepts:已经接受客户端的连接总数量。

​ Handled:已经处理客户端的连接总数量。

​ Requests:客户端发送的请求数量。

Reading:当前服务器正在读取客户端请求头的数量。

Writing:当前服务器正在写响应信息的数量。

Waiting:当前多少客户端在等待服务器的响应。

3. 优化Nginx并发量
1) 优化前使用ab高并发测试
  • 使用 Web1 或 proxy 自己作为海量客户

  • 防火墙与SELinux都关闭

    [root@proxy ~]# ab -n 100 -c 100 http://192.168.99.5/
    # -n任务量,-c是连接数
    ...
    ...
    100% #成功
    [root@proxy ~]# ab -n 2000 -c 2000 http://192.168.99.5/
    Benchmarking 192.168.99.5 (be patient)
    socket: Too many open files (24) #失败

2)修改Nginx配置文件 , 增加并发量
复制代码
vim /usr/local/nginx/conf/nginx.conf
.. ..
worker_processes  2;                    #与CPU核心数量一致
events {
worker_connections 50000;        #每个worker最大并发连接数
}
.. ..
/usr/local/nginx/sbin/nginx -s reload
3) 优化Linux内核参数 (最大文件数量)
复制代码
[root@proxy ~]# ulimit -n                        #查看最大文件数量
[root@proxy ~]# ulimit -n 100000                #临时设置最大文件数量
[root@proxy ~]# vim /etc/security/limits.conf
    .. ..
*               soft    nofile            100000
*               hard    nofile            100000

配置文件 /etc/security/limits.conf

  • 该配置文件分4列,分别如下:
  • 用户或组 硬限制或软限制 需要限制的项目 限制的值
4) 优化后测试服务器并发量
复制代码
ab -n 2000 -c 2000 http://192.168.99.5/
4. 优化Nginx数据包缓存 , 支持超长地址
  • 优化前 , 使用脚本制作超长头部请求是否能获得响应
  • 默认情况下nginx无法支持长地址栏 , 会报414错误
1) 超长地址脚本
复制代码
cat lnmp_soft/buffer.sh 
#!/bin/bash
URL=http://192.168.99.5/index.html?
for i in {1..5000}
do
    URL=${URL}v$i=$i
done
curl $URL                  #经过5000次循环后,生成一个超长的URL地址

 ./buffer.sh
.. ..
<center><h1>414 Request-URI Too Large</h1></center>        #访问失败
2) 修改Nginx配置文件 , 增加数据包头部缓存大小
复制代码
vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
client_header_buffer_size    200k;        #请求包头信息的缓存大小    
large_client_header_buffers  4 200k;   #大请求包头部信息的缓存个数与容量
.. ..
}

/usr/local/nginx/sbin/nginx -s reload
3) 优化后 , 使用脚本测试
复制代码
 ./buffer.sh
5. 浏览器本地缓存静态数据
1) 浏览器界面操作清空历史记录/缓存
2 )修改Nginx配置文件 , 定义对静态页面的缓存时间
复制代码
vim /usr/local/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
expires        30d;            #定义客户端缓存时间为30天
}
}
    /usr/local/nginx/sbin/nginx -s reload
3) 优化后使用浏览器访问图片 , 查看缓存

http://192.168.99.5/day.jpg

在firefox地址栏内输入about:cache,查看本地缓存数据,查看是否有图片以及过期时间是否正确。

相关推荐
ping某1 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工2 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_2 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉2 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦2 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
java_cj2 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes