【面试虐菜】—— 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

MaxRequestsPerChild 0

ThreadsPerChild 25

</IfModule>

MaxClients如果要设置超过256的话,就需要同步修改ServerLimit的数值,因为ServerLimit的默认值是256.比如这里需要配置为1024:


<IfModule mpm_worker_module>

StartServers 10

ServerLimit 1024

MaxClients 1024

MinSpareThreads 25

MaxSpareThreads 75

MaxRequestsPerChild 0

ThreadsPerChild 25

</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)

1 内存

适当选用适合大小的内存,保证谷峰负载时,有足够的内存使用

2 使用ab测试apache性能

ab -n 1000 -c 10 http://www.test.com

3 调节保持连接的设定

  KeepAlive On

  #在单一连接时进行多个请求

MaxKeepAliveRequests 0

   #单一连接时间可以允许多少个保持连接的请求

KeepAliveTimeout 15

  #在没有接受其他请求时,会持续开启特定连接的时间

4 取得网站活动快照

启用server-status处理器来取得子进程在运行的快照

<Location /server-status>
 SetHandler server-status
 </Location>
 ExtendedStatus On

5 避免DNS查询

以DNS来查询客户端地址

HostNameLookups Off

6 最佳化符号链接

主要考虑安全防护:永远不要允许遵循符号链接

主要考虑性能:永远使用Options FollowSysLinks且绝不使用Options SysLinkIfOwnerMatch

7 尽量降低.htaccess文件对性能的影响

只在必要的目录中启用AllowOverride,并告知Apache不要浪费时间在其他的位置上查找.htaccess文件

AllowOverride None

然后以<Directory>区块启用必要的.htaccess文件

8 最佳化进程的产生

MinSpareServers

 #MaxSpareServers 控制服务器池的大小,以便有子进程等待服务引入的请求

(永远不要发生,当请求送至网站却没有闲置的服务器进程在等待处理请求的情形)

9 调节线程的产生

 <IfModule mpm_winnt.c>
 ThreadsPerChild 1000
 MaxRequestsPerChild 8000
 Win32DisableAcceptEx
 </IfModule>

10 将经常查看的文件存入高速缓存区

[使用MMapFile]----将文件内容存入内存的高速缓冲区

 MMapFile /www/xxx/index.html
 MMapFile /www/xxx/otherpage.html

[使用CacheFile]----将文件句柄存入内存的高速缓冲区,稍微降低系统性能,但是占用内存较少

 CacheFile /www/xxx/index.html
 CacheFile /www/xxx/otherpage.html

Apache错误处理

1自定义错误信息

ErrorDocument 405 /errors/test.html

2 将无效的URL重定向至其他网页

ErrorDocument 404 /index.html

DirectoryIndex index.html /path/to/notfound.html

3 在发生错误状况时得到通知

ErrorDocument 404 /cgi-bin/404.cgi

404.cgi的内容

Apache虚拟主机

1 IP地址方式:每台虚拟主机都有其唯一的IP地址

名称寻址方式:多台虚拟主机会以不同的名称在同一IP地址上运行

2 以名称寻址的虚拟主机

使用NameVirtualHost *指令以及<VirtualHost>区块


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>

3 指定一台名称寻址的主机位默认服务器,并在查找不到主机时,转向默认网页

<VirtualHost *>
 ServerName default
 DocumentRoot /www/htdocs
 ErrorDocument 404 /site.html
</VirutualHost>

4 对特定主机设置多个名称

ServerAlias www.baidu.com baidu.name

5 以IP寻址的虚拟主机(可以在系统上设定多个IP,然后各自支持某个网站)


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>


6 建立IP寻址的默认虚拟主机

<VirtualHost _default_>
 DocumentRoot /www/htdocs
</VirtualHost>

1 _default_ 建立虚拟主机,处理所有未设定虚拟主机“地址:端口号”的请求

2 _default_ 可与端口号同时使用 _default_:443 会接受443端口号的所有未设定虚拟主机的请求

7 端口号寻址的虚拟主机


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>

这种用法不常见,因为请求时,很麻烦,需要填入端口号:比如 www.test.com:8080/

8 在多个地址上显示相同的网页内容

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日志管理

1 取得更详细的错误信息

LogLevel Debug


emerg 紧急状况,网页服务器无法使用

alert 必须立刻采取动作

error 错误的状况

crit 危急的状况

warn 警告

debug 调试信息

notice 正常但很重要

info 提供信息

2 按照日或小时来记录请求

CustomLog "| /path/to/rotaelogs /path/to/logs/access_log.%Y-%m-%d 86400" combined

rotaelogs #日志的主文件名

86400 #两次更新间隔的时间 一天24小时86400秒

3 记录引用的网页URL

%{Referer}i

4 记录浏览器软件的名称

%{User-Agent}i

本文转自博客园xingoo的博客,原文链接:【面试虐菜】—— Apache知识整理,如需转载请自行联系原博主。

时间: 2024-07-30 02:40:32

【面试虐菜】—— Apache知识整理的相关文章

【面试虐菜】—— MongoDB知识整理

为什么我们要使用MongoDB? 特点: 高性能.易部署.易使用,存储数据非常方便.主要功能特性有: 面向集合存储,易存储对象类型的数据. 模式自由. 支持动态查询. 支持完全索引,包含内部对象. 支持查询. 支持复制和故障恢复. 使用高效的二进制数据存储,包括大型对象(如视频等). 自动处理碎片,以支持云计算层次的扩展性 支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序. 文件存

【面试虐菜】—— Oracle知识整理《收获,不止Oracle》

普通堆表不足之处:     表更新有日志开销     表删除有瑕疵     表记录太大检索较慢     索引回表读开销很大     有序插入难有序读出 DELETE产生的undo最多,redo也最多,因为undo也需要redo保护 全局临时表: 1 高效删除记录 基于事务的全局临时表commit或者session连接退出后,自动删除 基于回话的全局临时表在退出回话后自动删除 2 针对不同的会话数据独立,不同的session访问全局临时表,看到的结果不同 全局临时表在程序的一次调用执行过程中,需要

【面试虐菜】—— JAVA面试题(1)

今天参加笔试,里面有设计模式,和一些基础题! 印象最深的是:什么不是Object的函数,我蒙的finalize,哎,无知! 还问了,接口与抽象类的不同,还有多线程的实现方式!下面基本都有. 另外还问了,观察者模式,设计模式,我一点不会,看来要下功夫了! 1.  面向对象编程的三大特性是什么,请简要阐述 (1).继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继 承了原始类的特性,新类称为原始类

【面试虐菜】—— 常用SQL语句

创建表 create table emp( id decimal, name char(10), age decimal) 删除表 DROP TABLE EMP 插入默认值 CREATE TABLE EMP( Id decimal NOT NULL, Name char(10) NOT NULL, Age decimal NOT NULL DEFAULT 18) 添加列 ALTER TABLE EMP ADD COLUMN Comments char(50) NOT NULL DEFAULT '

【面试虐菜】—— Oracle中CHAR、VARCHAR的区别

1.CHAR. CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取的时候可能要多次用到trim(). 2.VARCHAR. 存储变长数据,但存储效率没有CHAR高.如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的.VARCHAR类型的实际长度是它的值的实际长度+1.为什么"+1"呢?这一个

【面试虐菜】—— JAVA面试题(2)

1 String = 与 new 的不同 使用"="赋值不一定每次都创建一个新的字符串,而是从"字符串实例池"中查找字符串.使用"new"进行赋值,则每次都创建一个新的字符串. 2 String与StringBuffer String类是不可变类,字符串一旦初始化后,就不能被改变.而StringBuffer类是可变类,字符串值可以呗改变.常常在实际应用中看到累死这样的代码:String s=new("hello");s+=&q

【面试虐菜】—— JAVA面试题(3)

1 throws与throw的区别 解析:throws和throw是异常处理时两个常见的关键字,初级程序员常常容易正确理解throw和throws的作用和区别,说明已经能比较深入理解异常处理.Throw用来抛出异常,如果执行了throw语句,程序将发生异常,进入到异常处理机制.Throws用来声明异常,说明这个方法可能会发生某些类型的异常,那么编译器将强制在调用这个方法的时候处理异常.API中的很多方法都使用了throws声明了异常,所以使用这些方法时编译器会提示需要处理异常.   参考答案:t

asp知识整理笔记3(问答模式)_javascript技巧

继上两篇<asp知识整理笔记1>和<asp知识整理笔记2>,<asp知识整理笔记3>新鲜出炉: 17.问题:在ASP中使用ADO的AddNew方法和直接使用"Insert into..."语句有何不同?哪种方式更好?答:ADO的AddNew方法只是将"Insert into "语句封装了起来,所以,当对大量数据进行操作的时候,直接使用SQL语句将会大大加快存取数据的速度,因为它减少了ADO的"翻译"时间,由于S

asp知识整理笔记4(问答模式)_ASP基础

继前几篇篇<asp知识整理笔记1>和<asp知识整理笔记2>,<asp知识整理笔记3>新鲜出炉:23.问题:在ASP文件中读取HTML的表单字段有几种方法? 答:Request对象除了可以用来读取附带在网址后面的参数以外,也可以读取HTML表单字段的内容,经常使用的语法结构如下: < Form name =Formname method="Get|Post"Action="URL">< Form > 其中的