什么是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
相关推荐
二十雨辰2 小时前
[linux]docker基础
linux·运维·docker
饮浊酒3 小时前
Linux操作系统 ------(3.文本编译器Vim)
linux·vim
lihuhelihu3 小时前
第3章 CentOS系统管理
linux·运维·服务器·计算机网络·ubuntu·centos·云计算
矛取矛求3 小时前
Linux系统性能调优技巧
linux
One_Blanks3 小时前
渗透测试-Linux基础(1)
linux·运维·安全
Perishell3 小时前
无人机避障——大疆与Airsim中的角速度信息订阅获取
linux·动态规划·无人机
爱吃喵的鲤鱼3 小时前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
dessler3 小时前
Linux系统-ubuntu系统安装
linux·运维·云计算
荒Huang4 小时前
Linux挖矿病毒(kswapd0进程使cpu爆满)
linux·运维·服务器
hjjdebug6 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal