Centos6.6下编译安装Apache2.2.31

安装环境:

[root@apache ~]# cat /etc/redhat-release
CentOS release 6.6 (Final)
[root@apache ~]# uname -r
2.6.32-504.el6.x86_64

Apache简介

APACHE是世界上最流行的Web服务器软件之一,当然,提供WWW服务的还有微软的IIS,它是由微软开发的,只能用在微软的操作系统上,而APACHE是一个自由软件。说到APACHE,还要联想到LAMP,这个近年来也是应用得非常广泛,LAMP就是:linux+apache+mysql+php。Apache的特点是简单、速度快、性能稳定。

Apache的特点

功能强大,配置简单,速度快,应用广泛,性能稳定可靠,并可做代理服务器或负载均衡来使用。

Apache的应用场合

使用Apache运行静态HTML网页,图片(处理静态小文件能力不及Nginx)

使用Apache结合PHP引擎运行PHP,Perl等程序,LAMP被称之为经典组合

使用Apache结合Tomcat/Resin运行JSP,JAVA等程序,成为中小企业的首选

使用Apache作代理,负载均衡,rewrite规则过滤等等

安装Apache

1:卸载系统默认安装的Apache软件包

一般来说,操作系统自带或者apache rpm包方法安装的apache版本都比较低,且更新不及时,因此我们需要卸载掉安装操作系统时默认被安装上的apache软件

通过rpm -qa httpd*命令,查询当前系统中已安装的apache软件包,具体查询操作过程如下:

rpm -qa httpd*
rpm -e --nodeps httpd-2.2.3-43.el5.centos.3

通过rpm -e --nodeps后面分别接查询到的apache软件包完整名称,即可卸载当前系统中通过rpm安装方式安装的apache软件包

--nodeps:Don’t do a dependency check,意思是不做软件间的依赖检查

对于具备一定经验的朋友,也可以直接执行下面的shell脚本命令来批量删除系统自带的apache软件包

for name in `rpm -qa httpd*`;do rpm -e --nodeps $name;done

2:安装zlib-devel包

yum install zlib-devel -y

3:开始安装Apache

Apache-2.2.31版本下载地址:

微云下载:https://share.weiyun.com/08ed2869f08f997cd6120b89e4e3b3b1

百度下载:http://pan.baidu.com/s/1pLoAS2n

tar zxvf httpd-2.2.31.tar.gz 
cd httpd-2.2.31

4:创建安装目录

[root@apache httpd-2.2.31]# mkdir /application

5:编译

./configure \
--prefix=/application/apache2.2.31 \
--enable-deflate \
--enable-expires \
--enable-headers \
--enable-modules=most \
--enable-so \
--with-mpm=worker \
--enable-rewrite

#编译参数说明:

#1. --prefix=/application/apache2.2.31 表示指定安装路径为:/application/apache2.2.31。如果不指定安装路径,则默认路径为:/usr/local/apache2

#2. --enable-deflate 提供对内容的压缩传输编码支持,一般html,js,css等内容的站点,使用此参数功能会大大提高传输速度,提升访问者访问体验。在生产环境中,这是apache调优的一个重要选项之一

#3. --enable-expires 激活允许通过配置文件控制http的“expires”和“cahe-control:”头内容,即对网站图片,JS,CSS等内容,提供在客户端浏览器缓存的设置。这是apache调优的一个重要选项之一

#4. --enable-headers 提供允许对HTTP请求头的控制

#5. --with-mpm=worker 选择apache mpm的模式为worker模式,因为worker模式原理是更多的使用线程处理请求,所以可以处理更多的并发请求,而系统资源的开销小于基于进程的mpm prefork。如果不指定此参数,默认的模式是prefork进程模式。有关apache模式的知识,后文会有详细阐述。这是apache调优的一个重要选项之一

#6. --enable-rewrite 提供基于URL规则的重写功能。即根据已知URL地址,转换其它想要的URL地址。如前文讲解的伪静态功能就是这个模块实现的。这是APACHE在生产环境中必用的一个重要功能。

#7. --enable-so 激活APACHE服务的DSO(全称dynamic shared object,动态共享对象)支持,即在以后可以以DSO的方式编译安装共享模块。这个模块本身不能以DSO方式编译。有关DSO的知识,后文讲解。

上面如果没有安装zlib-devel包,这步编译时会报如下错误:

checking for zlib location... not found
checking whether to enable mod_deflate... configure: error: mod_deflate has been requested but can not be built due to prerequisite failures

上面编译无误后执行下面的命令开始安装:

make
make install

6:创建软链接

[root@apache application]# ln -s apache2.2.31 apache
[root@apache application]# ll
total 4
lrwxrwxrwx  1 root root   12 Feb 15 10:30 apache -> apache2.2.31
drwxr-xr-x 15 root root 4096 Feb 15 10:30 apache2.2.31

查看APACHE编译的模块:

[root@apache application]# /application/apache/bin/apachectl -l
Compiled in modules:
  core.c
  mod_authn_file.c
  mod_authn_dbm.c
  mod_authn_anon.c
  mod_authn_dbd.c
  mod_authn_default.c
  mod_authz_host.c
  mod_authz_groupfile.c
  mod_authz_user.c
  mod_authz_dbm.c
  mod_authz_owner.c
....................................................

7:启动APACHE并测试

[root@apache application]# /application/apache/bin/apachectl start
httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.17.16 for ServerName
#第一次启动时,此提示可暂时忽略

查看80端口:

[root@apache application]# lsof -i :80
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   58925   root    4u  IPv6  50990      0t0  TCP *:http (LISTEN)
httpd   58927 daemon    4u  IPv6  50990      0t0  TCP *:http (LISTEN)
httpd   58928 daemon    4u  IPv6  50990      0t0  TCP *:http (LISTEN)
httpd   58929 daemon    4u  IPv6  50990      0t0  TCP *:http (LISTEN)

查看httpd进程:

[root@apache application]# ps -ef|grep httpd
root     58925     1  0 10:32 ?        00:00:00 /application/apache2.2.31/bin/httpd -k start
daemon   58926 58925  0 10:32 ?        00:00:00 /application/apache2.2.31/bin/httpd -k start
daemon   58927 58925  0 10:32 ?        00:00:00 /application/apache2.2.31/bin/httpd -k start
daemon   58928 58925  0 10:32 ?        00:00:00 /application/apache2.2.31/bin/httpd -k start
daemon   58929 58925  0 10:32 ?        00:00:00 /application/apache2.2.31/bin/httpd -k start

APACHE启动成功后,在浏览器输入该服务器IP地址,可看到It works!字样:

[root@apache application]# ifconfig eth0|awk -F '[ :]+' 'NR==2{print $4}'
192.168.17.21

Centos6.6下编译安装Apache2.2.31

如果出不来it works的内容页面,请从下面原因中依次排查:

1:iptables防火墙和selinux是否关闭

[root@apache application]# /etc/init.d/iptables stop

#这是关闭防火墙的命令,如果是生产环境请允许80端口的访问,而不是关闭防火墙

#允许命令如下:

iptables -I INPUT -p tcp --dport 80 -j ACCEPT

关闭selinux:

临时关闭:setenforce 0

永久关闭(修改配置文件):cat /etc/selinux/config|grep SELINUX=disabled

2:通过下面命令确认httpd端口80是否存在

[root@apache application]# netstat -lnput|grep 80
tcp        0      0 :::80                       :::*                        LISTEN      58925/httpd

3:查看是否有httpd进程存在

[root@apache application]# ps -ef|grep http
root     58925     1  0 10:32 ?        00:00:00 /application/apache2.2.31/bin/httpd -k start
daemon   58926 58925  0 10:32 ?        00:00:00 /application/apache2.2.31/bin/httpd -k start
daemon   58927 58925  0 10:32 ?        00:00:00 /application/apache2.2.31/bin/httpd -k start
daemon   58928 58925  0 10:32 ?        00:00:00 /application/apache2.2.31/bin/httpd -k start
daemon   58929 58925  0 10:32 ?        00:00:00 /application/apache2.2.31/bin/httpd -k start
daemon   59016 58925  0 10:34 ?        00:00:00 /application/apache2.2.31/bin/httpd -k start

4:在服务器本地wget http://192.168.17.16 测试

注意:如果前面第2步和第3步都不符合要求,这步就不用查了,一定不行,直接下一步检查

这里把服务器本地当作客户端模拟用户检查http服务,此条的检查比第2步第3步的检查会更准确。同时可以排除防火墙的干扰来检查http服务,如果正常访问,说明apache服务没问题,那么就是网络或防火墙等问题了。

5:查看apache的错误日志看看是否有特殊异常

如果以上5条全都注意到了,基本问题就可以解决,如果是2,3步异常,则可以查看apache错误日志,获取信息

[root@apache application]# tail -10 /application/apache/logs/error_log

APACHE的默认站点目录,是安装目录下的/apache/htdocs,这可以从APACHE主配置文件/application/apache/conf/httpd.conf中可以查到:

[root@Web-Lamp application]# grep -i documentroot ./apache/conf/httpd.conf 
# DocumentRoot: The directory out of which you will serve your
DocumentRoot "/application/apache2.2.31/htdocs"
# This should be changed to whatever you set DocumentRoot to.
# access content that does not live under the DocumentRoot.

此时,如果要部署网站服务,只需要把开发好的程序放置到/application/apache2.2.32/htdocs目录下即可!至此Apache的安装已完成!

APACHE的目录结构

[root@Web-Lamp apache]# tree bin
bin
├── ab          #APACHE HTTP服务器性能测试工具,简单,易用。同类软件还有jmeter,loadrunner,webbench等
├── apachectl           #这是APACHE的启动命令,需重点掌握,apachectl是一个脚本
├── apxs                #apxs是一个为apache http服务器编译和安装扩展模块的工具,在进行DSO方式模块编译时会用到
              #后文在编译php软件时就用到此命令,如:--with-apxs2=/application/apache/apxs
├── htcacheclean    #这是清理磁盘缓冲区的命令,需要在编译时指定相关参数才可使用,一般用的很少
├── htpasswd            #建立和更新基本认证文件,如:配置nagios等监控服务时会用到
├── httpd               #此为apache的控制命令程序,apachectl执行时会调用httpd
└── rotatelogs  #apache自带的日志轮询命令,也还可以用,但在实际生产环境中习惯由cronolog替换它
提示:以上目录只列出了工作中比较常用的命令,其它末使用过的略过!

[root@Web-Lamp apache]# tree conf
conf
├── extra               #这是额外的apache配置文件目录,这个目录里的文件会经常访问修改:如httpd-vhosts.conf
├── httpd.conf  #apache的主配置文件,这个文件我们会经常访问修改,其中的每一行参数都应该弄清楚

APACHE扩展的配置文件

apache的扩展配置文件是通过在httpd.conf主配置文件中嵌入include命令实现的,不过默认情况下是注释状态。如下所示:

395 # Virtual hosts
396 #Include conf/extra/httpd-vhosts.conf

通过tree命令列出apache扩展的配置文件的在目录的配置文件

[root@Web-Lamp apache]# tree conf/extra
conf/extra
├── httpd-autoindex.conf
├── httpd-dav.conf
├── httpd-default.conf          #这个文件里配置的是apache的相关服务参数,如:超时时间,保持连接时间等
├── httpd-info.conf
├── httpd-languages.conf                #语言支持配置
├── httpd-manual.conf
├── httpd-mpm.conf              #服务器池管理,也就是优化apache的一个配置文件,如:选择apache的模式连接数等,常用的模式有worker模式和profork模式,默认情况下是profork模式!
├── httpd-multilang-errordoc.conf
├── httpd-ssl.conf                              #提供apache SSL支持配置文件
├── httpd-userdir.conf
└── httpd-vhosts.conf                   #虚拟主机配置文件

APACHE虚拟主机的配置文件

[root@Web-Lamp apache]# grep -Ev "^#|^$" conf/extra/httpd-vhosts.conf 
NameVirtualHost *:80
#这里表示使用基于名称的虚拟主机配置,这是生产环境下最常用的配置。*:80中的*表示监听本机所有IP地址,80表示在80端口上提供http服务。如果*改为具体IP,就表示监听本机指定IP地址的服务请求
<VirtualHost *:80>                #定义一个虚拟主机,监听本机所有IP地址80端口上提供的http服务请求
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/application/apache2.2.31/docs/dummy-host.example.com"
    ServerName dummy-host.example.com
ServerAlias www.dummy-host.example.com
#这是配置虚拟机的别名,也就是可以配置多个域名访问同一个站点,如:此处配置成baidu.com,则输入baidu.com可以得到和www.baidu.com同样的结果,此功能需要apache mode_alias模块支持
    ErrorLog "logs/dummy-host.example.com-error_log"
    CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot "/application/apache2.2.31/docs/dummy-host2.example.com"
    ServerName dummy-host2.example.com
    ErrorLog "logs/dummy-host2.example.com-error_log"
    CustomLog "logs/dummy-host2.example.com-access_log" common
</VirtualHost>

基于域名的虚拟主机实战配置

开启主配置文件httpd.cond中包含httpd-vhost.conf文件的配置:

[root@Web-Lamp apache]# vim /application/apache/conf/httpd.conf 
395 # Virtual hosts
396 Include conf/extra/httpd-vhosts.conf                        #将此行前面的#号去掉

配置httpd-vhosts.conf文件:

[root@Web-Lamp extra]# cp httpd-vhosts.conf httpd-vhosts.conf.poe.20161010

备份后把httpd-vhosts.conf文件中的<VirtualHost *.80></VirtualHost>删除,只保留一个,然后在这一个的基础上修改

[root@Web-Lamp extra]# vi httpd-vhosts.conf ##修改完后的配置文件如下
<VirtualHost *:80>
    ServerAdmin 33794712@qq.com
    DocumentRoot "/application/apache/htdocs/blog"
    ServerName blog.ginvip.com
    ErrorLog "logs/blog-error_log"
    CustomLog "logs/blog-access_log" common
</VirtualHost>

在主配置文件httpd.conf中添加如下内容:

############## blog.ginvip.com config by Gin ##################
<Directory "/application/apache/htdocs/blog">
        Options -Indexes FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
</Directory>

添加域名IP到/etc/hosts文件中

192.168.17.21   blog.ginvip.com

在/application/apache/htdocs/blog目录中添加测试文件(blog目录如果没有,新建):

[root@Lamp apache]# echo "this is apache test" >/application/apache/htdocs/blog/index.html

检查修改过的apache配置文件的语法:

生产环境中这一步,特别重要,它让你在重起前可以查出配置文件中的错误,如果没有此步,很可能会因为配置错误,而导致网站短时宕机,这在正规互联网公司是无法接受的,即使公司可以接受,我们也要表现的更专业。

[root@Lamp apache]# /application/apache/bin/apachectl -t
Syntax OK

httpd:Coun dot......这一行的提示解决方案:

[root@Web-Lamp conf]# vim httpd.conf 
96 # If your host doesn't have a registered DNS name, enter its IP address here.
97 #如果你没有注册的DNS域名,这里可以输入IP地址
98 #ServerName www.example.com:80
99 
100 ServerName 192.168.17.21

再次检查语法:

[root@Web-Lamp conf]# /application/apache/bin/apachectl -t
Syntax OK

语法检查通过后,执行graceful参数重起apache服务:

[root@Web-Lamp apache]# bin/apachectl graceful

注意:这里是graceful参数,而不是restart参数,graceful表示优雅地重启,这个参数可以在重启时使正在浏览器的访问的用户无感知,即重启时不会强行中断用户的访问请求,而是处理完毕后再重新启动。这个graceful参数在生产环境中是非常重要,请在重启时务必使用graceful替代restart参数

win主机上测试:

Centos6.6下编译安装Apache2.2.31

Linux主机测试:

[root@Lamp apache]# curl -I blog.ginvip.com
HTTP/1.1 200 OK                   ##状态码为200说明OK
Date: Sun, 19 Feb 2017 11:05:05 GMT
Server: Apache/2.2.31 (Unix) DAV/2
Last-Modified: Sun, 19 Feb 2017 11:02:51 GMT
ETag: "3f9df-14-548e0168e5df0"
Accept-Ranges: bytes
Content-Length: 20
Content-Type: text/html

apache服务Forbidden403问题

通常情况下(但不限于此)的原因有:

1)apache配置文件中没有对站点目录的权限许可配置,这通常是在初始安装apache后,更改了默认的apache站点目录所致!如编译安装apache(假定安装目录为/application/apache2.2.32)后,将站点目录更改为其他路径:/var/html,则在apache配置文件中的配置也要相应的改变此目录路径

2)站点目录下无首页(index)文件,而apache的配置又禁止了目录浏览器,就会提示403错误

3)Directory权限问题

4)站点目录原因,站点目录需要apache的用户访问权限

APACHE日志轮询

Apache自带的rotatorog轮询功能,有可能会丢失日志,所以生产场景不用!而使用cronolog

微云下载:https://share.weiyun.com/ab4674560b19babd028640e5c9676bcf

百度下载:http://pan.baidu.com/s/1dE2SltZ

tar zxvf cronolog-1.6.2.tar.gz 
cd cronolog-1.6.2
./configure 
make
make install
ll /usr/local/sbin/cronolog
/usr/local/sbin/cronolog

cronolog日志按天轮询轮询配置说明:(生产环境常见用法,推荐使用):

<VirtualHost *:80>
    ServerAdmin 33794712@qq.com
    DocumentRoot "/application/apache/htdocs/blog"
    ServerName blog.ginvip.com
    ErrorLog "logs/blog-error_log"
    #CustomLog "logs/blog-access_log" common
    CustomLog "|/usr/local/sbin/cronolog /application/apache/logs/access_www_%Y%m%d.log" combined
</VirtualHost>

按其它时间轮询:

access_www_%Y%m%d.log ===》按天轮询

access_www_%Y%m%d%H.log ===》按小时轮询

access_www_%w.log ===》按周轮询

注意:日志路径不能使用相对路径,一定要使用绝对路径

Apache日志不记录指定格式元素日志

当计算日志PV时一般不希望统计图片元素的日志,因为,打开一个页面才是一个PV,而RS服务器也不希望记录来自前端负载均衡健康检查的无用日志。整个配置需要mod_setenvif模块的支持!看下面的案例:

案例1:Apache不记录图片的日志

统计日志PV时一个页面才算一个PV,而图片,JS,CSS等只是图片的元素,如果记录在日志里,然后按日志行计算PV就不准确了,所以可考虑不记录图片等的日志

编辑httpd.conf文件,在文件中加入以下几行:

<FilesMath "\.(css|js|gif|png|ico|jpeg|swf)">
    SetEnv IMAG 1
</FilesMath>

编辑httpd-vhosts.conf文件,修改cronolog日志一行为:

CustomLog “|/usr/local/sbin/cronolog /app/logs/%Y/%m/%m/access_%Y%m%d.log” combined env=!IMAG

案例2:RS服务器不记录负载均衡健康检查日志

虚拟主机不记录负载均衡向下健康检查文件的日志(check.txt):

SetEnvIf   Request_URI     “^/check\.txt$”         dontlog
CustomLog               /var/log/httpd/vhost_access.log combined        env=!dontlog

案例3:日志IP统计

#法一:
[root@apache apache]# awk '{++S[$1]} END {for (key in S) print S[key],key}' logs/access_madsale_20170215.log |sort -rn -k1
20 192.168.17.1
1 192.168.17.16
#法二:
[root@apache apache]# awk '{print $1}' logs/access_madsale_20170215.log|sort|uniq -c
     20 192.168.17.1
      1 192.168.17.16

worker/prefork模式说明及优化配置

查看已安装的是worker还是prefork模式:

[root@Lamp apache]# /application/apache/bin/apachectl -l|grep -E "worker|prefork"
  worker.c

prefork模式:

prefork使用的是多个子进程,而每个子进程只有一个线程,每个进程在某个确定的时间只能维持一个连接

工作原理:

控制进程最初建立若干个子进程,为了不在请求到来时再生成子进程,所以要根据需求不断的创建新的子进程,最大可以达到每秒32个直到满足需求为止。

安装方法:

在编译的过程中,加入--with-mpm=prefork,如果不加也可以,因为默认就是采用prefork模式

优点:效率高,稳定,安全。对于线程调试困难的平台来说,调试更加容易些

缺点:和worker模式比消耗资源多

配置参数说明:

<IfModule mpm_prefork_module>
StartServers            5               #-->最初建立的子进程
MinStartServers         5                       #-->最小空闲进程数,如果空闲的进程小于设定值,APACHE会自动建立进程,如果服务器并发及负载大的话,可以考虑加大
MaxSpareServer          10                      #-->最大空闲进程数,如果空闲的进程大于设定值,APACHE会自动kill掉多余的进程,如果服务器负载大的话,可以考虑加大
MaxClients              150                     #-->设定的是APACHE可以同时处理的请求,是对APACHE性能影响最大的参数,就是APACHE可以同时处理的请求数,就是说,如果有150个用户在访问,那第第151个用户就要等之前的访问结束后才能访问
MaxRequestPerChild      0                       #-->每个子进程可处理的请求数。每个子进程在处理了“maxrequestsperchild”个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求。但如果设成非0值也有两点重要的好处:(1)可防止意外的内存泄漏 (2)在服务器负载下降的时候会自动减少子进程数。
</IfModule>

常用配置参考:

<IfModule mpm_prefork_module>
StartServer                     10
MinSpareServers                 10
MaxSpareServers                 15
ServerLimit                     2000
MaxClients                      1000
MaxRequestPerChild              5000
</IfModule>

worker模式

worker模式是Apache2.x新引进的模式,是线程与进程的结合,在workder模式下会有多个子进程,每个子进程又会有多个线程。每个线程在某相确定的时间只能维持一个连接

工作原理:

由主控制进程生成若干个子进程,而每个子进程中又包含固定的线程数,各个线程独立处理请求,同样为了不在请求到来时再生成线程,在配置文件中设置了最小和最大的空闲线程数及所有子进程中的线程总数,如果现有子进程中的线程总数不能满足并发及负载,控制进程将派生新的子进程。

安装方法:

在配置编译的过程中,加入参数--with-mpm=worker,如果不加的话系统会采用默认的worker模式

优点:内存占用比prefork模式低,适合高并发流量HTTP服务

缺点:假如一个线程崩溃,整个进程就会连同其任何线程一起“死掉”,由于线程共享内存空间,所以一个程式在运行时必须被系统识别为“每个线程都是安全的”。服务稳定性不如prefork模式

配置说明:

<IfModule mpm_worker_module>
StartServers 2                          #服务器启动时建立的子进程数,默认值是"3"。
MaxClients 150                          #允许同时伺服的最大接入请求数量(最大线程数量)。任何超过MaxClients限制的请求都将进入等候队列。默认值是"400",16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要增加MaxClients的时候,你必须同时增加ServerLimit的值。
MinSpareThreads 25              #最小空闲线程数,默认值是"75"。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。
MaxSpareThreads 75              #设置最大空闲线程数。默认值是"250"。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正你设置的值:worker要求其大于等于MinSpareThreads加上ThreadsPerChild的和。
ThreadsPerChild 25              #每个子进程建立的常驻的执行线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。
MaxRequestsPerChild 0   #设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:1.可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
注意对于KeepAlive链接,只有第一个请求会被计数。事实上,它改变了每个子进程限制最大链接数量的行为。
</IfModule>

常用配置参考:

生产场景配置1:

<IfModule mpm_worker_module>
StartServers                            3
MaxClients                              2000
ServerLimit                             25
MinSpareThreads                         50
MaxSpareThreads                         200
ThreadLimit                             200
ThreadsPerChild                         100
MaxRequestsPerChild             0
</IfModule>

生产场景配置2:

<IfModule mpm_worker_module>
StartServers                            5
MaxClients                              9600
ServerLimit                             64
MinSpareThreads                         25
MaxSpareThreads                         500
ThreadLimit                             200
ThreadsPerChild                         150
MaxRequestsPerChild             0
</IfModule>

生产场景配置3:

<IfModule mpm_worker_module>
StartServers                            2
MaxClients                              500
ServerLimit                             25
MinSpareThreads                         25
MaxSpareThreads                         75
ThreadsPerChild                         25
MaxRequestsPerChild             0
</IfModule>

生产场景配置4:

<IfModule mpm_worker_module>
StartServers                            3
MaxClients                              1600
ServerLimit                             25
MinSpareThreads                         50
MaxSpareThreads                         200
ThreadLimit                             200
ThreadsPerChild                         64
</IfModule>

worker模式下所能同时处理的请求总数是由子进程总数乘以Threadsperchild值决定的,应该大于等于maxclients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。

默认最大的子进程总数是16,如需加大时也需要显式声明serverlimit的值(最大值是20000)

特别说明:

如果显式声明了serverlimit,那么乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是threadperchild的整数倍,否则APACHE将会自动调节到一个相应值(可能是个非期望值)

数学表达:

MaxClient <= 总的进程数(ServerLimit)*线程数(ThreadsPerChild)

MaxClient%ThreadsPerChild=0

注意:

worker MPM也有不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起“死掉”

配置方法:

vim /application/apache/conf/httpd.conf 
377 # Server-pool management (MPM specific)
378 Include conf/extra/httpd-mpm.conf                   #默认是注释的

vim conf/extra/httpd-mpm.conf           #在下面调整参数
 51 <IfModule mpm_worker_module>
 52     StartServers          2
 53     MaxClients          150
 54     MinSpareThreads      25
 55     MaxSpareThreads      75
 56     ThreadsPerChild      25
 57     MaxRequestsPerChild   0
 58 </IfModule>

基于IP的虚拟机主机实战配置

1:增加IP

如果要配置基于IP的虚拟主机,就需要每个虚拟主机有不同的IP,此处我们以增加别名的方式来临时增加一个IP(在负载均衡里此IP也被称为VIP):

[root@Web-Lamp poe]# ifconfig eth0:181 192.168.17.181 netmask 255.255.255.0 up
[root@Web-Lamp poe]# ifconfig eth0:181
eth0:181  Link encap:Ethernet  HWaddr 00:0C:29:C4:DA:53  
          inet addr:192.168.17.181  Bcast:192.168.17.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:19 Base address:0x2000 

如果需要删除该IP重新配置的话,使用命令:ifconfig eth0:181 donw即可删除重新配置;配置完成后,本虚拟机上就有两个IP:

[root@Web-Lamp poe]# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:0C:29:C4:DA:53  
          inet addr:192.168.17.12  Bcast:192.168.17.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fec4:da53/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2465 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1581 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:279948 (273.3 KiB)  TX bytes:263645 (257.4 KiB)
          Interrupt:19 Base address:0x2000 

eth0:181  Link encap:Ethernet  HWaddr 00:0C:29:C4:DA:53  
          inet addr:192.168.17.181  Bcast:192.168.17.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:19 Base address:0x2000

2:配置虚拟主机

[root@Web-Lamp extra]# cp httpd-vhosts.conf httpd-vhosts.conf.poe.20161011         #备份该文件
[root@Web-Lamp extra]# grep -Ev "#" httpd-vhosts.conf
NameVirtualHost *:80
<VirtualHost 192.168.17.20:80>
    ServerAdmin 33794712@qq.com
    DocumentRoot "/application/apache/htdoc/blog"
    ServerName 192.168.17.12
    #ServerAlias adminba.com
    ErrorLog "logs/blog-error_log"
        CustomLog "|/usr/local/sbin/cronolog /application/apache/logs/access_blog_%Y%m%d.log" combined
</VirtualHost>

基于端口的虚拟主机实战配置

基于端口的虚拟主机在生产环境中的应用也不多见,仅偶尔会用到,一般是为公司内部人员提供访问的,如页面的后台,CMS发布,PHPMYADMIN等。下面我们来讲其相关配置部署。

1:增加监听的端口

[root@Web-Lamp conf]# vim httpd.conf
[root@Web-Lamp conf]# grep "Listen" httpd.conf
Listen 80
Listen 8091
Listen 8092

提示:保留80端口,新增加8091与8092两个端口

2:配置httpd-vhosts.conf

[root@Web-Lamp conf]# grep -Ev "#" extra/httpd-vhosts.conf
<VirtualHost 192.168.17.12:8091>
    ServerAdmin 33794712@qq.com
    DocumentRoot "/var/html/blog"
    ServerName 192.168.17.12
    ServerAlias adminba.com
    ErrorLog "logs/blog-error_log"
        CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d.log" combined
</VirtualHost>

mod_deflate压缩模块应用指南

模块提供了DEFLATE 输出过滤器,允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽,同时提升用户体验。

A:编译安装httpd情况时是否已安装mod_flate

[root@Lamp apache]# /application/apache/bin/apachectl -l|grep mod_deflate
  mod_deflate.c

B:如果是以DSO方式编译,则查看方法为:

Centos6.6下编译安装Apache2.2.31

特别说明:以上两种情况下不能同时存在,否则可能会冲突!如果已经编译安装完了,就不需要再用DSO的方法编译安装了!

C:mod_deflate DSO安装方法

[root@Web-Lamp poe]# cd /server/tools/httpd-2.2.31/modules/filters
[root@Web-Lamp filters]# ll mod_deflate.c
-rw-r--r-- 1 1000 1000 63745 May 11  2015 mod_deflate.c
[root@Web-Lamp filters]# /application/apache/bin/apxs -c -i -a mod_deflate.c
[root@Web-Lamp filters]# grep defla /application/apache/conf/httpd.conf
LoadModule deflate_module     modules/mod_deflate.so

apxs参数说明:

-c 此选项表示需要执行编译操作。它首先会编译C源程序(.c)files为对应的目标代码文件(.o),然后连接这些目标代码和files中其余的目标代码文件(.o and .a),以生成动态共享对象dsofile。如果没有指定-o选项,则此输出文件名由files中的第一个文件名推测得到,也就是默认为mod_name.so

-i 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录中

-a 此选项自动增加一个LoadModuls行到httpd.conf文件中,以激活此模块,或者,如果此行已经存在,则启用之

DSO安装完后,检查语法,重启APACHE即可!

deflate在httpd.conf中应用:

整个配置十分简单,只需要把下面内容完整的复制到httpd.conf结尾保存即可使所有的虚拟主机生效。

环境1:可以在主配置中配置,也可以在虚拟主机中配置

<ifmodule mod_deflate.c>
DeflateCompressionLevel 9                                       #压缩等级,越大效率越高,耗C也高
SetOutPutFilter DEFLATE                                 #启用压缩
AddOutPutFilterEvType DEFLATE test/html text/plain text/xml             #以下3行设置压缩的类型
AddOutPutFilterEvType DEFLATE application/javascript
AddOutPutFilterEvType DEFLATE test/css
#DeflateFilterNote ratio                                #在日志中放置压缩率标记,下面是记录日志的,这个功能一般不用。
#LogFormat
#CustomLog logs/deflate_log.log deflate
</ifmodule>

环境2:

<ifmodule mod_deflate.c>
DeflateCompressionLevel 9       
SetOutPutFilter DEFLATE
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
</ifmodule>

环境3:某公司曾经的生产配置

<ifmodule mod_deflate.c>
DeflateCompressionLevel 9       
SetOutPutFilter DEFLATE
DeflateFilterNote Input instream
DeflateFilterNote Ouput outstream
DeflateFilterNote Ration ration
</ifmodule>

apache优化实战

错误页面优雅显示

可以将404等的错误信息页面重定向到网站首页或其它页面,提升用户体验

[root@Web-Lamp apache]# vim /application/apache/conf/httpd.conf 
347 # Some examples:
348 #ErrorDocument 500 "The server made a boo boo."
349 #ErrorDocument 404 /missing.html
350 #ErrorDocument 404 "/cgi-bin/missing_handler.pl"
351 #ErrorDocument 402 http://www.example.com/subscription_info.html
352 #
353 ErrorDocument 404 http://www.baidu.com                      #增加404页面

mod_deflate文件压缩功能

Gzip的思想就是把文件先在服务器端进行压缩,然后再传输,这样可以显著减少文件传输的大小。传输完毕后浏览器会重新对压缩过的内容进行解压缩,没特殊情况,所有的文本内容都应该被gzip压缩:html(php),js,css,xml,txt...,因为首页上还有很多广告代码投放的JS,这些广告代码拥有都的网站的JS没有经过gzip压缩,是由于需要每次加载进而统计来访信息。

添加以下内容到指定的虚拟主机中(也可加入到主配置文件中,这样就对全局生效):

<ifmodule mod_deflate.c>
                DeflateCompressionLevel 9
                SetOutputFilter DEFLATE
                DeflateFilterNote Input instream
                DeflateFilterNote Output outstream
                DeflateFilterNote Ratio ratio
                #LogFormat ‘”%r” %{outstream}n/%{instream}n (%{ratio}n%%)’ deflate
                #CunstomLog logs/deflate_log.log deflate
</ifmodule>

如:

36 <VirtualHost 192.168.17.181:8092>
 37     ServerAdmin 33794712@qq.com
 38     DocumentRoot "/var/html/bbs"
 39     ServerName 192.168.17.181
 40     ServerAlias adminba.com
 41     ErrorLog "logs/bbs-error_log"
 42     CustomLog "|/usr/local/sbin/cronolog /app/logs/access_bbs_%Y%m%d.log" combined
 43     <ifmodule mod_deflate.c>
 44         DeflateCompressionLevel 9
 45         SetOutputFilter DEFLATE
 46         DeflateFilterNote Input instream
 47         DeflateFilterNote Output outstream
 48         DeflateFilterNote Ratio ratio
 49         #LogFormat ‘”%r” %{outstream}n/%{instream}n (%{ratio}n%%)’ deflate
 50         #CunstomLog logs/deflate_log.log deflate
 51     </ifmodule>
 52 </VirtualHost>

仅压缩限制特定的MIME类型文件:

AddOutputFilterByType DEFLATE text/html text/plain text/xml
或
AddOutputFilterByType DEFLATE text/html text/plain text/xml test/css application/javascript

压缩测试工具:火狐浏览器插件 --> Yslow

Centos6.6下编译安装Apache2.2.31

mod_expires缓存功能

添加Expire/Cache-Control 头:Add Expires Header

现在越来越多的图片,脚本,CSS,FLASH被嵌入到页面中,当我们访问他们的时候势必会做许多次的http请求,其实我们可以通过设置expires header来缓存这些文件。Expires其实就是通过header报文来指定特定类型的文件在浏览器中缓存时间。大多数的图片,flash在发布后都是不需要经常修改的,做了缓存以后这样浏览器以后就不需要再从服务器下载这些文件而是直接从缓存中读取,这样再次访问页面的速度会大大加快。一个典型的HTTP1.1协议返回的头信息:

[root@Web-Lamp blog]# curl -I http://192.168.17.12:8091/
HTTP/1.1 200 OK
Date: Sun, 04 Dec 2016 12:25:15 GMT
Server: Apache/2.2.31 (Unix) DAV/2
Last-Modified: Sun, 04 Dec 2016 12:12:57 GMT
ETag: "424ee-e2-542d4176e35e6"
Accept-Ranges: bytes
Content-Length: 226
Vary: Accept-Encoding
Content-Type: text/html

配置方法

1)针对虚拟主机或者主配置文件

ExpiresActive on
        ExpiresDefault "access plus 12 month"
        ExpiresByType text/html "access plus 12 months"
ExpiresByType text/css "access plus 12 months"
ExpiresByType image/gif "access plus 12 months"
ExpiresByType image/jpeg "access plus 12 months"
ExpiresByType image/jpg "access plus 12 months"
ExpiresByType image/png "access plus 12 months"
EXpiresByType application/x-shockwave-flash "access plus 12 months"
EXpiresByType application/x-javascript "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"

将上面的代码加入到httpd-vhosts.conf配置文件中,如下:

<VirtualHost 192.168.17.12:8091>
    ServerAdmin 33794712@qq.com
    DocumentRoot "/var/html/blog"
    ServerName 192.168.17.12
    ServerAlias adminba.com
    ErrorLog "logs/blog-error_log"
    #CustomLog "logs/blog-access_log" common
        CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d.log" combined
        <ifmodule mod_deflate.c>
        DeflateCompressionLevel 9
        SetOutputFilter DEFLATE
        DeflateFilterNote Input instream
        DeflateFilterNote Output outstream
        DeflateFilterNote Ratio ratio
        #LogFormat ‘”%r” %{outstream}n/%{instream}n (%{ratio}n%%)’ deflate
        #CunstomLog logs/deflate_log.log deflate
        </ifmodule>
        ExpiresActive on
        ExpiresDefault "access plus 12 month"
        ExpiresByType text/html "access plus 12 months"
        ExpiresByType text/css "access plus 12 months"
        ExpiresByType image/gif "access plus 12 months"
        ExpiresByType image/jpeg "access plus 12 months"
        ExpiresByType image/jpg "access plus 12 months"
        ExpiresByType image/png "access plus 12 months"
        EXpiresByType application/x-shockwave-flash "access plus 12 months"
        EXpiresByType application/x-javascript "access plus 12 months"
        ExpiresByType video/x-flv "access plus 12 months"
</VirtualHost>

测试:

[root@Web-Lamp blog]# /application/apache/bin/apachectl -t
Syntax OK
[root@Web-Lamp blog]# /application/apache/bin/apachectl graceful
[root@Web-Lamp blog]# netstat -lnt|grep 80
[root@Web-Lamp blog]# curl -I http://192.168.17.12:8091/images/09.jpg
HTTP/1.1 200 OK
Date: Sun, 04 Dec 2016 13:03:46 GMT
Server: Apache/2.2.31 (Unix) DAV/2
Last-Modified: Mon, 06 Jun 2016 03:44:43 GMT
ETag: "424e8-1d238-53493e48f80c0"
Accept-Ranges: bytes
Content-Length: 119352
Cache-Control: max-age=31104000
Expires: Wed, 29 Nov 2017 13:03:46 GMT          #如果配置无误,此行就是缓存时间,
Vary: Accept-Encoding
Content-Type: image/jpeg

2)针对目录的特殊用法

<Directory ~ “/application/.*/(all|tuijian)”>
ExpiresActive on
        ExpiresDefault "access plus 5 minutes"
        ExpiresByType text/html "access plus 1 day"
ExpiresByType text/css "access plus 1 day"
ExpiresByType image/gif "access plus 1 day"
ExpiresByType image/jpeg "access plus 1 day"
ExpiresByType image/png "access plus 1 day"
ExpiresByType audio/mpeg "access plus 1 day"
ExpiresByType audio/x-ms-wma "access plus 1 year"
ExpiresByType video/mpeg "access plus 1 year"
ExpiresByType video/x-msvideo "access plus 1 month"
EXpiresByType application/x-shockwave-flash "access plus 12 months"
EXpiresByType application/x-javascript "access plus 1 day"
ExpiresByType application/javascript "access plus 1 day"
</Directory>

提示:本节仅仅是演示,因此后面的过期按1天读者可以根据需求自己修改。

生产环境mod_expires优点:

1)提升用户体验

2)节约网站带宽成本

3)节约网站服务器及维护成本

控制expires方法:

如果网站更新功能或更新文件后,用户再访问时的内容还是旧的,怎么解决这个问题?

解答:

1)首先,对于大多公司业务来说,图片等资源一般很少会去修改。因此taobao,京东等公司可以肆无忌惮的把expires设置为10年,一年节省费用可达上亿人民币

2)对于js , css偶尔会变化的资源,一般expires设置时间会比较短,如1-30天

3)在更新文件上采取策略,如:更新后以新的文件名发布,这样对于用户又是新的资源

更改APACHE的默认用户

创建apache用户,用于子进程和线程

[root@Web-Lamp ~]# useradd -M -s /sbin/nologin apache

编辑apache配置文件:

[root@Web-Lamp ~]# vim /application/apache/conf/httpd.conf
 62 # If you wish httpd to run as a different user or group, you must run
 63 # httpd as root initially and it will switch.  
 64 #
 65 User apache
 66 Group apache

#添加用户与用户组

提示:建议不要使用apache用户,最好使用不容易被人猜出来的用户

屏蔽apache版本等敏感信息

编译程序之前可修改:

[root@apache apache]# cat /home/poe/tools/httpd-2.2.31/include/ap_release.h
#define AP_SERVER_BASEVENDOR "Apache Software Foundation"
#define AP_SERVER_BASEPROJECT "Apache HTTP Server"
#define AP_SERVER_BASEPRODUCT "Apache"

#define AP_SERVER_MAJORVERSION_NUMBER 2
#define AP_SERVER_MINORVERSION_NUMBER 2
#define AP_SERVER_PATCHLEVEL_NUMBER   31
#define AP_SERVER_DEVBUILD_BOOLEAN    0
[root@apache apache]# cat /home/poe/tools/httpd-2.2.31/os/unix/os.h
 35 #define PLATFORM "Unix"                     ##修改此行

编译安装完之后的修改:

1)修改httpd.conf文件,打开httpd-default.conf模块

55 ServerTokens Full                               #值修改为Prod
 65 ServerSignature On                  #值修改为Off

2)apachectl graceful 使配置生效

apache防盗链功能

<IfModule rewrite_module>
RewriteEngince On
RewriteCond % {HTTP_REFERER} !^http://adminba.com/.*$ [NC]
RewriteCond % {HTTP_REFERER} !^http://adminba.com$ [NC]
RewriteCond % {HTTP_REFERER} !^http://www.adminba.com/.*$ [NC]
RewriteCond % {HTTP_REFERER} !^http://www.adminba.com$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://www.51cto.com [R,NC]
#RewriteRule .*\.(gif|jpg|swf)$ http://www.adminba.com/about/nolink.png [R,NC]
<IfModule>

关闭CGI

ScriptAlias /cgi-bin/ “/application/apache2.3.2/cgi-bin/”
<Directory “/application/apache2.3.2/cgi-bin”>
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
##注释以上内容

避免使用.htaccess文件(分布式配置文件)

首先是性能考虑。如果AllowOverride启用了.htaccess文件,则APACHE需要在每个目录中查找.htaccess文件,因此,无论是否真正用到,启用.htaccess都会导致性能的下降。另外,对每一个请求,都需要读取一次.htaccess文件。

其次是安全考虑。这样会允许用户自己修改服务器的配置,这可能会导致某些意想不到的修改,所以请认真考虑是否应当给予用户这样的特权。

默认在Unix平台下能够使用.htaccess来对目录进行规则定义,但是这是不安装的,建议关闭,默认的选项:

AccessFileName .htaccess

建议改为:

#AccessFileName .htaccess

全部目录权限定义使用httpd.conf中的定义,不使用 .htaccess

APACHE日志授予root 700权限

chown -R root.root logs

chmod -R 700 logs

不需要在日志目录上给apache用户读或者写许可