【面试虐菜】—— Apache知识整理
Apache性能调优1
Apache 部分:
1. 移除不用的模块。
2. 使用 mod_disk_cache NOT mod_mem_cache 。
3. 扁平架构配置mod_disk_cache。
4. 安装恰当的Expires, Etag, 和 Cache-Control Headers 。
5. 将缓存放在独立的磁盘
6. 使用管道日志替代直接记录
7. 将日志放在不同的磁盘
8. 使用 mod_gzip/mod_deflate 。
9. 将HostnameLookups关闭.
10. 避免在configs中使用主机名。
11. 使用持久连接。
12. 不要设置KeepAliveTimeout太高。
13. 禁用 .htaccess。
14. 允许symlinks。
15. 关闭ExtendedStatus。
16. 避免在DirectoryIndex中通配符。
OS 部分:
17. 提高Swappiness。
18. 提高写入缓冲器( Write Buffer)大小。
19. 提高最大打开文件。
应用部分:
20. 设置图像和样式表的前端代理。
21. 使用 mod_passenger for rails。
22. 关闭safe_mode for php。
23. 不要使用threaded mpm with mod_php。
24. 刷新缓冲区预渲染。
25. 频繁访问的数据设置缓存。
Apache性能调优2
1 模块的加载
去掉不必要的加载或者动态加载模块
一般来说,不需要加载一下的模块:
Mod_include.so:服务器端包含,是一种已经过时的技术
Mod_autoindex.so:如果不希望apache列目录显示,可以删除
Mod_access.so mod_auth.so:如果你不需要进行安全验证,也没有必要加载
最好加载的模块:
Mod_dir.so:用于定义缺省文档index.php index.jsp等
Mod_log_config.so:用于记录文件格式
Mod_mime.so:定义文件类型的关联
2 域名查找
Hhostnamelookups off默认情况下已经是关闭的,务必要保持该设置。如果需要客户端dnx,可以使用第三方软件代替。服务器对dns作一个反向查询以找出客户系统的主机名,又进行正向查询看获得的主机名是否真实指向客户IP。
3 符号连接
Options -followsymlinks 开启后,apache检查每个请求中是否包含对符号链接的引用,对请求中包含的每个路径调用一次lstat()系统调用。
这将使用浏览器有可能访问文档根目录(DocumentRoot)之外的内容,并且只有符号连接的目的与符号连接本身为同一用户所拥有时(SymLinksOwnerMatch),才允许访问,这个设置将增加一些安全性,但将耗费Apache大量的资源。
4 服务器状态信息,默认关闭。
sethandler server--status
5 关闭目录浏览
options -indexes
6 更精确的时候尽可能不适用通配符之类的灵活选项,删除不必要的选项,明确的制定设置文件列表,最常用的放在前面。Directoryindex index.php index.html
7 cgi模块
将所有cgi文件放在一个特定的目录并设置正确的权限,避免apache对每一个请求都要判断一次要求的是一个静态文件还是动态文件。
8 日志
写入日志信息是一个花费时间的工作,apache保持日志文件的打开状态以节省打开文件 的时间,如果没有必要的可以关闭节省更多的处理器时间。
9 allowoverrice none
.htaccess文件可以极大的扩展apache的设置参数,而无需每次改变设计都要编辑apache的主设置文件,但是也降低了服务器的性能。
使用这个文件,apache必须要在当前的目录中查找是否存在这个文件,如果存在就解析这个文件并在当前目录中应用文件的设置。更坏的是,apache不仅要查看当前的目录,还要查看当前目录的所有上层的目录是否包括htaccess文件已根据所有这些文件最终确定设置。
如果你想最优化服务器的性能,你应该禁止使用htaccess文件,任何基本目录的设置都可以在主设置文件中进行,而主设置文件仅在服务器启动时解析一次。为了禁用htaccess文件,在任何节里加上指示allowoverride none。
10 timeout
Timeout设置apache等待一个连接读写操作的时间长度,也就是连接建立后,apache等待客户端完成请求发送的时间,或者相应开始以后。Apache写出数据到客户端连接时间长度。无论对于哪种应用来说,300秒的缺省值都有些过长了,因为这就意味着,如果客户端发生了某种未知因素导致的迟滞的话,服务器的一个连接和与之对应的所有资源都要维持 300 秒,这个对于重载的服务器来说是在是有些过长,所以,我建议将其设置得小一些,这个长度只要足够保证各种客户端的应用能够正常传递数据即可。这里需要考虑的因素主要有各种客户端的连接状况和服务器的繁忙程度。一般来说,我建议设置为 3~5。
11 keepalive on
Apache 的KeepAlive这个指令指定一段时间,在这段时间内,可以让服务器和客户端之间持同一个连接。这个特性,有其好处,也有其坏处。好处是,如果客户端 发出多个请求,服务端不必每次都花时间去创建连接。坏处就是,这段时间内,即使客户端不再发出新的请求、访问新的页面,这个连接也会被占用,这对服务器资 源来说是一种浪费。
在默认情况下,KeepAlive是设置为On的,KeepAliveTimeout设置为15秒。也就是说,在15秒之内,服务器平均每秒连接到150个不同的连接,那么从理论上讲,服务器将同时有15×150=2250个连接,内存消耗比较严重。
那么我们要如何来优化KeepAlive呢?
a、可以禁用KeepAlive(设置为 Off);
b、将KeepAliveTimeout改小,比3或者5秒。
12 maxkeepaliverequests 100
最多保持多少个活动的长链接
13 keepalivetimeout 5
连接的保持时间,超过时间就回收。apache进程在使用内存时,是“渐长”的。也就是说,直到这个进程死掉,使用内存的数量是一直增长而不会减少的。这样的话,apache进程使用内存的多少,就决定于你的应用程序最大使用内存量了。
keepalivetimeout 这个参数决定了,在什么都不做之前,一个http进程能够等待多长时间?设想一下,如果keepalive设置为on,而 keepalivetimeout设置为一个比较大的数字,apache占用内存会很快的增长。这是因为,一个apache进程完成了一个任务(并达到了一定的内存占用,想一下“渐进”模式),并不会马上退出,而是等待一个keepalivetimeout时间。假设用户的链接请求持续不断的到来,则积累起来的无用的apache进程就会相当多,直到timeout,这些进程才会被杀死。
但是,keepalive的确对于静态的文件,比如图像文件的传送是很有效的,因此,keepalive要设置为on,但是keepalvietimeout要设置的小些,比如5s
14 serversignature off
默认情况下,很多apache安装时会显示版本号及操作系统版本,甚至会显示服务器上安装的是什么样的apache模块。这些信息可以为黑客所用,并且黑客还可以从中得知你所配置的服务器上的很多设置都是默认状态。
所以,请加入如下两条:
serversignature off
servertokens prod
serversignature 出现在apache所产生的像404页面、目录列表等页面的底部。servertokens目录被用来判断apache会在server http响应包的头部填充什么信息。如果把servertokens设为prod,那么http响应包头就会被设置成:server:apache
15 优化maxclient
Apache2启动的时候会创建一些进程(配置文件中的StartServer设定的数目),并保持一个最大的MaxClients数;每一个超过该数目的连接请求,都会排队等待。
这 个MaxClients设置,是和MPM相关的。在apache.conf中,既有针对prefork的MaxClients设置,也有针对worker 的。前者在<IfModule mpm_prefork_module>段,后者在<IfModule mpm_worker_module>段。这里以woker为例,原配置为:
<IfModule mpm_worker_module> StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
MaxClients如果要设置超过256的话,就需要同步修改ServerLimit的数值,因为ServerLimit的默认值是256.比如这里需要配置为1024:
<IfModule mpm_worker_module> StartServers 10 ServerLimit 1024 MaxClients 1024 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
那么,要怎么才能知道是不是需要增大MaxClients呢?可以查看Apache2的错误日志文件/var/log/apache2/error.log,如果发现如下内容,就应该增大MaxClients了:
[error] server reached MaxClients setting,consider raising the MaxClients setting
下面代码取自http.conf文件
ServerLimit 2000
StartServers 25
MinSpareServers 25
MaxSpareServers 50
MaxClients 2000
MaxRequestsPerChild 10000
ServerLimit 2000
#有这个参数就不必像apache1一样修改源码才能修改256客户数的限制,要放到最前面才会生效,2000是这个参数的最大值
StartServers 25
#指定服务器启动时建立的子进程数量,prefork默认为5。
MinSpareServers 25
#指定空闲子进程的最小数量,默认为5。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。
MaxSpareServers 50
#设置空闲子进程的最大数量,默认为10。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。此参数 不要设的太大。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成"MinSpareServers+1"。
MaxClients 2000
#限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认为256。任何超过MaxClients限制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务。要增大这个值,你必须同时增大ServerLimit 。
MaxRequestsPerChild 10000
#每个子进程在其生存期内允许伺服的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。
将MaxRequestsPerChild设置成非零值有两个好处:
1.可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
16 启用压缩优化apache
在 Apache1.3中,有个gzip模块。在Apache2中,没有了gzip,有一个新的模块叫做deflate。这个模块可以在用户访问网站时实时将 内容进行压缩,然后再传给客户端。因为压缩比较高(测试结果显示,其压缩比最高可达97%,最少也有40%),所以deflate能够极大地加速网站,节 约带宽。当然,压缩是要花费CPU时间的。
要启用该模块,运行以下命令:
sudo a2enmod deflate
sudo /etc/init.d/apache2 force-reload
该模块有一个配置文件:/etc/apache2/mods-enabled/deflate.conf,可以配置要压缩的文件类型。默认配置为:
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/plain text/xml </IfModule>
上面配置较为合理,因为一般情况下,不需要对图片、PDF和mp3等文件进行压缩,那是很费资源的事情
17 使用缓存mod_cache提高apache性能
apache2 有两种缓存模块:一种是基于硬盘的,另外一种是基于内存的。
前者由mod_disk_cache实现,后者由mod_mem_cache实现,不过它们都 需要mod_cache的支持。
在基于内存的缓存方式中,还有一个mod_file_cache模块,它是用于搭配mod_mem_cache模块使用 的。
Apache调优(cookbook)
<Location /server-status> SetHandler server-status </Location> ExtendedStatus On
HostNameLookups Off
AllowOverride None
<IfModule mpm_winnt.c> ThreadsPerChild 1000 MaxRequestsPerChild 8000 Win32DisableAcceptEx </IfModule>
MMapFile /www/xxx/index.html
MMapFile /www/xxx/otherpage.html
CacheFile /www/xxx/index.html
CacheFile /www/xxx/otherpage.html
Apache错误处理
Apache虚拟主机
ServerName 127.0.0.1 NameVirtualHost * #表示所设定的主机可在所有的地址上运行 <VirtualHost *> ServerName test1.name #默认的第一个主机会接收未列出虚拟主机的请求 DocumentRoot "C:/Apache2.2/htdocs/test1" </VirutalHost> <VirtualHost *> ServerName test2.name DocumentRoot "C:/Apache2.2/htdocs/test2" </VirutalHost>
<VirtualHost *> ServerName default DocumentRoot /www/htdocs ErrorDocument 404 /site.html </VirutualHost>
ServerAlias www.baidu.com baidu.name
ServerName 127.0.0.1 <VirtualHost 10.0.0.1> ServerName test.name DocumentRoot "C:/Apache2.2/htdocs/test1" </VirtualHost> <VirtualHost 10.0.0.2> ServerName test2.name DocumentRoot "C:/Apache2.2/htdocs/test2" </VirutalHost>
<VirtualHost _default_> DocumentRoot /www/htdocs </VirtualHost>
Listen 8080 <VirtualHost 10.0.0.1:8080> DocumentRoot "C:/Apache2.2/htdocs/test_port8080" </VirtualHost> Listen 8081 <VirtualHost 10.0.0.1:8081> DocumentRoot "C:/Apache2.2/htdocs/test2_port8081" </VirtualHost>
NameVirtualHost 192.168.1.1 NameVirtualHost 170.1.2.3 <VirtualHost 192.168.1.1 170.1.2.3> DocumentRoot "C:/Apache2.2/htdocs/test" </VirtualHost>
Apache日志管理
emerg 紧急状况,网页服务器无法使用
alert 必须立刻采取动作
crit 危急的状况
error 错误的状况
warn 警告
notice 正常但很重要
info 提供信息
debug 调试信息
CustomLog "| /path/to/rotaelogs /path/to/logs/access_log.%Y-%m-%d 86400" combined