Apache
Apache简介
http://httpd.apache.org/docs/2.2 /中文文档
摘抄参考:http://www.cnblogs.com/ginvip/p/6400304.html
Apache的特点 功能强大,配置简单,速度快,应用广泛,性能稳定可靠,并可做代理服务器或负载均衡来使用。 Apache应用场合 使用Apache运行静态HTML网页,图片(处理静态小文件能力不及Nginx) 使用Apache结合PHP引擎运行PHP,Perl等程序,LAMP被称之为经典组合 使用Apache结合Tomcat/Resin运行JSP,JAVA等程序,成为中小企业的首选 使用Apache作代理,负载均衡,rewrite规则过滤等等
Apache安装
# cat /etc/redhat-release CentOS release 6.7 (Final) # uname -r 2.6.32-573.el6.x86_64 #yum installzlib-devel -y #tar -xvf httpd-2.2.31.tar.gz cd httpd-2.2.31 ./configure --prefix=/usr/local/apache2.2.31 \ --enable-deflate \ --enable-expires \ --enable-headers \ --enable-module=most \ --enable-so \ --with-mpm=worker \ --enable-module=rewrite
#编译参数说明: --prefix=/usr/local/apache2.2.31 表示指定安装路径为:/application/apache2.2.31。如果不指定安装路径,则默认路径为:/usr/local/apache2 --enable-deflate 提供对内容的压缩传输编码支持,一般html,js,css等内容的站点,使用此参数功能会大大提高传输速度,提升访问者访问体验。在生产环境中,这是apache调优的一个重要选项之一 --enable-expires 激活允许通过配置文件控制http的“expires”和“cahe-control:”头内容,即对网站图片,JS,CSS等内容,提供在客户端浏览器缓存的设置。这是apache调优的一个重要选项之一 --enable-headers 提供允许对HTTP请求头的控制 --with-mpm=worker 选择apache mpm的模式为worker模式,因为worker模式原理是更多的使用线程处理请求,所以可以处理更多的并发请求,而系统资源的开销小于基于进程的mpm prefork。如果不指定此参数,默认的模式是prefork进程模式。这是apache调优的一个重要选项之一 --enable-rewrite 提供基于URL规则的重写功能。即根据已知URL地址,转换其它想要的URL地址。如前文讲解的伪静态功能就是这个模块实现的。这是APACHE在生产环境中必用的一个重要功能。 --enable-so 激活APACHE服务的DSO(全称dynamic shared object,动态共享对象)支持,即在以后可以以DSO的方式编译安装共享模块。这个模块本身不能以DSO方式编译。 #make && make install #ln -s /usr/local/apache2.2.31/ /usr/local/apache #/usr/local/apache/bin/apachectl start
#lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 65082 root 4u IPv6 57114 0t0 TCP *:http (LISTEN) httpd 65084 daemon 4u IPv6 57114 0t0 TCP *:http (LISTEN) httpd 65085 daemon 4u IPv6 57114 0t0 TCP *:http (LISTEN) httpd 65086 daemon 4u IPv6 57114 0t0 TCP *:http (LISTEN) # ps -ef | grep httpd root 65082 1 0 00:25 ? 00:00:00 /app/apache2.2.31/bin/httpd -k start daemon 65083 65082 0 00:25 ? 00:00:00 /app/apache2.2.31/bin/httpd -k start daemon 65084 65082 0 00:25 ? 00:00:00 /app/apache2.2.31/bin/httpd -k start daemon 65085 65082 0 00:25 ? 00:00:00 /app/apache2.2.31/bin/httpd -k start daemon 65086 65082 0 00:25 ? 00:00:00 /app/apache2.2.31/bin/httpd -k start # usr/local/apache/bin/apachectl Usage: /app/apache2.2.31/bin/httpd [-D name] [-d directory] [-f file] [-C "directive"] [-c "directive"] [-k start|restart|graceful(平滑加载)|graceful-stop|stop] [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] Options: -D name : define a name for use in <IfDefine name> directives -d directory : specify an alternate initial ServerRoot -f file : specify an alternate ServerConfigFile -C "directive" : process directive before reading config files -c "directive" : process directive after reading config files -e level : show startup errors of level (see LogLevel) -E file : log startup errors to file -v : show version number -V : show compile settings -h : list available command line options (this page) -l : list compiled in modules #查看编译的模块 -L : list available configuration directives -t -D DUMP_VHOSTS : show parsed settings (currently only vhost settings) -S : a synonym for -t -D DUMP_VHOSTS -t -D DUMP_MODULES : show all loaded modules -M : a synonym for -t -D DUMP_MODULES -t : run syntax check for config files -T : start without DocumentRoot(s) check # /usr/local/apache/bin/apachectl -l Compiled in modules: core.c mod_authn_file.c mod_authn_default.c mod_authz_host.c mod_authz_groupfile.c mod_authz_user.c mod_authz_default.c mod_auth_basic.c mod_include.c mod_filter.c mod_deflate.c mod_log_config.c mod_env.c mod_expires.c mod_headers.c mod_setenvif.c mod_version.c worker.c http_core.c mod_mime.c mod_status.c mod_autoindex.c mod_asis.c mod_cgid.c mod_negotiation.c mod_dir.c mod_actions.c mod_userdir.c mod_alias.c mod_so.c APACHE相关目录介绍 [root@lamp apache]# ls bin cgi-bin error icons index.html lib man modules(编译的模块目录) build conf htdocs include index.html.1 logs manual bin目录# tree |-- ab 性能压力测试工具 |-- apachectl 启动命令,是一个脚本 |-- apr-1-config |-- apu-1-config |-- apxs 为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,
使之可以用由mod_so提供的LoadModule指令在运行时加载到Apache服务器中。因此,要使用这个扩展机制,你的平台必须支持DSO特性,而且Apache httpd必须内建了mod_so模块。 |-- checkgid |-- dbmmanage |-- envvars |-- envvars-std |-- htcacheclean 清理磁盘缓冲区的命令 |-- htdbm |-- htdigest |-- htpasswd 建立和更新基本认证文件。如nagios等监控服务时会用到 |-- httpd httpd为apache的控制命令程序,apachectl执行时会调用httpd |-- httxt2dbm |-- logresolve `-- rotatelogs apache自带的日志轮询工具命令,也还可以用。建议cronolog替代之 conf目录# tree conf/ |-- extra #额外的apache配置文件目录,运维会经常修改访问,vhost默认目录 | |-- httpd-autoindex.conf | |-- httpd-dav.conf | |-- httpd-default.conf #这个文件里配置的是apache的相关服务参数,如:keepalived,timeout等,隐藏版本号等 | |-- httpd-info.conf | |-- httpd-languages.conf #语言支持配置 | |-- httpd-manual.conf | |-- httpd-mpm.conf #(prefork,worker)设置,#服务器池管理,也就是优化apache的一个配置文件,如:选择apache的模式连接数等 | |-- httpd-multilang-errordoc.conf | |-- httpd-ssl.conf #提供apache SSL支持配置文件 | |-- httpd-userdir.conf | `-- httpd-vhosts.conf #配置虚拟主机 |-- httpd.conf #apache的主配置文件 |-- magic |-- mime.types `-- original |-- extra | |-- httpd-autoindex.conf | |-- httpd-dav.conf | |-- httpd-default.conf | |-- httpd-info.conf | |-- httpd-languages.conf | |-- httpd-manual.conf | |-- httpd-mpm.conf | |-- httpd-multilang-errordoc.conf | |-- httpd-ssl.conf | |-- httpd-userdir.conf | `-- httpd-vhosts.conf `-- httpd.conf LOG目录# tree log |-- access_log 默认访问日志文件 |-- cgisock.65082 |-- error_log 错误日志文件,启动故障等问题 `-- httpd.pid pid文件,http进程启动后,会把所有的进程ID号写到此文件 httpd.conf配置文件 # grep -Ev "#|^$" httpd.conf ServerRoot "/usr/local/apache2.2.31" #安装目录 Listen 80 #监听端口(本机任何ip) <IfModule !mpm_netware_module> <IfModule !mpm_winnt_module> User daemon Group daemon #(安全优化改成其他用户) </IfModule> </IfModule> ServerAdmin you@example.com 管理员邮箱 DocumentRoot "/usr/local/apache2.2.31/htdocs" #网站目录 <Directory />=============================权限控制 Options FollowSymLinks AllowOverride None Order deny,allow Deny from all </Directory> ===========================权限控制 <Directory "/app/apache2.2.31/htdocs"> #(新增加站点目录需要在本配置末尾配置此块,不然403错误) Options Indexes FollowSymLinks #Indexes前面加-或者删除,防止展示目录结构(没index.html时) AllowOverride None Order allow,deny Allow from all </Directory>===========================权限控制 <IfModule dir_module> DirectoryIndex index.html #指定首页,可以多个,防止目录展示 </IfModule> <FilesMatch "^\.ht"> Order allow,deny Deny from all Satisfy All </FilesMatch> ErrorLog "logs/error_log" LogLevel warn <IfModule log_config_module> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common <IfModule logio_module> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio </IfModule> CustomLog "logs/access_log" common </IfModule> <IfModule alias_module> #CGI配置这语言基本淘汰 ScriptAlias /cgi-bin/ "/app/apache2.2.31/cgi-bin/" </IfModule> <IfModule cgid_module> </IfModule> <Directory "/app/apache2.2.31/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all </Directory> DefaultType text/plain <IfModule mime_module> TypesConfig conf/mime.types AddType application/x-compress .Z AddType application/x-gzip .gz .tgz </IfModule> <IfModule ssl_module> SSLRandomSeed startup builtin SSLRandomSeed connect builtin </IfModule> extra下的配置文件===httpd-default.conf # grep -Ev "#|^$" httpd-default.conf Timeout 300 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 5 UseCanonicalName Off AccessFileName .htaccess ServerTokens Full ServerSignature On HostnameLookups Off extra下的配置文件httpd-vhosts.conf #虚拟站点设置配置文件 # grep -Ev "^#|^$" /usr/local/apache/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 "/usr/local/apache2.2.31/docs/dummy-host.example.com" ServerName dummy-host.example.com ServerAlias www.dummy-host.example.com #这是配置虚拟机的别名,也就是可以配置多个域名访问同一个站点 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 "/usr/local/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>
配置一个基于域名配置站点
1、创建站点目录及文件 #mkdir -p /var/html/www #echo "gtms,this is apache www" >>/var/html/www/index.html
2、创建站点目录配置 #vi /usr/local/apache/conf/extra/httpd-vhosts.conf
<VirtualHost *:80> ServerAdmin 87014247@qq.com DocumentRoot "/var/html/www" ServerName www.gtms.com ServerAlias gtms.com ErrorLog "logs/www-error_log" CustomLog "logs/www-access_log" common </VirtualHost> 3、修改主配置文件
#vi /usr/local/apache/conf/httpd.conf
#Include conf/extra/httpd-vhosts.conf #取消注释
文件末尾加如下配置,否则403
<Directory "/var/html">
Options -FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
#apache服务Forbidden403问题 通常情况下(但不限于此)的原因有: 1)apache配置文件中没有对站点目录的权限许可配置,这通常是在初始安装apache后,更改了默认的apache站点目录所致!
如编译安装apache(假定安装目录为/usr/local/apache2.2.32)后,将站点目录更改为其他路径:/var/html,则在apache配置文件中的配置也要相应的改变此目录路径 2)站点目录下无首页(index)文件,而apache的配置又禁止了目录浏览器,就会提示403错误 3)Directory权限问题 4)站点目录原因,站点目录需要apache的用户访问权限 4、检查语法,平滑加载 # /usr/local/apache/bin/apachectl -t # /usr/lcoal/apache/bin/apachectl graceful #解决每次加载apache时FQDN报错,主配置文件中,取消注释,改成ip,如下 ServerName 192.168.0.86:80 基于域名端口混合 1、在主配置文件增加Listen端口 2、在vhost配置文件增加Listen端口(NameVirtualHost *:8000),在单独的vhost上增加上端口 基于IP vi vhost 将servername 改成ip <VirtualHost IP:80>
增加基于IP的虚拟机主机实战配置
1:增加IP
如果要配置基于IP的虚拟主机,就需要每个虚拟主机有不同的IP
# ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $4}'
192.168.0.86
# ifconfig eth1 | awk -F "[ :]+" 'NR==2{print $4}'
192.168.0.186
2、创建站点目录及文件
#mkdir -p /var/html/blog
#echo "gtms,this is apache blog" >>/var/html/blog/index.html
2、创建站点目录配置(增加)
#vi /usr/local/apache/conf/extra/httpd-vhosts.conf
<VirtualHost 192.168.0.186:80>
ServerAdmin 87014247@qq.com
DocumentRoot "/var/html/blog"
ServerName blog.gtms.org
ServerAlias blog.org
ErrorLog "logs/www-error_log"
CustomLog "logs/blog-access_log" common
</VirtualHost>
配置好hosts文件
[root@node87 ~]# curl blog.gtms.org
gtms,this is apache blog
[root@node87 ~]# curl www.gtms.com
gtms,this is apache www
基于端口的虚拟主机实战配置
基于端口的虚拟主机在生产环境中的应用也不多见,仅偶尔会用到,一般是为公司内部人员提供访问的,如页面的后台,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>
Apache日志 CustomLog "logs/bbs-access_log" common或Combined(具体格式定义在主配置文件)
日志格式
通用日志格式 CommonLog Fomat 组合日志格式 CombinedLog Format
日志轮询方案
1、Apache日志轮询工具自带 rotatelog 2、另外的工具选择cronolog(工作中推荐) 3、通过crontab mv改名日志 然后graceful
日志轮询工具cronolog安装 tar -zxvf cronolog-1.6.2.tar.gz cd cronolog-1.6.2 ./configure make make install
CustomLog "|/usr/local/sbin/cronolog /usr/local/apache/logs/access_www_%Y%m%d.log" combined #按天轮询
CustomLog "|/usr/local/sbin/cronolog /usr/local/apache/logs/access_www_%Y%m%d%H.log" combined #按小时轮询
CustomLog "|/usr/local/sbin/cronolog /usr/local/apache/logs/access_www_%w.log" combined #按周轮询
注意:日志路径不能使用相对路径,一定要使用绝对路径
#vi /usr/local/apache/conf/extra/httpd-vhosts.conf
<VirtualHost *:80> ServerAdmin 87014247@qq.com DocumentRoot "/var/html/www" ServerName www.gtms.com ServerAlias gtms.com ErrorLog "logs/www-error_log" #CustomLog "logs/www-access_log" common CustomLog "|/usr/local/sbin/cronolog /usr/local/apache/logs/access_www_%Y%m%d.log" combined </VirtualHost> apache自带日志轮询工具rotatelogs(不推荐使用rotatelogs进行日志轮询) rotatelogs 日志轮询 ErrorLog "|/application/apache/bin/rotatelogs /logs/%Y%m%d.error.log 604800" CustomLog "|/application/apache/bin/rotatelogs /logs/access_www_%Y%m%d.log 86400 480" combined CustomLog "|/application/apache/bin/rotatelogs /logs/access_www_%Y%m%d.log 86400" combined 提示:也可以按照达到多大文件而轮询日志,此处就不提了。 rotatelogs 日志轮询说明 语法rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ] 选项 -l 使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中,使用-l会导致不可预料的结果。 logfile 它加上基准名就是日志文件名。如果logfile中包含"%",则它会被视为用于strftime()的格式字符串;否则它会被自动加上以秒为单位的".nnnnnnnnnn"后缀。这两种格式都表示新的日志开始使用的时间。 rotationtime 日志文件滚动的以秒为单位的间隔时间。 offset 相对于UTC的时差的分钟数。如果省略,则假定为"0"并使用UTC时间。比如,要指定UTC时差为"-5小时"的地区的当地时间,则此参数应为"-300"。 filesizeM 指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。 按天轮询的常见生产环境实际配置: <VirtualHost *:80> ServerAdmin 31333741@qq.com ServerName blog.etiantian.org DocumentRoot "/var/blog" ServerAlias etiantian.org ErrorLog "logs/www.etiantian.org-error_log" #CustomLog "logs/www.etiantian.org-access_www_log" common CustomLog "|/usr/local/sbin/cronolog /logs/access_www_%Y%m%d.log" combined </VirtualHost> 提示:/logs/access_www_%Y%m%d.log 这里要写绝对路径,不能是logs/access_www_%Y%m%d.log 不同轮询命令同时记录三份日志,并做多种轮询的写法,这个配置生产环境,并不常用, 这里写出来是告诉大家语法功能上可以这样进行配置。 <VirtualHost *:80> ServerAdmin 87014247@qq.com ServerName blog.etiantian.org DocumentRoot "/var/blog" ServerAlias etiantian.org ErrorLog "logs/www.etiantian.org-error_log" #CustomLog "logs/www.etiantian.org-access_www_log" common CustomLog "|/usr/local/sbin/cronolog /logs/access_www_%Y%m%d.log" combined CustomLog "|/usr/local/sbin/cronolog /logs/access_www_%Y%m%d%H.log" combined CustomLog "|/application/apache/bin/rotatelogs /logs/access_www_%Y%m%d%H%M.log 86400" combined </VirtualHost>
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模式: # /usr/local/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 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>
mod_deflate压缩模块应用指南
模块提供了DEFLATE 输出过滤器,允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽,同时提升用户体验。 A:编译安装httpd情况时是否已安装mod_flate # /usr/local/apache/bin/apachectl -l|grep mod_deflate mod_deflate.c
B:如果是以DSO方式编译,则查看方法为:
# ls /usr/local/apache/modules/ | grep mod_deflate
# grep mod_deflate.so /usr/local/apache/conf/httpd.conf 特别说明:以上两种情况下不能同时存在,否则可能会冲突!如果已经编译安装完了,就不需要再用DSO的方法编译安装了!
C:mod_deflate DSO安装方法 # ls /home/tools/httpd-2.2.31/modules/filters | grep mod_deflate.c
mod_deflate.c # /usr/local/apache/bin/apxs -c -i -a mod_deflate.c # grep defla /usr/local/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 /usr/local/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
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防盗链功能
<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用户读或者写许可
优化隐藏软件名称
1、安全设置configure前 # vi /home/tools/httpd-2.2.31/include/ap_release.h #define AP_SERVER_BASEPRODUCT "Apache" ==>改成其他的#define AP_SERVER_BASEPRODUCT "IIS" # vi /home/tools/httpd-2.2.31/os/unix/os.h #define PLATFORM "Unix" ==>改成其他的#define PLATFORM "Win32" 2、安装完成之后,修改httpd-default.conf #vi /usr/local/apache/conf/extra/httpd-default.conf ServerSignature On 改为Off ServerTokens 为Prod 3、修改httpd.conf #Include conf/extra/httpd-default.conf #去掉注释 4、启动检查 # curl -I 192.168.0.86 HTTP/1.1 200 OK Date: Fri, 10 Feb 2017 21:55:22 GMT Server: IIS Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT ETag: "4333d-2c-3e9564c23b600" Accept-Ranges: bytes Content-Length: 44 Content-Type: text/html