新增模块:
对于基于 IP 的访问控制做了修改,不再支持 allow,deny,order 机制,而是统一使用 require 进行
还新增以下几条新特性;
–enable-mpms-shared=all --with-mpm=event
安装环境:
操作系统:Centos7.5,关闭selinux
检查http是否安装,如查安装则卸载
httpd-2.4.23.tar.gz
apr-1.5.2.tar.gz
apr-util-1.5.4.tar.gz
zlib-1.2.8.tar.gz
pcre-8.39.tar.gz
软件链接
提取码:uzra
注:apr(Apache Portable Runtime)Apache 可移植运行库,它是一个对操作系统调用的抽 象库,用来实现 Apache 内部组件对操作系统的使用,提高系统的可移植性。
apr
[root@apache ~]# tar zxf apr-1.5.2.tar.gz
[root@apache ~]# cd apr-1.5.2/
[root@apache apr-1.5.2]# ./configure --prefix=/usr/local/apr
[root@apache apr-1.5.2]# make && make install
apr-util
[root@apache ~]# tar zxf apr-util-1.5.4.tar.gz
[root@apache ~]# cd apr-util-1.5.4/
[root@apache apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@apache apr-util-1.5.4]# make && make install
[root@apache ~]# tar zxf zlib-1.2.8.tar.gz
[root@apache ~]# cd zlib-1.2.8/
[root@apache zlib-1.2.8]# ./configure --prefix=/usr/local/zlib
[root@apache zlib-1.2.8]# make && make install
[root@apache ~]# tar zxf pcre-8.39.tar.gz
[root@apache ~]# cd pcre-8.39/
[root@apache pcre-8.39]# ./configure --prefix=/usr/local/pcre
[root@apache pcre-8.39]# make && make install
安装 apache2.4.23 时提示 openssl 版本过低,centos7 自带版本 openssl-1.0.1e
下载openssl:
[root@apache ~]# wget https://www.openssl.org/source/openssl-1.0.1u.tar.gz
安装:
[root@apache ~]# tar zxf openssl-1.0.1u.tar.gz
[root@apache ~]# cd openssl-1.0.1u/
[root@apache openssl-1.0.1u]# ./config -fPIC --prefix=/usr/local/openssl enable-shared
[root@apache openssl-1.0.1u]# make && make install
[root@apache ~]# mv /usr/bin/openssl /usr/bin/openssl.1.0.1e
[root@apache ~]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
[root@apache httpd-2.4.23]# ./configure --prefix=/usr/local/http-2.4.23 --enable-so \
> --enable-cgi --enable-cgid --enable-ssl --with-ssl=/usr/local/openssl \
> --enable-rewrite --with-pcre=/usr/local/pcre --with-z=/usr/local/zlib \
> --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util \
> --enable-modeles=most --enable-mods-shared=most --enable-mpms-shared=all \
> --with-mpm=event --enable-proxy --enable-proxy-fcgi --enable-expires --enable-deflate
相关参数解释:
--enable-so:支持动态共享模块(即打开 DSO 支持)
--enable-rewrite:支持 url 重写
--enable-ssl:支持 ssl
--with-ssl=/usr/local/openssl:指定 ssl 安装位置
--enable-cgi:启用 cgi
--enable-cgid:MPM 使用的是 event 或 worker 要启用 cgid
--enable-modules=most:明确指明要静态编译到 httpd 二进制文件的模块,为 空格分隔的模块名列表、all 或者 most,all 表示包含所有模块,most 表示包含大部分常用模块
--enable-mods-shared=most:明确指明要以 DSO 方式编译的模块,为空格分隔 的模块名列表、all 或者 most,all 表示包含所有模 块,most 表示包含大部分模块
--enable-mpms-shared=all:启用 MPM 所有支持的模式,这样 event、worker、prefork 就会以 模块化的方式安装,要用哪个就在 httpd.conf 里配置就好了
--with-mpm=event:指定启用的 mpm 模式,默认使用 enevt 模式,在 apache 的早期版本 2.0 默认 prefork,2.2 版本是 worker,2.4 版本是 event
--with-pcre=/usr/local/pcre:支持 pcre
--with-z=/usr/local/zlib:使用 zlib 压缩库
--with-apr=/usr/local/apr:指定 apr 的安装路径
--with-apr-util=/usr/local/apr-util:指定 apr-util 的安装路径
--enable-expires:激活彧通过配置文件控制 HTTP 的“Expires:”和“Cache-Control:”头内容,即 对网站图片、js、css 等内容,提供客户端浏览器缓存的设置。这个是 apache 调优的一个重 要选项之一
--enable-deflate提供对内容的压缩传输编码支持,一般是 html、js、css 等内容的站点。使 用此参数会打打提高传输速度,提升访问者访问的体验。在生产环境中,这是 apache 调优 的一个重要选项之一
[root@apache httpd-2.4.23]# make && make install
[root@apache ~]# ln -s /usr/local/http-2.4.23/bin/* /usr/local/bin/
例如:ServerName www.benet.com
[root@apache ~]# vim /usr/local/http-2.4.23/conf/httpd.conf
ServerName 127.0.0.1
[root@apache ~]# apachectl start
[root@apache ~]# cp /usr/local/http-2.4.23/bin/apachectl /etc/init.d/httpd
编辑 /etc/init.d/httpd 文件,在首行 #!/bin/sh 下面加入两行:
[root@apache ~]# vim /etc/init.d/httpd
# chkconfig: 35 85 15
# description: apache 2.4.23
chkconfig: 35 85 15 (在 3 和 5 启动模式下的–启动优先级)
将 Apache 加入开机自动启动:
[root@apache ~]# chkconfig --add httpd
[root@apache ~]# chkconfig httpd on
[root@apache ~]# systemctl start httpd
[root@apache ~]# netstat -anplt | grep 80
tcp6 0 0 :::80 :::* LISTEN 51792/httpd
apache 所运行的硬件环境都是对性能影响最大的因素,即使不能对硬件进行升级,也最好 给 apache 一个单独的主机以免受到其他应用的干扰。各个硬件指标中,对性能影响最大的 是内存,对于静态内容(图片、javascript 文件、css 文件等),它决定了 apache 可以缓存多 少内容,它缓存的内容越多,在硬盘上读取内容的机会就越少,大内存可以极大提高静态站 点的速度;对动态高负载站点来说,每个请求保存的时间更多一些,apache 的 mpm 模块会 为每个请求派生出相应的进程或线程分别处理,而进程或线程的数量与内存的消耗近似成正 比,因此增大内存对提高动态站点的负载和运行速度也极为有利
其次是硬盘的速度,静态站点尤为突出,apache 不断的在读取文件并发送给相应的请求, 硬盘的读写是极其频繁的;动态站点也要不断的加载 web 程序(php 等),一个请求甚至要读 取十几个文件才能处理完成,因此尽可能的提高硬盘速度和质量对提高 apache 的性能是有 积极意义的
最后是 cpu 和网络,cpu 影响的是 web 程序执行速度,网络影响流量大小
Apache HTTP 服务器被设计为一个强大的、灵活的能够在多种平台以及不同环境下工作的服 务器。这种模块化的设计就叫做“多进程处理模块”(Multi-Processing Module,MPM),也叫 做工作模式
当 Apache 服务器启动后,mpm_prefork 模块会预先创建多个子进程(默 认为 5 个),每个子进程只有一个线程,当接收到客户端的请求后,mpm_prefork 模块再将 请求转交给子进程处理,并且每个子进程同时只能用于处理单个请求。如果当前的请求数将 超过预先创建的子进程数时,mpm_prefork 模块就会创建新的子进程来处理额外的请求。 Apache 总是试图保持一些备用的或者是空闲的子进程用于迎接即将到来的请求。这样客户 端的请求就不需要在接收后等候子进程的产生
由于在 mpm_prefork 模块中,每个请求对应一个子进程,因此其占用的系统资源相对其他 两种模块而言较多。不过 mpm_prefork 模块的优点在于它的每个子进程都会独立处理对应 的单个请求,这样,如果其中一个请求出现问题就不会影响到其他请求。Prefork 在效率上 要比 Worker 要高,但是内存使用大得多不擅长处理高并发的场景
# prefork MPM
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 500
</IfModule>
StartServers:
apache 启动时候默认开始的子进程数
MinSpareServers:
最小的闲置子进程数
MaxSpareServers:
最大的闲置子进程数
MaxRequestWorkers:
MaxRequestWorkers 设置了允许同时的最大接入请求数量 任何 超 过 MaxRequestWorkers 限 制 的 请 求 将 进 入 等 候 队 列 , 在 apache2.3.1 以 前 的 版 本 MaxRequestWorkers 被称为 MaxClients,旧的名字仍旧被支持
MaxConnectionsPerChild
设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxConnectionsPerChild” 个请求后将自动销毁。0 意味着无限,即子进程永不销毁。虽然缺省设为 0 可以使每个 子进程处理更多的请求,但如果设成非零值也有两点重要的好处:
1、可防止意外的内 存泄漏
2、在服务器负载下降的时侯会自动减少子进程数。因此,可根据服务器的负 载来调整这个值。在 Apache2.3.9 之前称之为 MaxRequestsPerChild
MaxRequestWorkers 是这些指令中最为重要的一个,设定的是 Apache 可以同时处理 的请求,是对 Apache 性能影响最大的参数。如果请求总数已达到这个值(可通过 ps -ef|grep http|wc -l 来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源 还剩下很多而 HTTP 访问却很慢的主要原因。虽然理论上这个值越大,可以处理的请求就越 多,建议将初始值设为(以 Mb 为单位的最大物理内存/2),然后根据负载情况进行动态调整。 比如一台 4G 内存的机器,那么初始值就是 4000/2=2000
prefork 控制进程在最初建立“StartServers”个子进程后,为了满足 MinSpareServers 设 置的需要创建一个进程,等待一秒钟,继续创建两 个,再等待一秒钟,继续创建四个……如 此按指数级增加创建的进程数,最多达到每秒 32 个,直到满足 MinSpareServers 设置的值为止。这种模式 可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。 MaxSpareServers 设置了最大的空闲进程数,如果空闲进程数大于这个 值,Apache 会自动 kill 掉一些多余进程。这个值不要设得过大,但如果设的值比 MinSpareServers 小,Apache 会自 动把其调整为 MinSpareServers+1。如果站点负载较大,可考虑同时加大 MinSpareServers 和 MaxSpareServers
ServerLimit 和 MaxClients(MaxRequestWorkers)有什么区别呢?
是因为在 apache1 时代,控制最大进程数只有 MaxClients 这个参数,并且这个参数最大值为 256,并且是写死了的,试图设置为超过 256 是无效的,这是由于 apache1 时代的服务器硬 件限制的。但是 apache2 时代由于服务器硬件的升级,硬件已经不再是限制,所以使用 ServerLimit 这个参数来控制最大进程数,ServerLimit 值>=MaxClient 值才有效。ServerLimit 要放在 MaxClients 之前,值要不小于 MaxClients
查看 Apache 加载的模块
[root@apache conf]# apachectl -t -D DUMP_MODULES
或
[root@apache conf]# apachectl -M
或
[root@apache conf]# apachectl -l # 小写 L,只显示静态模块
如何查看 Apache 的工作模式呢?可以使用 httpd -V 命令查看,另外使用 httpd -l 也可以查 看到
如何修改 prefork 参数和启用 prefork 模式
[root@apache ~]# vim /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 500
</IfModule>
[root@apache ~]# vim /usr/local/http-2.4.23/conf/httpd.conf
# 注释掉当前的工作模式,开启新的工作模式
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
Include conf/extra/httpd-mpm.conf
重启服务
[root@apache ~]# systemctl restart httpd
和 prefork 模式相比,worker 使用了多进程和多线程的混合模式,worker 模式也同样会先预 派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会 被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间, 因此,内存的占用会减少一些,在高并发的场景下会比 prefork 有更多可用的线程,表现会 更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是 多个线程出现问题,也只是影响 Apache 的一部分,而不是全部。由于用到多进程多线程, 需要考虑到线程的安全了,在使用 keep-alive 长连接的时候,某个线程会一直被占用,即使 中间没有请求,需要等待到超时才会被释放(该问题在 prefork 模式下也存在)
总的来说,prefork 方式速度要稍高于 worker,然而它需要的 cpu 和 memory 资源也稍多于 woker
# worker MPM
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
StartServers:apache 启动时候默认开始的子进程数
MinSpareThreads:最小空闲数量的工作线程
MaxSpareThreads:最大空闲数量的工作线程
ThreadsPerChild:每个子进程产生的线程数量
MaxRequestWorkers:与 prefork 模式相同
MaxConnectionsPerChild:与 prefork 模式相同
Worker 由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的 ThreadsPerChild 线程数,各个线程独立地处理请求。同样, 为了不在请求到来时再生成线 程,MinSpareThreads 和 MaxSpareThreads 设置了最少和最多的空闲线程数;
而 MaxRequestWorkers 设置了同时连入的 clients 最大总数。如果现有子进程中的线程总数不 能满足负载,控制进程将派生新的子进程
MinSpareThreads 和 MaxSpareThreads 的最大缺省值分别是 75 和 250。这两个参数对 Apache 的性能影响并不大,可以按照实际情况相应调节
ThreadsPerChild 是 worker MPM 中与性能相关最密切的指令。ThreadsPerChild 的最大 缺省值是 64,如果负载较大,64 也是不够的。这时要显式使用 ThreadLimit 指令,它的最大 缺省值是 20000。
Worker 模式下所能同时处理的请求总数是由子进程总数乘以 ThreadsPerChild 值决定 的,应该大于等于 MaxRequestWorkers。如果负载很大,现有的子进程数不能满足时,控制 进程会派生新的子进程。默认最大的子进程总数是 16,加大时 也需要显式声明 ServerLimit (系统配置的最大进程数量,最大值是 20000)。需要注意的是,如果显式声明了 ServerLimit, 那么它乘以 ThreadsPerChild的值必须大于等于MaxRequestWorkers,而且MaxRequestWorkers 必须是 ThreadsPerChild 的整数倍,否则 Apache 将会自动调节到一个相应值
线程是指进程内的一个执行单元,也是进程内的可调度实体
与进程的区别:
(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程 有自己独立的地址空间;
(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
(3)线程是处理器调度的基本单位,但进程不是
(4)二者均可并发执行.
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对 应用的并发性
进程和线程的区别在于:
简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程 序的运行效率
这是 Apache 最新的工作模式,是 worker 模式的变种,它把服务进程从连接中分离出来,一 worker 模式不同的是在于它解决了 keep-alive 长连接的时候占用线程资源被浪费的问题,在 event 工作模式中,会有一些专门的线程用来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并 发场景下的请求处理。event 模式不能很好的支持 https 的访问(HTTP 认证相关的问题)
KeepAlive 指的是保持连接活跃,换一句话说,如果将 KeepAlive 设置为 On,那么来自 同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负 担。一般情况下,图片较多的网站应该把 KeepAlive 设为 On
如果第二次请求和第一次请求之间超过 KeepAliveTimeOut 的时间的话,第一次连接就会 中断,再新建第二个连接。它的设置一般考虑图片或者 JS 等文件两次请求间隔,一般设置 为 3-5 秒
一次连接可以进行的 HTTP 请求的最大请求次数。将其值设为 0 将支持在一次连接内进 行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面,通常达不到这个 上限就完成连接了
如果是使用 on,那么只有进行一次反查,如果用 double,那么进行反查之后还要进行一次 正向解析,只有两次的结果互相符合才行,而 off 就是不进行域名验证。 如果为了安全,建议使用 double;为了加快访问速度,建议使用 off。 域名查找开启这个会增加 apache 的负担, 减慢访问速度建议关闭
推荐 5 这个是 apache 接受请求或者发出相应的时间超过这个时间断开
注:以上配置项可在/usr/local/http-2.4.23/conf/extra/httpd-default.conf 设置并在 httpd.conf 文件中通过 include 选项引用
设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所以 一般没有必要调整这个参数
设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当 前空闲子进程数少于 MinSpareServers ,那么 Apache 将以最大每秒一个的速度产生新的子进 程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意
设置空闲子进程的最大数量。如果当前有超过 MaxSpareServers 数量的空闲子进程,那么 父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太 大通常是一个坏主意。如果你将该指令的值设置为比 MinSpareServers 小,Apache 将会自动将 其修改成”MinSpareServers+1″
服务器允许配置的进程数上限。只有在你需要将 MaxClients 设置成高于默认值 256 的时 候才需要使用。要将此指令的值保持和 MaxClients 一样。修改此指令的值必须完全停止服务 后再启动才能生效,以 restart 方式重启动将不会生效
用于客户端请求的最大请求数量(最大子进程数),任何超过 MaxClients 限制的请求都 将进入等候队列。默认值是 256,如果要提高这个值必须同时提高 ServerLimit 的值。建议将初始值设为(以 Mb 为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台 4G 内存的机器,那么初始值就是 4000/2=2000。
设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请 求后将自动销毁。0 意味着无限,即子进程永不销毁。内存较大的服务器可以设置为 0 或较 大的数字。内存较小的服务器不妨设置成 30、50、100。所以一般情况下,如果你发现服务 器的内存直线上升,建议修改该参数试试
效,以 restart 方式重启动将不会生效
用于客户端请求的最大请求数量(最大子进程数),任何超过 MaxClients 限制的请求都 将进入等候队列。默认值是 256,如果要提高这个值必须同时提高 ServerLimit 的值。建议将初始值设为(以 Mb 为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台 4G 内存的机器,那么初始值就是 4000/2=2000。
设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请 求后将自动销毁。0 意味着无限,即子进程永不销毁。内存较大的服务器可以设置为 0 或较 大的数字。内存较小的服务器不妨设置成 30、50、100。所以一般情况下,如果你发现服务 器的内存直线上升,建议修改该参数试试
注:以上配置项可在/usr/local/http-2.4.23/conf/extra/httpd-mpm.conf 设置并在 httpd.conf 文 件中通过 include 选项引用