Linux进阶-浅谈apache

apache 是什么?

20世纪90年代初,国家超级计算机应用中心NCSA开发,1995年开源社区发布apache(a patchyserver)

  • ASF: apache software foundation

  • FSF:Free Software Foundation

  • Apache 是​​使用最广泛的 Web 服务器软件。Apache 是​​由 Apache Software Foundation 开发和维护的,它是一个免费提供的开源软件。它占全球所有网络服务器的 67%。它快速,可靠,安全。它可以通过使用扩展和模块进行高度定制,以满足许多不同环境的需求。大多数 WordPress 托管服务提供商使用 Apache 作为其 Web 服务器软件。但是,WordPress 也可以在其他 Web 服务器软件上运行。

  • Apache Web Server 旨在创建能够托管一个或多个基于 HTTP 的网站的 Web 服务器。值得注意的功能包括支持多种编程语言,服务器端脚本,身份验证机制和数据库支持。可以通过操纵代码库或添加多个扩展/附加组件来增强 Apache Web Server。

  • 它也被 Web 托管公司广泛用于提供共享/虚拟主机,因为默认情况下,Apache Web Server 支持并区分驻留在同一台机器上的不同主机。

apache 特性

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

apache 功能

  • 虚拟主机:IP、Port、FQDN
  • CGI:Common Gateway Interface,通用网关接口
  • 反向代理
  • 负载均衡
  • 路径别名
  • 丰富的用户认证机制:basic,digest
  • 支持第三方模块

httpd-2.4特性

  • MPM支持运行为DSO机制;以模块形式按需加载
  • event MPM生产环境可用
  • 异步读写机制
  • 支持每模块及每目录的单独日志级别定义
  • 每请求相关的专用配置
  • 增强版的表达式分析式
  • 毫秒级持久连接时长定义
  • 基于FQDN的虚拟主机不需要NameVirutalHost指令
  • 新指令
  • 支持用户自定义变量
  • 更低的内存消耗

MPM multi-processing module 工作模式

  • prefork:多进程I/O模型,每个进程响应一个请求,CentOS7 默认模型
    • 一个主进程:生成和回收n个子进程,创建套接字,不响应请求
    • 多个子进程:工作work进程,每个子进程处理一个请求;
    • 系统初始时,预先生成多个空闲进程,等待请求

在这里插入图片描述

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

    • 优点:稳定
    • 缺点:慢,占用资源,不适用于高并发场景
  • worker: 复用的多进程I/O模型,多进程多线程,IIS使用此模型

    • 一个主进程:生成m个子进程
    • 每个子进程负责生成n个线程,每个线程响应一个请求,故能够并发响应请求:m*n
    • 比prefork模式节约资源,但一个线程出错会影响所在进程的其他线程

在这里插入图片描述

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

    • 优点:相比prefork 占用的内存较少,可以同时处理更多的请求

    • 缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)

    • event: 事件驱动模型(worker模型的变种),CentOS8 默认模型

在这里插入图片描述

  • 一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n,有专门的监控线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力

  • event MPM:Apache中最新的模式,属于事件驱动模型(epoll),每个进程响应多个请求,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。

  • event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力

  • event只在有数据发送的时候才开始建立连接,连接请求才会触发工作线程,即使用了TCP的一个选项,叫做延迟接受连接TCP_DEFER_ACCEPT,加了这个选项后,若客户端只进行TCP连接,不发送请求,则不会触发Accept操作,也就不会触发工作线程去干活,进行了简单的防攻击(TCP连接)

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

    • 缺点:没有线程安全控制

httpd-2.4 相关文件

  • 配置文件
    • /etc/httpd/conf/httpd.conf 主配置文件
    • /etc/httpd/conf.d/*.conf 子配置文件
    • /etc/httpd/conf.d/conf.modules.d/ 模块加载的配置文件
  • 检查配置语法:httpd –t
  • 查看静态编译的模块:httpd -l
  • 查看静态编译及动态装载的模块:httpd –M
  • 服务单元文件:
    • /usr/lib/systemd/system/httpd.service
    • 配置文件:/etc/sysconfig/httpd
  • 服务控制和启动
    • systemctl enable|disable httpd.service
    • systemctl {start|stop|restart|status|reload} httpd.service
  • 站点网页文档根目录:/var/www/html
  • 模块文件路径:
    • /etc/httpd/modules
    • usr/lib64/httpd/modules
  • 主服务器程序文件: /usr/sbin/httpd
  • 主进程文件: /etc/httpd/run/httpd.pid
  • 日志文件目录:/var/log/httpd
    • access_log: 访问日志
    • error_log:错误日志
  • 帮助文档包:httpd-manual

httpd配置文件的组成

主要组成:

  • 全局配置:Global Environment
  • 主服务器配置:Main server configuration
  • 虚拟主机配置:virtual host

配置文件格式:directive value (指令 值)

  • directive:不区分字符大小写
  • value:当为路径时,是否区分大小写取决于文件系统

httpd 常见配置

显示服务器版本信息

[uctOnly]|OS|Full
ServerTokens Prod[uctOnly] :Server: Apache
ServerTokens Major: Server: Apache/2
ServerTokens Minor: Server: Apache/2.0
ServerTokens Min[imal]: Server: Apache/2.0.41
ServerTokens OS: Server: Apache/2.0.41 (Unix)
ServerTokens Full (or not specified): Server: Apache/2.0.41 (Unix) PHP/4.2.2
MyMod/1.2

建议使用:ServerTokens Prod
//在远程主机开启相关服务,查看显示如下
[root@node-17 ~]# curl -I 192.168.26.37
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Mon, 09 Dec 2019 08:44:32 GMT
Content-Type: text/html
Content-Length: 246
Last-Modified: Sat, 07 Dec 2019 10:41:35 GMT
Connection: keep-alive
ETag: "5deb81df-f6"
Accept-Ranges: bytes

//准备修改文件,主配置文件最好别动,手动创建一个被服务包含的子配置文件
[root@node-17 ~]# ansible 192.168.26.37 -a "/bin/echo 'servertokens prod' > /etc/httpd/conf.d/son_conf.conf"
-------------------------------------------------
//重启httpd服务
[root@node-17 ~]# ansible 192.168.26.37 -m service -a "name=httpd state=restarted"
--------------------------------------------------
//查看显示如下
[root@node-17 ~]# curl -I 192.168.26.37
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Mon, 09 Dec 2019 08:59:24 GMT
Content-Type: text/html
Content-Length: 246
Last-Modified: Sat, 07 Dec 2019 10:41:35 GMT
Connection: keep-alive
ETag: "5deb81df-f6"
Accept-Ranges: bytes

修改监听的IP和Port

  • 设置格式:Listen [IP:]PORT
    • 省略IP表示为0.0.0.0
    • Listen指令至少一个,可重复出现多次
    • Listen 80
    • Listen 8080
    • 修改监听socket,重载服务进程方可生效
      注意:必须有端口号设置,否则服务启动失败
//修改服务器端口192.168.26.37只能通过8080端口访问
[root@node-37 ~]# vim /etc/httpd/conf/httpd.conf
//配置文件修改或添加下列内容
Listen 192.168.26.37:8080
------------------------------------------------
//测试
[root@node-17 ~]# curl -I 192.168.26.37
curl: (7) Failed connect to 192.168.26.37:80; Connection refused
------------------------------------------------
//必须使用8080端口才能连接词IP
[root@node-17 ~]# curl -I 192.168.26.37:8080
HTTP/1.1 200 OK
Date: Mon, 09 Dec 2019 09:39:35 GMT
Server: Apache
Last-Modified: Sat, 07 Dec 2019 07:39:53 GMT
ETag: "f6-5991844a8a4fe"
Accept-Ranges: bytes
Content-Length: 246
Content-Type: text/html; charset=UTF-8

持久连接

  • 定义:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完
    成,默认关闭持久连接
  • 断开条件:时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级
  • 副作用:对并发访问量大的服务器,持久连接会使有些请求得不到响应
  • 折衷:使用较短的持久连接时间
  • 设置格式
    • KeepAlive On|Off
    • KeepAliveTimeout 15 #连接持续15s,可以以ms为单位,默认值为5s
    • MaxKeepAliveRequests 500 #持久连接最大接收的请求数,默认值100
  • 测试方法
telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host: WEB_SERVER_IP
  • 测试实例
//编辑之前创建的子配置文件
[root@node-37 ~]# vim /etc/httpd/conf.d/son_conf.conf

servertokens prod
//开启持久连接
keepalive on
//设置连接为60秒,默认为5秒
keepalivetimeout 100
-----------------------------------------------
telnet 192.168.26.37:8080

date

MPM (Multi-Processing Module) 多路处理模块

httpd 支持三种MPM工作模式:prefork、worker、event

  • httpd-2.4不支持同时编译多个模块,所以只能编译时选定一个
  • 查询当前MPM模式
[root@node-37 ~]# httpd -M | grep mpm
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::20c:29ff:fe63:1feb. Set the 'ServerName' directive globally to suppress this message
 mpm_prefork_module (shared)
  • 切换正在使用的MPM模式
    在这里插入图片描述

  • 注意不要同时启用多个模块,否则会报错
    AH00534: httpd: Configuration error: More than one MPM loaded.

  • 范例:查看各个版本默认的MPM模式

/ Centos6 默认的模式
[root@Centos6 ~]#httpd -v
Server version: Apache/2.2.15 (Unix)            / 默认使用的版本
Server built:   Jun 19 2018 15:45:13
[root@Centos6 ~]#httpd -M |grep mpm
httpd: apr_sockaddr_info_get() failed for Centos6.localdomain
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
 mpm_prefork_module (static)

/ Centos7 默认模式
[root@Centos7 ~]# httpd -v                     / 默认使用的版本
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug  8 2019 11:41:18

[root@Centos7 ~]# httpd -M | grep mpm
 mpm_prefork_module (shared)

/ Centos8 默认模式
[root@Centos8 ~]#httpd -v
Server version: Apache/2.4.37 (centos)         / 默认使用的版本
Server built:   Oct  7 2019 21:42:02

[root@Centos8 ~]#httpd -M | grep mpm
 mpm_event_module (shared)
  • 示例:修改Centos7模式
//编辑修改文件启用prefork模式,如下图
[root@node-37 ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf

在这里插入图片描述

查看模块

  • 查看静态编译的模块 httpd -l
  • 查看静态编译及动态装载的模块 httpd -M
  • 动态模块加载:不需重启即生效
  • 动态模块路径:/usr/lib64/httpd/modules/

切换正在使用的httpd模式

centos6 httpd-2.2 MPM设置

修改文件

/etc/sysconfig/httpd

HTTPD=/usr/sbin/httpd.worker

HTTPD=/usr/sbin/httpd.event

默认为prefork模式

配置后重启httpd server生效
------------------------------------
centos7 httpd-2.4 MPM设置

修改文件 /etc/httpd/conf.modules.d/00-mpm.conf

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

LoadModule mpm_worker_module modules/mod_mpm_worker.so

LoadModule mpm_event_module modules/mod_mpm_event.so

prefork默认设置

vim /etc/httpd/conf/httpd.conf                  / Centos6 httpd-2.2版本
vim /usr/share/doc/httpd-2.4.6/httpd-mpm.conf   / Centos7 httpd-2.4版本
<IfModule prefork.c>
StartServers       8       / 启动开启的进程数
MinSpareServers    5       / 最少空闲进程数
MaxSpareServers   20       / 最大空闲进程数
ServerLimit      256       / 最多进程数,不能超过MaxClient,最大能设置为20000
MaxClients       256       / 最大并发数
MaxRequestsPerChild  4000  / 子进程最多能处理的请求,达到设置值子进程被父进程终止,释放内存
                           / 从 httpd.2.3.9开始被MaxConnectionsPerChild代替
</IfModule>

worker和event 模式相关的配置

vim /etc/httpd/conf/httpd.conf                  / Centos6 httpd-2.2版本
vim /usr/share/doc/httpd-2.4.6/httpd-mpm.conf   / Centos7 httpd-2.4版本

<IfModule mpm_worker_module>
    StartServers             3   #服务开启时默认进程数
    MinSpareThreads         75   #最小线程数
    MaxSpareThreads        220   #最大线程数
    ThreadsPerChild         25   #
    MaxRequestWorkers      400   #最大并发数
    MaxConnectionsPerChild   0   #无限制永不释放
</IfModule>
  • 启动时开启3个进程,每个进程开启75个线程,共225个线程,但最多空闲220个线程,需要结束1个进程共75个线程,故开启服务后实际只能开到2个进程共150个线程

  • 示例修改启动进程以及线程数量

/ MPM各个模块相关设置文件在httpd-mpm.conf文件里面
locate httpd-mpm.conf

//编辑修改MPM模块配置文件
vim /usr/share/doc/httpd-2.4.6/httpd-mpm.conf
<IfModule mpm_prefork_module>
    StartServers             100
    MinSpareServers          50
    MaxSpareServers         60
    MaxRequestWorkers      250
    MaxConnectionsPerChild   0
</IfModule>
-----------------------------------------
//需在主配置文件加载这个httpd-mpm.conf配置文件,因为服务默认不加载这个文件
vim /etc/httpd/conf/httpd.conf

//在主配置文件中添加文件路径
Include /usr/share/doc/httpd-2.4.6/httpd-mpm.conf

//重启服务
systemctl restart httpd

//查看得,生效
[root@Centos7 httpd]# pstree
systemd─┬─agetty
        ├─auditd───{auditd}
        ├─crond
        ├─dbus-daemon
        ├─httpd───98*[httpd]

DSO(Dynamic Shared Object):动态加载模块

  • 加载动态模块配置文件
//编辑配置文件查看得
vim /etc/http/conf/httpd.conf

ServerRoot "/etc/httpd"   //动态加载模块默认地址
Include conf.modules.d/*.conf

在这里插入图片描述

  • 配置指定模块加载格式:
    LoadModule <mod_name> <mod_path>
  • 模块文件路径使用相对路径:
    相对于ServerRoot(默认/etc/httpd)
  • 范例:取消加载模块auth_basic_module
[root@Centos7 httpd]# vim /etc/httpd/conf.modules.d/00-base.conf 
#LoadModule auth_basic_module modules/mod_auth_basic.so  / 注释即可
[root@Centos7 httpd]# httpd -t
Syntax OK
[root@Centos7 httpd]# systemctl restart httpd
[root@Centos7 httpd]# httpd -M | grep auth_basic
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章