描述:
单次Web访问流程是一个从用户输入URL开始,经过DNS解析、TCP连接建立、HTTP请求与响应、浏览器解析与渲染,最后断开TCP连接的完整过程。这个过程中涉及多个协议和技术的协同工作,确保了Web服务的可靠性和高效性。
一、定义与特点
高性能Web服务器是指能够处理大量并发请求、提供快速响应速度,并在高负载下保持稳定的Web服务器。它们通常具备以下特点:
- 高并发处理能力:能够同时处理成千上万的并发连接,确保在高流量情况下依然能够稳定运行。
- 低延迟响应:通过优化处理流程和缓存机制,减少用户请求的响应时间。
- 高可靠性:具备强大的容错和恢复能力,能够在硬件或软件故障时自动切换或恢复服务。
- 可扩展性:支持模块化设计,易于通过添加新模块或升级硬件来扩展服务器性能。
- 资源利用率高:在提供高性能服务的同时,能够合理利用系统资源,降低运营成本。
二、常见的高性能Web服务器
- Nginx
- 概述:Nginx是一款开源的高性能HTTP和反向代理服务器,以其高并发、低内存消耗和可扩展性著称。
- 特点:支持异步非阻塞处理机制,能够处理数十万甚至上百万的并发连接;模块化设计,易于扩展;支持反向代理、负载均衡和HTTP缓存等功能。
- 应用场景:广泛应用于Web服务、反向代理、负载均衡、静态文件处理以及SSL/TLS加密等方面。
- Apache
- 概述:Apache是世界上最流行的Web服务器之一,以其稳定性和丰富的功能集而闻名。
- 特点:支持多种操作系统和平台;模块化设计,支持多种扩展模块;具备强大的安全机制和日志记录功能。
- 应用场景:适用于需要高稳定性和丰富功能的Web应用场景。
- Lighttpd
- 概述:Lighttpd是一款轻量级的Web服务器,以其高性能和低资源消耗为特点。
- 特点:采用事件驱动和异步非阻塞I/O模型,能够处理大量并发连接;支持FastCGI、SCGI等多种后端接口;配置简单灵活。
- 应用场景:适用于对性能要求较高且资源有限的环境。
三、关键技术与应用场景
-
异步非阻塞处理机制:通过异步非阻塞的方式处理用户请求,可以显著提高服务器的并发处理能力。Nginx和Lighttpd等服务器均采用了这种机制。
-
负载均衡:通过负载均衡技术,将用户请求分发到多个后端服务器上进行处理,以提高系统的整体性能和可靠性。Nginx等服务器支持多种负载均衡算法和策略。
-
HTTP缓存:通过缓存经常访问的静态资源,可以减少对后端服务器的请求次数,提高访问速度。Nginx等服务器内置了强大的缓存机制。
-
SSL/TLS加密:提供安全的HTTPS访问服务,保护用户数据在传输过程中的安全。Nginx等服务器支持SSL/TLS加密协议。
四、未来发展趋势
随着云计算、大数据和人工智能等技术的不断发展,高性能Web服务器将面临更多的挑战和机遇。未来,高性能Web服务器将更加注重以下几个方面的发展:
- 云原生支持:与云计算平台深度融合,提供更加灵活和高效的部署和管理方式。
- 智能化运维:通过AI和机器学习技术实现自动化运维和故障预测,降低运维成本和提高系统稳定性。
- 安全性增强:加强安全机制建设,应对日益复杂的网络攻击和威胁。
- 绿色节能:采用更加环保的硬件和节能技术,降低服务器的能耗和碳排放。
实验--nginx源码编译:
实验工具:rhel9(nginx):172.25.254.100
nginx:
使用脚本修改IP:
vmset.sh ens160 172.25.54.100 nginx.node1.timinglee.org
下载nginx:
nginx: download【选择pgp的】
eget https://nginx.org/download/nginx-1.24.0.tar.gz
解压缩:
tar zxf nginx-1.24.0.tar.gz
进入nginx目录:
cd nginx-1.24.0/
【configure:用于检测环境是否缺损】
使用configure检测系统目前是否适合这些操作:
./configure --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-http_ssl_module \
> --with-http_v2_module \
> --with-http_realip_module \
> --with-http_gzip_static_module \
> --with-http_stub_status_module \
> --with-pcre \
> --with-stream \
> --with-stream_ssl_module
结果不适合:
意思是没有C语言编译器
下载C语言编译器:
dnf install gcc -y
再次检测:
下载:
dnf install pcre-devel.x86_64 -y
检测:
查找:
dnf search openssl
下载:
dnf install openssl-devel.x86_64 -y
检测:
下载:
dnf install zlib-devel -y
检测全过产生make规则:
重新检测步骤:
make clean
目录文件还原:
重新检测:
【产生makefile和objs,检测成功】
项目构建:
make -j2
进入文件查看:
cd objs/
【nginx绿色的是启动程序,src是插件】
拷贝objs程序到系统目录:
make install
查看拷贝是否成功:
启用脚本:
/usr/local/nginx/sbin/nginx
【缺少nginx 用户】
创建nginnx用户:
useradd -s /sbin/nologin -M nginx
启动nginx,并查看nginx的进程:
./nginx
ps aux | grep nginx
【一个管理进程,一个工作进程】
查看端口:
netstat -antlupe | grep nginx
检测:
查看nginx文件大小:
关闭nginx的debug模式:
/usr/local/nginx/sbin/nginx -s stop
查看端口:
删除原来编译的东西:
关闭debug:
vim auto/cc/gcc
重新执行一下,查看关闭结果:
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_gzip_static_module --with-http_stub_status_module --with-pcre --with-stream --with-stream_ssl_module
make && make install
编译环境变量基本文件(将nginx软件的命令执行路径添加到环境变量里):
vim ~/.bash_profile
开始直接使用:
source ~/.bash_profile
启动nginx:
nginx
进入浏览器:
nginx平滑升级及版本回滚:
平滑升级:
下载最新版本nginx:
wget https://nginx.org/download/nginx-1.26.2.tar.gz
【新版本没有echo模块,需要自己下载】
解压:
tar zxf echo-nginx-module-0.63.tar.gz
tar zxf nginx-1.26.2.tar.gz
检测新版本:
cd nginx-1.26.2/
./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_gzip_static_module --with-http_stub_status_module --with-pcre --with-stream --with-stream_ssl_module
make
备份nginx:
cd /usr/local/nginx/sbin/
ls
\cp -f /root/nginx-1.26.2/objs/nginx /usr/local/nginx/sbin/nginx
查看新旧进程:
启动旧的:
启动新的:
cd sbin/
ls
cp nginx nginx.24
\cp -f /root/nginx-1.26.2/objs/nginx /usr/local/nginx/sbin/
date
ll
ps axu | grep nginx
pidof nginx
kill -USR2 55131
ps axu | grep nginx
回收旧的worker:
再开一个窗口, 写一个死循环,验证没有断过:
where true
do
curl 172.25.254.100;sleep 1
done
kill -WINCH 55131
ps axu | grep nginx
【主进程的worker消失】
旧的1.24的:
平滑升级到最新版1.26:
版本的回滚:
打开旧的:
kill -HUP 55131
回收新的:
kill -WINCH 55195
查看当前版本:
除去新的:
cd sbin
ls
cp nginx nginx.new
[root@nginx sbin]# \cp -f nginx.24 nginx
[root@nginx sbin]# ls
kill -9 55195
[注意隐藏版本信息的方法:
]
nginx的IO调用及优化原理:
服务端IO:
磁盘IO:
网络IO模型:
网络I/O模型主要包括阻塞型(Blocking I/O)、非阻塞型(Non-blocking I/O)、复用型(I/O Multiplexing)、信号驱动型(Signal-driven I/O)和异步型(Asynchronous I/O)五种。下面分别对这五种模型进行详细解释:
1. 阻塞型I/O(Blocking I/O)
特点:
- 在I/O操作的两个阶段(等待数据准备好和将数据从内核拷贝到用户空间),用户线程都会被阻塞。
- 线程在等待数据到达时不能执行其他任务,导致CPU资源利用率低。
优点:
- 程序简单,容易实现。
- 在阻塞等待数据期间,进程/线程挂起,基本不占用CPU资源。
缺点:
- 每个连接需要独立的进程/线程单独处理,当并发请求量大时,内存和线程切换开销大。
- 扩展性差,不适合处理大量并发连接。
2. 非阻塞型I/O(Non-blocking I/O)
特点:
- 用户线程发起I/O请求时立即返回,但并未读取到数据。
- 用户线程需要不断发起I/O请求,直到数据到达后,才真正读取到数据,即“轮询”机制。
优点:
- 可以在等待数据期间执行其他任务,提高CPU利用率。
缺点:
- 需要不断轮询,耗费大量CPU时间。
- 轮询时间难以把握,可能导致程序响应延迟或CPU资源浪费。
3. 复用型I/O(I/O Multiplexing)
特点:
- 通过select、poll、epoll等系统调用,一个线程可以同时监控和处理多个文件描述符对应的I/O。
- 线程在select或poll调用上阻塞,但可以同时处理多个I/O请求。
优点:
- 可以基于一个阻塞对象,同时在多个描述符上等待就绪,节省系统资源。
- 适用于处理大量并发连接。
缺点:
- 当连接数较少时,效率可能低于多线程+阻塞I/O模型。
- 每个I/O请求的过程在select或poll调用上仍然是阻塞的。
4. 信号驱动型I/O(Signal-driven I/O)
特点:
- 通过sigaction系统调用注册一个信号处理函数,当I/O操作准备就绪时,内核会发送一个信号(如SIGIO)通知进程。
- 进程在接收到信号后,调用相应的信号处理函数来处理I/O。
优点:
- 等待数据期间进程不会被阻塞,可以继续执行其他任务。
- 适用于需要高效处理多个并发连接且对延迟要求不高的场景。
缺点:
- 信号处理函数的执行可能会受到系统对信号处理函数的限制。
- 在某些情况下,信号处理函数的执行可能不如直接调用I/O操作高效。
5. 异步I/O(Asynchronous I/O)
特点:
- 用户线程发起I/O请求后,立即返回继续执行后续操作。
- 当I/O操作完成时,系统通过回调或通知机制告知用户线程。
优点:
- 可以在等待I/O操作完成期间执行其他任务,提高CPU利用率。
- 适用于需要高并发、低延迟的场景。
缺点:
- 实现相对复杂,需要处理回调或通知机制。
- 在某些情况下,可能需要额外的系统资源来支持异步操作。
nginx命令常用参数:
1. 启动Nginx
- 默认启动:直接使用
nginx
命令启动Nginx,此时Nginx会使用默认的配置文件(通常是/usr/local/nginx/conf/nginx.conf
或/etc/nginx/nginx.conf
,具体取决于Nginx的安装方式和配置)。 - 指定配置文件启动:使用
-c
参数指定Nginx的配置文件,例如nginx -c /path/to/nginx.conf
。 - 指定运行目录启动:结合
-p
参数和-c
参数,可以指定Nginx的运行目录和配置文件,例如nginx -p /home/nginx -c /home/nginx/conf/nginx.conf
。
2. 关闭Nginx
- 快速关闭:使用
-s stop
参数向Nginx主进程发送SIGTERM信号,快速关闭Nginx。这可能会导致正在处理的请求被中断。 - 优雅关闭:使用
-s quit
参数向Nginx主进程发送SIGQUIT信号,Nginx会等待工作进程完成当前请求后再退出。这是一种更安全的关闭方式。 - 直接杀死进程:不推荐使用
kill
命令直接杀死Nginx进程,因为这可能会导致数据丢失或其他不可预见的问题。但如果确实需要这样做,可以使用kill -9 nginx_pid
(其中nginx_pid
是Nginx主进程的PID)。
3. 重新加载配置文件
- 重新加载:使用
-s reload
参数向Nginx主进程发送SIGHUP信号,Nginx会重新加载配置文件,并应用新的配置。这是一种无需重启Nginx即可更新配置的方法。
4. 测试配置
- 测试配置:使用
-t
参数测试Nginx配置文件的语法是否正确。如果配置文件存在语法错误,Nginx会输出错误信息。如果配置文件语法正确,Nginx会输出一条确认消息。 - 详细测试配置:使用
-T
参数不仅可以测试配置文件的语法,还会将配置文件的完整内容输出到标准输出(通常是终端或控制台)。
5. 显示版本信息
- 显示版本:使用
-v
参数显示Nginx的版本号。 - 显示详细版本信息:使用
-V
参数显示Nginx的详细版本信息,包括编译器版本和配置参数。
6. 其他参数
- 设置全局指令:使用
-g
参数可以在命令行中设置全局指令,这些指令将覆盖配置文件中的相应指令。 - 指定前缀路径:使用
-p
参数可以指定Nginx的前缀路径,即Nginx的根目录。
示例
- 启动Nginx:
nginx
- 指定配置文件启动Nginx:
nginx -c /path/to/nginx.conf
- 测试Nginx配置文件:
nginx -t
- 重新加载Nginx配置:
nginx -s reload
- 显示Nginx版本信息:
nginx -v
或nginx -V
nginx启动脚本编写: