文章目录
文章相关连接如下:
- 如果想更多了解nginx,请点击:企业高性能web服务器之nginx篇
- 想看看I/O模型的小伙伴请走这:I/O模型
Web 服务基础介绍
Apache
Apache prefork 模型
- 预派生模式,有一个主控制进程,然后生成多个子进程,使用select模型,最大并发1024
- 每个子进程有一个独立的线程响应用户请求
- 相对比较占用内存,但是比较稳定,进程之间不会有影响,可以设置最大和最小进程数
- 是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
优点:稳定
缺点:每个用户请求需要对应开启一个进程,占用资源较多,并发性差,不适用于高并发场景
Apache worker 模型
- 一种多进程和多线程混合的模型
- 有一个控制进程,启动多个子进程
- 每个子进程里面包含固定的线程
- 使用线程来处理请求
- 当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,
- 由于其使用了线程处理请求,因此可以承受更高的并发
优点:相比prefork 占用的内存较少,可以同时处理更多的请求
缺点:使用keepalive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用(该问题在prefork模式下,同样会发生)
Apache event模型
- Apache中最新的模式,2012年发布的apache 2.4.X系列正式支持event 模型,属于事件驱动模型(epoll)
- 每个进程响应多个请求,在现在版本里的已经是稳定可用的模式
- 它和worker模式很像,最大的区别在于,它解决了keepalive场景下长期被占用的线程的资源浪费问题(某些线程因为被keepalive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)
- event MPM中,会有一个专门的线程来管理这些keepalive类型的线程
- 当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场
景下的请求处理能力
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keepalive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
缺点:没有线程安全控制
Nginx-高性能的 Web 服务端
Nginx的工作场景:
nginx源码安装
#官方源码包下载地址
https://nginx.org/en/download.html
准备编译环境:
[root@server9 ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y
[root@server9 ~]# cd nginx-1.24.0/
[root@server9 nginx-1.24.0]#useradd -s /sbin/nologin -M nginx
[root@server9 nginx-1.24.0]# ls
[root@server9 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
检测没问题后,开始安装
[root@server9 nginx-1.24.0]# make && make install
nginx完成安装以后,有四个主要的目录
验证版本及编译参数
[root@server9 nginx-1.24.0]# vim ~/.bash_profile
[root@server9 nginx-1.24.0]# source ~/.bash_profile
[root@server9 nginx-1.24.0]# nginx -v
本地环境变量
启动nginx验证:
[root@server9 nginx-1.24.0]# nginx
[root@server9 nginx-1.24.0]# curl 172.25.254.100
[root@server9 local]# ps aux | grep nginx
平滑升级和回滚
平滑升级:
有时候我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级
平滑升级流程:
平滑升级步骤:
[root@server9 ~]# tar zxf nginx-1.26.1.tar.gz
[root@server9 ~]# cd nginx-1.26.1/
# 编译新版本
[root@server9 nginx-1.26.1]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/echo-nginx-module-0.63 --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
只要make无需要make install
[root@server9 nginx-1.26.1]# make
查看两个nginx版本
[root@server9 nginx-1.26.1]# ll objs/nginx /usr/local/nginx/sbin/nginx
把之前的旧版的nginx命令备份
[root@server9 ~]# cd /usr/local/nginx/sbin/
[root@Nginx sbin]# cp nginx nginx.24
把新版本的nginx命令复制过去
[root@Nginx sbin]# \cp -f /root/nginx/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin
检测
[root@Nginx sbin]# nginx -t
查看版本依然是旧版本生效
回收旧版本
[root@server9 sbin]# kill -WINCH 36838
[root@server9 sbin]# ps aux |grep nginx
[root@Nginx sbin]# curl -I localhost
回滚步骤
如果升级的版本发现问题需要回滚,可以重新拉起旧版本的worker
#先备份
[root@Nginx sbin]# cp nginx nginx.26
[root@Nginx sbin]# ls
[root@Nginx sbin]# mv nginx.24 nginx
[root@Nginx sbin]# kill -HUP 20896
[root@Nginx sbin]# kill -WINCH 24242
[root@Nginx sbin]# curl -I localhost
nginx启动文件
[root@Nginx logs]# vim /lib/systemd/system/nginx.service
[root@Nginx logs]# systemctl daemon-reload
[root@Nginx logs]# systemctl start nginx.service
[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf
[root@Nginx ~]# mkdir -p /usr/local/nginx/conf.d
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
[root@Nginx ~]# systemctl restart nginx.service