apache安装及工做模式

博文结构
安装apache
工做模式javascript

一.编译安装apache2.4.23

新版本的 httpd-2.4 新增如下特性;
新增模块; mod_proxy_fcgi(可提供 fcgi 代理)
mod_ratelimit(限制用户带宽)
mod_request(请求模块,对请求作过滤)
mod_remoteip(匹配客户端的 IP 地址)
对于基于 IP 的访问控制作了修改,再也不支持 allow,deny,order 机制,而是统一使用 require 进行 php

  • 新增如下几条新特性;
    一、MPM 支持在运行时装载;不过要开启这种特性,在编译安装要启用这三种功能; --enable-mpms-shared=all --with-mpm=event
    二、支持 event
    三、支持异步读写
    四、在每一个模块及每一个目录上指定日志级别
    五、加强版的表达式分析器
    六、每请求配置:<If>, <Elseif>
    七、毫秒级别的 keepalive timeout
    八、基于 FQDN 的虚拟主机再也不须要 NameVirtualHost 指令
    九、支持使用自定义变量 css

  • 安装环境:操做系统:Centos7.2,关闭 selinux 检查 httpd 包是否安装,如查安装则卸载

下载源码包java

注:apr(Apache Portable Runtime)Apache 可移植运行库,它是一个对操做系统调用的抽 象库,用来实现 Apache 内部组件对操做系统的使用,提升系统的可移植性。 安装 apr 和 apr-util
linux

  • 解压缩
[root@localhost media]# ls
apr-1.5.2.tar.gz       cronolog-1.6.2.tar.gz  openssl-1.0.1u.tar.gz
apr-util-1.5.4.tar.gz  httpd-2.4.23.tar.gz    pcre-8.39.tar.gz
[root@localhost media]# tar zxf apr-1.5.2.tar.gz -C /usr/src/
[root@localhost media]# tar zxf apr-util-1.5.4.tar.gz  -C /usr/src/
[root@localhost media]tar zxf zlib-1.2.8.tar.gz   -C /usr/src/
[root@localhost media]# tar zxf pcre-8.39.tar.gz -C /usr/src/
[root@localhost media]# tar zxf httpd-2.4.23.tar.gz -C /usr/src/
[root@localhost media]# tar zxf openssl-1.0.1u.tar.gz -C /usr/src/
  • 安装
[root@localhost src]# cd /usr/src/
[root@localhost src]# ls
apr-1.5.2  apr-util-1.5.4  debug  httpd-2.4.23  kernels  openssl-1.0.1u  pcre-8.39
[root@localhost src]# cd apr-1.5.2/
[root@www apr-1.5.2]# ./configure --prefix=/usr/local/apr 
[root@www apr-1.5.2]# make && make install 
[root@www ~]# cd apr-util-1.5.4/ 
[root@www apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr 
[root@www apr-util-1.5.4]# make && make install
  • 安装zlib
[root@www ~]# cd zlib-1.2.8/ 
[root@www zlib-1.2.8]# ./configure --prefix=/usr/local/zlib 
[root@www zlib-1.2.8]# make && make install
  • 安装pcre
[root@www ~]# cd pcre-8.39/
[root@www pcre-8.39]# ./configure --prefix=/usr/local/pcre 
[root@www pcre-8.39]# make && make install
  • 安装openssl

安装 apache2.4.23 时提示 openssl 版本太低,centos7 自带版本 openssl-1.0.1e web

[root@www ~]# cd openssl-1.0.1u/
[root@www openssl-1.0.1u]# ./config -fPIC --prefix=/usr/local/openssl enable-shared
[root@www openssl-1.0.1u]# make && make install
[root@www ~]# mv /usr/bin/openssl /usr/bin/openssl.1.0.1e
[root@www ~]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl apache

  • 安装 apache2.4.23
[root@www ~]# cd httpd-2.4.23/ 
[root@www 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-modules=most --enable-mods-shared=most --enable-mpms-shared=all --with-mpm=event--enable-proxy --enable-proxy-fcgi --enable-expires --enable-deflate 
[root@www httpd-2.4.23]# make && make install 
[root@www httpd-2.4.23]# ln -s /usr/local/http-2.4.23/bin/* /usr/local/bin/ 
\\优化 http 程序执行路径 
[root@www httpd-2.4.23]# ln -s /usr/local/http-2.4.23/bin/* /usr/local/bin
\\修改配置文件 httpd.conf,设置其中的 ServerName 值 
[root@www /]# /usr/local/http-2.4.23/apachectl start
[root@www httpd-2.4.23]# cp /usr/local/http-2.4.23/bin/apachectl /etc/init.d/httpd 
\\开机后自动启动 
[root@www httpd-2.4.23]# vi /etc/init.d/httpd   \\添加下面俩行带#
# chkconfig: 35 85 15 (在 3 和 5 启动模式下的--启动优先级)
# description: apache 2.4.23 
[root@www httpd-2.4.23]# chkconfig --add httpd 
[root@www httpd-2.4.23]# chkconfig httpd on
\\将 Apache 加入开机自动启动
[root@www httpd-2.4.23]# service  httpd start 
[root@www httpd-2.4.23]# netstat -anplt | grep 80 tcp6      
0      0 :::80                   :::*       LISTEN      4807/httpd

参数解释:vim

--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 二进制文件的模块,<MODULE-LIST>为 空格分隔的模块名列表、all 或者 most,all 表示包含全部模块,most 表示包含大部分经常使用模 块 
--enable-mods-shared=most:明确指明要以 DSO 方式编译的模块,<MODULE-LIST>为空格分隔 的模块名列表、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 的安装路径

二.apache的优化及模块解释

apache 所运行的硬件环境都是对性能影响最大的因素,即便不能对硬件进行升级,也最好 给 apache 一个单独的主机以避免受到其余应用的干扰。各个硬件指标中,对性能影响最大的 是内存,对于静态内容(图片、javascript 文件、css 文件等),它决定了 apache 能够缓存多 少内容,它缓存的内容越多,在硬盘上读取内容的机会就越少,大内存能够极大提升静态站 点的速度;对动态高负载站点来讲,每一个请求保存的时间更多一些,apache 的 mpm 模块会 为每一个请求派生出相应的进程或线程分别处理,而进程或线程的数量与内存的消耗近似成正 比,所以增大内存对提升动态站点的负载和运行速度也极为有利  其次是硬盘的速度,静态站点尤其突出,apache 不断的在读取文件并发送给相应的请求, 硬盘的读写是极其频繁的;动态站点也要不断的加载 web 程序(php 等),一个请求甚至要读 取十几个文件才能处理完成,所以尽量的提升硬盘速度和质量对提升 apache 的性能是有 积极意义的。  最后是 cpu 和网络,cpu 影响的是 web 程序执行速度,网络影响流量大小。
  • 工做模式

Apache HTTP 服务器被设计为一个强大的、灵活的可以在多种平台以及不一样环境下工做的服 务器。这种模块化的设计就叫作“多进程处理模块”(Multi-Processing Module,MPM),也叫 作工做模式centos

注:若是要更改工做模式里面的进程须要到主配置文件里面把
[root@www ~]# vi /usr/local/http-2.4.23/conf/httpd.conf
Include conf/extra/httpd-mpm.conf \这条前面#去掉就能够更改进程了(大约在456页搜索mpm)

[root@www /]# ps -ef | grep httpd \看进程
[root@www /]# apachectl -t \jian检查语法缓存

  • Prefork 模式(一个非线程型的)

其工做方式:当Apache服务启动后,mpm_prefork模块会预先建立多个子进程(默认为5个),每一个子进程只有一个线程,当接收到客户端请求后,mpm_prefork模块再将请求转交给子进程进行处理,而且每一个子进程同时只能用于单个请求。若是当前的请求数将超过预先建立的子进程数时,mpm_prefork模块就会建立新的子进程来处理额外的请求。

apache安装及工做模式

  • 开启prefork模式的方法:
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf
//编写httpd的主配置文件,修改一下内容
Include conf/extra/httpd-mpm.conf                     //默认存在删除“#”号便可
#LoadModule mpm_event_module modules/mod_mpm_event.so
//添加#号
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
//默认存在,删除#号便可!
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
//这三行即是apache的三种工做模式,可根据实际状况进行切换
[root@localhost ~]# systemctl restart httpd      //从新启动httpd服务
[root@localhost ~]# systemctl start httpd     //手动再启动一下
[root@localhost ~]# httpd -V      //查看httpd的工做模式
//找到这一行便可
Server MPM:     prefork                //能够看到如今Apache工做在prefork模式
[root@www ~]# apachectl –l  //小写 L,只显示静态模块)
  • 修改 prefork 参数
[root@www ~]# vi /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf 
//设置prefork模式也就只有这几个参数,具体含义:
<IfModule mpm_prefork_module>            //这就是prefork工做模式的参数-
    StartServers             5                //apache启动时默认开启的子进程数
    MinSpareServers          5                  //最小的闲置子进程数
    MaxSpareServers         10               //最大的闲置子进程数
    MaxRequestWorkers      250        // 设置了容许同时的最大接入请求数量
    MaxConnectionsPerChild   0         //0表示每一个子进程处理完数据后进程永不销毁,设置成非0时,可防止内存泄漏,服务器在负载小时自动减小本身进程数
</IfModule>

apache安装及工做模式

  • 注 1:MaxRequestWorkers 是这些指令中最为重要的一个,设定的是 Apache 能够同时处理 的请求,是对 Apache 性能影响最大的参数。若是请求总数已达到这个值(可经过 ps -ef|grep http|wc -l 来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源 还剩下不少而 HTTP 访问却很慢的主要缘由。虽然理论上这个值越大,能够处理的请求就越 多,建议将初始值设为(以 Mb 为单位的最大物理内存/2),而后根据负载状况进行动态调整。 好比一台 4G 内存的机器,那么初始值就是 4000/2=2000
  • 注 2:prefork 控制进程在最初创建“StartServers”个子进程后,为了知足 MinSpareServers 设置的须要建立一个进程,等待一秒钟,继续建立两个,再等待一秒钟,继续建立四个……如 此按指数级增长建立的进程数,最多达到每秒 32 个,直到知足 MinSpareServers 设置的值为止。这种模式 能够没必要在请求到来时再产生新的进程,从而减少了系统开销以增长性能。 MaxSpareServers 设置了最大的空闲进程数,若是空闲进程数大于这个 值,Apache 会自动 kill 掉一些多余进程。这个值不要设得过大,但若是设的值比 MinSpareServers 小,Apache 会自 动把其调整为 MinSpareServers+1。若是站点负载较大,可考虑同时加大 MinSpareServers 和 MaxSpareServers。
  • 注 3:ServerLimit 和 MaxClients(MaxRequestWorkers)有什么区别呢? 是由于在 apache1 时代,控制最大进程数只有 MaxClients 这个参数,而且这个参数最大值为 256,而且是写死了的,试图设置为超过 256 是无效的,这是因为 apache1 时代的服务器硬 件限制的。可是 apache2 时代因为服务器硬件的升级,硬件已经再也不是限制,因此使用 ServerLimit 这个参数来控制最大进程数,ServerLimit 值>=MaxClient 值才有效。ServerLimit 要放在 MaxClients 以前,值要不小于 MaxClients

优势:成熟,兼容全部新老模块。进程之间彻底独立,使得它很是稳定。同时,不须要担忧线程安全的问题。(咱们经常使用的mod_php,PHP的拓展不须要支持线程安全)

缺点:一个进程相对占用更多的系统资源,消耗更多的内存。并且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。

  • Worker 模式(多线程多进程)

和 prefork 模式相比,worker 使用了多进程和多线程的混合模式,worker 模式也一样会先预派生一些子进程,而后每一个子进程建立一些线程,同时包括一个监听线程,每一个请求过来会 被分配到一个线程来服务。线程比起进程会更轻量,由于线程是经过共享父进程的内存空间, 所以,内存的占用会减小一些,在高并发的场景下会比 prefork 有更多可用的线程,表现会 更优秀一些;另外,若是一个线程出现了问题也会致使同一进程下的线程出现问题,若是是 多个线程出现问题,也只是影响 Apache 的一部分,而不是所有。因为用到多进程多线程, 须要考虑到线程的安全了,在使用 keep-alive 长链接的时候,某个线程会一直被占用,即便 中间没有请求,须要等待到超时才会被释放(该问题在 prefork 模式下也存在) 总的来讲,prefork 方式速度要稍高于 worker,然而它须要的 cpu 和 memory 资源也稍多于 woker。

apache安装及工做模式

  • work模式的配置
/自行修改httpd主配置文件,切换模式并重启服务,接下来
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf 
<IfModule mpm_worker_module>       //这是worker工做模式的参数
    StartServers             3                  //apache启动时默认开始的子进程数
    MinSpareThreads         75            //最小空闲数量的工做线程-
    MaxSpareThreads        250          //最大空闲数量的工做线程-
    ThreadsPerChild         25              //每一个子进程产生的线程数量
    MaxRequestWorkers      400        //每一个进程最大接受的请求数量
    MaxConnectionsPerChild   0         //表示永不销毁
</IfModule>

apache安装及工做模式

Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild 值决定的,应该大于等于MaxRequestWorkers。若是负载很大,现有的子进程数不能知足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时 也须要显式声明ServerLimit(最大值是20000)。须要注意的是,若是显式声明了ServerLimit,那么它乘以 ThreadsPerChild的值必须大于等于MaxRequestWorkers,并且MaxRequestWorkers必须是ThreadsPerChild的整数倍,不然 Apache将会自动调节到一个相应值。

优势:占据更少的内存,高并发下表现更优秀。

缺点:必须考虑线程安全的问题,由于多个子线程是共享父进程的内存地址的。若是使用keep-alive的长链接方式,也许中间几乎没有请求,这时就会发生阻塞,线程被挂起,须要一直等待到超时才会被释放。若是过多的线程,被这样占据,也会致使在高并发场景下的无服务线程可用。(该问题在prefork模式下,一样会发生)。

  • Event 模式 多进程+多线程+epoll

这是 Apache 最新的工做模式,是 worker 模式的变种,它把服务进程从链接中分离出来,一 worker 模式不一样的是在于它解决了 keep-alive 长链接的时候占用线程资源被浪费的问题,在 event 工做模式中,会有一些专门的线程用来管理这些 keep-alive 类型的线程,当有真实请
求过来的时候,将请求传递给服务器的线程,执行完毕后,又容许它释放。这加强了在高并 发场景下的请求处理。event 模式不能很好的支持 https 的访问(HTTP 认证相关的问题)。

apache安装及工做模式

  • 进程与线程的区别
地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有本身独立的地址空间;
资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源;
线程是处理器调度的基本单位,但进程不是;
两者都可并发执行;
相关文章
相关标签/搜索