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

2024-09-08 13:12

本文主要是介绍云原生之高性能web服务器学习(持续更新中),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

高性能web服务器

  • 1 Web服务器的基础介绍
    • 1.1 Web服务介绍
      • 1.1.1 Apache介绍
      • 1.1.2 Nginx-高性能的 Web 服务端
  • 2 Nginx架构与安装
    • 2.1 Nginx概述
      • 2.1.1 Nginx 功能介绍
      • 2.1.2 基础特性
      • 2.1.3 Web 服务相关的功能
    • 2.2 Nginx 架构和进程
      • 2.2.1 架构
      • 2.2.2 Ngnix进程结构
    • 2.3 Nginx 模块介绍
    • 2.4 Nginx安装
      • 2.4.1 安装方式
      • 2.4.2 源码编译安装
      • 2.4.3 平滑升级和回滚
  • 3 Nginx核心配置
    • 3.1 配置文件说明
    • 3.2 主配置文件结构
    • 3.3 核心配置示例
      • 3.3.1 新建一个PC web站点
      • 3.3.2 root和alias
      • 3.3.3 Location
      • 3.3.4 账户认证
      • 3.3.5 自定义错误界面
      • 3.3.6 自定义错误日志
      • 3.3.7 制作下载文件
  • 4 Nginx高级配置
    • 4.1 状态页
    • 4.2 压缩功能
    • 4.3 变量使用
  • 5 Nginx的Rewrite相关功能
    • 5.1 if判定
    • 5.2 break
    • 5.3 return
    • 5.4 rewrite
  • 6 Nginx反向代理
    • 6.1 实现http反向代理
      • 6.1.1
      • 6.1.2 动静分离
      • 6.1.3 http反向代理负载均衡
    • 6.2 实现FastCGI
      • 6.2.1 配置nginx
      • 6.2.2 php配置
      • 6.2.3 php配置优化
      • 6.2.4 测试页面

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)测试
在这里插入图片描述

这篇关于云原生之高性能web服务器学习(持续更新中)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1148208

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

hdu1689(线段树成段更新)

两种操作:1、set区间[a,b]上数字为v;2、查询[ 1 , n ]上的sum 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdl

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份