云原生之高性能web服务器学习(持续更新中)

1 Web服务器的基础介绍

  • 这是一张正常情况下单次web服务的访问流程
    这是一张正常情况下单次web服务的访问流程

1.1 Web服务介绍

现有流行的Web服务有两种:一种是Apache,另一种就是Nginx。

1.1.1 Apache介绍

(1)Apache prefork 模型

  • 预派生模式,有一个主控制进程,然后生成多个子进程,使用select模型,最大并发1024
  • 每个子进程有一个独立的线程响应用户请求
  • 相对比较占用内存,但是比较稳定,可以设置最大和最小进程数
  • 是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景

优点:稳定
缺点:每个用户请求需要对应开启一个进程,占用资源较多,并发性差,不适用于高并发场景

(2)Apache worker 模型

  • 一种多进程和多线程混合的模型
  • 有一个控制进程,启动多个子进程
  • 每个子进程里面包含固定的线程
  • 使用线程程来处理请求
  • 当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求
  • 由于其使用了线程处理请求,因此可以承受更高的并发

优点:相比prefork 占用的内存较少,可以同时处理更多的请求
缺点:使用keepalive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用(该问题在prefork模式下,同样会发生)

(3)Apache event模型

  • Apache中最新的模式,2012年发布的apache 2.4.X系列正式支持event 模型,属于事件驱动模型(epoll)
  • 每个进程响应多个请求,在现在版本里的已经是稳定可用的模式
  • 它和worker模式很像,最大的区别在于,它解决了keepalive场景下长期被占用的线程的资源浪费问题(某些线程因为被keepalive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)
    event MPM中,会有一个专门的线程来管理这些keepalive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力

缺点:没有线程安全控制
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放

1.1.2 Nginx-高性能的 Web 服务端

  • 基于Nginx的工作场景:
    在这里插入图片描述

2 Nginx架构与安装

2.1 Nginx概述

2.1.1 Nginx 功能介绍

  • 静态的web资源服务器html,图片,js,css,txt等静态资源
  • http/https协议的反向代理
  • 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
  • tcp/udp协议的请求转发(反向代理)
  • imap4/pop3协议的反向代理

2.1.2 基础特性

  • 模块化设计,较好的扩展性
  • 高可靠性
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
  • event-driven,aio,mmap,sendfile

2.1.3 Web 服务相关的功能

  • 虚拟主机(server)
  • 支持 keep-alive 和管道连接(利用一个连接做多次请求)
  • 访问日志(支持基于日志缓冲提高其性能)
  • url rewirte
  • 路径别名
  • 基于IP及用户的访问控制
  • 支持速率限制及并发数限制
  • 重新配置和在线升级而无须中断客户的工作进程

2.2 Nginx 架构和进程

2.2.1 架构

在这里插入图片描述

2.2.2 Ngnix进程结构

(1)web请求处理机制

  • 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求
  • 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。

(2)Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。

#主进程(master process)的功能:
- 对外接口:接收外部的操作(信号)
- 对内转发:根据外部的操作的不同,通过信号管理 Worker
- 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
- 读取Nginx 配置文件并验证其有效性和正确性
- 建立、绑定和关闭socket连接
- 按照配置生成、管理和结束工作进程
- 接受外界指令,比如重启、升级及退出服务器等指令
- 不中断服务,实现平滑升级,重启服务并应用新的配置
- 开启日志文件,获取文件描述符
- 不中断服务,实现平滑升级,升级失败进行回滚处理
- 编译和处理perl脚本
#工作进程(worker process)的功能:
- 所有 Worker 进程都是平等的
- 实际处理:网络请求,由 Worker 进程处理
- Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争
- CPU资源
- 增加上下文切换的损耗
- 接受处理客户的请求
- 将请求依次送入各个功能模块进行处理
- I/O调用,获取响应数据
- 与后端服务器通信,接收后端服务器的处理结果
- 缓存数据,访问缓存索引,查询和调用缓存数据
- 发送请求结果,响应客户的请求
- 接收主程序指令,比如重启、升级和退出等

2.3 Nginx 模块介绍

nginx 有多种模块

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

2.4 Nginx安装

2.4.1 安装方式

  • 源码编译安装(这里使用源码安装)(可以自定义安装相关内容)
  • yum安装(yum安装版本比较旧)
实验环境
1.一台虚拟机,内存4g,存储40g(大一点没事)
2.网络正常
3.有软件仓库
4.关闭防火墙和selinux

2.4.2 源码编译安装

(1)首先安装需要的编译软件

[root@nginx ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y

(2)导入并解压
首先导入压缩包(也可以直接拉取链接直接下载),解压(可以解压到指定目录),解压后创建用户
在这里插入图片描述
(3)环境检测
在这里插入图片描述
(4)编译

[root@nginx nginx-1.24.0]# make && make install

(5)完成后查看
在这里插入图片描述
安装完成后有四个目录

conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params两个文件,配置文件一般都有一个样板配置文件,是以.default为后缀,使用时可将其复制并将default后缀去掉即可。
html:目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web文件是默认的错误页面提示页面。
logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比如/var/logs/nginx里面。
sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能。

(6)验证版本并编辑参数
在这里插入图片描述
(7)启动nginx服务
在这里插入图片描述
网页访问,表示启动成功
在这里插入图片描述

2.4.3 平滑升级和回滚

有时候我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级

平滑升级
(1)原理

  • 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
  • 向master进程发送USR2信号
  • master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
  • master进程用新Nginx文件启动,新master进程成为旧master的子进程,系统中将有新旧两个Nginx主进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进程的PID存放至新生成的pid文件nginx.pid
  • 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
  • 向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
  • 如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT

(2)示例
1.解压新版本
在这里插入图片描述
2.检测
在这里插入图片描述
3.make,不用make install

[root@nginx nginx-1.26.1]# make

4.查看两个版本
在这里插入图片描述
5.备份老版本
在这里插入图片描述
6.复制新版本到指定目录

[root@nginx sbin]#  \cp -f /root/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin

7.检测
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

版本回滚
(1)进行新版本的启动文件备份
在这里插入图片描述
(2)切换到老版本
在这里插入图片描述
(3)回滚
在这里插入图片描述

3 Nginx核心配置

3.1 配置文件说明

Nginx配置文件的组成部分:
a.主配置文件:nginx.conf
b.子配置文件: include conf.d/*.conf
c.fastcgi, uwsgi,scgi 等协议相关的配置文件
d.mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

3.2 主配置文件结构

a. main block #主配置段
b. event{} #事件驱动相关配置
c. http{} #http/https协议相关配置段
d. mail #协议相关配置段和stream服务器相关配置段

3.3 核心配置示例

3.3.1 新建一个PC web站点

(1)相关配置(server和{之间需要空格,排错两小时崩溃了)
在这里插入图片描述

#在这个配置文件里面添加一条代码
vim /usr/local/nginx/conf/nginx.conf

在这里插入图片描述

(2)结果演示

#这里我在自己windows上做的解析,是在自己电脑的这个目录底下,一个hosts文件里面做解析。
C:\Windows\System32\drivers\etc

访问成功
在这里插入图片描述

3.3.2 root和alias

1.root

  • root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location
    (1)配置
    在这里插入图片描述
    保存退出并重启nginx
    (2)测试
    在这里插入图片描述

2.alias
(1)配置
在这里插入图片描述

(2)测试
在这里插入图片描述
测试成功

3.3.3 Location

  • 在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;
  • ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri
  • uri是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
#语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }

= #用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立
即处理请求
^~ #用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头
#对uri的最左边部分做匹配检查,不区分字符大小写
~ #用于标准uri前,表示包含正则表达式,并且区分大小写
~* #用于标准uri前,表示包含正则表达式,并且不区分大写
不带符号 #匹配起始于此uri的所有的uri
\ #用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号

#匹配优先级从高到低:
=, ^~, ~/~*, 不带符号

(1)配置+测试
在这里插入图片描述

在这里插入图片描述
测试
在这里插入图片描述
讲web2放在最后
在这里插入图片描述
重启测试
在这里插入图片描述
在这里插入图片描述
接着测试
在这里插入图片描述
按照这个思路测试的最后优先级同上边总结一致

3.3.4 账户认证

(1)创建默认认证文件
在这里插入图片描述
(2)修改配置文件,加认证
在这里插入图片描述
(3)测试,登录,用注册的用户
在这里插入图片描述
(4)登录完成后
在这里插入图片描述

3.3.5 自定义错误界面

(1)配置
在这里插入图片描述
在这里插入图片描述

(2)测试
在这里插入图片描述

3.3.6 自定义错误日志

(1)配置
在这里插入图片描述
在这里插入图片描述

(2)测试
在这里插入图片描述

3.3.7 制作下载文件

(1)配置
在这里插入图片描述
在这里插入图片描述

(2)测试
在这里插入图片描述
可以点击liufile下载

4 Nginx高级配置

4.1 状态页

(1)配置
在这里插入图片描述

在这里插入图片描述

(2)测试
在这里插入图片描述

4.2 压缩功能

(1)配置
在这里插入图片描述

(2)测试
在这里插入图片描述

4.3 变量使用

(1)配置
在这里插入图片描述

(2)测试
这台虚拟机需要做解析

vim /etc/hosts

在这里插入图片描述

5 Nginx的Rewrite相关功能

  • Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求
  • 此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库
  • rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能
  • 比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问
  • 另外还可以在一定程度上提高网站的安全性。

5.1 if判定

(1)配置
在这里插入图片描述

(2)测试
在这里插入图片描述

5.2 break

(1)配置
在这里插入图片描述

(2)测试
在这里插入图片描述

5.3 return

(1)配置
在这里插入图片描述

(2)测试
在这里插入图片描述

5.4 rewrite

(1)配置
在这里插入图片描述

(2)测试
在这里插入图片描述

6 Nginx反向代理

实验环境:三台虚拟机,一台nginx服务器,两台webserver,其中两台webserver做apache。

在这里插入图片描述

  • 反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。

访问逻辑图:
在这里插入图片描述

同构代理:用户不需要其他程序的参与,直接通过http协议或者tcp协议访问后端服务器
异构代理:用户访问的资源时需要经过处理后才能返回的,比如php,python,等等,这种访问资源需要经过处理才能被访问

6.1 实现http反向代理

官方文档: https://nginx.org/en/docs/http/ngx_http_proxy_module.html

6.1.1

(1)配置
在这里插入图片描述
在这里插入图片描述
在webserver2上
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

(2)测试
在这里插入图片描述
在这里插入图片描述

6.1.2 动静分离

(1)配置
在webserver1中做php
在这里插入图片描述

在这里插入图片描述
(2)测试
在这里插入图片描述

6.1.3 http反向代理负载均衡

(1)配置
在这里插入图片描述

(2)测试
在这里插入图片描述
关闭两个http服务,测试backup在这里插入图片描述
测试成功

6.2 实现FastCGI

6.2.1 配置nginx

删掉之前的nginx,接着导入
在这里插入图片描述
解压后进入到nginx1.26.1中进行编译,编译完进行make和make install

#编译语句
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --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

6.2.2 php配置

(1)配置
在编译之前需要安装相应的软件依赖

yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libpng-devel libcurl-devel oniguruma-devel

遇见下载不到的就搜索,没有的就在阿里云镜像站的软件包栏目下去找。

dnf search 软件包
找到就下载x86结构的

在这里插入图片描述
编译完成
接着

make && make install

6.2.3 php配置优化

(1)配置
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6.2.4 测试页面

(1)配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
(2)测试
在这里插入图片描述

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值