企业高性能web服务器

目录

一、web服务介绍

1.1 Web 服务访问流程

1.2 Web 服务器类型

1.3 Apache常用工作模式

1.3.1 Apache prefork 模型

1.3.2 Apache worker 模型

1.3.3 Apache event 模型

【补充】

子进程角色主要负责以下:

二、Nginx 架构和安装

2.1 Nginx 编译安装示例

2.2 平滑升级和回滚示例

2.2.1 平滑升级

 2.2.2 回滚

2.3 Nginx 配置文件

三、案例

3.1 示例:nginx的用户认证

 3.2 示例:nginx中的文件检测

3.3 示例:nginx长链接控制

3.4 示例:nginx下载服务器

3.5 nginx的压缩功能

3.6 nginx的反向代理负载均衡

3.7 nginx和php的整合


一、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 服务器类型

Web服务器是使用HTTP和其他协议 来响应 通过万维网发出的 客户端请求 的 软件和硬件。

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完成安装以后,有四个主要的目录

## conf :保存 nginx 所有的配置文件,其中 nginx.conf nginx 服务器的最核心的配置文件,其他的.conf 则是用来配置 nginx 相关的功能的。

## sbin:保存nginx二进制启动脚本,不同的参数以实现不同的功能。

6)(非必要)将Nginx的可执行文件目录(/usr/local/nginx/sbin)添加到环境变量PATH中:这样,我们可以在任何地方通过输入nginx的命令(nginxnginx -s reload)来运行Nginx,而不需要完整的路径。

vim ~/.bash_profile
'''
        export PATH=$PATH:/usr/local/nginx/sbin
'''
source ~/.bash_profile

最后可以通过 nginx -V 命令来验证版本及编译参数。

2.2 平滑升级和回滚示例

2.2.1 平滑升级

目的:在不中断服务的情况下,更新Nginx到新版本或应用新的配置。这样做可以确保在升级过程中,用户的访问不受影响,服务的稳定性和可用性得到保障。

1、从官网下载并解压一个新版的源码包 :
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_module
make
3、
# 把之前的旧版的 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 49723
ps aux | grep nginx

 已经有nginx服务在执行,直接nginx不能启动新的,使用kill -USR2才可以:

5、回收旧版本

kill -WINCH 49732
ps aux | grep nginx

检测版本信息:变成了新版本的。

 2.2.2 回滚

如果升级的版本发现问题需要回滚, 可以重新拉起旧版本的 worker。
mv nginx.old nginx
kill -HUP 49732
kill -WINCH 49800
检测一下:

2.3 Nginx 配置文件

nginx.conf主配置文件)是Nginx 的核心配置文件,包含了全局配置、事件配置、http 配置……这个文件是 Nginx 启动时读取的主要文件,用于设置 Nginx 的工作特性,如工作进程数、日志路径、HTTP 服务器配置等。

mime.typesMIME 类型文件)文件定义了 HTTP 响应中 Content-Type 字段与文件扩展名之间的映射关系。Nginx 使用这个文件来确定当文件被请求时应该使用哪种 MIME 类型来响应。

fastcgi.conffastcgi_paramsFastCGI 相关配置)这些文件包含了与 FastCGI 服务器交互时所需的参数。Nginx 可以通过 FastCGI 与多种后端应用通信。fastcgi.conf 可能包含一些特定于 FastCGI 的指令,而 fastcgi_params 则包含传递给 FastCGI 服务器的参数列表。

proxy.confproxy_paramsProxy 相关配置)这些文件定义了 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下载服务器

#ps: download 不需要  index.html  文件
mkdir -p /webdata/nginx/folian.org/folian/download
cp /root/anaconda-ks.cfg
/webdata/nginx/folian.org/folian/download
vim /usr/local/nginx/conf.d/vhosts.conf
重启Nginx并访问测试下载页面

3.5 nginx的压缩功能

Nginx 支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文件大小将比源文件显著变小,样有助于降低出口带宽的利用率,降低企业的IT 支出,不过会占用相应的CPU 资源。Nginx对文件的压缩功能是依赖于模块 ngx_http_gzip_module, 默认是内置模块。
# 启用或禁用 gzip 压缩,默认是关闭的
 vim /usr/local/nginx/conf/nginx.conf
gzip on;   #启用 gzip 压缩
gzip_comp_level 5;
gzip_min_length 1k;
……
# 重启 Nginx 并访问测试:
#输入 测试字符 到页面,测试 小于 1k 的文件是否会压缩:

3.6 nginx的反向代理负载均衡

环境:启动两台虚拟机作为后端服务器(web1-172.25.254.10 web2-172.25.254.20);nginx(172.25.254.100)作为代理服务器。

部署后端 Apache 服务器:
[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.10
web1 172.25.254.10
[root@localhost ~]# curl http://172.25.254.20
web2 172.25.254.20
配置 nginx 反向代理:
注意 : 实验过程中先关闭缓存
vim  /apps/nginx/conf/conf.d/pc.conf
upstream 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;
        }
}
#重启Nginx 并访问测试
[root@localhost ~]#  curl www.folian.org
172.25.254.10 web
[root@localhost ~]#  curl www.folian.org
172.25.254.20 web
#关闭172.25.254.20172.25.254.30,测试nginx backup服务器可用性:
[root@localhost ~]# while true;do
curl http://www.folian.org;sleep 2;done

3.7 nginx和php的整合

源码编译 php:
yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libcurl-devel 
yum 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
php 相关配置优化:
[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 # 修改时区
配置php加载memcache模块:
[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 by
this 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
*********
准备 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();
?>
部署:memecached
[root@nginx-node1 ~]# yum install memcached -y
[root@nginx-node1 ~]# systemctl enable --now memcached
访问web测试:
  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值