默认安装的FreeBSD6.2,优化比较少,这几天服务器访问量涨了些,于是就出了N多问题。问题之一是TIME_WAIT的数过大,观察发现,TIME_WAIT达到5148(参考下面netstat的结果)以后就再也涨不上去。这样的话,其他用户访问就会受到影响。
FIN_WAIT_1 135
FIN_WAIT_2 41
LAST_ACK 15
CLOSING 7
TIME_WAIT 5148
ESTABLISHED 97
在Unix和Linux系统下,这个连接的时间默认值是3000,减小这个值则可以使这个time_wait的时间减小,然后netstat的结果 里,time_wati的值就会小很多。具体做法如下(只在FreeBSD下试用,其他系统下未经验证,不过从网上资料看,应该部分适用):
在/etc/sysctl.conf文件里添加如下几行:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.inet.tcp.msl = 2000
net.inet.tcp.always_keepalive = 0
然后要使之生效,有两种办法(两种办法都需要在super权限下):
一是在super权限命令行下:sysctl -p
二是使用sysctl name=value
下面附上TIME_WAIT状态的意义:
客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口
状态为TIME_WAIT
是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?
有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?
主动关闭的一方在发送最后一个 ack 后
就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间
这个是TCP/IP必不可少的,也就是“解决”不了的。
也就是TCP/IP设计者本来是这么设计的
主要有两个原因
1。防止上一次连接中的包,迷路后重新出现,影响新连接
(经过2MSL,上一次连接中所有的重复包都会消失)
2。可靠的关闭TCP连接
在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。
TIME_WAIT 并不会占用很大资源的,除非受到攻击。
还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态
Posts Tagged ‘apache’
搞互联网开发也有好几年了,关于Apache的Timeout以前还真没有认真看过。羞!!! 今天一位网友访问不了魔秀, 刚开始没在意,还以为是网络的问题,因为我自己访问着非常正常。打开QQ的远程协助,登陆到对方电脑上,设置了hosts,不管用;ping 也ping不通。在准备放弃并告诉对方是网络原因,没有任何办法的时候,偶尔试着tracert了一下服务器所在机房的网关,发现可以到达,但我们的服务 器就不行。于是猜到是不是TimeOut的问题,增大这个值,重启Apache之后发现果然可以了。FT一下自己。下面把手册里关于timeout这一切 粘到这里来,以后得长个记性。这些天为服务器的负载能力发愁,看手册的时候不少,真的发现有好多之前被自己忽视的却是非常有用的东东。
TimeOut Directive
Description:
Amount of time the server will wait for certain events before failing a request
Syntax:
TimeOut seconds
Default:
TimeOut 300
Context:
server config
Status:
Core
Module:
core
The TimeOut directive currently defines the amount of time Apache will wait for three things:
The total amount of time it takes to receive a GET request.
The amount of time [...]
Filed under: Unix/Linux
Social Tagging: apache • mime • sis • wap • wml
Apache 是一个优秀的应用服务器程序,已经提供了对一般WAP的支持。
如果你不确定你的Apache是否配置好了WAP支持,可以看一下Apache的配置文件"mime.types"。如果配置文件中这么一行:
text/vnd.wap.wml wml
如果没有的话,也不用着急,加上这一行就行了。如果你要配置全面一些的话还要加上以下几行:
image/vnd.wap.wbmp wbmp
text/vnd.wap.wmls wmls
application/vnd.wap.wmlc wmlc
application/vnd.wap.wmlscriptc wmlsc
text/vnd.wap.wmlscript wsc
text/vnd.wap.wmlscript wmlscript
修改好以后,重新启动Apache就可以了。
如果要系统支持index.wml的话,还得配置Apache的httpd.conf,类似添加index.php的配置了,略。
只所以说支持的是一般WAP,像一些安装文件jar,jad,sis之类的安装文件就没有默认支持。
如果要使Apache支持OTA(WAP PUSH)下载的话,还得在mime.types中添加下面几行:
AddType image/vnd.nokia.ota-bitmap ota
AddType text/vnd.sun.j2me.app-descriptor jad
AddType application/java-archive jar
AddType application/vnd.Nokie.ringing-tone rng
AddType application/vnd.symbian.install sis
(不加的话,下载类似sis的安装文件会直接打开该文件,而不会直接执行。)
更详细的文件类型配置如下:
AddType text/vnd.sun.j2me.app-descriptor jad
AddType application/java-archive jar
AddType text/vnd.wap.wml wml
AddType audio/amr amr
AddType audio/midi mid
AddType audio/midi midi
AddType application/vnd.Nokie.ringing-tone rng
AddType application/vnd.symbian.install sis
AddType application/vnd.wap.wmlc wmlc
AddType text/vnd.wap.wmlscript wmls
AddType text/vnd.wap.wmlscript wmlsc
AddType application/vnd.wap.sic sic
AddType text/vnd.wap.si si
AddType text/vnd.wap.sl sl
AddType application/vnd.wap.slc slc
AddType text/x-vCalendar vcs
AddType text/v-vCard vcf
AddType application/vnd.nokia.gamedata nqd
AddType [...]
有时候我们需要定制Apache默认日志的格式和内容,比如增加或减少日志所记录的信息、改变默认日志文件的格式等。本文介绍可以用日志记录的所有信息,以及如何设置Apache使其记录这些信息。
一、定义日志格式
很久以前,日志文件只有一种格式,这就是“公共格式”,许多人已经习惯于使用这种格式。随后出现了定制日志格式,而且看起来定制日志格式更很受欢迎,即使 公共日志格式本身也重新用定制日志格式定义。本文介绍的就是如何随心所欲地定制日志文件的格式、如何让日志文件记录自己想要的信息。
定制日志文件的格式涉及到两个指令,即LogFormat指令和CustomLog指令,默认httpd.conf文件提供了关于这两个指令的几个示例。
LogFormat指令定义格式并为格式指定一个名字,以后我们就可以直接引用这个名字。CustomLog指令设置日志文件,并指明日志文件所用的格式(通常通过格式的名字)。
LogFormat指令的功能是定义日志格式并为它指定一个名字。例如,在默认的httpd.conf文件中,我们可以找到下面这行代码:
LogFormat "%h %l %u %t \"%r\" %>s %b" common
该指令创建了一种名为“common”的日志格式,日志的格式在双引号包围的内容中指定。格式字符串中的每一个变量代表着一项特定的信息,这些信息按照格式串规定的次序写入到日志文件。
Apache文档已经给出了所有可用于格式串的变量及其含义,下面是其译文:
———————————————————————-
%…a: 远程IP地址
%…A: 本地IP地址
%…B: 已发送的字节数,不包含HTTP头
%…b: CLF格式的已发送字节数量,不包含HTTP头。
例如当没有发送数据时,写入‘-’而不是0。
%…{FOOBAR}e: 环境变量FOOBAR的内容
%…f: 文件名字
%…h: 远程主机
%…H 请求的协议
%…{Foobar}i: Foobar的内容,发送给服务器的请求的标头行。
%…l: 远程登录名字(来自identd,如提供的话)
%…m 请求的方法
%…{Foobar}n: 来自另外一个模块的注解“Foobar”的内容
%…{Foobar}o: Foobar的内容,应答的标头行
%…p: 服务器响应请求时使用的端口
%…P: 响应请求的子进程ID。
%…q 查询字符串(如果存在查询字符串,则包含“?”后面的
部分;否则,它是一个空字符串。)
%…r: 请求的第一行
%…s: [...]
Filed under: Unix/Linux
Social Tagging: apache • keepalive • marrequest
Copy From : http://www.lostk.com/bbs/thread-872-1-1.html
apache的内存使用
apache进程在使用内存时,是“渐长”的。也就是说,直到这个进程死掉,使用内存的数量是一直增长而不会减少的。这样的话,apache进程使用内存的多少,就决定于你的应用程序最大使用内存量了。
keepalive参数
KeepAliveTimeout 这个参数决定了,在什么都不做之前,一个http进程能够等待多长时间?设想一下,如果keepalive设置为on,而 keepalivetimeout设置为一个比较大的数字,apache占用内存会很快的增长。这是因为,一个apache进程完成了一个任务(并达到了 一定的内存占用,想一下“渐进”模式),并不会马上退出,而是等待一个keepalivetimeout时间。假设用户的链接请求持续不断的到来,则积累 起来的无用的apache进程就会相当多,直到timeout,这些进程才会被杀死。
但是,keepalive的确对于静态的文件,比如图像文件的传送是很有效的,因此,keepalive要设置为on,但是keepalvietimeout要设置的小些,比如5s
MaxRequestsPerChild
这个参数是说,apache进程在处理了多少个请求之后,必须退出,重新开始,以免在处理中的内存问题。
对于php脚本来说,把这个参数设置的小一些是有好处的,可以避免程序使用的内存持续增长对apache带来的压力:让这个参数定期释放内存,因为php是在脚本执行完毕后,自动释放只用的资源(内存)的。
比如设置为50?如果太小的话,重新产生一个apache进程也是要消耗资源的,这是一个平衡问题。
作者:Fenng | English Version 【可以任意转载, 转载时请务必以超链接形式标明文章原始出处和作者信息及本声明】网址:http://www.dbanotes.net/web/flickr_web_tech.html
Cal Henderson 是大名鼎鼎的 Flickr 网站的开发者之一.在一篇名为 Serving JavaScript Fast 的文章中,他介绍了用于 Flickr 站点应用优化的技巧,读罢感觉获益良多."嚼一下别人的馍",概括一下该文的主要内容.
Flickr 是 Web 2.0 的代表站点。面对的网络问题除了一般 Web 站点都会有的内容优化之外, 还有必须要灵活处理 JavaScript 与 CSS 的频繁变化后部署分发带来的复杂性。
设定文件大小的策略 首先面临的一个问题是把所有的 JavaScript 与 CSS 放到一个文件中好呢,还是分割成多个文件 ? 从减少网络请求的角度上考虑, 前者更好,后者差。但是从并行的角度考虑, IE 与 Firefox 默认情况下都只能同时从一个域请求两个资源. 这会在很多情况下给用户带来不良的使用体验–必须所有的文件都下载完毕才可以看到像样的页面. Flickr 采用了折衷的办法–在保持文件数量尽可能少的情况下,把 JavaScript 与 CSS 分成多个子文件. 这在开发上带来了复杂性,但是对性能的收益是巨大的。
压缩的优化问题 毫无疑问,对站点内容进行压缩是一个比较常用的 Web 优化手段.但是并不一定都能达到理想的效果.原因在于 mod-gzip 模块不但消耗服务器端 CPU 资源,也消耗客户端 CPU [...]
Filed under: Unix/Linux
Social Tagging: apache • mod_rewrite
今天学习重写规则的语法。
RewriteRuleSyntax: RewriteRule Pattern Substitution [flags] 一条RewriteRule指令,定义一条重写规则,规则间的顺序非常重要。对Apache1.2及以后的版本,模板(pattern)是一个POSIX正则式,用以匹配当前的URL。当前的URL不一定是用记最初提交的URL,因为可能用一些规则在此规则前已经对URL进行了处理。 对mod_rewrite来说,!是个合法的模板前缀,表示“非”的意思,这对描述“不满足某种匹配条件”的情况非常方便,或用作最后一条默认规则。当使用!时,不能在模板中有分组的通配符,也不能做后向引用。 当匹配成功后,Substitution会被用来替换相应的匹配,它除了可以是普通的字符串以外,还可以包括:
$N,引用RewriteRule模板中匹配的相关字串,N表示序号,N=0..9
%N,引用最后一个RewriteCond模板中匹配的数据,N表示序号
%{VARNAME},服务器变量
${mapname:key|default},映射函数调用
这些特殊内容的扩展,按上述顺序进行。 一个URL的全部相关部分都会被Substitution替换,而且这个替换过程会一直持续到所有的规则都被执行完,除非明确地用L标志中断处理过程。 当susbstitution有”-”前缀时,表示不进行替换,只做匹配检查。 利用RewriteRule,可定义含有请求串(Query String)的URL,此时只需在Sustitution中加入一个?,表示此后的内容放入QUERY_STRING变量中。如果要清空一个QUERY_STRING变量,只需要以?结束Substitution串即可。 如果给一个Substitution增加一个http://thishost[:port]的前缀,则mod_rewrite会自动将此前缀去掉。因此,利用http://thisthost做一个无条件的重定向到自己,将难以奏效。要实现这种效果,必须使用R标志。 Flags是可选参数,当有多个标志同时出现时,彼此间以逗号分隔。
‘redirect|R [=code]‘ (强制重定向) 给当前的URI增加前缀http://thishost[:thisport]/, 从而生成一个新的URL,强制生成一个外部重定向(external redirection,指生的URL发送到客户端,由客户端再次以新的URL发出请求,虽然新URL仍指向当前的服务器). 如果没有指定的code值,则HTTP应答以状态值302 (MOVED TEMPORARILY),如果想使用300-400(不含400)间的其它值可以通过在code的位置以相应的数字指定,也可以用标志名指定: temp (默认值), permanent, seeother. 注意,当使用这个标志时,要确实substitution是个合法的URL,这个标志只是在URL前增加http://thishost[:thisport]/前缀而已,重写操作会继续进行。如果要立即将新URL重定向,用L标志来中重写流程。
‘forbidden|F’ (强制禁止访问URL所指的资源) 立即返回状态值403 (FORBIDDEN)的应答包。将这个标志与合适的RewriteConds 联合使用,可以阻断访问某些URL。
‘gone|G’ (强制返回URL所指资源为不存在(gone)) 立即返回状态值410 (GONE)的应答包。用这个标志来标记URL所指的资源永久消失了.
# ‘proxy|P’ (强制将当前URL送往代理模块(proxy module)) 这个标志,强制将substitution当作一个发向代理模块的请求,并立即将共送往代理模块。因此,必须确保substitution串是一个合法的URI (如, 典型的情况是以http://hostname开头),否则会从代理模块得到一个错误. 这个标志,是ProxyPass指令的一个更强劲的实现,将远程请求(remote stuff)映射到本地服务器的名字空间(namespace)中来。 注意,使用这个功能必须确保代理模块已经编译到Apache 服务器程序中了. 可以用“httpd -l ”命令,来检查输出中是否含有mod_proxy.c来确认一下。如果没有,而又需要使用这个功能,则需要重新编译“httpd”程序并使用mod_proxy有效。
‘last|L’ (最后一条规则) 中止重写流程,不再对当前URL施加更多的重写规则。这相当于perl的last命令或C的break命令。
‘next|N’ (下一轮) 重新从第一条重写规则开始执行重写过程,新开的过程中的URL不应当与最初的URL相同。 这相当于Perl的next命令或C的continue命令. 千万小心不要产生死循环。
# ‘chain|C’ (将当前的规则与其后续规则綑绑(chained)) 当规则匹配时,处理过程与没有綑绑一样;如果规则不匹配,则綑绑在一起的后续规则也不在检查和执行。
‘type|T=MIME-type’ (强制MIME类型) 强制将目标文件的MIME-type为某MIME类型。例如,这可用来模仿mod_alias模块对某目录的ScriptAlias指定,通过强制将该目录下的所有文件的类型改为 “application/x-httpd-cgi”.
‘nosubreq|NS’ (used only if no internal sub-request ) 这个标志强制重写引擎跳过为内部sub-request的重写规则.例如,当mod_include试图找到某一目录下的默认文件时 (index.xxx),sub-requests [...]
Filed under: Unix/Linux
Social Tagging: apache • mod_rewrite
车东很早就写了一篇文章来介绍利用mod_rewrite模块来达到用静态页面形式的链接隐藏后台的动态页面。 Apache的rewrite模块,提供了一个基于规则的重写(rewrite,也许译为重构更为合适)引擎,来实时重写发送到Apache的请求URL。因功能极其强大,被称为URL重写的“瑞士军刀”。
这个模块使用一个基于正则表达式解析器开发的重写引擎,根据web管理员定义的规则来实时(on the fly)重写请求URL。它支持任意数目的重写规则,以及附加到一条规则上的任意数目的规则条件,从而提供了一套非常灵活和功能强大的URL处理机制。URL处理操作的实施与否,依赖于各种各样的条件检查,如检查服务器变量、环境变量、HTTP头字段、时间戳的值,甚至外部数据库的检索结果。这个模块可以在服务器范围内(http.conf)、目录范围内(.htaccess)或请求串(query-string)的一部分处理有关的URL。重写的结果URL,可以指向一个站内的处理程序、指向站外的重定向或者一个站内的代理。与灵活和功能强大相随的是设置的复杂,别指望一天内弄明白整个模块。(所以,这个学习笔记也分了几部分:)
内部处理过程
API阶段 首先,Apache处理HTTP请求是分阶段进行的,Apache API为每个阶段提供了一个钩子(hook)。Mod_rewrite使用了其中的两个钩子:一个用来在HTTP请求被读取但还没有访问授权验证之前进行URL_to_filename转换,一个用来在授权验证完成且目录设置文件(.htaccess)读取之后、但内容处理器(content handler)被调用之前激化,进行修补(fixup).因此,当一个请求到达,Apache决定了相关的服务器(或虚拟服务器)以后进行URL_to_filename阶段,重写引擎(rewrite engine)开始处理服务器设置中的重写指令(mod_rewrite directives).接下来几个阶段过后进入修补阶段,此时最终的数据所在的物理目录已经找到,目录配置中的重写指令开始执行。在这两个阶段,mod_rewrite都是将URL重写为新的URL或文件名,所以看起来并没有明显的区别。对API的这种应用,并不是一开始就是这样设计的,而是Apache1.x不得已而为之。为了搞清这个问题,以下两点需要记住。 1)虽然mod_rewrite能进行URL到URL、URL到文件名字甚至文件名字到文件名字的转换,API(1.x)目前提供了一个URL_to_filename转换。在Apache2.0中,这两个钩子会被加进去,整个过程会更加清晰。一个事实必须清楚的记得:Apache在URL_to_filename钩子中,做得比API设计的功能更多。 2)不可思议的是,mod_rewrite能在目录范围内(如根据.htaccess文件的指令配置)进行URL处理,虽然URL很早就已经被转换为文件名字了。只所以会如此,是因为.htaccess文件存在于文件系统中。也就是说,在这个阶段来进行URL处理,是非常晚的时候了。为了解决这个"先有鸡还是先有蛋"的问题,mod_rewrite用了一个小技巧:当在目录范围内处理URL/filename时,mod_rewrite先将文件名逆转回相关的URL(虽然通常是不可能的,但请参见下面用以实现这个技巧的RewriteBase指令),然后据这个新URL生成一个站内的子请求(internal sub-request),这又重开始了API进程。Mod_rewrite尽量使这些复杂的步骤对用户透明,但应要记住:虽然目录范围URL的真正处理过程很快很高效,但这一阶段会因为这个"鸡和蛋"的问题而变得很慢和低效。从另一方面来看,这也是mod_rewrite提供给普通用户进行目录范围内的URL处理的唯一途径.规则集(RewriteRule指令集合)处理过程 当mod_rewrite在上述的两个API阶段被激活时,它会从它的配置数据结构(在开始服务器上下文(per-server context)或目录上下文(per-directory context)时创建的)中读取配置的规则集,然后URL重写引擎启动来执行包含的规则集(一个或多条规则以及它们的条件)。两种上下文中的处理过程都是一样的,差别只是在最后的结果处理过程上。 规则集中规则的顺序是非常重要的,因为重写引擎以特定的顺序来处理它们。重写引擎顺序遍历规则集,当一条规则匹配时,引擎会去遍历与它相关的条件集(RewriteCond指令集合).由于历史的原因,条件集先被列出来,因此控制流流程有点曲折(long-winded).如图一所示: 正如所看到的,首先URL会与每条规则的模板(pattern)比较,当匹配失败时,立即停止对当前规则的处理进入下一条规则。当匹配成功时,mod_rewrite寻找相关的规则条件。如果找不到相关的条件,则直接执行规则中定义的替换,然后回到规则遍历的过程。如果找到了相关的条件,则启动一个内部循环,依次检查各个条件。对于检查,我们不是拿一个模板来匹配当前的URL,而是先创建一个TestString串,将串内的变量、后向引用(bakc-reference)、查询结果(map lookups)等展开,然后用这个TestString和条件式中的CondPattern进行匹配,如果匹配失败,则整个条件集且这个规则都不再执行,重要回到规则遍历中;如果匹配成功,则检查下一个条件,如果所有的条件都满足,则执行规则中定义的替换动作。 特殊字符的转义 既然基于正则式,则当然会有特殊字符的问题。在1.3.20版本的Apache中,通过在特殊字符前加一个“”来将TestString或Sustitution串的特殊字符转义。正则式的后向引用 有一点需要记住:一旦在模板(pattern)或条件模板(CondPattern)中使用了括号,则后向引用已经自动产生了,你可以在Sustitution或TestString中通过$N或%N来引用相关的值。如图,描述了后向引用的值可以传到的位置。
配置指令(Configuration Directives)
指令
语法
默认值
说明
备注
RewriteEngine
RewriteEngine on|off
Off
开关重构引擎
默认时不能继承,故每个虚拟主机都要有自己的开关指令。
RewriteOptions
RewriteOptions Option
MaxRedirects=10
设置一些特殊参数
inherit:配置是否继承,MaxRedirects=number:内部重定向次数
RewriteLog
RewriteLog file-path
None
设定重写log文件
用RewriteLogLevel 0来禁止日志
RewriteLogLevel
RewriteLogLevel Level
RewriteLogLevel 0
设置日志级别
0表示没有,2以上用于debug,9及以上表示全部信息
RewriteLock
RewriteLock file-path
None
设置RewriteMap程序的同步锁文件
要求是本地文件,此文件只对rewriting map-program有效。
RewriteMap
RewriteMap MapName MapType:MapSource
Notused per default
定义重写影射
具体说明参见文档
RewriteBase
RewriteBase URL-path
physical directory path
设置目录范围内重写的基本URL
具体说明参见文档
RewriteCond
RewriteCond TestString CondPattern
None
定义规则条件
具体说明参见文档
RewriteRule
RewriteRule Pattern [...]

RSS
Sina微博
twitter