Nginx 和 Tomcat --企业高并发应用的杀手锏
1.什么是 Nginx?它为解决什么而生?
- 静态的web资源服务器HTML,图片,js,CSS,txt等静态资源
- http/https协议的反向代理
- 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
- tcp/udp协议的请求转发(反向代理)
- imap4/pop3协议的反向代理
- 模块化设计,较好的扩展性
- 高可靠性
- 支持热部署:不停机更新配置文件,升级版本,更换日志文件
- 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
- event-driven,aio,mmap,sendfile
Web 服务相关的功能
- 虚拟主机(server)
- 支持 keep-alive 和管道连接(利用一个连接做多次请求)
- 访问日志(支持基于日志缓冲提高其性能)
- url rewirte路径别名
- 基于IP及用户的访问控制
- 支持速率限制及并发数限制
- 重新配置和在线升级而无须中断客户的工作进程
Nginx架构和进程

- 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件 驱动机制 、进程管理等核心功能
- 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应 头设置 等等
- 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
- 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的 支持
- Stream服务模块: 实现反向代理功能,包括TCP协议代理
- 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支 持等
1.1Nginx的源码安装
下载wget https://nginx.org/download/nginx-1.28.1.tar.gz

安装依赖

编译

1.2编写启动文件
为了方便控制nginx服务设定启动脚本 便于操作可以用systemctl控制
vim /lib/systemd/system/nginx.service


编写好配置文件后记得daemon重载
验证

设置开启自启
systemctl enable --now nginx
重启虚拟机
查看

2.1Nginx的平滑升级及回滚
下载高版本的软件
wget https://nginx.org/download/nginx-1.29.4.tar.gz

编译nginx隐藏版本

文件编辑完成后进行源码编译即可
2.2对于新版本的软件进行源码编译并进行平滑升级
检测

编译但不用安装
程序的主体


备份

替换为新版本





检测

回收旧版本的子进程

2.3.版本回退|版本回滚
备份新的版本

替换为老版本并唤醒老版本的进程

检测

回收新版本的进程

3.1 I/O 模型
1I/O 模型相关概念
同步/异步:关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。
同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事
情是否处理完成
异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态

阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂
起,干不了别的事情。
非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完
成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情

3.2网络 I/O 模型
阻塞型 I/O 模型(blocking IO)

- 阻塞IO模型是最简单的I/O模型,用户线程在内核进行IO操作时被阻塞
- 用户线程通过系统调用read发起I/O读操作,由用户空间转到内核空间。内核等到数据包到达后,然 后将接收的数据拷贝到用户空间,完成read操作
- 用户需要等待read将数据读取到buffer后,才继续处理接收的数据。整个I/O请求的过程中,用户线 程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够
优点:程序简单,在阻塞等待数据期间进程/线程挂起,基本不会占用 CPU 资源
缺点:每个连接需要独立的进程/线程单独处理,当并发请求量大时为了维护程序,内存、线程切换开销 较apache 的preforck使用的是这种模式。
同步阻塞:程序向内核发送I/O请求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回,则进 程将一直等待并不再接受新的请求,并由进程轮询查看I/O是否完成,完成后进程将I/O结果返回给 Client,在IO没有返回期间进程不能接受其他客户的请求,而且是有进程自己去查看I/O是否完成,这种 方式简单,但是比较慢,用的比较少。
非阻塞型 I/O 模型 (nonblocking IO)

用户线程发起IO请求时立即返回。但并未读取到任何数据,用户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,继续执行。即 “轮询”机制存在两个问题:如果有大量文件描述符都要等,那么就得一个一个的read。这会带来大量的Context Switch(read是系统调用,每调用一次就得在用户态和核心态切换一次)。轮询的时间不好把握。这里是要猜多久之后数据才能到。等待时间设的太长,程序响应延迟就过大;设的太短,就会造成过于频繁的重试,干耗CPU而已,是比较浪费CPU的方式,一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一性。
是由内核通知用户进程I/O操作何时完成,两者有本质区别,相当于不用去饭店场吃饭,直接点个外卖,把等待上菜的时间也给省了相对于同步I/O,异步I/O不是顺序执行。用户进程进行aio_read系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情。等到socket数据准备好了,内核直接复制数据给进程,然后从内核向进程发送通知。IO两个阶段,进程都是非阻塞的。信号驱动IO当内核通知触发信号处理程序时,信号处理程序还需要阻塞在从内核空间缓冲区拷贝数据到用户空间缓冲区这个阶段,而异步IO直接是在第二个阶段完成后,内核直接通知用户线程可以进行后续操作了
4.1Nginx下构建PC站点
基于不同的IP、不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块
ngx_http_core_module实现。
配置子配置文件


建立pc站点


编写域名信息


测试

local示例


location中的alias
配置子配置文件

测试
5KeepAlived长链接优化
5.1设定长链接时间

在telent工具的帮助下5秒后会断开访问链接

5.2设定长链接次数


6服务访问的用户认证
创建用户认证

编写配置文件

测试

![]()
7自定义错误页面
默认错误页面

编写自定义文件

测试

8.自定义错误日志

测试

9自定义下载服务器
创建实验素材

编写自定义文件

解析
打开记事本


解析成功

测试
服务器拒绝访问
编写自定义文件
启用列表功能


下载控速
没控速之前下载速度过快对服务器消耗过大


控速后速度明显变慢,让服务器压力小
10.检测文件是否存在

- Active connections: 当前处于活动状态的客户端连接数 包括连接等待空闲连接数=reading+writing+waiting
- accepts:统计总值,Nginx自启动后已经接受的客户端请求连接的总数。
- handled: 统计总值,Nginx自启动后已经处理完成的客户端请求连接总数通常等于accepts,除非有因worker_connections限制等被拒绝的连接
- requests: 统计总值,Nginx自启动后客户端发来的总的请求数
- Reading: 当前状态,正在读取客户端请求报文首部的连接的连接数数值越大,说明排队现象严重,性能不足
2.什么是 Tomcat?它与 Nginx 有何csc's
更多推荐




所有评论(0)