源码包编译安装apache

 下载所需要的软件包:

 httpd:http://mirrors.hust.edu.cn/apache/httpd/httpd-2.4.9.tar.gz

 apr:http://apache.fayea.com/apache-mirror//apr/apr-1.5.1.tar.gz

 apr-util:http://apache.fayea.com/apache-mirror//apr/apr-util-1.5.3.tar.gz

安装apr

       cd /usr/src/apr-1.5.1

       ./configure --prefix=/usr/local/apr

       make

       make install

   安装apr-util

       cd /usr/src/apr-util-1.5.3

       ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/

       make

       make install

   安装httpd(apache)

       cd /usr/src/httpd-2.4.9

       ./configure --prefix=/usr/local/httpd-2.4.9 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util

       注:这里只是为了演示源码包的安装,如果需要定制httpd的功能,使用./configure --help,查阅帮助信息;

       make

       make install

   将httpd的bin目录加入到PATH中

       vim /etc/profile.d/httpd.sh

       输入"export PATH=$PATH:/usr/local/httpd-2.4.9/bin",保存退出;

       source /etc/profile

   启动apache:apachectl start

   在浏览器中输入服务器的IP地址,如果看到“It works!“表示安装成功!

   停止apache:apachectl stop

删除apache:将/usr/local/httpd-2.4.9目录删除即可;


使用rpm格式安装并配置httpd

httpd相关软件包说明

          httpd          主软件包;

          httpd-devel          http相关的开发包;

          httpd-manual          官方提供的手册;

          httpd-tools          httpd相关的工具(包括一些测试工具);

 安装httpd(centos6.4-x64系统,使用rpm安装)

         yum install -y httpd

     服务脚本:/etc/rc.d/init.d/httpd;

     工作目录:/etc/httpd;

     配置文件存放目录:/etc/httpd/conf/;

     主配置文件:/etc/httpd/conf/httpd.conf;

     扩展配置文件:/etc/httpd/conf.d/*.conf;

     socket:http(80/tcp),https(443/tcp);

     网页文件存放目录:/var/www/html/

     CGI脚本目录:/var/www/cgi-bin/

     模块目录:/etc/httpd/modules(链接到/usr/lib/httpd/modules);

     日志目录:/etc/httpd/logs(链接到/var/log/httpd);

     启动httpd服务:service httpd start;

     注意:在rhel系列中,启动httpd后会默认打开一个测试页面,如果不想显示该测试页,使用"mv -f /etc/httpd/conf.d/welcome.conf webcome.conf.bak",并重启服务即可;

     配置文件语法

          1,指令不区分大小写,但通常建议将首字母大写;

          2,指令的值可能会区分大小写(比如路径);

          3,指令和值之间用空格隔开即可;

          4,某些指令可以重复出现多次(如listen);

          5,紧跟在"#"符号后没有空格的为指令,是可以启用的,"#"符号后面紧跟有空格的为注释;

     主配置文件的构成

          1,全局配置:对主服务器或虚拟主机都生效,并且有些功能是服务器自身的工作属性;

          2,主服务器:与主站相关的设置;

          3,虚拟主机:虚拟主机相关的设置;

          注意:主服务器和虚拟主机不能同时启用;


     主配置文件的设置:/etc/httpd/conf/httpd.conf;

     ### Section 1: Global Environment

     ServerTokens OS          定义页面显示的服务器信息详细程度,可以指定其他参数;

     ServerRoot "/etc/httpd"          定义服务器的工作的根目录;

     PidFile run/httpd.pid          定义pid配置文件的路径(这是一个相对路径);

     Timeout 60          TCP连接的超时时间(如三次握手等等);

     KeepAlive Off          是否打开长连接,开启后有助于提升服务器性能,但如果在比较繁忙的服务器中,应考虑是否开启(服务器处理客户端的数量是有限的,要避免客户端长时间占用资源);

     MaxKeepAliveRequests 100          长连接请求的最大资源数,达到该限制后断开链接;

     KeepAliveTimeout 15          

     <IfModule prefork.c>          prefork模型的相关设置;

     StartServers       8          服务器启动多少个空闲进程;

     MinSpareServers    5     最少空闲进程(如果8个空闲进程使用了4个,则会再启动一个空闲进程,保证存在5个空闲进程);

     MaxSpareServers   20          最大空闲进程(如果有500个用户访问,退出了450个,则kill掉30个);

     ServerLimit      256          为MaxClients设定的上限值(需要将服务器进程kill掉,然后在重启)

     MaxClients       256          最大客户端数量(最大允许多少个连接请求);

     MaxRequestsPerChild  4000          一个进程最多响应多少个用户请求,当接收用户请求4000次后,将其kill掉,生成新的进程响应用户请求;

     </IfModule>

     <IfModule worker.c>          worker模型的相关设置;

     StartServers         4          默认启动的进程数;

     MaxClients         300          最大客户端数量(最大允许多少个连接请求);

     MinSpareThreads     25          最小空闲线程(所有进程的线程数之和);

     MaxSpareThreads     75          最大空闲线程(所有进程的线程数之和);

     ThreadsPerChild     25          一个进程生成多少个线程;

     MaxRequestsPerChild  0          每个进程响应多少个用户请求(由于是由线程来控制,为0表示不限制);
     </IfModule>

     Listen 12.34.56.78:80          httpd监听的IP地址和端口,可以不指定IP地址表示监听本机所有地址(listen可以出现多次,用于监听多个端口);

     LoadModule auth_basic_module modules/mod_auth_basic.so          指定httpd启动时装载的模块(前后分别为"模块名称/模块路径",路径为相对路径);

     Include conf.d/*.conf          装载额外的配置文件(相对路径);

     ExtendedStatus On          使用status时,是否显示更详细的信息(默认注释掉);

     User apache          httpd的work进程使用的用户;

     Group apache          httpd的work进程使用的组名;


     ### Section 2: 'Main' server configuration

     ServerAdmin root@localhost          服务器管理员的邮箱地址;

     ServerName www.example.com:80          服务器名称(如果不启用此指令,则服务器启动时会试图反解当前主机的IP地址,如果解析成功,则引用此主机名作为服务器名称,否则会使用"127.0.0.1"来作为默认主机名);

     DocumentRoot "/var/www/html"          网页文件存放的根目录;

     <Directory "/var/www/html">          定义一个网站容器;

     Options FollowSymLinks          定义容器名称内文件被访问时的访问属性;

          Options的参数

               Indexes     允许索引目录,即没有默认页面时,列出网页文件列表(生成环境中应该关闭,如果作为下载站点时可以开启);

               none          不支持任何参数;

               FollowSymLinks          允许符号链接(是否允许访问页面中的符号链接所指向的源文件,如果没有必要可以关闭,在一定程度上可以提高服务器性能);

               Includes          允许执行服务器端包含"SSI"的文档,为了安全起见,应该关闭;

               ExecCGI          是否允许执行CGI脚本;

               MultViews          内容协商机制,根据客户端来源的语言来判定显示相匹配的的网页(消耗资源,没有必要不必开启);

               All          支持所有参数;

     AllowOverride None          是否使用.htacess覆写访问权限;

          AuthConfig          需要进程用户认证后才可以访问网页;

     Order allow,deny          定义基于主机的访问控制功能,可以实现基于IP、网络地址或主机名来定义,deny写在后面表示deny所有;

     Allow from all          允许所有的主机访问,或者使用Deny from all拒绝所有主机,也可以使用以下写法:

          Deny from 192.168.0.0/24

          Allow from 192.168.1.0/24 172.16.100.0/24 .edu  apache.org www.example.com 172.16

     </Directory>

     注意: 目录可能会继承父目录的选项,在选择前"-”符号表示取消从父目录继承的某项功能;

     <IfModule mod_userdir.c>     是否支持用户在个人的家目录中建立网页文件,使用http://xxx/~home/的方式访问;

          UserDir disabled          默认不允许,如果要启用此功能,将此项注释,去掉#UserDir public_html的注释,用户建立public_html目录,然后将网页文件放到该目录即可;

     </IfModule>

     DirectoryIndex index.html index.html.var          定义访问的默认页面,从左向右匹配;

     AccessFileName .htaccess          apache的每目录访问控制,在对应的目录下创建".htacess"文件,将访问控制机制写入即可,但会降低apache的执行效率,生产中通常禁用;

     <Files ~ "^\.ht">          模式匹配,以ht开头的文件,保障此类开头文件的安全性;
          Order allow,deny
          Deny from all
          Satisfy All
     </Files>

     TypesConfig /etc/mime.types          定义httpd支持的mime类型的文件;

     DefaultType text/plain          如果没有指定类型,默认使用的类型为:明文的纯文本类型;

     HostnameLookups Off   日志记录中,是否将每个访问用户的IP反解成主机名(消耗系统资源,建议不启用);

     EnableSendfile off

     ErrorLog logs/error_log          定义错误日志的存放位置;

     LogLevel warn          定义日志级别;

     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined          定义日志格式,最后面的一项为日志格式的名称;

          %h          客户端地址;

          %l          远端主机的登录名称(远程主机登录系统的用户名);

          %u          登录网站使用的用户;

          %t          日志事件产生的时间;

          %r          请求报文的第一行(访问方法,URL获取的资源以及版本号);

          %>s          最后一个请求对应的状态码;

          %b          响应报文的大小;

          %{Referer}i           从哪个页面的链接过来的;

          %{User-Agent}i          客户端浏览器的类型;

     CustomLog logs/access_log combined          定义访问日志格式的类型;

     Alias /icons/ "/var/www/icons/"          定义路径别名;

     注意:Alias /luntan "/bbs/forum"  如果luntan后面加/符号,后面forum也一定要加/符号,如果没加则都不加;

     ScriptAlias          定义执行CGI脚本的目录;

     配置用户认证

     <Directory "/var/www/html">

          AllowOverride AuthConfig

          AuthType Basic          使用基本用户认证;

          AuthName "Restricted Site..."          认证提示信息;

          AuthUserFile “/etc/httpd/conf/htpasswd”          认证用户的账号密码文件;

          Require valid-user          valid-user表示允许密码文件中所有用户登录,也可以指定特定用户;

          AuthGroupFile "/etc/httpd/conf/group"          指定组名和包含的用户(语法"myusers:hadoop tom");

          Require group groupname          允许哪些组可以登录;

          Order allow,deny

          Allow from all

     </Directory>


### Section 3: Virtual Hosts

     定义虚拟主机前,最好先取消中心主机,注释中心的DocumentRoot即可;

     配置基于IP的虚拟主机

     <VirtualHost 192.168.1.1:80>

          ServerName www.example.com               域名;

          DocumentRoot "/var/www/html"            网页文件存放目录;

     </VirtualHost>

     <VirtualHost 192.168.1.2:80>

          ServerName www.linux.com

          DocumentRoot "/var/www/linux"

     </VirtualHost>

     配置基于端口的虚拟主机

     <VirtualHost 192.168.1.1:80>

          ServerName www.example.com

          DocumentRoot "/var/www/html"

          CustomLog logs/example.com-access_log common          访问日志的记录位置和类型;

     </VirtualHost>

     <VirtualHost 192.168.1.1:8080>          需要在Listen指令上添加监听8080端口;

          ServerName www.linux.com

          DocumentRoot "/var/www/linux"

          CustomLog logs/linux.com-access_log common          访问日志的记录位置和类型;

     </VirtualHost>

     配置基于域名的虚拟主机:使用基于域名的虚拟主机,需要启用"NameVirtualHost *:80"指令,可以指定监听的地址,*表示监听所有IP;

     <VirtualHost *:80>

          ServerName www.example.com

          DocumentRoot "/var/www/html"

          CustomLog logs/example.com-access_log common

          <Directory "/var/www/html">

               Options none

               AllowOverride none

               Order deny,allow

               Deny from 192.168.10.1

          </Directory>

     </VirtualHost>

     <VirtualHost *:80>

          ServerName www.linux.com

          DocumentRoot "/var/www/linux"

          CustomLog logs/linux.com-access_log common

          <Directory "/var/www/linux">

               Options none

               AllowOverride AuthConfig

               AuthType Basic

               AuthName "Restricted Site..."

               AuthUserFile “/etc/httpd/conf/htpassw"

               Require valid-user

          </Directory>

     </VirtualHost>

     定义默认虚拟主机:需将其放在所有虚拟主机的最上面;

     <VirtualHost _default_:80>

          DocumentRoot "/var/www/default"

     </VirtualHost>

配置httpd的status功能

     <Location /status>

          SetHandler server-status          实现所有匹配到的文件由一个处理器来处理,server-status可以显示服务器的状态信息;

          Order deny,allow

          Deny from all

          Allow from .example.com          生产中应该对用户访问status做认证;

     </Location>


###### Section 4配置基于openssl的https服务

     1,安装ssl模块:yum install -y mod_ssl,安装后会生成以下文件

          /etc/httpd/conf.d/ssl.conf          ssl的配置文件,需要装载到httpd的主配置文件中(重启httpd会自动装载);

          /usr/lib/httpd/modules/mod_ssl.so          ssl的模块;

          /var/cache/mod_ssl          ssl会话的缓存目录

     2,为服务器提供证书(测试环境中,可以自建CA,然后使用自签名证书);

     3,配置https服务:编辑/etc/httpd/conf.d/ssl.conf

          <VirtualHost 192.168.1.1:443>

               DocumentRoot "/var/www/html"

               ServerName www.example.com

               ErrorLog logs/ssl_error_log          错误日志的存放位置;

               TransferLog logs/ssl_access_log          访问日志的存放位置;

               LogLevel warm          记录日志的级别;

               SSLengine on          是否启用ssl功能;

               SSLProtocal all -SSLv2          支持哪些ssl协议,ALL表示所有,-SSLv2表示不支持ssl v2;

               SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW          SSL支持哪些加密机制,ALL表示所有,!表示排除;

               SSLCertificateFile /etc/pki/tls/certs/localhost.crt          证书文件存放的位置;

               SSLCertificateKeyFile /etc/pki/tls/private/localhost.key          私钥文件的存放位置;

     注意

          1,证书中的主机名称必须与客户浏览器访问的名称一致;

          2,一个IP地址上只能建立一个SSL主机;

          3,将CA的证书(如cacert.pem)下载到客户机,改名为"cacert.crt",然后导入到客户端浏览器的"受信任的根证书颁发机构"中,客户端浏览器打开https就不会报错;

          4,生产环境中的服务器,建议向权威的CA机构申请证书;


httpd配置文件语法测试

     service httpd configtest     或     httpd -t;两个命令的效果是一样的,前者也是调用的后者;

     注意:大部分配置被修改后,使用"service httpd reload"即可生效,而修改监听地址和端口需要重启服务才生效;

htpasswd:创建用户密码文件的命令;

     -c:创建密码文件,只有在第一次的时候使用,如果密码文件已经存在,则将文件内的用户清空;

     -m:用户的密码以md5格式加密存放;

     -D:删除一个用户

     htpasswd -c -m /etc/httpd/conf/htpasswd hadoop;

     htpasswd -m /etc/httpd/conf/htpasswd tom;

关于<Directory>和<Location>的说明

     <Directory "/var/a.org"></Directory>          定义用户访问某个文件系统路径的时候,应该具有何种访问属性;

     <Location "/p_w_picpaths"></Location>          定义用户访问该URL的时候,具有何种的访问属性;

关于MPM:多道处理模块,用于定义apache响应多个用户请求时所工作的模型;

     mpm_winnt:windows专用;

     prefork:一个请求用一个进程响应;

     worker:一个进程响应多个用户请求;worker是基于线程,其启动多个进程,进程启动后启动多个线程一个请求用一个线程响应;

     enent:基于事件驱动模型,一个进程响应多个用户请求;

     httpd -l :查看httpd编译所支持的模型,如果没有编译又想使用其他模型可以使用httpd.event或httpd.worker;
     在/etc/sysconfig/httpd 文件中可以修改httpd启动的默认模型,在2.2中event为测试模型,不建议使用;2.4默认为event模型;

虚拟主机的类型

     基于IP:每个虚拟主机使用不同的IP地址,但使用的端口相同;

     基于端口:每个虚拟主机的IP地址相同,但端口不同;

     基于域名:每个虚拟主机的IP和端口相同,但使用的域名不用;


统计appche站点IP访问量的shell脚本

根据IP访问量降序排列:

#!/bin/bash
#Script_name: access_count
acc_log=/usr/local/apache2/logs/access_log
/bin/awk '{print $1}' $acc_log  | sort | uniq -c | sort -nr

执行效果:

[root@zabbix ~]# sh access_count
  94989 192.168.100.34
  38863 192.168.200.92
  23658 192.168.1.71
  16720 192.168.100.80

打印访问量前三的IP地址:

#!/bin/bash
#Script_name:access_count
acc_log=/usr/local/apache2/logs/access_log
/bin/awk '{print $1}' $acc_log  | sort | uniq -c | sort -nr | head -n 3

apache站点访问错误统计:

#!/bin/bash
#Script_name:error_count
err_log=/usr/local/apache2/logs/error_log
cat  $err_log | grep -e "^\[" |  awk '{print $6}' | sort | uniq -c |sort -nr

执行效果:

[root@zabbix ~]# sh error_count
    701 [core:notice]
     30 [mpm_event:notice]
     12 [core:warn]
      1 [:error]