七层负载均衡-nginx

七层负载均衡-nginx

  • 一、nginx安装
    • 1.下载nginx的源码包
    • 2.安装
      • 1)源码编译第一步,./configure ,检验操作系统的依赖性
      • 2)源码编译第二步编译,make,把c语言源码编译成可执行的二进制程序
      • 3)源码编译第三步,make install
  • 二、nginx七层负载配置
  • 三、nginx的一些配置
    • 1.backup:备份;
    • 2.配置权重
    • 3.选择负载均衡算法:IP Hash
    • 4.手动下线指定服务器节点,down
  • 四、nginx添加第三方模块stick,扩充调度算法
    • 1.下载扩展包
    • 2.重新编译并添加新的模块
    • 3.进行优化
    • 4.编译make
    • 5.覆盖原二进制程序
    • 6.修改配置文件进行验证
    • 7.浏览器域名访问进行验证
    • 8.当浏览器使用域名访问出现解析错误时
  • 五、nginx的一些常规配置
    • 1.修改nginx使用用户
    • 2.设置脚本实现nginx开机自启动
  • 六、nginx并发优化
    • 1.设置nginx的work进程数
    • 2.使用linux内核的epoll的I/O复用模型,默认就是,用这个模型可以高效处理异步事件
    • 3.修改每个work的并发线连接数
    • 3.开启文件高效传输模式
    • 4.nginx的loaction优先级匹配
  • 七、nginx的平滑升级
    • 1.下载新版nginx,并解压,并关闭编译的debug,不隐藏版本信息
    • 2.在解压目录下执行编译
    • 3.备份原程序,拷贝新程序
    • 4.获取当前nginx主进程pid
    • 5.唤醒新版本的二进制程序进程
    • 6.关闭原worker进程但保留主进程:为了回退
    • 7.版本回退

一、nginx安装

nginx实现负载均衡集群,本质上就是反向代理加负载均衡。

正向代理与反向代理的区别
1.代理服务器如果配置在客户端即为正向代理,如果配置在服务端即为反向代理,和机器个数没有关系

2.正向代理代替客户端去发送请求,反向代理代替服务端接受请求

3.正是因为正向代理代替客户端发送请求,正向代理服务器和客户端对外表现为一个客户端,所以正向代理隐藏了真实的客户端;反向代理代替服务端接受请求,反向代理服务器和真实服务器对外表现为一个服务端,所以反向代理服务器隐藏真实的服务端

综上,本质上代理服务器还是那个代理服务器,如果替客户端干活就是正向代理,如果替服务端干活就是反向代理;

服务器不仅可以作为服务端,也可以作为客户端;如果该服务器向某些客户端提供资源,此时就是服务端,同时如果需要向别的服务器请求资源,此时就是客户端。

七层负载均衡-nginx_第1张图片LVS是四层负载,也就是基于传输层信息进行调度(传输层协议TCP/UDP)七层负载中比较出名就是haproxy与nginx,也就是基于应用层信息就行调度(应用层协议:HTTP等)。

七层可以做重定向,比如下图访问淘宝地址www.taobao.com,可以看到http状态码为301表示重定向,重定向后的地址为 https://www.taobao.com/,端口为443端口,但用户通过浏览器上过去的都是标准的80端口,也就是做了重定向。现在电商都是做的整站加密。

七层负载均衡-nginx_第2张图片

1.下载nginx的源码包

  本实验使用nginx源码安装(也可以下载编译好的rpm),rpm包是已经配置好参数进行编译的,源码包则可以按自己需求配置再进行编译,也就是个人定制。
  下载相应版本源码包到本地宿主机,通过ftp协议下载到server1上进行解压;configure是GNU组织的make,类似于goodjob的check。

Nginx官网

#宿主机下载所需版本的源码安装包,推荐下载稳定版的
[root@wlb Downloads]# pwd
/home/westos/Downloads
[root@wlb Downloads]# wget http://nginx.org/download/nginx-1.20.2.tar.gz

七层负载均衡-nginx_第3张图片七层负载均衡-nginx_第4张图片
七层负载均衡-nginx_第5张图片

部署节点虚拟机通过ftp协议从宿主机下载安装包并解压

#下载
[root@server5 ~]# lftp  -u westos,westos sftp://172.25.254.73
lftp [email protected]:~> cd /home/westos/Downloads/
lftp [email protected]:~/Downloads> ls
drwxr-xr-x    3 westos   westos        191 Jul 20 21:35 .
drwx------   22 westos   westos       4096 Jul 20 09:48 ..
-rw-rw-r--    1 westos   westos   77101976 May  4 16:26 Firefox-latest-x86_64.tar.bz2
-rw-rw-r--    1 westos   westos   77259395 Jul 20 09:31 firefox-102.0.1.tar.bz2
-rw-rw-r--    1 westos   westos   13626774 Mar  5 23:00 helm-v3.8.0-linux-amd64.tar.gz
-rw-rw-r--    1 westos   westos    1721604 Mar 27 21:45 moosefs-3-0-users-manual.pdf
-rw-r--r--    1 root     root      1062124 Nov 16  2021 nginx-1.20.2.tar.gz
drwx------    3 westos   westos         24 Jan  3  2022 qq-files
lftp [email protected]:~/Downloads> get nginx-1.20.2.tar.gz 
1062124 bytes transferred
lftp [email protected]:~/Downloads> exit
[root@server5 ~]# ls
nginx-1.20.2.tar.gz
[root@server5 ~]# tar zxf nginx-1.20.2.tar.gz 
[root@server5 ~]# ls
nginx-1.20.2  nginx-1.20.2.tar.gz

七层负载均衡-nginx_第6张图片七层负载均衡-nginx_第7张图片

2.安装

七层负载均衡-nginx_第8张图片–without表示默认情况下编译是自带的,需要使用该命令把它去除。
–with表示默认情况下编译是不带的,需要使用该命令加上去。

1)源码编译第一步,./configure ,检验操作系统的依赖性

[root@server5 nginx-1.20.2]# ./configure --with-http_ssl_module --with-http_stub_status_module  --prefix=/usr/local/nginx
此命令是安装一些模块,此命令必须在nginx源码目录下执行

七层负载均衡-nginx_第9张图片七层负载均衡-nginx_第10张图片七层负载均衡-nginx_第11张图片

提示没有下载c语言编辑器,安装c语言编辑器,解决依赖性
[root@server5 nginx-1.20.2]# yum install -y gcc
安装后继续执行
[root@server5 nginx-1.20.2]# [root@server5 nginx-1.20.2]# ./configure --with-http_ssl_module --with-http_stub_status_module  --prefix=/usr/local/nginx

七层负载均衡-nginx_第12张图片七层负载均衡-nginx_第13张图片

执行命令继续检测
[root@server5 nginx-1.20.2]# ./configure --with-http_ssl_module --with-http_stub_status_module  --prefix=/usr/local/nginx

七层负载均衡-nginx_第14张图片七层负载均衡-nginx_第15张图片

2)源码编译第二步编译,make,把c语言源码编译成可执行的二进制程序

make指令,是在安装有GNU Make的计算机上的可执行指令。该指令是读入一个名为 ’Makefile’的文件,然后执行这个文件中指定的指令。
七层负载均衡-nginx_第16张图片

七层负载均衡-nginx_第17张图片七层负载均衡-nginx_第18张图片七层负载均衡-nginx_第19张图片

3)源码编译第三步,make install

[root@server5 nginx-1.20.2]# make install
该动作必须在源码的第一级解压路径,也就Makefile文件的同级目录下,其实就是把编译好的二进制程序和配置文件复制过去

七层负载均衡-nginx_第20张图片七层负载均衡-nginx_第21张图片七层负载均衡-nginx_第22张图片创建软连接

[root@server5 conf]# ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
[root@server5 conf]# which nginx
[root@server5 conf]# ll /usr/local/bin/nginx
创建软链接到/usr/local/sbin/,在该目录下,命令相当于在环境变量中,这样在开启nginx服务的时候就不需要进到目录下开启,方便开启全局nginx。软连接的方式可以

七层负载均衡-nginx_第23张图片检测语法,并启动

[root@server5 conf]# nginx -t #检测语法
[root@server5 conf]# nginx	#启动nginx
[root@server5 conf]# ps ax

七层负载均衡-nginx_第24张图片七层负载均衡-nginx_第25张图片

[root@server5 conf]# nginx -s stop #关闭nginx
[root@server5 conf]# nginx -s reload #重启nginx

七层负载均衡-nginx_第26张图片七层负载均衡-nginx_第27张图片
七层负载均衡-nginx_第28张图片七层负载均衡-nginx_第29张图片

二、nginx七层负载配置

后端服务器开启apache服务,进行测试

[root@server2 ~]# systemctl start httpd
[root@server3 ~]# systemctl start httpd

七层负载均衡-nginx_第30张图片七层负载均衡-nginx_第31张图片nginx主配置文件添加负载均衡器和反向代理

七层负载均衡-nginx_第32张图片
七层负载均衡-nginx_第33张图片
七层负载均衡-nginx_第34张图片

七层负载均衡-nginx_第35张图片

[root@westos_student73 westos]# vim /etc/hosts

172.25.254.15 server1 reg.westos.org www.westos.org bbs.westos.org www2.westos.org

七层负载均衡-nginx_第36张图片七层负载均衡-nginx_第37张图片七层负载均衡-nginx_第38张图片七层负载均衡-nginx_第39张图片七层负载均衡-nginx_第40张图片关闭后端服务器server2进行测试
访问测试必须是访问域名,如果使用访问IP将默认访问第一个虚拟主机Nginx

七层负载均衡-nginx_第41张图片七层负载均衡-nginx_第42张图片七层负载均衡-nginx_第43张图片七层负载均衡-nginx_第44张图片

三、nginx的一些配置

1.backup:备份;

当其他后端服务器停止工作时,代替工作
七层负载均衡-nginx_第45张图片七层负载均衡-nginx_第46张图片七层负载均衡-nginx_第47张图片七层负载均衡-nginx_第48张图片

2.配置权重

七层负载均衡-nginx_第49张图片测试:客户端测试,按权重比例分配负载。

七层负载均衡-nginx_第50张图片

3.选择负载均衡算法:IP Hash

IP Hash算法:根据客户端ip进行负载均衡,相同客户端IP访问时,会访问到同一客户端。一对一,一个sever对一个IP。

七层负载均衡-nginx_第51张图片七层负载均衡-nginx_第52张图片七层负载均衡-nginx_第53张图片七层负载均衡-nginx_第54张图片客户端测试:同一客户端访问同一后端服务器
在生产环境中需要的是整体的均衡,并不需要不断地切换后台服务器,在实际中实现整体流量的均衡就行。当下的应用服务器很多要与客户端建立session连接,这就需要session保持机制,不能随便进行调度,因为如果后台服务器之间没有session共享机制时,可能会出现一种情况。当通过浏览器访问莫网页,通过认证后,又被调度到其他服务器就会出现需要重新认证的情况。

该算法仍然有负载均衡,当客户端匹配的后台服务器挂掉时,会进行负载均衡调度到其他服务器,当该
服务器恢复后,还会匹配到原服务器。

七层负载均衡-nginx_第55张图片

4.手动下线指定服务器节点,down

当后端服务器RS需要下线维护时,可以手动指定下线

七层负载均衡-nginx_第56张图片七层负载均衡-nginx_第57张图片服务端测试:
七层负载均衡-nginx_第58张图片因为实验的一些原因,test5虚拟机仍为nginx服务器,另建立test6虚拟机为sever6后端服务器,IP为172.25.254.16;以及虚拟机test7为server7后台服务器,IP为172.25.254.17;
七层负载均衡-nginx_第59张图片

七层负载均衡-nginx_第60张图片
七层负载均衡-nginx_第61张图片

修改nginx主配置如下

七层负载均衡-nginx_第62张图片RS服务端下载apache,并设置发布页内容

[root@server6 ~]# yum install httpd -y
[root@server6 ~]# systemctl start httpd
[root@server6 ~]# echo server6 > /var/www/html/index.html
[root@server6 ~]# curl localhost


[root@server6 ~]# yum install httpd -y
[root@server6 ~]# systemctl start httpd
[root@server6 ~]# echo server7 > /var/www/html/index.html
[root@server6 ~]# curl localhost

七层负载均衡-nginx_第63张图片

七层负载均衡-nginx_第64张图片nginx手动下线server7后端服务器进行测试
七层负载均衡-nginx_第65张图片客户端测试
七层负载均衡-nginx_第66张图片

四、nginx添加第三方模块stick,扩充调度算法

sticky模块与Ip_hash都是与负载均衡算法相关,效果相似同一客户端请求访问时会被调度到同一后端服务器,差别是:

1.ip hash,根据客户端的IP,将请求分配到不同的服务器上
2.sticky,根据服务器给客户端浏览器发送的cookie,客户端再次请求时会带上此cookie,nginx会把有此cookie的请求转发到颁发cookie的服务器上

注意:在一个局域网内有多台主机,这些主机有不同的内网IP,但是当他们发起请求时,却只有一个外网IP,该IP是电信运营商分配在这些内网主机连接的路由器的,如果使用 ip_hash 方式,则Nginx会将请求分配到不同上游服务器,如果使用 sticky 模块,则会把请求分配到颁发cookie的服务器上,实现:内网nat用户的均衡。这是iphash无法做到的。

Sticky是基于cookie的一种负载均衡解决方案,通过分发和识别cookie,使来自同一个客户端的请求落在同一台服务器上,默认cookie标识名为route :
sticky工作机制

1.客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。
2.后端服务器处理完请求,将响应数据返回给nginx。
3.此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值
4.客户端接收请求,并保存带route的cookie。
5.当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器

现在很多网站走的都是cdn,都是有缓存的:
七层负载均衡-nginx_第67张图片
CDN是一种分布式集群,只要作用就是缓存,目的有两点:1.加速客户端的访问(就是个cache,CDN可以通过nginx做二次开发,因为nginx支持缓存和反向代理)2.降低后端real server的负载。

工作流程:
client---->dns---->CDN(cache)缓存中没有时可以向邻居找,邻居也没有时会去源站寻找 ----->server---->CDN(cache)做缓存---->client

所以从上面的机制可以看出,server端拿到的IP并不是客户端IP而是CDN的IP。也就是说nginx服务器端server5的反向代理机制,对于后端服务器来说时透明的,后端服务器无法得知客户端地址。
七层负载均衡-nginx_第68张图片

cession在服务器端,cookie在浏览器中保存的。所以可以通过浏览器的cookie来实现类似IP_hash负载均衡。但是社区版nginx不支持该算法,需要nginxplus才可以。如果想要使用该算法,需要对当前nginx模块进行扩展。

1.下载扩展包

扩展包名字:nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
由于nginx是静态编译,所以每次增加新功能时都需要重新编译,而且要加载之前的所有参数。

下载扩展包,安装解压工具并解压
七层负载均衡-nginx_第69张图片七层负载均衡-nginx_第70张图片清除原编译二进制程序
七层负载均衡-nginx_第71张图片

2.重新编译并添加新的模块

[root@server5 nginx-1.20.2]# ./configure --with-http_ssl_module --with-http_stub_status_module --prefix=/usr/local/nginx --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
由于nginx是静态编译,所以每次增加新功能时都需要重新编译,而且要加载之前的所有参数,不加的话就会丢失。

七层负载均衡-nginx_第72张图片七层负载均衡-nginx_第73张图片

3.进行优化

编译时关闭gcc的debug模式

[root@server5 nginx-1.20.2]# vim auto/cc/gcc
可以关闭gcc的debug模式,这样编译出的二进制程序会更小


# debug
#CFLAGS="$CFLAGS -g"

七层负载均衡-nginx_第74张图片关闭版本显示

[root@server5 nginx-1.20.2]# vim src/core/nginx.h
nginx核心源代码

七层负载均衡-nginx_第75张图片
七层负载均衡-nginx_第76张图片七层负载均衡-nginx_第77张图片
七层负载均衡-nginx_第78张图片
七层负载均衡-nginx_第79张图片

4.编译make

切记不要进行make install安装,因为软件已经安装过,现在直是去更新,执行make install 会进行覆盖安装

七层负载均衡-nginx_第80张图片

5.覆盖原二进制程序

[root@server5 nginx-1.20.2]# cd objs/
[root@server5 objs]# ls
[root@server5 objs]# du -h nginx
[root@server5 objs]# cp nginx /usr/local/nginx/sbin/
cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y
[root@server5 objs]# cd /usr/local/nginx/sbin/
[root@server5 sbin]# ls
nginx
[root@server5 sbin]# du -h nginx 
936K	nginx

覆盖结束后,更新完成
七层负载均衡-nginx_第81张图片

6.修改配置文件进行验证

[root@server5 sbin]# cd /usr/local/nginx/conf/
[root@server5 conf]# ls
fastcgi.conf          fastcgi_params.default  mime.types          nginx.conf.default   uwsgi_params
fastcgi.conf.default  koi-utf                 mime.types.default  scgi_params          uwsgi_params.default
fastcgi_params        koi-win                 nginx.conf          scgi_params.default  win-utf
[root@server5 conf]# vim nginx.conf
[root@server5 conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server5 conf]# nginx  #启动nginx

七层负载均衡-nginx_第82张图片

七层负载均衡-nginx_第83张图片

7.浏览器域名访问进行验证

七层负载均衡-nginx_第84张图片七层负载均衡-nginx_第85张图片

8.当浏览器使用域名访问出现解析错误时


解决方法一: 先清除浏览器缓存,防止之前的地址解析缓存干扰

解决方法二: 通过浏览器访问IP进行验证
\

通过IP进行访问时,默认访问Nginx的第一个虚拟主机localhost,此时可以通过proxy_pass将服务传递给

负载组westos,Nginx配置如下。

七层负载均衡-nginx_第86张图片

当浏览器使用IP访问Nginx服务端时,默认访问第一个虚拟服务器localhost,再通过location匹配和

proxy_pass,将服务传递给负载组westos,效果如下图。

七层负载均衡-nginx_第87张图片七层负载均衡-nginx_第88张图片
七层负载均衡-nginx_第89张图片
上面实验中apache服务器就是real server,属于web层,接入层之后就是到达lamp架构了,接入层有高可用和负载均衡集群。

五、nginx的一些常规配置

RS其实就是web层,也就到达了lamp架构,也就是接入层之后就是lamp架构,接入层有高可用和负载均衡集群,电商公司一般都会使用lamp架构。nginx的反向代理只是其中功能之一,更多的时候是作为web服务器使用。

1.修改nginx使用用户

[root@server5 ~]# ps aux
[root@server5 ~]# useradd nginx
[root@server5 ~]# id  nginx

[root@server5 conf]# vim nginx.conf
[root@server5 conf]# nginx -t 
[root@server5 conf]# nginx -s reload

七层负载均衡-nginx_第90张图片

七层负载均衡-nginx_第91张图片七层负载均衡-nginx_第92张图片

2.设置脚本实现nginx开机自启动

Systemd下服务脚本说明
命令行和脚本作用是一样的,服务脚本主要是为了开机自启,操作时是命令行多一些。

[root@server5 /]# cd /usr/lib/systemd/system
[root@server5 system]# vim nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

[root@server5 system]# systemctl daemon-reload
[root@server5 system]# nginx -s stop  #命令行打开的时候,无法关闭,所以先用命令行关闭
[root@server5 system]# systemctl start nginx
[root@server5 system]# ps aux

七层负载均衡-nginx_第93张图片
七层负载均衡-nginx_第94张图片
七层负载均衡-nginx_第95张图片
七层负载均衡-nginx_第96张图片七层负载均衡-nginx_第97张图片

七层负载均衡-nginx_第98张图片
七层负载均衡-nginx_第99张图片七层负载均衡-nginx_第100张图片

六、nginx并发优化

1.设置nginx的work进程数

推荐按cpu数目设定,和cpu核心数相同即可
nginx的master进程和worker进程,以及worker绑定cpu内核的原因

七层负载均衡-nginx_第101张图片七层负载均衡-nginx_第102张图片

七层负载均衡-nginx_第103张图片nginx官方推荐的就是一个work对应一个cpu核心,而且最好是进行捆绑。
设定为自动的情况下有可能会导致不均匀的情况,所以手动设定,并进行捆绑。

cpu是按照cpu的时间分片进行负载的,因为cpu太快了,所以cpu调动线程是安装平均的时间分片进行负载的,当前时间分片是1线程的话,下一个时间分片就会是2分片,因为cpu的轮询太快了,所以直观上是多任务的,但实际上是轮询的。这种cpu资源是共享的,比如开了两个worker,这两个worker会共享两个cpu核心的时间分片,也就是同一个worker当前是由核心1处理的,下一时刻就会是核心2处理,这就是多核心的功能。并行就是操作系统只要有空闲资源就可以调用,默认机制是以最快的调度效率完成用户任务工作。这样就会导致一个问题,因为实际工作当中,cpu的工作机制是每个cpu核心会管控离自己最近的内存,比如硬件上插两个cpu,每个cpu会管控一片内存,也就是缓存不同,具体可以查看操作系统原理或计算机架构。如果不进行绑定,会导致cpu因上下文切换而造成损耗,绑定后,效率更高也就是命中率更高
cpu上下文切换
nginx的master进程和worker进程,以及worker绑定cpu内核的原因

worker_processes  2;
worker_cpu_affinity 01 10;

当有四核心时的写法
worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;

七层负载均衡-nginx_第104张图片

2.使用linux内核的epoll的I/O复用模型,默认就是,用这个模型可以高效处理异步事件

Linux五种IO模型
七层负载均衡-nginx_第105张图片

3.修改每个work的并发线连接数

nginx出来就是为了解决c10k的问题,c10k是指并发过万的问题,所以1024太小了
修改每个work可以同时处理的并发连接数为65535
并发连接数-SBC(Simultaneous Browser Connections),并发连接数是指客户端向服务器发起请求,并建立TCP连接。每秒钟服务器连接的总TCP数量,就是并发连接数。

worker_connections  65535;

七层负载均衡-nginx_第106张图片因为操作系统的限制,上述设定并不生效
每建立一个网络连接,就会消耗Linux内核的一个文件描述服务。在应用层面设置并发连接数,需要看操作系统是否允许,操作系统允许还需要看内核是否允许,内核的权重最高,内核一般没问题,因为内核里的值是根据操作系统的内存设定
七层负载均衡-nginx_第107张图片
内核限制最高,接着是操作系统的限制,最后才是app应用层。
七层负载均衡-nginx_第108张图片
可以看到内核没有问题,所以向需要对操作系统进行修改,操作系统是通过热插拔模块控制的,热插拔模块调用了limits模块。
热插拔模块

[root@server5 conf]# vim /etc/security/limits.conf 
nginx   -       nofile  65535
改了即生效

七层负载均衡-nginx_第109张图片

注意:worker_processes //工作进程数
worker_connections //单个工作进程并发连接数

nginx作为http服务器时:
max_clients = worker_processes * worker_connections

nginx作为反向代理服务器时:
max_clients = worker_processes * worker_connections / 2
因为nginx作为反向代理时需要与sever和客户端相连,同时消耗两个连接数。

3.开启文件高效传输模式

开启文件高效传输模式sendfile on,同时设置tcp_nopush 和tcp_nodelay 为on,可以防止网路和磁盘IO阻塞。这也是Nginx比Apache快的原因,避免应用层和内核层面的交互,也就是用户空间和内核空间的交互,因为数据传输都需要在内核空间和用户空间进行切换。
高级I/O函数之sendfile函数
七层负载均衡-nginx_第110张图片

Nginx比apache快的原因:
  Nginx比Apache快的原因1
  Nginx比Apache快的原因2

sendfile on;
tcp_nopush on; 
tcp_nodelay on;

4.nginx的loaction优先级匹配

location 匹配规则
location匹配优先级

location = /uri		=表示精准匹配,只有完全匹配上才生效
location  /uri		不带任何修饰符,也表示前缀匹配,但是在正则匹配之后
location  /			通用匹配,任何未匹配到其他location的请求都会匹配到
location  ^~ /uri	开头对URL路径进行前缀匹配,并且在正则之前,一旦匹配到最长匹配,则不再查找其他匹配
location ~	pattern	表示区分大小写的的正则匹配
location ~* pattern 表示不区分大小写的正则匹配,如果有多个location匹配,则选择匹配最长的的那个	

七层负载均衡-nginx_第111张图片

七、nginx的平滑升级

阿里的Tengine的内存热生效并没有分发出来,所谓热生效是指修改完配置文件后,不需要reload将配置文件加载到内存中。之所以需要内存热生效,是因为reload需要成本,reload就是把配置文件加载到内存中,消耗的时间很短,但还是有损耗,特别是当服务器的数量很多的时候。
七层负载均衡-nginx_第112张图片

七层负载均衡-nginx_第113张图片

七层负载均衡-nginx_第114张图片

1.下载新版nginx,并解压,并关闭编译的debug,不隐藏版本信息

不隐藏版本信息是为了看到效果
七层负载均衡-nginx_第115张图片
下载源安装包并解压

[root@server5 ~]# wget http://nginx.org/download/nginx-1.21.5.tar.gz
[root@server5 ~]# tar zxf nginx-1.21.5.tar.gz

七层负载均衡-nginx_第116张图片
修改配置,禁掉gcc在编译时的dubug,减小编译后产生的二进制可执行文件的大小
切记不禁用版本号,否则无法看出是否进行升级和回退

七层负载均衡-nginx_第117张图片

七层负载均衡-nginx_第118张图片

七层负载均衡-nginx_第119张图片

2.在解压目录下执行编译

只做make,不做make install

[root@server5 ~]# cd nginx-1.21.5
[root@server5 nginx-1.21.5]# ./configure --with-http_ssl_module --with-http_stub_status_module --prefix=/usr/local/nginx --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42

[root@server5 nginx-1.21.5]# make

七层负载均衡-nginx_第120张图片

七层负载均衡-nginx_第121张图片
七层负载均衡-nginx_第122张图片七层负载均衡-nginx_第123张图片

3.备份原程序,拷贝新程序

alias命令用于设置指令的别名

cp –i 若目标文件已存在,则会询问是否覆盖。语法格式 cp -i 源文件 目标文件

七层负载均衡-nginx_第124张图片

4.获取当前nginx主进程pid

七层负载均衡-nginx_第125张图片

5.唤醒新版本的二进制程序进程

[root@server5 sbin]# kill -USR2 3593

七层负载均衡-nginx_第126张图片
七层负载均衡-nginx_第127张图片

6.关闭原worker进程但保留主进程:为了回退

老版本的进程自动回收,新版本会自动接替。

[root@server5 sbin]# kill -WINCH 3593

平滑升级完成,正果过程服务没有关闭
七层负载均衡-nginx_第128张图片

7.版本回退

当升级完成之后,发现版本有问题时,可以回退。

还原老版本nginx程序
[root@server5 sbin]# cd /usr/local/nginx/sbin
[root@server5 sbin]# \cp -f nginx.old nginx

唤醒原进程
[root@server5 sbin]# kill -HUP 3593

回收新版本的worker进程
[root@server5 sbin]#  kill -WINCH 13249

关闭新版本主进程: kill -QUIT 13249

七层负载均衡-nginx_第129张图片
七层负载均衡-nginx_第130张图片

你可能感兴趣的:(Linux,nginx,负载均衡,bash)