NGINX
--------------第一部分------------------
一.单次web服务器访问流程
我口述简单来说就是用户请求到达浏览器,浏览器会对URL进行解析,涉及dns解析,查看缓存等过程获取ip后浏览器会向服务器发送请求,服务器处理请求后,查询数据库获取信息,把数据返回给浏览器,浏览器接收后,返回给客户端,在此过程中,若用户访问到的是静态页面,浏览器本地缓存中是有的,会直接返回,若是动态页面(LNMP)搭建的,会通过PHP,还有nginx里面的一些接口去从数据库获取数据。
二.apache的三种模型对比
简单来说:一系列模型的进化都是为了处理高并发,刚开始的Apache使用select模型,一个子进程处理单个请求,虽然稳定,但是占用资源,不适合高并发,
因此,出现了worker模型,一个子进程对应多个线程,内存占用少了,可以处理的请求更多,但是如果出现keepalive长连接,并且是空数据,只能一直挂在那里,等待超时,对于高并发还是无法满足,
所以event模型在每个子进程中增加了监听线程,真实请求过来,把请求分发给服务线程,空请求不被分配处理,要是长连接,就由监听线程监听,不会占用服务线程资源,增加了高并发处理能力
1.Apache prefork 模型

2.Apache worker 模型

3.Apache event模型

三. I/O模型(数据从内核空间复制到用户空间)
3.1.磁盘I/O(input/output)

3.2.网络I/O

以上为I/O 过程
3.3.I/O模型
阻塞型、非阻塞型、复用型、信号驱动型、异步
首先把整个I/O过程化为两个部分,一个数从磁盘获取数据,一个是把数据从内核空间复制到用户空间
3.3.1.阻塞型模型

整个过程都被阻塞
阻塞阶段线程挂起不会占用cpu,但是耗资,跟preforck模式像

3.3.2.非阻塞型模型
***用户线程发起IO请求时立即返回。但并未读取到任何数据,用户线程需要不断地发起IO请求,直到数据 到达后,才真正读取到数据,继续执行。过于频繁的重试,干耗CPU而已,是比较浪费CPU的方式

3.3.3.多路复用I/O模型
***当用户进程调用了方法,那么此进程会被阻塞,内核会监视进程处理多个I/Od的各个socket,如果内核从磁盘中获取数据,方法会返回一个信息,此时用户进程载调用read操作,将数据从内核考入用户进程
多路复用IO指一个线程可以同时(实际是交替实现,即并发完成)监控和处理多个文件描述符对应各自 的IO,即复用同一个线程
一个线程之所以能实现同时处理多个IO原理就是select/poll/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数 据到达了,就通知用户进程。

3.3.4. 信号驱动型I/O
***当有I/O操作准备就绪,即内核数据就绪时,内核会为该进程产生一个 SIGIO信 号,并回调函数,这样就可以在回调函数中系统调用 recvfrom 获取数据,将用户进 程所需要的数据从内核空间拷贝到用户空间
此模型的优势在于等待数据报到达期间进程不被阻塞。用户主程序可以继续执行,只要等待来自信号处理函数的通知
3.3.4异步I/O
***异步I/O 与 信号驱动I/O最大区别在于,信号驱动是内核通知用户进程何时开始一个I/O操作,而异步I/O 是由内核通知用户进程I/O操作何时完成,两者有本质区别,相当于不用去饭店场吃饭,直接点个外卖,把 等待上菜的时间也给省了
3.3.5.nginx相比于Apache的优势(edge标签页)
1.Nginx采用C语言编写,相较于Apache,它在处理相同的Web服务时占用更少的内存和资源
2.Nginx使用异步非阻塞的IO模型(如epoll或kqueue),能够处理成千上万的并发连接,而Apache的同步多进程模型在高并发情况下资源消耗较大。
3.Nginx的配置文件使用基于文本的语法,支持正则表达式,相比Apache的配置更加简洁直观
4.Nginx不仅可以作为Web服务器,还可以作为反向代理服务器和负载均衡器,支持HTTP和TCP协议的负载均衡。
四.零拷贝
大量数据的拷贝,用户态和内核态的频繁切换,会消耗大量的 CPU 资源,零拷贝就是通过尽量避免拷贝操作来缓解 CPU 的压力。零拷贝并没有真正做 到“0”拷贝,它更多是一种思想
相当于打通用户态和内核态

MMAP技术进行优化

sendfile模式优化

硬件缓存

-------------第二部分------------------
一.NGINX 源码安装
1..安装步骤
1.安装源码编译时需要的编译器,yum search PCRE 命令去查看所在的包
[root@Nginx ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y2.创建用户nginx,设置该账户的登录Shell为/sbin/nologin,-M选项来确保不创建用户的家目录
[root@Nginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx3.解压以及切换目录
[root@Nginx nginx]# tar zxf nginx-1.24.0.tar.gz
[root@Nginx nginx]# cd nginx-1.24.0/[root@Nginx nginx-1.24.0]# ls
auto CHANGES.ru configure html Makefile objs src
CHANGES conf contrib LICENSE man README
通过运行make命令,可以依据makefile中的规则进行编译和链接,最终生成可执行的nginx程序
src目录下的各个子目录(如src/core、src/event、src/http等)分别存放着不同模块的源码文件,这些文#共同构成了nginx的功能实现4.加载需要的模块
[root@Nginx nginx-1.24.0]# ./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module 5.[root@Nginx nginx-1.24.0]# make && make install
2.查看及版本验证
编译完成后查看:

6.编译完成后验证版本信息以及添加环境变量并运行脚本
[root@Nginx ~]# vim ~/.bash_profile
export PATH=$PATH:/usr/local/nginx/sbin
[root@Nginx ~]# source ~/.bash_profile

取消debug功能,减少内存使用

二.平滑升级回滚
添加新模块,需要新功能,而此时 Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级
原理:编译完新的二进制文件后,通过命令向新的master进程发送USR2升级信号,新旧master共同处理事务,使用WINCH关闭旧的wocker进程,最后向旧的master发出退出请求,实现升级
1.升级准备
1.解压新的版本,同时新增新的模块
[root@Nginx nginx]# tar zxf nginx-1.26.1.tar.gz
[root@Nginx nginx]# tar zxf echo-nginx-module-0.63.tar.gz
2.切换目录
[root@Nginx nginx]# cd nginx-1.26.1/[root@Nginx nginx-1.26.1]# ./configure --add-module=/root/echo-nginx-module-0.63.tar.gz with-http_ssl_module --withhttp_v2_module--with-http_realip_module --with-http_stub_status_module --withhttp_gzip_static_module--with-pcre --with-stream --with-stream_ssl_module --
with-stream_realip_module
[root@Nginx nginx-1.26.1]# make
#注意:无需make install3.备份旧的nginx命令文件,把新版本的文件复制过去
[root@Nginx ~]# cd /usr/local/nginx/sbin/
[root@Nginx sbin]# cp nginx nginx.old
4.把新版本的nginx命令复制过去
[root@Nginx sbin]# \cp -f /root/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin
#检测一下有没有问题
[root@Nginx sbin]# nginx -tnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
2.升级前检查
如果升级前里面存在两个nginx,后面升级命令执行后之前旧的master不会被回收,这是因为之前执行过curl -I localhost命令导致的,因此确保没有操作前里面只有nginx文件(我这个后面会报错)

执行回收旧版本命令没有回收

3.报错解决
报错一:无法回收
暂停nginx,删除下载目录里面的所有内容,切换到旧版本安装包解压后的目录,重新make install ,之后就可以做升级操作啦!!

报错二:pid文件缺失
在某次操作时并未关闭nginx,直接更改配置文件或者做了某些操作,显示正在运行,不能重新启动,注意,这样每次启动nginx都需要手动杀死之前的进程,杀死后系统发现没有 pid文件会重建文件,但是可以暂时解决,后面需要启动脚本时,启动前检查没有启动文件,会导致无法重启和启动,只能关闭,要解决只能在启动前那里写一个脚本,每次启动前杀死进程,pkill -nginx

4.
4.平滑升级
升级
[root@Nginx sbin]# kill -USR2 13003 #nginx master ID
此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进
程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。

回收
[root@Nginx sbin]# kill -WINCH 13003

检验

5. 回滚
拉起旧进程,回收新进程

检验
![]()
三.NGINX配置优化
1.修改用户名为nginx
2.一个master可以管理多少个 worker,设置为自动,否则命令行指定进程数也不会影响真正 的 进程数量
3.将Nginx工作进程绑定到指定的CPU核心,使进程不运行在其他核心上,减少其来回跳转,减少了CPU对进程的资源分配与回收以及内存管理
4.worker_connections 2048; #设置单个工作进程的最大并发连接数
5.use epoll; #使用epoll事件驱动
#Nginx支持众多的事件驱动,
#比如:select、poll、epoll,只能设置在events模块中


四.高并发测试
1.未开启并发参数


2.开启参数变为100000
[root@nginx nginx-1.24.0]# vim /etc/security/limits.conf
![]()

2.1.验证并发
五.root和alias区别
root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location(相当于拼接)
alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于 location上下文,此指令使用较少(相当于映射,映射的是后面紧跟着的绝对路径)
注意:
使用alias的时候uri后面如果加了斜杠,则下面的路径配置 必须加斜杠,否则403
当访问alias的时候,会显示alias定义的/mnt/dirtest 里面的内容
5.1:验证root
路径:/webdata/nginx/timinglee.org/lee/html/index.html

![]()
![]()

5.2:无法访问

无法访问,查看报错信息


![]()
5.3: 验证alias

![]()
------------第三部分-------------------
一.Location说明
= 需要请求字串与uri精确匹配
^~ 以什么开头不区分大小写
~ 区分大小写
~* 不区分大小写
不带符号 匹配起始于此uri的所有的uri
\ 用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号 (1.26.2不需要转义)
优先级排序:
对目录匹配:(~* ~)> 不带符号 > ^~ > = =不能指定目录所以排在最后,其为精确匹配,只能匹配文件
对文件匹配: = > (~* ~) > 不带符号 > ^~
1.1. 精确匹配
精确匹配时如果不是html页面,匹配成功会显示下载
第一个测试案例文件路径:/webdata/nginx/timinglee.org/html/index.html
第二个测试案例文件路径:/webdata/nginx/timinglee.org/lee/tee


1.2.区分大小写
/webdata/nginx/timinglee.org/lee/html/index.HTML

1.3.不区分大小写
/webdata/nginx/timinglee.org/lee/html/index.html

1.4.以某个url开头
第一个location:/webdata/nginx/timinglee.org/lee/images/images1/index.html
访问的是http://lee.timinglee.org/images/

访问:lee.timinglee.org/lee/
location:/webdata/nginx/timinglee.org/lee/index.html


1.5.文件名后缀
http://lee.timinglee.org/index.html
/webdata/nginx/timinglee.org/index.html

二.NGINX账户认证说明
由 ngx_http_auth_basic_module 模块提供此功能
使用htpasswd工具生成加密的密码并将其存储在.htpasswd文件中,然后在配置中引用这个文件
auth_basic_user_file +.htpasswd文件存放实际路径



三.自定义错误界面
[root@Nginx ~]# mkdir /date/web/errorpage -p
[root@Nginx ~]# echo error page > /date/web/errorpage/40x.html
如果页面不存在返回状态码404,那么会访问40x.html,此时会匹配到对应location
即/date/web/errorpage/40x.html



此时test目录不存在返回错误页面信息
四.自定义错误日志
重启nginx并访问不存在的页面进行测试并验证是在指定目录生成新的日志文件
文件是自动生成的


五.检测文件是否存在
[root@Nginx ~]# echo "error default " > /date/web/html/error/default.html
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
在server下面添加:
如果页面不存在,那么访问/date/web/html/error/default.html
#try_files $uri $uri.html $uri/index.html /error/default.html;

六.长链接配置
keepalive_timeout timeout [header_timeout]; #设定保持连接超时时长,0表示禁止长连接
keepalive_requests 数字; #在一次长连接上所允许请求的资源的最大数量#默认为100次,建议适当调大,比如:500
测试:首先下载测试软件telnet
keepalive_requests 2; 访问不能超过两次
keepalive_timeout 65 60;
开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断,第二个数字60为发送给客户端应答报文头部中显示的超时时间设置为60s:如不设置客户端将不显示超时时 间。

最终修改为500

七.作为下载服务器配置
ngx_http_autoindex_module 模块处理以斜杠字符 "/" 结尾的请求,并生成目录列表,可以做为下载服务 配置使用

autoindex on #自动文件索引功能,默为offautoindex_exact_size off # 计算文件确切大小(单位bytes),off 显示大概大小(单位K、 M),默认on autoindex_localtime on #显示本机时间limit_rate rate; #限制响应客户端传输速率默认值0,表示无限制,此指令由 ngx_http_core_modulet提供
#下载访问目录
mkdir /date/web/download -p
dd if=/dev/zero of=/date/web/download/leefile bs=1M count=100
vim vhosts.conf
systemctl restart nginx#dd:这是命令本身,代表“数据转储
#if=/dev/zero:输入文件是/dev/zero。这是一个特殊文件,当读取时会返回零值(空字节)。它通#常用于创建特定大小的空白文件。
#bs=1M:块大小被设置为1兆字节
#count=100:这指定了要复制的块的数量。这里设置的是100个块,每个块的大小为1MB,因此,总的文件大小将是100MB命令将创建一个名为leefile的文件在/data/web/download/目录中,并用100MB的零字节填充这个文件。
http:/lee.timinglee.org/download/

八.NGINX状态页
状态页匹配的location下加入stub_status;参数即可,不允许访问可以设置允许用户名和密码登录
location /status {
stub_status;
auth_basic ;
"auth login"; auth_basic_user_file /apps/nginx/conf/.htpasswd;
allow 192.168.0.0/24;
accepts: #统计总值,Nginx自启动后已经接受的客户端请求连接的总数
handled: #统计总值,Nginx自启动后已经处理完成的客户端请求连接总数
requests: #统计总值,Nginx自启动后客户端发来的总的请求数

九.NGINX的压缩功能
Nginx对文件的压缩功能是依赖于模块 ngx_http_gzip_module,默认是内置模块
在本机压缩后大小不会变,只是在传输给别人的时候会变小而已

gzip on 启用或禁用gzip压缩,默认关闭
gzip_comp_level 4; 值越高压缩后文件越小,但是消耗cpu比较高
gzip_min_length 1k; gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_http_version 1.1; 启用压缩功能时,协议的最小版本
gzip_vary on 启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开
gzip_types 压缩类型
echo hi > /date/web/html/small.html
du -sh /date/web/html/small.html 查看文件大小,尽量在1K内
cat /usr/local/nginx/logs/access.log > /date/web/html/big.html
du -sh /date/web/html/big.html
curl --head --cpmpressed 172.25.254.160/small.html
curl --head --compressed 172.25.254.160/small.html

十.NGINX 变量使用


十一.永久重定向和临时重定向
域名的临时的调整,后期可能会变,之前的域名或者URL可能还用、或者跳转的目的域名和URL还会跳 转,这种情况浏览器不会缓存跳转,临时重定向不会缓存域名解析记录(A记录),但是永久重定向会缓存
永久重定向(permanent)会缓存DNS解析记录, 浏览器中有 from disk cache 信息,即使nginx服务器无法访问,浏览器也 会利用缓存进行重定向
域名临时重定向(redirect)告诉浏览器域名不是固定重定向到当前目标域名,后期可能随时会更改,因此浏览器 不会缓存当前域名的解析记录
如果状态码304为从磁盘中缓存


测试永久重定向:


测试临时重定向:

十二.break和last
break和last在测试时一定要确定到具体的html文件,break在当前location中访问到就不会继续往下匹配,而last会一直往下匹配,直到匹配到最终的匹配条件
[root@nginx conf.d]# mkdir /data/web/html/{test1,test2,break,last} -p
[root@nginx conf.d]# echo test1 > /data/web/html/test1/index.html
[root@nginx conf.d]# echo test2 > /data/web/html/test2/index.html
[root@nginx conf.d]# echo last > /data/web/html/last/index.html
[root@nginx conf.d]# echo break > /data/web/html/break/index.html[root@nginx conf.d]# mkdir -p /date/web/var/test1
[root@nginx conf.d]# echo hhhhhhhhhhhhh > /date/web/var/test1/index.html
环境准备




验证break

测试last


十三.自动跳转https
基于通信安全考虑公司网站要求全站 https,因此要求将在不影响用户请求的情况下将http请求全 部自动跳转至 https,另外也可以实现部分 location 跳转
#制作证书
cd /usr/local/nginx/mkdir certsopenssl req -newkey rsa:2048 -nodes -sha256 -keyout /usr/local/nginx/certs/timinglee.org.key -x509 -days 365 -out /usr/local/nginx/certs/timinglee.org.crtvim /usr/local/nginx/conf.d/vhosts.conf#openssl req:这是OpenSSL的req命令,用于创建和管理X.509数字证书请求
#-newkey rsa:2048:这表示要创建一个新的2048位的RSA密钥对。RSA是一种非对称加密算法,2048位是密钥的长度,是当前推荐的安全标准。
#-nodes:这个选项表示私钥将不会被加密,即不会设置密码。
#-sha256:这是指证书签名时使用的哈希算法
#-keyout /usr/local/nginx/certs/timinglee.org.key:这指定了私钥的保存路径和文件名。私钥是敏感信息
#-x509:这表示要创建的是一个X.509格式的自签名证书
#-days 365:这设置了证书的有效期为365天
#-out /usr/local/nginx/certs/timinglee.org.crt:这指定了证书的保存路径和文件名。证书将在这里生成,可以被Nginx或其他支持SSL/TLS的服务器软件使用

当访问的为http协议时,自动跳转到HTTPS


当访问到的域名下面的文件不存在,会自定义到主页面上(第二个if的功能)


-------------第三部分---------------------
一.nginx反向代理
1.1.概念
同构代理:用户不需要其他程序的参与,直接通过http协议或者tcp协议访问后端服务器
异构代理:用户访问的资源时需要经过处理后才能返回的,比如php,python,等等,这种访问资源需 要经过处理才能被访问
proxy_pass; #用来设置将客户端请求转发给的后端服务器的主机
格式:proxy_pass http://172.25.254.30:8080; 相当于root(拼接)
proxy_pass http://172.25.254.40:8080/; 相当于alias
常用参数:
proxy_hide_header field; 隐藏相应头部
proxy_hide_header ETag;隐藏后端服务器ETag首部字段
proxy_pass_header field; #透传 将后端服务器返回的值传递给客户端
proxy_pass_request_body on | off; 是否向后端服务器发送HTTP实体部分
proxy_pass_request_headers on | off; 是否将客户端的请求头部转发给后端服务器
1.2实战
要求:将用户对域 www.timinglee.org 的请求转发给后端服务器处理(后端有两台服务器)
后端准备两台服务器:apache
yum install httpd -y
systemctl start httpd
systemctl enable httpd准备默认页面
echo 172.25.254.162 > /var/www/html/index.html
注意:一个location只能写一个proxy_pass,可以更改apache里面的/etc/httpd/conf/httpd.conf,更改下端口然后分别测试


测试结果


若是想要访问两个主机,可以写两个location,不同的URL
准备默认页面
mkdir -p /var/www/html/static;
echo static > /var/www/html/static/index.html



二.nginx动静分离
2.1.动态文件处理过程

2.2.准备php动态文件
[root@node1 ~]# yum install php -y
[root@node1 ~]# systemctl restart httpd
[root@node1 ~]# vim /var/www/html/index.php
<?phpphpinfo();
?>
2.3.测试


三.nginx的反向代理负载均衡(七层:upstream)
Nginx可以将客户端的请求转发至单台后端服务器但是无法转发至特定的一组的服务器,而 且不能对后端服务器提供相应的服务器状态监测,Nginx 可以基于ngx_http_upstream_module模块提 供服务器分组转发、权重分配、状态监测、调度算法等高级功能
http upstream配置参数
weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等
max_conns=number #给当前后端server设置最大活动链接数
max_fails=number #最大失败连接次数
fail_timeout=time
backup #设置为备份服务器,当所有后端服务器不可用时,才会启用
down #标记为down状态,可以平滑下线后端服务器
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启
hash $request_uri consistent; #基于用户请求的uri做hash
hash $cookie_sessionid #基于cookie中的sessionid这个key进行hash调度,实现会话绑 定
ip_hash;会话保持
least_conn;最少连接
在之前的环境下编辑配置文件:
3.1.负载均衡
upstream webserver {#ip_hash;# hash $request_uri consistent;# hash $cookie_lee;#least_connserver 172.25.254.161:8080 weight=1 fail_timeout=15s max_fails=3;server 172.25.254.162:80 weight=1 fail_timeout=15s max_fails=3;server 172.25.254.160 backup;
}server {listen 80;server_name www.timinglee.com;location ~/ {proxy_pass http://webserver;}
}

3.2.测试ip_hash
ip_hash和backup不能同时使用
如果要测试backup,就需要关闭后端两台apache的服
upstream webserver {ip_hash;server 172.25.254.161:8080 weight=1 fail_timeout=15s max_fails=3;server 172.25.254.162:80 weight=1 fail_timeout=15s max_fails=3;}server {listen 80;server_name www.timinglee.com;location ~/ {proxy_pass http://webserver;}
}

3.3.测试hash $cookie_lee
cookie后面跟了一个键,键的值不影响访问的主机
upstream webserver {hash $cookie_lee;server 172.25.254.161:8080 weight=1 fail_timeout=15s max_fails=3;server 172.25.254.162:80 weight=1 fail_timeout=15s max_fails=3;server 172.25.254.160 backup;
}server {listen 80;server_name www.timinglee.com;location ~/ {proxy_pass http://webserver;}
}

四.nginx四层负载均衡(stream)
4.1.实例1:MYSQL
后端准备两台MYSQL服务器:
[root@node1 ~]# yum install mariadb-server
[root@node1 ~]# vim /etc/my.cnf.d/mariadb-server.cnf
【mysqld】
server-id=161
[root@node1 ~]# systemctl start mariadb
外部命令授权密码用户lee:lee
[root@node1 ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee' ;"
连接查看SERVER_id
[root@node1 ~]# mysql -ulee -p'lee' -h 172.25.254.161 -e "select @@server _id"
+-------------+
| @@server_id |
+-------------+
| 161 |
+-------------+
两台机子做同样配置负载均衡服务器下载连接数据库的客户端yum install mariadb -y
警告:在nginx主配置文件中要看清楚子配置文件的链接位置
在负载均衡服务器配置:

测试结果:

4.2. 实例2:DNS(UDP:53)
4.2.1.后端搭建两台DNS服务器
[root@node2 ~]# yum install named -y
[root@node2 ~]# vim /etc/named.conf
[root@node2 ~]# vim /etc/named.rfc1912.zones
[root@node2 ~]# cd /var/named
[root@node2 named]# cp -p named.localhost timinglee.com.zone




4.2.2.nginx端配置

4.2.3.测试


五.nginx四层和七层负载的区别

1..四层负载均衡,也就是主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器
特点:
1. 性能高效:由于操作在较低的网络层,处理速度快,开销小
2. 无法基于请求的具体内容进行智能决策,如URL路径或HTTP头信息
七层负载均衡,或应用层负载均衡,是基于HTTP/HTTPS协议的负载均衡。Nginx在这一层上进行操作,根据HTTP请求的内容(如URL、头信息、Cookies等)来决定如何分配请求到后端服务器。
特点:
1.支持URL重写、请求重定向
2.可以根据请求的具体内容(如请求的路径、域名、甚至是请求中的某些值)来决定请 求应该转发到哪个后端服务器
2.区别:
①处理层次不同:四层负载均衡在传输层上工作,主要关注IP和端口;七层负载均衡在应用层上工作,能够理解HTTP协议和内容。
②功能和灵活性:七层负载均衡由于能够理解应用协议,因此提供了更多的功能和灵活性,如基于URL的路由、HTTP头的修改
③性能开销:四层负载均衡通常性能更高,因为它避免了对数据包内容的深入解析;而七层负载均衡由于需要解析HTTP请求,可能会有更多的性能开销。
为什么有了七层还需要四层?
Day62-Nginx四层负载均衡及结合7层负载均衡实践_nginx可以支持百亿并发吗-CSDN博客文章浏览阅读1.2k次,点赞27次,收藏26次。所谓四层就是OSI模型的传输层,主要是基于tcp/ip的负载均衡模式,即基于ip和端口的方式实现将请求转发至后端节点。_nginx可以支持百亿并发吗https://blog.csdn.net/dws123654/article/details/137045231
四层可以保证七层的负载均衡的高可用性,如:nginx就无法保证自己的服务高可用,需要依赖LVS或者keepaive。
端口映射(端口转发):如:TCP协议的负载均衡,有些请求是TCP协议的(mysql,ssh),或者说这些请求只需要使用四层进行端口的转发就可以了,所以使用四层负载均衡。
2、四层负载均衡可以用来解决七层负载均衡端口限制问题;(七层负载均衡最大使用65535个端口)
3、四层负载均衡可以解决七层负载均衡高可用问题;(nginx就无法保证自己的服务高可用,需要依赖LVS或者keepaive)
4、四层的转发效率比七层的高得多,但仅支持tcp/ip协议,不支持http和https协议;
5、通常大并发场景通常会选择使用在七层负载均衡前面增加四层负载均衡

四层:在tcp层工作的方式,例如:LVS ;F5
七层:应用层,例如:haproxy、mysql proxy等
--------------第四部分------------------
1.实现FastCGI(LNMP)
随着网站功能增多网站开发也越来越复杂,以至于出现动态技 术,比如像php(1995年)、java(1995)、python(1991)语言开发的网站,但是nginx/apache服务器并不 能直接运行 php、java这样的文件,nginx将客户端请求转发给CGI处理,处理完成后返回数据给Nginx并回收进程
因为 Web Server 每收到一个请求都会创建一个CGI进程,FastCGI是用来提高CGI性 能的,FastCGI每次处理完请求之后不会关闭掉进程,而是保留这个进程,使这个进程可以处理多个请 求。
2.Fastcgi:nginx与php-fpm在同一服务器
2.1.源码编译PHP
#NGINX配置
systemctl stop nginx
rm -rf /usr/local/nginx/ #若是想要之前的配置就做平滑升级,要是不想要就直接删掉
tar xf memc-nginx-module-0.20.tgz
tar xf srcache-nginx-module-0.33.tar.gz./configure --prefix=/usr/local/nginx --add-module=/root/echo-nginx-module-0.63 --add-module=/root/memc-nginx-module-0.20 --add-module=/root/srcache-nginx-module-0.33 --user=nginx --group=nginx --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-stream --with-stream_ssl_module --with-stream_realip_module --with-pcremake && make installsystemctl start nginx
#解压php
tar xf php-8.3.9.tar.gz
#进入php安装目录
cd php-8.3.9/
#加入模块
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-curl --with-iconv --with-mhash --with-zlib --with-openssl --enable-mysqlnd --with-mysqli --with-pdo-mysql --disable-debug --enable-sockets --enable-soap --enable-xml --enable-ftp --enable-gd --enable-exif --enable-mbstring --enable-bcmath --with-fpm-systemd#若是有依赖的包通过以下方式查找,或者在阿里云上下载
yum search libsystemd
yum whatprovides libsystemd
yum whatprovides */libsystemd*
yum install systemd-devel-252-38.el9.x86_64
.......yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libpng-devel libcurl-devel
yum install oniguruma-devel-6.9.6-1.el9.5.x86_64.rpm
make && make install
nginx模块

PHP模块 (去掉memcache)

依赖包查找下载: (注意版本对应起来)



成功
make && make install
2.2.PHP相关配置优化
[root@nginx php-8.3.9]# cd /usr/local/php/etc/
[root@nginx etc]# ls
php-fpm.conf.default php-fpm.d
[root@nginx etc]# cp -p php-fpm.conf.default php-fpm.conf
-p连带权限一起复制
[root@nginx etc]# vim php-fpm.conf去掉注释
pid = run/php-fpm.pid #指定pid文件存放位置[root@nginx etc]# cd php-fpm.d/
[root@nginx php-fpm.d]# ll
total 24
-rw-r--r-- 1 root root 22102 Aug 20 08:37 www.conf.default#生成主配置文件
[root@nginx php-fpm.d]# cp www.conf.default www.conf -p
[root@nginx php-fpm.d]# vim www.conf
[root@nginx php-fpm.d]# cd /root/php-8.3.9/
[root@nginx php-8.3.9]# cp php.ini-production /usr/local/php/etc/php.ini
[root@nginx php-8.3.9]# cd
[root@nginx ~]# vim /usr/local/php/etc/php.ini[Date]
; Defines the default timezone used by the date functions
; https://php.net/date.timezone
date.timezone = Asia/Shanghai #修改时区#生成启动文件
[root@nginx ~]# cd /root/php-8.3.9/
[root@nginx php-8.3.9]# cp sapi/fpm/php-fpm.service /lib/systemd/system/
[root@nginx php-8.3.9]# vim /lib/systemd/system/php-fpm.service
#ProtectSystem=full #注释该内容[root@nginx php-8.3.9]# systemctl start php-fpm.service
[root@nginx php-8.3.9]# netstat -anltup | grep php
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 119823/php-fpm: mas加入环境变量
[root@nginx conf]# vim ~/.bash_profile
export PATH=$PATH:/usr/local/nginx/sbin:/usr/local/php/sbin:/usr/local/php/bin[root@nginx conf]# source ~/.bash_profile
请注意,修改配置后需要重启相关服务才能使更改生效。例如,如果修改了php.ini,你需要重启Web服务器。如果修改了php-fpm.conf或www.conf,则需要重启PHP-FPM服务。
与nginx搭配使用的php,有三个配置文件:php.ini、php-fpm.conf、www.conf
①php.ini是php运行时的核心配置。CLI形式、php-fpm模式下的PHP进程,都读取php.ini中的配置项
②php-fpm.conf 是php-fpm管理下的php进程的配置文件。该模式下运行的php进程,除读取php.ini中的配置项外,还读取php-fpm.conf中的配置项。
③www.conf 是 php-fpm.conf 的补充
2.3. 准备PHP测试页面
在nginx.conf中加入include "/usr/local/nginx/conf.d/*.conf";
准备PHP默认访问页面
[root@nginx php-8.3.9]# mkdir -p /data/php
[root@nginx php-8.3.9]# vim /data/php/index.php
[root@nginx php-8.3.9]# cat /data/php/index.php
<?php
phpinfo();
?>编写nginx配置页面:
[root@nginx conf]# cat /usr/local/nginx/conf.d/php.conf
server {listen 80;server_name www.timinglee.com;root /data/php;location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;include fastcgi.conf;}}
[root@nginx conf]# systemctl restart nginx
测试访问:

3.PHP缓存模块
3.1.安装缓存模块
一个PHP页面需要通过PHP处理,为了提升性能,在内存里面给PHP处理的文件一个缓存区域(memcache),已经处理过的数据就存放在缓存中,下一次直接去这个缓存中取数据
1.使PHP支持memcache
[root@nginx ~]# cd memcache-8.2/2.phpize需要的插件
[root@nginx memcache-8.2]# yum install autoconf3.生成configure
[root@nginx memcache-8.2]# phpize
Configuring for:
PHP Api Version: 20230831
Zend Module Api No: 20230831
Zend Extension Api No: 4202308314.[root@nginx memcache-8.2]# ./configure && make && make install5.查看模块
[root@nginx memcache-8.2]# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20230831/
memcache.so opcache.so
6.复制测试文件到nginx目录
[root@nginx memcache-8.2]# cp example.php memcache.php /data/php/
7.修改nginx要访问的目录里面的登录名和密码
[root@nginx memcache-8.2]# vim /data/php/memcache.php
define('ADMIN_USERNAME','admin'); // Admin Username
define('ADMIN_PASSWORD','admin'); // Admin Password
注意:下面的主机名也要改
8.配置php加载memcache模块
[root@nginx memcache-8.2]# vim /usr/local/php/etc/php.ini
;extension=zip
extension=memcache
;zend_extension=opcache
9.启动PHP
[root@nginx memcache-8.2]# systemctl reload php-fpm
查看是否加载成功
[root@nginx memcache-8.2]# php -m | grep mem
memcache10.下载模块
[root@nginx memcache-8.2]# yum install memcached -y
11.启动服务
[root@nginx memcache-8.2]# systemctl enable --now memcached.service
12.查看是否监听服务
[root@nginx memcache-8.2]# netstat -antlupe | grep memcache
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN 977 179351 125857/memcached
tcp6 0 0 ::1:11211 :::* LISTEN 977 179352 125857/memcached
[root@nginx memcache-8.2]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1,::1"

3.2.测试:
默认访问页
一直访问默认页,缓存命中率在上升

性能测试:
[root@nginx memcache-8.2]# ab -n500 -c10 http://www.timinglee.com/index.php 

4.PHP高速缓存

注意:高速缓存需要 借助第三方模块来让nginx支持此功能,所 以nginx需要重新编译,
--add-module=/root/srcache-nginx-module0.33
nginx配置文件:
upstream memcache {server 127.0.0.1:11211;keepalive 512;
}
server {listen 80;server_name www.timinglee.com;root /data/php;location /memc {internal;memc_connect_timeout 100ms;memc_send_timeout 100ms;memc_read_timeout 100ms;set $memc_key $query_string; #使用内置变量$query_string来作为keyset $memc_exptime 300; #缓存失效时间300秒memc_pass memcache;}location ~ \.php$ {set $key $uri$args; #设定key的值srcache_fetch GET /memc $key; #检测mem中是否有要访问的phpsrcache_store PUT /memc $key; #缓存为加载的php数据fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;include fastcgi.conf;}
}
[root@Nginx ~]# systemctl start nginx
性能测试(直接从内存中去取数据)


