目录
一、web服务介绍
1.1 Web 服务访问流程
1) 用户发起请
- 输入URL:用户在浏览器中输入目标网站的URL/点击链接。
- 请求构建:浏览器根据URL构建HTTP请求报文,包括请求行、请求头部等。
2) DNS解析
- 域名查询:浏览器首先通过DNS系统解析URL中的域名,将其转换为对应的IP地址。这一过程可能涉及递归和迭代查询。
- 地址获取:一旦获取到IP地址,浏览器就知道向哪个服务器发送请求。
3) TCP连接建立
- 三次握手:浏览器与Web服务器之间通过TCP协议建立连接。这一过程包括三次握手,确保双方建立起可靠的连接。
- 连接建立:一旦连接建立,浏览器就可以通过这条连接发送HTTP请求报文。
4) HTTP请求发送
- 发送请求:浏览器通过TCP连接将HTTP请求报文发送给Web服务器。
- 请求处理:Web服务器接收到请求后,根据请求的内容进行相应的处理。
5) 服务器处理请求
- 静态内容处理:如果请求的是静态内容,Web服务器直接从文件系统中读取这些内容。
- 动态内容处理:如果请求的是动态内容(如数据库查询结果、用户提交表单的响应等),Web服务器可能需要调用后端应用服务器来处理请求,并可能涉及到数据库的读写操作。
6) HTTP响应返回
- 生成响应:Web服务器或后端应用服务器处理完请求后,生成HTTP响应报文,包括响应行、响应头部和响应体。
- 发送响应:Web服务器通过TCP连接将HTTP响应报文发送给浏览器。
7) 浏览器解析和渲染
- 接收响应:浏览器接收到HTTP响应后,开始解析响应内容。
- 内容渲染:根据响应头部中的Content-Type判断响应内容的类型,并调用相应的解析器对内容进行解析和渲染。
- 页面显示:浏览器将解析和渲染后的页面内容显示给用户。
8) TCP连接关闭
四次挥手:页面加载完毕后,浏览器和Web服务器之间通过TCP四次挥手机制安全关闭连接。
1.2 Web 服务器类型
1) Apache
是世界上最流行的Web服务器之一,支持多种操作系统。
特点:Apache的源代码开放,有强大的开发团队支持,支持跨平台应用,可移植性好,且模块支持丰富。尽管在速度和性能上可能不及某些轻量级Web服务器,但其功能全面且稳定。
2) Nginx
一款高性能的HTTP和反向代理服务器,以其高并发处理能力和低资源消耗著称。
特点:Nginx能够处理高达5万个并发连接,同时保持低内存和CPU占用。它支持负载均衡、缓存、SSL/TLS加密和虚拟主机等功能,是许多大型网站的首选。
3) IIS
IIS是由微软开发的Web服务器,只能在Windows操作系统上运行。
特点:IIS与微软的其他产品集成良好,支持SSL/TLS加密和虚拟主机等功能。它使得在Windows平台上发布和管理Web应用程序变得简单。
4) Tomcat
一个开源的Java Web应用软件容器,用于运行Servlet和JSP Web应用程序。
特点:Tomcat基于Java,提供了对Java Web应用程序的完整支持。然而,它在处理静态文件和高并发请求时可能表现较弱。
1.3 Apache常用工作模式
1.3.1 Apache prefork 模型
Apache Prefork 模型是一种经典且稳定的多进程服务器模型,它通过预先生成子进程来准备处理客户端请求。
优点:先预派生一些子进程,然后等待连接;可以减少频繁创建和销毁进程的开销,每个子进程只有一个线程,在一个时间点内,只能处理一个请求不需要担心线程安全问题。
缺点:一个进程相对占用资源,消耗大量内存,不擅长处理高并发。
适用场景:
①Apache Prefork 模型适用于访问量不是很大的场景,或者对稳定性和可靠性有较高要求的场景。
②在高并发环境下,可能需要考虑使用更高效的模型(如 Worker 模型或 Event 模型)来优化性能。
1.3.2 Apache worker 模型
worker使用了多进程和多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。
1.3.3 Apache event 模型
与worker模式很像,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。
【补充】
主进程角色主要负责以下:
初始化与配置:主进程负责Apache服务器的启动和初始化工作,包括读取配置文件、设置监听端口、初始化必要的系统资源等。根据配置文件中的参数,主进程会创建指定数量的子进程,并为每个子进程分配固定数量的线程。
请求监听与分发:主进程或其中一个子进程中的监听线程负责监听来自客户端的请求。当请求到达时,监听线程会根据负载均衡策略将请求分发给可用的子进程中的线程进行处理。
监控与管理:主进程持续监控着子进程和线程的健康状况,包括运行状态、内存使用情况、处理请求的速度等。如果发现某个子进程或线程出现异常或崩溃,主进程会采取相应的恢复措施。
动态调整:主进程会根据服务器的负载情况动态地调整子进程和线程的数量。如果现有子进程和线程无法处理所有请求,主进程会启动新的子进程以增加处理能力。如果负载降低,主进程会减少不必要的子进程和线程以节省资源。
子进程角色主要负责以下:
请求处理:子进程中的线程负责实际处理客户端请求。每个线程在某个确定的时间只能维持一个连接,并处理该连接上的所有请求。
资源共享与隔离:子进程之间通过系统提供的机制进行资源共享和隔离。每个子进程都拥有独立的内存空间和其他系统资源,以确保它们之间的独立性。
稳定性与恢复:子进程在运行时可能遇到各种异常情况,如内存泄漏、死锁等。当主进程检测到某个子进程出现问题时,会尝试重启该子进程以恢复其正常功能。
二、Nginx 架构和安装
2.1 Nginx 编译安装示例
1)去官网下载所需源码包 .tar.gz,然后解压...
eg:tar zxf nginx-1.24.0.tar.gz
2)创建一个系统服务账户nginx,用于运行 Nginx。
useradd -s /sbin/nologin -M nginx
3)编译和安装 Nginx前,安装这些软件包。
dnf install gcc pcre-devel zlib-devel openssl-devel -y
3)配置Nginx的源代码安装过程中的 ./configure
脚本,它可以指定Nginx安装和编译时的多个选项。(根据需求指定选项)
[root@nginx-node1 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_gzip_static_module --with-http_stub_status_module --with-pcre --with-stream --with-stream_ssl_module
5)源代码编译安装软件包:
[root@nginx-node1 nginx-1.24.0]# make && make install
nginx完成安装以后,有四个主要的目录 :
## sbin:保存nginx二进制启动脚本,不同的参数以实现不同的功能。
6)(非必要)将Nginx的可执行文件目录(/usr/local/nginx/sbin
)添加到环境变量PATH
中:这样,我们可以在任何地方通过输入nginx的命令(nginx
、nginx -s reload
)来运行Nginx,而不需要完整的路径。
vim ~/.bash_profile'''export PATH=$PATH:/usr/local/nginx/sbin'''source ~/.bash_profile
最后可以通过 nginx -V 命令来验证版本及编译参数。
2.2 平滑升级和回滚示例
2.2.1 平滑升级
目的:在不中断服务的情况下,更新Nginx到新版本或应用新的配置。这样做可以确保在升级过程中,用户的访问不受影响,服务的稳定性和可用性得到保障。
tar zxf nginx-1.26.2.tar.gz
2、编译新版本的Nginx,但不要执行make install
命令,以避免覆盖原有的Nginx文件。
./configure --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_modulemake
# 把之前的旧版的 nginx 命令备份cd /usr/local/nginx/sbin/cp nginx nginx.old
# 把新版本的 nginx 命令复制过去\cp -f /root/nginx/nginx-1.26.2/objs/nginx /usr/local/nginx/sbin![]()
检测一下:
4、#USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的 nginx。
#此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80。
#此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进 程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。
kill -USR2 49723ps aux | grep nginx
已经有nginx服务在执行,直接nginx不能启动新的,使用kill -USR2才可以:
5、回收旧版本
kill -WINCH 49732ps aux | grep nginx
检测版本信息:变成了新版本的。
2.2.2 回滚
mv nginx.old nginxkill -HUP 49732kill -WINCH 49800![]()
![](https://i-blog.csdnimg.cn/direct/b89178a11a6544a6bf7d61f9d15d3ebd.png)
2.3 Nginx 配置文件
nginx.conf(主配置文件)是Nginx 的核心配置文件,包含了全局配置、事件配置、http 配置……这个文件是 Nginx 启动时读取的主要文件,用于设置 Nginx 的工作特性,如工作进程数、日志路径、HTTP 服务器配置等。
mime.types(MIME 类型文件)文件定义了 HTTP 响应中 Content-Type
字段与文件扩展名之间的映射关系。Nginx 使用这个文件来确定当文件被请求时应该使用哪种 MIME 类型来响应。
fastcgi.conf、fastcgi_params(FastCGI 相关配置)这些文件包含了与 FastCGI 服务器交互时所需的参数。Nginx 可以通过 FastCGI 与多种后端应用通信。fastcgi.conf
可能包含一些特定于 FastCGI 的指令,而 fastcgi_params
则包含传递给 FastCGI 服务器的参数列表。
proxy.conf、proxy_params(Proxy 相关配置)这些文件定义了 Nginx 作为反向代理服务器时的行为。它们包含了与代理功能相关的指令和参数,如负载均衡设置、代理头部传递等。
站点特定配置文件:比如 sites-available/
和 sites-enabled/
目录下的文件。——Nginx 通常使用 sites-available/
和 sites-enabled/
目录来管理站点特定的配置。sites-available/
目录包含所有可用的站点配置文件,而 sites-enabled/
目录则包含实际启用的站点配置文件的符号链接。
三、案例
3.1 示例:nginx的用户认证
1、创建日志目录
2、
#设置网页:在
/data/web/
目录下创建了一个名为folian
的目录,然后在该目录下创建一个名为index.html
的文件,并向该文件写入folian
。[root@nginx-node1 ~]# mkdir /data/web/folian
[root@nginx-node1 ~]# echo folian > /data/web/folian/index.html
[root@nginx-node1 ~]# vim /usr/local/nginx/conf.d/vhost.conf
[root@nginx-node1 ~]# nginx -s reload #重启生效
3、设置不是谁都能访问:即用户认证;访问者需要通过认证才能看到内容。
关键参数:
auth_basic "login password !!";
auth_basic_user_file "/usr/local/nginx/.htpassword";
实现!!
3.2 示例:nginx中的文件检测
创建目录:
编辑配置文件:
测试:
3.3 示例:nginx长链接控制
下载测试工具:dnf install telnet -y
通过修改长连接请求次数:可以?
keepalive_timeout #长链接等待时间,即没有数据传输的时间。
keepalive_timeout 65 60; 当等待时间有两个参数时:真正保持时间65、 客户看到时间60。
测试看看:
如果不设置那个(客户看到时间)值:则看到的是keep-alive。
3.4 示例:nginx下载服务器
mkdir -p /webdata/nginx/folian.org/folian/downloadcp /root/anaconda-ks.cfg/webdata/nginx/folian.org/folian/downloadvim /usr/local/nginx/conf.d/vhosts.conf
![](https://i-blog.csdnimg.cn/direct/280e2dbfe02d4ecbb1eb16291d507e3e.png)
![](https://i-blog.csdnimg.cn/direct/f8b6ab947a664ff68f21f59da1f34b9f.png)
3.5 nginx的压缩功能
vim /usr/local/nginx/conf/nginx.confgzip on; #启用 gzip 压缩gzip_comp_level 5;gzip_min_length 1k;……
![](https://i-blog.csdnimg.cn/direct/c6125a86e35f4cf58ac5927a89e40729.png)
![](https://i-blog.csdnimg.cn/direct/9d3691a696b549aca54edfdaae1cd7cf.png)
![](https://i-blog.csdnimg.cn/direct/1680912e8ab14f8b9d7e81233838faf6.png)
![](https://i-blog.csdnimg.cn/direct/e55b319aa27f418e8a02070dd2005aac.png)
![](https://i-blog.csdnimg.cn/direct/e9f94c3519594a00a6a2c373014c8e44.png)
3.6 nginx的反向代理负载均衡
环境:启动两台虚拟机作为后端服务器(web1-172.25.254.10 web2-172.25.254.20);nginx(172.25.254.100)作为代理服务器。
[root@web1 ~]# yum install httpd -y[root@web1 ~]# echo "web1 172.25.254.10" > /var/www/html/index.html[root@web1 ~]# systemctl enable --now httpd[root@web2 ~]# yum install httpd -y[root@web2 ~]# echo "web2 172.25.254.20" > /var/www/html/index.html[root@web2 ~]# systemctl enable --now httpd
[root@localhost ~]# curl http://172.25.254.10web1 172.25.254.10[root@localhost ~]# curl http://172.25.254.20web2 172.25.254.20
vim /apps/nginx/conf/conf.d/pc.confupstream webserver {server 172.25.254.10:80 weight=1 fail_timeout=15s max_fails=3;server 172.25.254.20:80 weight=1 fail_timeout=15s max_fails=3;}server {listen 80;server_name www.folian.org;location ~ / {proxy_pass http://webserver;}}
[root@localhost ~]# curl www.folian.org172.25.254.10 web[root@localhost ~]# curl www.folian.org172.25.254.20 web
[root@localhost ~]# while true;docurl http://www.folian.org;sleep 2;done
3.7 nginx和php的整合
yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libcurl-develyum install libpng-devel.x86_64
wget https://mirrors.aliyun.com/rockylinux/9.4/devel/x86_64/kickstart/Packages/o/oniguruma-devel-6.9.6-1.el9.5.x86_64.rpm
dnf install -y oniguruma-devel-6.9.6-1.el9.5.x86_64.rpm
./configure --prefix=/usr/local/php --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
make && make install
[root@nginx-node1 ~]# cd /usr/local/php/etc/
[root@nginx-node1 etc]# ls
php-fpm.conf.default php-fpm.d
[root@nginx-node1 etc]# cp php-fpm.conf.default php-fpm.conf[root@nginx-node1 etc]# vim php-fpm.conf去掉注释 :pid = run/php-fpm.pid #指定 pid 文件存放位置
[root@nginx-node1 etc]# cd php-fpm.d/
[root@nginx-node1 php-fpm.d]# cp www.conf.default www.conf
[root@nginx-node1 php-fpm.d]# cd /root/php-8.3.9/
[root@nginx-node1 php-8.3.9]#
[root@nginx-node1 php-8.3.9]# cp php.ini-production /usr/local/php/etc/php.ini
[root@nginx-node1 php-8.3.9]# cd
[root@nginx-node1 ~]# vim /usr/local/php/etc/php.ini
date.timezone = Asia/Shanghai # 修改时区![]()
[root@nginx-node1 ~]# cd /usr/local/php/etc/php-fpm.d/
[root@nginx-node1 etc]# vim php.ini![]()
[root@nginx-node1 ~]# cd php-8.3.9/
[root@nginx-node1 php-8.3.9]# cp sapi/fpm/php-fpm.service /lib/systemd/
[root@nginx-node1 php-8.3.9]# vim /lib/systemd/php-fpm.service# Mounts the /usr, /boot, and /etc directories read-only for processes invoked bythis unit.#ProtectSystem=full # 注释该内容
[root@nginx-node1 php-8.3.9]# systemctl start php-fpm.service[root@nginx-node1 php-8.3.9]# netstat -antlupe | grep php
[root@nginx-node1 ~]# mkdir -p /data/php
[root@nginx-node1 ~]# vim /data/php/index.php
[root@nginx-node1 ~]# cat /data/php/index.php
<?php
phpinfo();
?>
[root@nginx-node1 ~]# yum install memcached -y
[root@nginx-node1 ~]# systemctl enable --now memcached
![](https://i-blog.csdnimg.cn/direct/9571ee76286a4f14894800012fc0d19a.png)