什么是apache?以及apache配置

1、http协议

1.1 http相关概念

http 超文本传输协议

配置文件:vim /etc/httpd/conf/httpd.conf

互联网分为:局域网、城域网、广域网, 其中,因特网是最大的广域网。

1.2 访问浏览器的过程

在浏览器中输入www.baidu.com,会经过下面5个过程:

  1. 浏览器的职责
  2. DNS 域名解析
  3. TCP 连接:三次握手、四次挥手
  4. HTTP 请求
  5. 浏览器的渲染原理

1.3 http协议通信过程

客户端向服务端发出请求,需要192.168.91.100/a.jpg文件,实际浏览的文件夹是:

软件名 路径
httpd /var/www/html/a.jpg
nginx /usr/share/nginx/html/a.jpg

处理请求的顺序: 网卡 ---> 内核 ---> 程序

程序在用户空间,用户空间 和 内核空间 都在内存里面

小拓展:

1、客户打开网页,如何处理?

  • 首先看状态码,状态码的信息比较直接
  • 再查看日志,分析报错信息

2、/etc/mime.types 在里面的就是查看;里面没有的 就是下载

1.4 URL⭐⭐⭐

URL 与 URN,同属于URI(小i)统一资源标识。

  • URN 统一资源命名符

    描述了资源的名字

  • URL 统一资源定位符⭐⭐⭐

    用于描述某服务器某特定资源位置,资源的具体位置

1.4.1 URL完整格式:

js 复制代码
 <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
 拆分:
     scheme:方案,访问服务器以获取资源时要使用哪种协议⭐
     user:用户,某些方案访问资源时需要的用户名
     password:密码,用户对应的密码,中间用:分隔
     Host:主机,资源宿主服务器的主机名或IP地址⭐
     port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号⭐
     path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔⭐
     params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔
     query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
     frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔

1.4.2 URL基本格式:⭐⭐⭐

js 复制代码
 协议://主机名:端口/路径
 scheme host  port path

1.5 网站访问量

  • pv 访问量, 即Page View, 页面浏览量或点击量
  • UV 独立访客

1.6 http的七个过程⭐⭐⭐

一次完整的http请求处理过程:

  1. 建立连接:三次握手
  2. 同意连接
  3. 处理请求:内核根据协议和端口号,找到相应的程序,程序根据自己的配置文件,分析处理客户的请求。
  4. 访问资源:分析出客户需要的资源后,再告诉内核,内核去找资源交给程序。
  5. 构建响应报文:程序拿到资源后,会构建响应报文。
  6. 发送响应报文:报文准备好后,会交给内核,内核交给网卡,网卡转发给客户端。
  7. 记录日志

小拓展:I/O结构是 input、output

1.7 http工作机制

1.7.1 串行和并行

  • 串行:1对1 每次只处理一个问题,效率慢,基本不用。
  • 并行:一起,对单个客户端,多次请求的优化,弊端是存在时延,如果第50个没有处理完,就不会开启第51个。

1.7.2 处理高并发的四个基本模型:

  1. 单线程I/O结构:串行,启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
  2. 多线程I/O结构:串行,并行启动多个进程,每个进程响应一个连接请求复用的I/O结构
  3. 复用I/O结构:启动一个进程,同时响应N个连接请求
  4. 复用的多线程I/O结构:启动M个进程,每个进程响应N个连接请求,同时接收M*N个请求

用的最多是第2个和第3个

1.7.3 提高HTTP连接性能:

  • 并行连接:单个客户端多次请求,通过多条TCP连接发起并发的HTTP请求
  • 持久连接:一次连接 多次下载,keep-alive,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接
  • 管道化连接:通过共享TCP连接,发起并发的HTTP请求
  • 复用的连接:交替传送请求和响应报文

使用持久连接来进行优化,持久连接就是一次连接(三次握手)多次下载。持久连接 要比 并行效果好,处理效率更高。

小拓展:

1、结束持久连接的条件:

  • 时间限制
  • 下载资源个数的限制

2、一个进程里面最少要有一个线程。

3、改完配置文件为什么要重启?

因为修改是改在磁盘上的,内存并不知道进行了修改,重启是为了让磁盘和内存一致。

1.8 http协议的版本及区别⭐⭐⭐

http发明的初衷是共享文件

  1. http 0.9 :只支持下载,方法只有get(下载),不支持长连接
  2. http 1.0 :加入了多种方法,不止有get(下载)、post(上传)等,不支持长连接
  3. http 1.1:加入了长连接,(长连接也就是持久连接)

http1.1目前是市场主流

1.9 http 报文

报文主要分为 请求报文 和 回复报文

1.9.1 http请求报文

首部字段 主要是一些提示信息、注释

方法:

方法 含义
GET 获取资源 当前网络请求中,绝大部分使用的是 GET方法
HEAD 获取报文首部,主要用于确认 URL 的有效性以及资源更新的日期时间等
POST 传输实体主体 (比如传输 用户名密码)
PUT 上传文件(比如写博客)
PATCH 对资源进行部分修改
DELETE 删除文件
OPTIONS 查询支持的方法(查看服务端可以支持哪些方法)
CONNECT 要求在与代理服务器通信时建立隧道(类似加密)
TRACE 追踪路径

小实验:

实验目的:模拟http请求的过程

js 复制代码
 关闭防火墙
 下载telnet
 telnet 192.168.125.100 80    //访问80端口
 get /index.html HTTP/1.1      //通过http1.1版本下载文件
 //方法    URL     版本
 HOST:1.1.1.1     //首部字段,随便设,自己定义

1.9.2 响应报文(回复报文)

js 复制代码
 [root@7-3 ~]#  curl -I 192.168.125.130   
 HTTP/1.1   200     OK
 //版本     状态码   短语
 Date: Mon, 27 May 2024 12:03:14 GMT    //下面这些都是首部字段
 Server: Apache/2.4.6 (CentOS)
 Last-Modified: Thu, 23 May 2024 15:28:25 GMT
 ETag: "8-61920b3ba079e"
 Accept-Ranges: bytes
 Content-Length: 8
 Content-Type: text/html; charset=UTF-8

1.10 http 状态码⭐⭐⭐⭐⭐

js 复制代码
 1xx(信息类):表示接收到请求并且继续处理
 2xx(响应成功):表示动作被成功接收、理解和接受
 3xx(重定向类):为了完成指定的动作,必须接受进一步处理
 4xx(客户端错误类):请求包含错误语法或不能正确执行
 5xx(服务端错误类):服务器不能正确执行一个正确的请求

http协议常用的状态码

js 复制代码
 200: 成功,请求数据通过响应报文的entity-body部分发送;OK
 301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
 302: 响应报文Location指明资源临时新位置 Moved Temporarily
 304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified
 307:  浏览器内部重定向
 401: 需要输入账号和密码认证方能访问资源;Unauthorized
 403: 请求被禁止;Forbidden
 404: 服务器无法找到客户端请求的资源;Not Found
 500: 服务器内部错误;Internal Server Error,比如:cgi程序没有执行权限
 502: 代理服务器从后端服务器收到了一条伪响应,如无法连接到网关;Bad Gateway
 503: 服务不可用,临时服务器维护或过载,服务器无法处理请求,比如:php服务停止,无法处理php程序
 504: 网关超时

2、httpd安装组成

http基于C/S架构:

服务名:apache

安装软件名:httpd

2.1 常见http服务器程序

  • httpd apache,存在C10K(10K connections)问题
  • nginx 解决C10K问题 httpd
  • tomcat .jsp 应用程序服务器

国外用apache、中国用nginx

2.2 apache简介

2.2.1 apeche功能

  • 提供web服务(提供网页服务)

  • 多个虚拟主机,用一台物理服务器,搭建多个网站

  • CGI:Common Gateway interface,通用网关接口,支持动态程序。用CGI接口协议可以进行转发。

    tomcat擅长处理 动态资源

    nginx 擅长处理 静态资源

  • 反向代理:客户端访问代理,代理将请求转发给服务端。

    反向代理,代理的是 服务端;

    正向代理,代理的是 客户端

  • 负载均衡

2.2.2 apache特性⭐

  • 高度模块化:core + modules
  • DSO:Dynamic Shared Object 动态加载/卸载
  • MPM:multi-processing module 多路处理模块

2.3 MPM 三个工作模式及特点⭐⭐⭐

MPM 多路复用技术,处理高并发(同一时间多个用户同时访问)

长连接:处理 单个用户多次访问。

2.3.1 prefork

prefork: 多进程I/O模型,每个进程响应一个请求

系统初始时,预生成多个空闲进程,等待请求。

进程+子进程:

  • 优点:稳定,服务周到
  • 缺点:慢,占用资源,不适用于高并发场景

2.3.2 worker

worker:复用的多进程I/O模型,多进程多线程,一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n

  • 优点:相比prefork 占用的内存较少,可以同时处理更多的请求
  • 缺点:占用资源,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。

基本不用!

2.3.3 event

事件驱动模型,进程+子进程+线程

js 复制代码
 修改配置:
 vim 00-mpm.conf
 //修改用prefork 还是用event
  • 优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀
  • 缺点:没有线程安全控制 小拓展:怎么查看是哪种工作模式?
js 复制代码
pstree -p |grep httpd

花括号代表 线程

2.4 httpd安装和相关文件

2.4.1 httpd相关文件

配置文件 路径
主配置文件 /etc/httpd/conf/httpd.conf
子配置文件 /etc/httpd/conf.d/*.conf
模块加载的配置文件 /etc/httpd/conf.d/conf.modules.d/

2.4.2 编译安装

js 复制代码
 #编译安装
 ./configure --prefix=$install_dir --sysconfdir=/etc/httpd --enable-ssl
 ​
 make -j`lscpu | grep "^CPU(s)" | awk '{print $NF}'` && make install

一定要分清楚,是编译安装 还是yum安装

3、http常见配置

优化:

  • 子配置文件
  • 隐藏版本号
  • 优化长连接

3.1 主配置文件

js 复制代码
 yum安装的,对应配置文件位置:
 /etc/httpd/conf/httpd.conf
 ​
 统计多少行配置文件:
 wc -l /etc/httpd/conf/httpd.conf
 353 /etc/httpd/conf/httpd.conf
 ​
 统计不包括注释的配置:
 grep -v "^#" /etc/httpd/conf/httpd.conf

3.2 httpd -t 检查格式命令

apache 最有用的选项:

js 复制代码
httpd -t   //检查格式的命令

小拓展:1、

js 复制代码
nginx -g 'daemon off'   //daemon off是后台运行

2、

js 复制代码
 vim /etc/httpd/conf/httpd.conf
 ServerName www.example.com:80   //打开域名
 httpd -t

3.3 监听端口

通式:Listen [IP:]端口号 1、如果省略IP,则默认为本机所有IP 2、Listen指令至少一个,可重复出现多次

js 复制代码
 vim /etc/httpd/conf/httpd.conf
 listen 80   //监听80端口
 systemctl restart httpd    //改完配置,重启服务!!!
 ​
 #修改子配置文件
 cd /etc/httpd/conf.d
 vim test.conf
     listen 9527
 systemctl restart httpd
 ​
 #其他配置文件
 grep -i include /etc/httpd/conf/httpd.conf    //建议用include
 IncludeOptional conf.d/*.conf    //建议放在最后

说明:

  • Include和IncludeOptional功能相同,都可以包括其它配置文件
  • 但是当无匹配文件时,include会报错,IncludeOptional会忽略错误

3.4 隐藏服务器的版本信息(真正的调优)

js 复制代码
 [root@7-3 ~]#  curl -I 192.168.125.130
 HTTP/1.1 200 OK
 Date: Mon, 27 May 2024 15:29:19 GMT
 Server: Apache/2.4.6 (CentOS)  //版本号会显示出来
 Last-Modified: Thu, 23 May 2024 15:28:25 GMT
 ETag: "8-61920b3ba079e"
 Accept-Ranges: bytes
 Content-Length: 8
 Content-Type: text/html; charset=UTF-8
 ​
 [root@7-3 ~]#  vim /etc/httpd/conf/httpd.conf   //编辑配置文件
     servertokens prod     //最下面加上规则配置,为什么要在最后面加,因为谁写在最后谁生效
 [root@7-3 ~]#  systemctl restart httpd    //重启服务

3.5 持久连接

断开条件:

  • 时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级
  • 请求数量: 请求数达到指定值,也会断开
js 复制代码
 KeepAlive On|Off   //打开、关闭持久连接
 KeepAliveTimeout 15      #时间,连接持续15s,可以以ms为单位,默认值为5s
 MaxKeepAliveRequests 500    #数量,持久连接最大接收的请求数,默认值100

3.6 DSO

Dynamic Shared Object,加载动态模块配置,不需重启即生效。

动态模块所在路径: /usr/lib64/httpd/modules/

查看静态编译的模块: httpd -l

查看动态装载的模块: httpd -M

3.7 prefork模式相关的配置

js 复制代码
 StartServers       100   //一开始开启100个进程
 MinSpareServers    50    //如果一直空闲需要最少预留 50个进程
 MaxSpareServers    80   //如果空闲,最大预留80个
 ServerLimit        2560 #最多进程数,最大值 20000
 MaxRequestWorkers    2560 #最大的并发连接数,默认256
 MaxConnectionsPerChild  4000 #子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个
 请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)
 MaxRequestsPerChild 4000  #从 httpd.2.3.9开始被MaxConnectionsPerChild代替

3.8 worker、event 模式相关的配置

js 复制代码
 ServerLimit         16  #最多worker进程数 Upper limit on configurable number of 
 processes
 StartServers        10  #Number of child server processes created at startup
 MaxRequestWorkers  150  #Maximum number of connections that will be processed 
 simultaneously
 MinSpareThreads     25
 MaxSpareThreads     75
 ThreadsPerChild     25  #Number of threads created by each child process
相关推荐
cominglately3 小时前
centos单机部署seata
linux·运维·centos
魏 无羡3 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
CircleMouse3 小时前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos
木子Linux4 小时前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算
mit6.8244 小时前
Ubuntu 系统下性能剖析工具: perf
linux·运维·ubuntu
鹏大师运维4 小时前
聊聊开源的虚拟化平台--PVE
linux·开源·虚拟化·虚拟机·pve·存储·nfs
watermelonoops4 小时前
Windows安装Ubuntu,Deepin三系统启动问题(XXX has invalid signature 您需要先加载内核)
linux·运维·ubuntu·deepin
滴水之功5 小时前
VMware OpenWrt怎么桥接模式联网
linux·openwrt
ldinvicible5 小时前
How to run Flutter on an Embedded Device
linux
YRr YRr6 小时前
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误
linux·opencv·ubuntu