2008年8月18日星期一

Apache中httpd.conf文件配置详解1

Apache中httpd.conf文件配置详解...phpma.com

Apache的基本设置主要交由httpd.conf来设定管理,我们要修改Apache的相关设定,主要还是通过修改httpd.cong来实现。下面让我们来看看httpd.conf的内容,它主要分成3大部分:
Section 1:Global Environment
Section 2:'Main' server configurationphpma.com
Section 3:Virtual Hosts

【第一部分】

·ServerType standalone
这表示Apache是以standalone启动,也可以是inetd。所谓standalone是指启动一次来接听所有的连线;而inetd是接到http的连线要求才启动,随着连线的结束而结束,这样负担是不是很但呢?所以一般都是以standalone启动。
·ServerRoot "/usr/local/httpd"
此为apache的目录
·#LocdFile /use/local/httpd/logs/httpd.lock
保留预设值,不更动phpma.com
·PidFile /usr/local/httpd/logs/httpd.pid
此文件记录着apache的父处理程序id
·ScoreBoardFile /usr/local/httpd/logs/httpd.scoreboard
此文件存储处理程序的信息
·#ResourceConfig conf/srm.conf
·#AccessConfig conf/access.conf
由于我们统筹由httpd.conf来管理,所以这两个文件预设是注解起来的,可以保留预设值不更动
·Timeout 300
设盯超时的时间。如果用户端超过300秒还没连上server,或server超过300秒还没传送信息给用户端,即断线。
·KeepAlive On
允许用户端的连线有多个请求,设为Off表示不允许
·MaxKeepAliveRequests 100
每次连线最大的请求树木,数字愈大,效能愈好。0表示不限制
·MinSpareServer 5
·MaxSpareServers 10
MinSpareServer 5表示最少会有5个闲置的处理程序,如果实际的数目少于此数目,则会增加处理程序。MaxSpareServers 10表示最大的闲置处理程序数目,如果你的网站需求量很大,可以将此数目设大一些,大不要随便将此数目设得太大。
·StartServers 5
启动时Server的数目
MaxClients 150
限制同时间最大的连线数目,当然不能设得太小,一旦达到此数目,就无法再增加用户端
·MaxRequestPerChild 0
限制子处理程序结果前的要求数目,0表示不限制
·#Listen 3000
·#Listen 12.34.56.78:80
使用其它的连接端口或IP
·BindAddress *
可以接听*(所有IP地址)、指定的IP地址或是完整的域名
·#LoadModule foo_module libexec/mod_foo.so
使用DSO模块
·#ExtendedStatus On
可检阅apache的状态信息,预设是Off(注解起来)

如果之前的ServerType是inetd,请直接跳到ServerAdmin。
·Port 80
Standalone服务器接听的连接端口,当然也可以是其他小于1023的端口号
·User nobody
·Group nobody
执行httpd的用户和群组
·ServerAdmin 管理员的电子邮件地址
这是管理员的电子邮件地址,如果apache有问题的话,会寄信通知管理员,当然你也可以建立一个专门负责web的帐号来收信
·ServerName 你的主机名称
此为主机名称,如果没有域名,也可以用IP
·DocumentRoot "usr/local/httpd/htdocs"
此目录为apache放置网页的地方,里面的index.html即为连到此主机的预设首页
·
  Options FollowSymLinks
  AllowOverride nonephpma.com
 
此目录设定用户放置网页的目录(public_html)的执行动作。详细的目录存取方法会在后面说明
·
  Options Indexes FolloeSymLinks
  AllowOverride None
  Order allow,deny
  Allow from all
 
此目录设定apache的网页目录(htdocs)的执行动作
·UserDir public_html
用户可在自己的目录下建立public_html目录来放置网页,输入http://主机地址/~用户名称即可连接到...劳撤胖玫牡胤?/a>
·DirectoryIndex index.html
这里设定预设主页的名称
·AccessFileName .htaccess
这个是控制存取的文件名称,一般采用预设的.htaccess名称,后面会说明htaccess的使用方法
·
  Order allow,deny
  Deny from all
 
这用来防止其他人看到.ht开头的文件内容,不仅是保护.htaccess的内容,还保护.htpasswd的内容。当然也可以直接写成。如果你有更改 AccessFilename,例如将.htaccess改成.accessht,请记得也要在此做相关的更改,如此才能防止其他人看到哦
·#CacheNegotiatedDocs
注解起来是告诉Proxy不要将互动产生的文件存入cache,如果拿掉#,则会存在cache中
·UseCanonicalName On
使用标准的名称,预设是On。假设有一个web server的全名是www.sample.com,一般称为www;如果us...羑ttp://www/abc
·TypeConfig /usr/local/httpd/conf/mime.types
指定存放MIME文件类型的文件。你可以自行编辑mime.types文件。
·DefaultType text/plain
当server不认得此文件类型时的预设格式,此设定是当成一般文字
·
  MIMEMagicFile /usr/local/httpd/conf/magic
 
mod_mime_magic模块可使server由文件内容决定其MIME类型。如果有载入mod_mime_magic模块,才会处理MIMEMagicFile这一段。如果是…,则表示如果没有载入该模块,才会处理这一段
·HostLookups Off
如果为On,则每次都会向name server解析该IP,记录此连线的名称(例如www.apache.org)自换岷牟簧偈奔洌...为Off,仅记录IP
·ErrorLog /usr/local/httpd/logs/error_log
指定发生错误的记录文件(error_log)位置。如果在没有指定发生错误的记录文件,则会沿用此文件
·LogLevel warn
记录分成很多等级,在此是warn。各等级如下: 等级 说明
debug debug信息
info 普通信息
notice 重要信息
warn 警告信息
error 发生错误
crit 紧急情况
alert 马上要处理的情况
amerg 系统快要死了
·LogFormat "%h %l %u %t\"%r\"%>s %b\"{Referer}i\"\"${UserAgent}i\""combined
 LogFormat "%h %l %u %t"%r\"%>s %b"commom
 LogFormat "%{Referer}i->%U"referer
 LogFormat "%{User-agent}i"agent
自定四种记录格式:combined、common、referer、agent
·CustomLog /usr/local/httpd/logs/access_log common
存取的记录文件(access_log)使用自定的common格式
·#CustomLog /usr/local/httpd/logs/referer_log referer
 #CustomLog /usr/local/httpd/logs/agent_log agent
 #CustomLog /usr/local/httpd/logs/agent_log combined
这三个记录文件也是使用自定义格式(分别是referer、agent、combined),不过注解起来表示未使用这三个文件
·ServerSignature On
设为On时,在server所产生的网页(像是错误发生时)上,会有apache的版本、主机、连接端口的一行信息;如果设为Email,则会有mailto:给管理员的超链接
·Alias /icons/ "/usr/local/httpd/icons/"
使用较短的别名,其格式为:Alias 别名 原名。
·ScriptAlias /cgi-bin/ "/usr/local/httpd/cgi-bin/"
和Alias一样,只是这是设定server script的目录
·IndexOptions FancyIndexing
显示好看的文件清单(配合下面各文件所对应的图形)
·AddIconByEncoding(CMP,/icons/compressed.gif)x-conpress x-gzip
·AddIcon /icons/blank.gif^^BLANKICON^^DefaultIcon/icons/unknow.gif
这些是在显示文件清单(之前所说的FancyIndex)时,各种文件类型的对应图形。例如.ps .si .eps这三种文件的表示图形都是a.gif
·#AddDescription "GZIP conpressed document" .gz
 #AddDescription "tar archive" .tar
 #AddDescription "GZIP compressed tar archive" .tgz
这些是在显示文件清单时,在文件后面附上说明,其格式为:
AddDescription "说明" 文件名
例如:AddDescription "It is private txt" my.txt
·ReadmeName README
显示文件清单时,在最下面显示README的文件内容
设置CGI脚本/将httpd.conf做为唯一的配置文件/用户授权和访问控制等
关于Apache的配置及使用,在LinuxAid中已经有不少文章做了详细的阐述,本文讨论了在使用Apache时,有关配置文件的使用及对文件的访问控制等内容,算是对Apache的使用所做的一些补充吧!

如果您对Apache有一定的了解,特别是对几个配置文件有一定的了解,这将会有助于您对本文内容的理解;如果恰巧您不是很了解这几个配置文件的使用,那么就借着这个机会来一起熟悉一下吧。
一、关于CGI执行脚本的配置
这里有两种设置CGI脚本的方法。第一、CGI的脚本文件以.cgi为扩展名;第二、设置脚本可执行目录。但是这两种方法都需要将要执行的文件设置为711,才可以被执行。
第一种方法,我们需要在access.conf文件种将你要发行的目录设置为Option ExecCGI All,在srm.conf资源配置文件中,加上下列一句:
AddHandle cgi-script .cgi
这样在所有的目录种只要你的文件是.cgi为扩展名的,且文件访问权限为711的,无论给文件在你发行目录的任何一个地方都可以做为CGI被Apache服务器调用。这种方法一般没有第二种方法安全。
第二种方法,是将一个目录作为一个可执行目录,将所有的cgi文件都放在其中,这里就不一定非得是以.cgi为扩展名得文件可以执行,而是只要有711属性的文件就可以被执行,而且其它的非可执行文件都被禁止访问。我们的默认配置文件种就有一个很好的例子:


access.conf:
phpma.com
Allow Override None
Options ExecCGI

srm.conf
ScriptAlias /cgi-bin/ /home/httpd/cgi-bin/


这样只要在/home/httpd/cgi-bin/目录中的可执行文件都可以被Web服务器调用,而其它的非可执行文件将被拒绝访问。
二、配置用户的发行目录
这里有两种设置方法:
第一种是系统的默认方法,即用户目录下的public_html目录为用户的发行目录,且默认的主页文件为index.html,且该目录不支持CGI。
第二种是在其它目录种专门为用户设置发布目录,如我想在/home/html目录做为用户的web目录,那管理员就应该在该目录下为每一个用户设置一个子目录,如:/home/html/user01、/home/html/user02等。那么,你的srm.conf文件中的UserDir后面就不能再是 public_html了,应该改为:UserDir /home/html/*/,注意这里的“*”代表anyone,当你再浏览器中请求一个如http://www.domain/~user01 时,Apache...ndex.html文件。
这种设置不需要到access.conf中设置该目录的访问属性,还有,当我们设置虚拟主机时也不用设置目录的访问属性,但是如果你想让某个目录具有CGI权限,都要到Access.conf文件中去配置目录的访问权限,如:你想让你的所有用户在他们的发布目录中具有CGI访问权,则需要在你的access.conf中这样设置:

phpma.com

Allow Override None
Options ExecCGI



注意这里设置用户目录中的cgi-bin子目录为cgi执行目录,这是一种安全的设置,而且也是一种UNIX的习惯。

Apache中httpd.conf文件配置详解2

三、如何将Apache服务器设置为inetd的子服务
当你安装了Apache后,默认设置为standalone方式运行,如果你想将它设置为inetd的子服务,首先在每次激活Linux时不激活 httpd,然后编辑/etc/inetd.conf,在其中加入下列语句:http stream tcp nowait root /usr/sbin/httpd httpd
然后重新激活inetd服务器。这样你用ps -aux命令查看进程运行情况时,你不会发现httpd的进程的存在,但是一旦有客户请求一个页面时,inetd就激活一个httpd进程为该请求服务,之后就自动释放,这种运行方式有助于节省系统资源,但是如果你的web服务很重要,一般不建议设置为这种方式运行。
四、将httpd.conf做为唯一的配置文件
在 Apache中给用户提供了三个配置文件: srm.conf、 access.conf 和 httpd.conf files。实际上这三个文件是平等的,所有的配置都可以放在一个单独的httpd.conf文件中,事实上在Apache 1.3.2中就已经这样做了,在httpd.conf中应包括以下两条指令来防止Apache对srm.conf和access.conf两个配置文件的访问:
AccessConfig /dev/null
ResourceConfig /dev/null
在apache1.3.2中只要注释掉以下这两行即可:
AccessConfig conf/access.conf
ResourceConfig conf/srm.conf
五、用户授权和访问控制
你也许在访问某些网站时会遇到过这样的情况,当你点击某个连接时,你的浏览器会弹出一个身份验证的对话框,要求输入账号及密码,如果没有,就无法继续浏览了。有人会以为这是用CGI做出来的,其实不然,这是WWW服务器的用户授权和访问控制机制在发挥作用。

你是否还记得在设置Apache服务环境的过程中,有……..<./Directory>这个指令,可以对不同的目录提供不同的保护。但是这样的设定,需要重新启动服务器才会生效,灵活性较差,通过AccessFile指令指定访问控制文件的方式则比较灵活,在Apache服务器中设置用户的访问控制权限步骤如下:
1、首先对httpd.conf文件进行设置如下:
phpma.com
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Options Includes FollowSymLinks Indexes
AllowOverride All //*注意AllowOverride 一定要设置为All,这样后面的.htaccess文件才会起作用

Order allow,deny
Allow from all

#
# Order deny,allow
# Deny from all
#


#指定配置存取控制权限的文件名称
AccessFileName .htaccess
2、创建.htaccess文件內容
要控制某目录的访问权限必须建立一访问控制文件,文件名前面指定的“.htaccess”,其内容格式如下:
AuthUserFile 用户帐号密码文件名
AuthGroupFile 群组帐号密码文件名
AuthName 画面提示文字
AuthType 验证方式

密码验证方式

用户验证方式AuthType目前提供了Basic和Digest两种。
密码检验设定方法与httpd.conf中的相关设定相同。
具体例子如下:
AuthUserFile /etc/secure.user
AuthName 安全认证中心
AuthType Basic

require valid-user

3、建立用户密码文件
如果你是第一次创建用户密码,命令格式如下:
htpasswd -c 密码文件名 用户名称
在上面的例子中,我们将用户密码文件放到了/etc/secure.user文件中,所以这里应按照如下进行操作:
htpasswd -c /etc/secure.user sword
程序会提示你输入两次用户的口令,然后用户密码文件就已经创建sword这个用户也添加完毕了。
如果要向密码文件中添加新的用户,按照如下命令格式进行操作:
htpasswd 密码文件 用户名称
这样,重新启动httpd后,进行该WEB目录时就会有一个对话框弹出,要求输入用户名及用户口令了。
4、如何减少访问控制对Apache性能的影响
频繁的使用访问控制会对Apache的性能产生较大的影响,那么,如何才能减少这种影响呢?最简单也是最有效的方法之一就是减少.htaccess文件的数目,这样可以避免Apache对每一个请求都要按照.htaccess文件的内容进行授权检查。它不仅在当前的目录中查找.htaccess文件,它还会在当前目录的父目录中查找。
/
/usr
/usr/local
/usr/local/etc
/usr/local/etc/httpd
/usr/local/etc/httpd/htdocs
/usr/local/etc/httpd/htdocs/docs
通常在根目录下没有htaccess文件,但Apache仍然会进行例行检查以确定该文件确实不存在。这是影响很影响服务器工作效率的事情。下面的方法可以消除这个讨厌的过程:将AllowOverride选设置为None,这样Apache就会检查.htaccess文件了。将/根目录的 AllowOverride选项设为None,只将需要进行访问控制的目录下的AllowOverride选项设置为all,如下面的例子中将/根目录的 AllowOverride 选项关闭了,只打开了/usr/local/etc/httpd/htdocs目录下的AllowOerride选项,这样,系统就只在/usr /local/etc/httpd/htdocs中检查.htaccess文件,达到的提高服务效率的目的。

AllowOverride None


AllowOverride All

如果除了根目录以外,还有其它存放WWW文件的目录,你也可以采取同样的方法进行设置。比如:如果你使用UserDir来允许用户访问自己的目录,AllowOverride的设置如下:

AllowOverride FileInfo Indexes IncludesNOEXEC

5、防止用户访问指定的文件
系统中有一些文件是不适宜提供给WWW用户的,如:.htaccess、htpasswd、*.pl等,可以用达到这个目的:

order allow,deny
deny from all

用户访问控制三个.htaccess文件、.htpasswd和.htgroup(用于用户授权),为了安全起见,应该防止用户浏览其中内容,可以在httpd.conf中加入以下内容阻止用户对其进行访问:

Order deny, allow
Deny from all

这样这三个文件就不会被用户访问了。
6、限制某些用户访问特定文件
可以对目录进行约束,要限制某些用户对某个特定文件的访问可以使用,比如:不允许非domain.com域内的用户对/prices/internal.html进行访问,可以用如下的设置:

order deny,allow
deny from all
allow from .domain.com

如果你要授于相应权限的机器没有公开的域名,请在你的/etc/hosts文件中,将其IP地址映射到某个指定的名称,然后在Location中对其进行设置,否则该选项是不起作用的。
7、只接受来自特定链接的访问
例如,只让所有来自 http://www.sina.com.cn/* 的链接的用户进入此目录,由其它链接来的访客都不得进入; " * "表示此网站底下所有的链接。其中的 http://www.sina.com.cn/* 也可以是:http://202.106.184.200/* 或是指定文件 http://www.sina.com.cn/news.html
.htaccess文件的内容如下:
AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName ExampleAllowFromSpecificURL
AuthType Basic

order deny,allow
deny from all
referer allow from http://www.sina.com.cn/*

六、如何通过Apache访问挂接到mnt中的目录内容
在Linux下,要浏览光盘的内容,必须要先将光盘挂接到/mnt/cdrom上,在Linux下访问dos或其它分区也一样,都要将其先挂接到/mnt下。下面提供的方法,可以通过Apache显示上挂的目录内容:
1、 先将需要挂接的内容挂接到mnt下,如:
mount –t iso9660 /dev/cdrom /mnt/cdrom
2、修改/usr/local/etc/httpd/conf中的srm.conf文件(在Apache1.3.2中修改httpd.conf)
加入别名支持:
# Alias fakename realname
# alias for netware server //
Alias /netware/ /mnt/MYDOM_NW/vol1/home/htmldocs/
Alias /winNT/ /mnt/MYDOM_NT/
Alias /unix/ /mnt/MYDOM_UNIX
其实这一步还有个最简单的方法就是直接在WWW文件目录下建立链接目录,比如:
ln –s /mnt/MYDOM_NT/ winNT
也能达到同样的效果。
3、最后,用Directory 分别指定用户对上面这几个目录的访问权限:

Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all

注意, Options中的Indexes一定要注明,否则被打开的目录中若没有Index.html文件,用户无法浏览整个目录的结构,服务器会返回错误指示。
这些工作都完成后,别忘了重新启动Apache。在客户端通过 http://www.yourdomain/CDROM/访问光盘内容,其余系统以此类推

#DocumentRoot "/usr/local/apache/htdocs"
#设置存放站点html文件的目录。

Options FollowSymLinks
AllowOverride None

#设置/目录的指令。具体地说明:
Option:定义在目录内所能执行的操作。
None:表示只能浏览,
FollowSymLinks:允许页面连接到别处,
ExecCGI:允许执行CGI,
MultiViews:允许看动画或是听音乐之类的操作,
Indexes:允许服务器返回目录的格式化列表,
Includes:允许使用SSI。这些设置可以复选。
All:则可以做任何事,但不包括MultiViews。
AllowOverride:加None参数表示任何人都可以浏览该目录下的文件。
另外的参数有:FileInfo、AuthConfig、Limit。php

2008年8月12日星期二

PHP缓存加速器:eAccelerato

eAccelerator README for Linux 简体中文翻译



eAccelerator 是一个为 PHP 程序加速的免费开源软件,其极速效果绝不输给 Zend Performance Suite。并且支持 Linux, FreeBSD, Solaris, MacOS X, Windows等系统。

今天闲来无事,将 README for Linux 文件翻译了出来,供大家参考。
其中安装部分进行了修改,细化了安装过程。

其中翻译不确切的地方还请大家指教:)

【翻译:Nanu (nanu@discuz.com) 】

eAccelerator for PHP

什么是 eAccelerator ?

eAccelerator 是一个开源并且免费的 PHP 加速器,优化器,编码器,同时也能够为 PHP
提供动态内容缓存。它能够将 PHP 脚本缓存为已编译状态以达到提升 PHP 脚本运行性能
的目的,因此传统的预编译几乎被消除。eAccelerator 也能够优化 PHP 脚本以提升 PHP
脚本的执行速度。eAccelerator 可有效降低服务器负载并且提高 PHP 程序速度达 1-10 倍。

TurckMMCache 是 eAccelerator 的前身。
( http://sourceforge.net/project/turckmm-cache/ by Dmitry Stogov )

eAccelerator 包含一个 PHP 编码器和加载器。您可以使用编码器对 .php 脚本进行编码,
从而能够以非源代码方式发布您的 PHP 程序。经过编码的 PHP 程序可以运行在任何安装有
PHP 解析环境和 eAccelerator 的站点上,由于编码后的 PHP 程序存储为已编译代码,并且
已编译版本中不包含程序的源代码,因此,经过 eAccelerator 编码的 PHP 程序是不能被还原
恢复的。当然,一些内部脚本可以被某些不同的反编译引擎工具(如 disassemblers, debuggers等)
进行还原恢复,但这并非是微不足道的。

eAccelerator 与 Zend Optimizer 加载器兼容。在 php.ini 中,Zend Optimizer 必须在
eAccelerator 之后加载。如果您的站点不运行任何经由 Zend 编码器编码的 PHP 脚本,那么
我们并不推荐您在安装 eAccelerator 的服务器上安装 Zend Optimizer。

eAccelerator 不能运行于 CGI 模式下,但它可以运行于像 lighttpd 类似的 Fast-CGI模式。

以下是一些与 eAccelerator 具有相同功能的产品:
- Zend Performance Suite (http://www.zend.com)
- Alternative PHP Cache (http://pecl.php.net/package/APC)


下载

最新版的 eAccelerator 可以在 Sourceforge 下载:
http://sourceforge.net/projects/eaccelerator/
CVS 开发版本快照(snapshots)可以在以下地址下载:
http://snapshots,eaccelerator.net


所需环境

Apache 1.3 或更高版本
mod_php 4.1 或更高版本
autoconf
automake
libtool
m4


兼容性

经过用户的使用和报告,eAccelerator 能够运行在 PHP4 和 PHP5。PHP5.1 目前尚不能完整的
支持。eAccelerator 能够与 Apache 1.3/2.0、lighttpd、和 IIS 在 Linux、FreeBSD、MacOS X、Solaris 和
Windows 上运行。


快速安装

您可以在 eAccelerator 站点获取更多有关安装方面的信息。
http://eaccelerator.sourceforge.net/

注意(1):有关 Microsoft Windows 平台的安装信息,请阅读 README.win32 file。

步骤 1. 编译 eAccelerator

cd /usr/local/src

wget http://internap.dl.sourceforge.n ... rator-0.9.4.tar.bz2

tar xjvf eaccelerator-0.9.4.tar.bz2

cd eaccelerator-0.9.4.tar.bz2

export PHP_PREFIX="/usr/local/php"

$PHP_PREFIX/bin/phpize

./configure \
--enable-eaccelerator=shared \
--with-php-config=$PHP_PREFIX/bin/php-config

make

您必须在 export 命令中指定 PHP 真实的安装目录位置。该目录位置可能是 "/usr" "/usr/local",或
其他位置。

步骤 2. 安装 eAccelerator

make install

步骤 3. 配置 eAccelerator

eAccelerator 可以安装为 Zend 扩展或者 PHP 扩展。

对于 eAccelerator 0.9.1 及其以上版本,如果您系统中存在 /etc/php.d 目录,则需要将 eaccelerator.ini
文件复制到该目录中,并且根据需要修改其中的默认设置和数值。

如果系统中不存在 /etc/php.d 目录,则编辑 php.ini 文件(通常位于 /etc/php.ini)。

安装为 Zend 扩展:

zend_extension="/usr/lib/php4/eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

如果您使用 thread safe 编译安装 PHP,则您必须使用 "zend_extension_ts" 代替 "zend_extension"。

安装为 PHP 扩展:

extension="eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

步骤 4. 创建缓存目录

mkdir /tmp/eaccelerator
chomd 0777 /tmp/eaccelerator


配置选项

eaccelerator.shm_size
指定 eAccelerator 能够使用的共享内存数量,单位:MB。
"0" 代表操作系统默认。默认值为 "0"。

eaccelerator.cache_dir
用户磁盘缓存的目录。eAccelerator 在该目录中存储预编译代码、session 数据、内容等。
相同的数据也可以存储于共享内存中(以获得更快的存取速度)。默认值为 "/tmp/eaccelerator"。

eaccelerator.enable
开启或关闭 eAccelerator。"1" 为开启,"0" 为关闭。默认值为 "1"。

eaccelerator.optimizer
开启或关闭内部优化器,可以提升代码执行速度。"1" 为开启,"0" 为关闭。默认值为 "1"。

eaccelerator.debug
开启或关闭调试日志记录。"1" 为开启,"0" 为关闭。默认值为 "0"。

eaccelerator.check_mtime
开启或关闭 PHP 文件改动检查。"1" 为开启,"0" 为关闭。如果您想要在修改后重新编译 PHP
程序则需要设置为 "1"。默认值为 "1"。

eaccelerator.filter
判断哪些 PHP 文件必须缓存。您可以指定缓存和不缓存的文件类型(如 "*.php *.phtml"等)
如果参数以 "!" 开头,则匹配这些参数的文件被忽略缓存。默认值为 "",即,所有 PHP 文件
都将被缓存。

eaccelerator.shm_max
当使用 " eaccelerator_put() " 函数时禁止其向共享内存中存储过大的文件。该参数指定允许
存储的最大值,单位:字节 (10240, 10K, 1M)。"0" 为不限制。默认值为 "0"。

eaccelerator.shm_ttl
当 eAccelerator 获取新脚本的共享内存大小失败时,它将从共享内存中删除所有在
最后 "shm_ttl" 秒内无法存取的脚本缓存。默认值为 "0",即:不从共享内春中删除
任何缓存文件。

eaccelerator.shm_prune_period
当 eAccelerator 获取新脚本的共享内存大小失败时,他将试图从共享内存中删除早于
"shm_prune_period" 秒的缓存脚本。默认值为 "0",即:不从共享内春中删除
任何缓存文件。

eaccelerator.shm_only
允许或禁止将已编译脚本缓存在磁盘上。该选项对 session 数据和内容缓存无效。默认
值为 "0",即:使用磁盘和共享内存进行缓存。

eaccelerator.compress
允许或禁止压缩内容缓存。默认值为 "1",即:允许压缩。

eaccelerator.compress_level
指定内容缓存的压缩等级。默认值为 "9",为最高等级。

eaccelerator.name_sapce
一个所有键(keys)的前缀字符串。如果设置该前缀字符串则允许 .htaccess 或者 主配置
文件在相同主机上运行两个相同的键名。

eaccelerator.keys
eaccelerator.sessions
eaccelerator.content
判断哪些键(keys)、session 数据和内容将被缓存。可用参数值为:
"shm_and_disk" - 同时在共享内存和磁盘中缓存数据(默认值);
"shm" - 如果共享内存用尽或者数据容量大于 "eaccelerator.shm_max"
则在共享内存或磁盘中缓存数据;
"shm_only" - 仅在共享内存中缓存数据;
"disk_only" - 仅在磁盘中缓存数据;
"none" - 禁止缓存数据。


eAccelerator 应用程序接口(API)

eaccelerator_put($key, $value, $ttl=0)
将 $value 存储在共享内存中,并存储 $tll 秒。

eaccelerator_get($key)
从共享内存中返回 eaccelerator_put() 函数所存储的缓存数值,如果不存在或者已经
过期,则返回 null。

eaccelerator_rm($key)
从共享内存中删除 $key。

eaccelerator_gc()
删除所有过期的键(keys)

eaccelerator_lock($lock)
创建一个指定名称的锁(lock)。该锁可以通过 eaccelerator_unlock() 函数解除,在请求
结束时也会自动解锁。例如:
eaccelerator_lock("count");
eaccelerator_put("count",eaccelerator_get("count")+1));
?>

eaccelerator_unlock($lock)
解除指定名称的锁(lock)。

eaccelerator_set_session_handlers()
安装 eAccelerator session 句柄。
从 PHP 4.2.0 以后,您可以通过设置 php.ini 中的 "session.save_handler=eaacelerator"
安装 eAccelerator 句柄。

eaccelerator_cache_output($key, $eval_code, $ttl=0)
在共享内存中缓存 $eval_code 的输出,缓存 $ttl 秒。
可以调用 mmcach_rm() 函数删除相同 $key 的输出。例如:


eaccelerator_cache_result($key, $eval_code, $ttl=0)
在共享内存中缓存 $eval_code 的结果,缓存 $ttl 秒。
可以调用 mmcach_rm() 函数删除相同 $key 的结果。例如:


eaccelerator_cache_page($key, $ttl=0)
缓存整个页面,且缓存 $ttl 秒。例如:
eaccelerator_cache_page($_SERVER['PHP_SELF'].'?GET='.serialize($_GET),30);
echo time();
phpinfo();
?>

eaccelerator_rm_page($key)
从缓存中删除由 eaccelerator_cache_page() 函数创建的相同 $key 的页。

eaccelerator_encode($filename)
返回 $filename 文件经过编译后的编码。

eaccelerator_load($code)
加载被 eaccelerator_encode() 函数编码过的脚本。


WEB 界面

可以通过 eaccelerator.php 进行基于 WEB 界面的管理。当然,您需要将该文件存储于您的 WEB 站点
目录中。出于安全原因,建议您对该文件进行安全控制,保证只有本地 IP 才能读取该文件。

从 2.3.18 版本开始,管理界面可以进行密码保护。从终端命令行运行 eaccelerator_password.php 并
按照以下步骤生成密码:

$ php -q eaccelerator_password.php
更改 eAccelerator WEB 管理界面密码。(eaccelerator.php)

Enter admin name:admin
New admin password: eaccelerator
Retype new admin password: eaccelerator

在 php.ini 中添加以下内容,并且重新启动 WEB 服务:
eaccelerator.admin.name="admin"
eaccelerator.admin.password="$1$0ScD9gkb$nOEmFerNMvQ576hELeLrG0"

如果在受 HTTPD 密码保护的目录中存放 eaccelerator.php,则 eaccelerator 的管理员用户名和密码
必须一致。


联系我们

eAccelerator binaries for PHP 5.2.5 (windows builds)

eAccelerator是一个的免费、开源的PHP模块,它能够为提供PHP加速、优化、加码、和动态内容缓存功能。它通过存储PH脚本编译后的状态而加快执行PHP脚本的速度,而不需要频繁的编译这个PHP脚本。而且它能优化PHP脚本,以提高执行PHP的速度。eAccelerator特色是减少了服务器负载、使PHP脚本加速1-10倍。

you can download the eAccelerator binaries for your version of PHP 5.2.5
//对应你的php版本下载相应的dll文件.如果是PHP 5.2.5请下载eAccelerator 0952 for PHP 5.2.5 eLoader 0952 for PHP 5.2.5

Attachment Size
eAccelerator 095 Final for PHP 5.1.6 120 KB
095_final_useful _files.zip 41.97 KB
eAccelerator 0.9.5 Final for PHP 5.1.5 120 KB
eAccelerator 095 Final for PHP 5.1.6 Optimized for Size 108 KB
eAccelerator 095 Final for PHP 5.2.0 120 KB
eAccelerator 095 Final for PHP 5.0.5 120 KB
eAccelerator 095 for PHP 5.0.4 (OLDER PHP VERSION) 120 KB
eAccelerator 0951 for PHP 5.2.2 120 KB
eAccelerator 0951 for PHP 5.2.1 120 KB
eAccelerator 0951 for PHP 5.2.2 Built with VC2005 SP1 128 KB
eAccelerator 0951 for PHP 5.1.4 120 KB
eAccelerator 0951 for PHP 5.2.3 120 KB
eAccelerator 0951 for PHP 5.2.0 (OLDER PHP VERSION) 120 KB
eAccelerator 0951 for PHP 5.2.4 120 KB
eLoader 0951 for PHP 5.2.4 28 KB
0952_final_useful _files.zip 42.27 KB
eLoader 0952 for PHP 5.2.3 28 KB
eAccelerator 0952 for PHP 5.2.3 120 KB
eLoader0952_5.2.4.dll 28 KB
eAccelerator 0952 for PHP 5.2.4 120 KB
eAccelerator 0952 for PHP 5.2.5 120 KB
eLoader 0952 for PHP 5.2.5 28 KB


We have been using this PHP accelerator (0.9.5), on multiple servers, for a long time. It's used on some high traffic sites without any problem.
Install:
a) Download a copy of eAccelerator that is compatible with your version of PHP.
This can be an issue with eAccelerator. Sometimes it can take a little time before the Windows binaries are available for the most recent version of PHP.
b) Copy a compatible eaccelerator.dll to your PHP extensions folder (like: c:\php\extensions replace with your actual folder location).
Make sure the configuration directive extension_dir in your php.ini is properly pointing to your extensions folder.
Like: extension_dir = "c:/php/extensions"
//将dll文件复制到c:/php/ext下.
c) Create a folder (with the appropriate permissions) for the temporary cached files.
For example: D:\tmp\eaccelerator
//创建tmp目录 权限可写
d) Add the following to your php.ini (as the first loaded extension):
.
.
.
;extension=php_yaz.dll
;extension=php_zip.dll
//编辑php.ini 在extension=php_zip.dll之后添以红字部分

[eaccelerator]
zend_extension_ts="C:\php\ext\eAccelerator0952_5.2.4.dll"
zend_extension="C:\php\ext\eAccelerator0952_5.2.4.dll"
eaccelerator.cache_dir = "D:\tmp\eaccelerator"
eaccelerator.shm_size="64"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.debug ="0"
eaccelerator.check_mtime="1"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl ="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
eaccelerator.keys= "shm"
eaccelerator.sessions="shm"
eaccelerator.c
zend_extension="C:\php\ext\eLoader0952_5.2.4.dll"

;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;
.
.
.

e) Restart your Web Server.You can see..D:\tmp\eaccelerator have folders
//重启iis 你会看到tmp目录下有相应的文件出现
C:\tmp\eaccelerator
0
1
2
3
4
5
6
7
8
9
a
b
c
d
e
f

f)testing eAccelerator
测试 eAccelerator
C:\Documents and Settings\Administrator>php -v
PHP 5.2.5 (cli) (built: Nov 8 2007 23:18:51)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
with eAccelerator v0.9.5.2, Copyright (c) 2004-2006 eAccelerator, by eAccelerator
with Zend Extension Manager v1.2.0, Copyright (c) 2003-2007, by Zend Technologies
with Zend Optimizer v3.3.0, Copyright (c) 1998-2007, by Zend Technologies
And You can see phpinfo.
你也可以通过phpinfo.php查看是否成功

使 eaccelerator 与 Zend Optimizer 和平相处

使 eaccelerator 与 Zend Optimizer 和平相处


Zend Optimizer 是Zend官方发布的免费PHP优化器,国内外大多数用户对这一产品的唯一评价是“Zend Loader”。这种说法是因为该产品所谓的优化只是提供了一个页面压缩输出功能,其最主要的目的是为Zend相继推出的PHP代码“混淆器”铺桥搭路,让混淆后的PHP代码可以在计算机上得到执行。如果您打算真正获得高效PHP缓存,建议您选择 eaccelerator 。

Zend的市场推广能力非常之强,这样致使国内外大多数人采用Zend混淆器加密PHP代码。如果想使用被Zend混淆器加密过的代码,那么你必须安装Zend Optimizer。这就引出了我们的主要问题,如何既可以获得执行Zend混淆器加密代码的能力,又可以获得 eaccelerator 的高效率优化。

值得庆幸的是 eaccelerator 提供了对Zend扩展界面的支持,它可以和Zend Optimizer和平相处。让您轻松达到 “既可以获得执行Zend混淆器加密代码的能力,又可以获得 eaccelerator 的高效率优化”的目的。

我习惯性以ZEND扩展的方式配置该模块,下面是我使用的配置(官方标配):

在PHP.INI文件段,eaccelerator的配置内容写在Zend Optimizer之前,并做如下配置:

[Zend]
zend_extension_ts="d:\xampp\xampp\php\ext\eAccelerator.dll"
;eAccelerator加速器路径部分PHP版本此处使用 zend_extension
eaccelerator.shm_size="16"
;eAccelerator使用的内存
eaccelerator.cache_dir="D:\xampp\xampp\tmp"
;eAccelerator缓冲目录,记得给web server可读写权限。
eaccelerator.enable="1"
;eAccelerator是否启用
eaccelerator.optimizer="1"
;eAccelerator优化功能
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
zend_extension_ts = "d:\xampp\xampp\php\zendOptimizer\lib\ZendExtensionManager.dll"
zend_extension_manager.optimizer_ts = "d:\xampp\xampp\php\zendOptimizer\lib\Optimizer"
;zend_optimizer.enable_loader = 1
;开启Zend Loader以解析Zend混淆器加密过的PHP代码。默认开启,此行配置只是起到说明作用。
zend_optimizer.optimization_level=1023
;禁止优化功能,避免冲突。
;zend_optimizer.optimization_level=15
;zend_optimizer.license_path =

lighttpd 配置文件详解 Configuration File

Configuration File
Module: core ¶

Table of Contents

* Description
o Basic Syntax
o Example
* Conditional Configuration
o Example
o Troubleshooting
* advanced usage
* Using variables
* Global context
o Example
* Options

Description
Basic Syntax

A BNF like notation:

option : NAME = VALUE
merge : NAME += VALUE
NAME : modulename.key
VALUE : ( | | | | VALUE [ + VALUE ]*)
: "text"
: digit*
: ( "enable" | "disable" )
: "(" [ "=>" ] [, [ "=>" ] ]* ")"
INCLUDE : "include" VALUE
INCLUDE_SHELL : "include_shell" STRING_VALUE

Example

# default document-root
server.document-root = "/var/www/example.org/pages/"

# TCP port
server.port = 80

# selecting modules
server.modules = ( "mod_access", "mod_rewrite" )

# variables, computed when config is read.
var.mymodule = "foo"
server.modules += ( "mod_" + var.mymodule )
# var.PID is initialised to the pid of lighttpd before config is parsed

# include, relative to dirname of main config file
include "mime.types.conf"

# read configuration from output of a command
include_shell "/usr/local/bin/confmimetype /etc/mime.types"

Conditional Configuration

Most options can be configured conditionally by using the following syntax (including nesting).

{
...
{
... nesting: match only when parent match
}
}
else {
... the "else if" block
}

where is one of one of the following:

$HTTP["cookie"]
match on cookie
$HTTP["host"]
match on host
$HTTP["useragent"]
match on useragent
$HTTP["referer"]
match on referer
$HTTP["url"]
match on url. If there are nested blocks, this must be the most inner block.
$HTTP["querystring"]
match on querystring, eg, after the ? in this type url: index.php?module=images..
$HTTP["remoteip"]
match on the remote IP or a remote Network (Warning: doesn't work with IPv6 enabled)
$HTTP["scheme"] (Introduced in version 1.4.19)
match on the scheme used by the incoming connection. This is either "http" or "https".
$SERVER["socket"]
match on socket. Value must be on the format "ip:port" where ip is an IP address and port a port number, or ":port" to match port only. Only equal match (==) is supported. It also binds the daemon to this socket. Use this if you want to do IP/port-based virtual hosts.
$PHYSICAL["path"] (Introduced in version 1.5.0)
match on the mapped physical path of the file / cgi script to be served.
$PHYSICAL["existing-path"] (Introduced in version 1.5.0)
match on the mapped physical path of the file / cgi script to be served only if such a file exists on the local filesystem.

is one of:

==
string equal match
!=
string not equal match
=~
perl style regular expression match
!~
perl style regular expression not match

and is either a quoted ("") literal string or regular expression.
Example

# disable directory-listings for /download/*
dir-listing.activate = "enable"
$HTTP["url"] =~ "^/download/" {
dir-listing.activate = "disable"
}

# handle virtual hosting
# map all domains of a top-level-domain to a single document-root
$HTTP["host"] =~ "(^|\.)example\.org$" {
server.document-root = "/var/www/htdocs/example.org/pages/"
}

# multiple sockets
$SERVER["socket"] == "127.0.0.1:81" {
server.document-root = "..."
}

$SERVER["socket"] == "127.0.0.1:443" {
ssl.pemfile = "/var/www/certs/localhost.pem"
ssl.engine = "enable"

server.document-root = "/var/www/htdocs/secure.example.org/pages/"
}

# deny access for all googlebot
$HTTP["useragent"] =~ "Google" {
url.access-deny = ( "" )
}

# deny access for all image stealers (anti-hotlinking for images)
$HTTP["referer"] !~ "^($|http://www\.example\.org)" {
url.access-deny = ( ".jpg", ".jpeg", ".png" )
}

# deny the access to www.example.org to all user which
# are not in the 10.0.0.0/8 network
$HTTP["host"] == "www.example.org" {
$HTTP["remoteip"] != "10.0.0.0/8" {
url.access-deny = ( "" )
}
}

# Allow only 200.19.1.5 and 210.45.2.7 to
# have access to www.example.org/admin/
$HTTP["host"] == "www.example.org" {
#!~ is a perl style regular expression not match
$HTTP["remoteip"] !~ "^(200\.19\.1\.5|210\.45\.2\.7)$" {
$HTTP["url"] =~ "^/admin/" {
url.access-deny = ( "" )
}
}
}

Troubleshooting

If you're not running on the default port, $HTTP["host"] will have the port appended to it, so regular expressions ending in "$" (without allowing for a port) won't match. To match with or without a port, change "(^|\.)example\.org$" to "(^|\.)example\.org(\:[0-9]*)?$"
advanced usage

check the blog: http://blog.lighttpd.net/articles/2005/05/07/advanced-configuration-in-up-upcoming-1-4-x
Using variables

You can set your own variables in the configuration to simplify your config.

var.basedir = "/home/www/servers/"
$HTTP["host"] == "www.example.org" {
server.name = "www.example.org"
include "incl-base.conf"
}

in incl-base.conf:
server.document-root = basedir + server.name + "/pages/"
accesslog.filename = basedir + server.name + "/logs/access.log"

You can also use environment variables or the default variables var.PID and var.CWD:

var.basedir = env.LIGHTTPDBASE

$HTTP["host"] == "www.example.org" {
server.name = "www.example.org"
include "incl-base.conf"
include "incl-fastcgi.conf"
}

in incl-fastcgi.conf:
fastcgi.server = ( ... => ((
"socket" => basedir + server.name + "/tmp/fastcgi-" + PID + ".sock"
)) )

Or like the lighttpd script for rails does:

var.basedir = var.CWD

server.document-root = basedir + "/public/"

Global context

global {
...
}

You don't need it in the main configuration file. But you might have difficulty setting a server wide configuration inside a included-file from conditionals.
Example

in lighttpd.conf:
server.modules = ()
$HTTP["host"] == "www.example.org" {
include "incl-php.conf"
}

in incl-php.conf:
global {
server.modules += ("mod_fastcgi")
static-file.exclude-extensions += (".php")
}
fastcgi.server = "..."

Options

All Configuration Options

window+lighttpd+php 配置经验简谈

网上找了很多资料,但都不是很全,这里汇总一下
准备工作:
1 从 lighttpd 的官方网下载window版的exe安装版
2 php 的可以是 window下的安装版或解压版都可以

安装步骤:
1 安装lighttpd,安装到指定目录下比如C:\Server\lighttp1.4.19-1\,本人装的LightTPD-1.4.19-1-Win32-SSL.exe
2 解压或安装php到指定目录下,比如C:/Server/php5/

接下来就是配置了
第一步把 C:\Server\lighttp1.4.19-1\conf\lighttpd-inc.conf打开
把cgi的modules放开
server.modules = (
"mod_access",
"mod_accesslog",
"mod_alias",
# "mod_auth",
"mod_cgi",
# "mod_cml",
# "mod_compress",
# "mod_dirlisting",
# "mod_evasive",
# "mod_evhost",
# "mod_expire",
# "mod_extforward",
"mod_fastcgi",
# "mod_flv_streaming",
# "mod_indexfile",
# "mod_magnet",
# "mod_mysql_vhost",
# "mod_proxy",
# "mod_redirect",
# "mod_rewrite",
## "mod_rrdtool",
"mod_scgi",
# "mod_secdownload",
# "mod_setenv",
# "mod_simple_vhost",
"mod_ssi",
# "mod_staticfile",
"mod_status",
## "mod_trigger_b4_dl",
# "mod_userdir",
# "mod_usertrack",
# "mod_webdav"
)


#修改这里
cgi.assign = ( ".php" => "C:/Server/php5/php-cgi.exe" )

lighttpd的配置先到这里,接下来看看php的配置

php的主要是php.ini文件的配置,它是是否配置成功的关键
cgi.force_redirect = 1
cgi.fix_pathinfo=1
这两个把前面的分号去掉

找到doc_root= 前面加;号
;extension=php_sockets.dll 把分号去掉,其他的dll根据需要去掉分号即可

注:到此为止貌似已经配置完成了,但发现lighttpd的默认虚拟目录是HTDOCS/
这种情况下测试php程序是行不通的,这个可能是个lighttpd的win下的bug吧
所以把虚拟路径改变一下,最好不在安装目录下,比如:server.document-root = "D:/phpv"

好了 到此为止配置已完成,
启动lighttpd 运行C:\Server\lighttp1.4.19-1\bin\Service-Install.exe
(停止是Service-Remove.exe)或C:\Server\lighttp1.4.19-1\TestMode.bat
可以了
我们在D:/phpv 下建立一个test.php
写入.
访问 http://1270.0.1/test.php
看到php信息页面就是配置成功了

Windows-Install

主題:在 Windows 系列安裝 Lighttpd
作業環境:Windows XP Professional
軟體版本:

* Windows XP Professional
* Lighttpd 1.4.18-1

說明:好用又輕量級的 Lighttpd 已經廣為 Unix 系列作業系統採用,然而 Windows 系列難道就只能流口水嗎?當然網路上的有高手將 Lighttpd 編譯成 Windows 系列版本,所以就可以享受到 Lighttpd 的好。
版本更新

* 2008.2.14 新增頁面

最後更新

* 2008 年 02 月 24 日,04:57 AM

1.下載 Lighttpd for Windows
http://wlmp.dtech.hu/down_lighty.php?type=ssl&lang=en
download-lighttpd-for-windows-1.png
有兩個版本可以選擇,如果不需要 SSL 連線,就選擇 Without OpenSSL Support 大約會少 1MB

download-lighttpd-for-windows-2.png

選擇 Download Site,因為 Lighttpd for Windows 是匈牙利人開發的,所以主要的 Download Site 在匈牙利,所以可以選擇 Google 的 mirror site 台灣對美國的連線是比較快的。

2.安裝 Lighttpd for Windows
基本上有安裝精靈,一直下一步就可以了。

3.以服務的方式啟動 Lighttpd
安裝完後,啟動 Lighttpd 要以服務的方式啟動,根據我測試的結果,手動啟動會有問題,所以要以 Windows 服務的方式啟動 Lighttpd。

首先到安裝的目錄裡面[C:\Program Files\LightTPD\bin]執行[Service-Install.exe]程式會將 Lighttpd 安裝成 Windows 服務,之後再用瀏覽器瀏覽[http://127.0.0.1],有出現 LightTPD Test Page 就表示成功了。

4.資料夾說明
htdocs 首頁及其他網頁放置在這邊
conf 放設定檔的地方
logs

lighttpd来代替apache

这两天试用了lighttpd来代替bbs使用的apache,印象深刻

bbs的在使用fweb之后一直使用unix下的标准服务器apache作为web服务器。

但是apache表现却不怎么令人满意。

因为使用了php,所以还是用apache的1.3版本。

但是由于并发很高,导致随时有200+apache进程在运行,而且每个进程占用的内存随时间增加越来越多(可能是php的问题)。

最后可能占用超过700M的内存。同时apache导致系统用于nice的cpu也很高,一般在10%-20%之间。

也许可以通过一些设置,比如静态文件的缓存时间,减少每个apache进程的服务次数。

这些问题是由于apache的prefork工作模式有关。

每个apache进程只能同时服务于一个http连接。

这种模式好处在于每个进程不互相干扰,稳定性好;

缺点也建立在优点之上,就是占用资源多,即使每个进程只使用2M内存(如果使用了php,这点内存根本不够),
100的并发连接就用掉200M的内存。

不要以为100的并发很难达到,在低速连接占多数的时候,20req/s就能达到100的并发。
即使在高速连接占多数的情况(比如bbs),并发也是req/s的两倍左右。
在使用apache的时候,bbs的web高峰期连接大概在150req/s,即使关掉keepalive,还是要使用200多个进程来服务。
为了解决这个问题,我试用了其它一些http服务软件。
很多短小精悍的,比如thttpd,boa之类的,不过大多不能支持fastcgi,也就不能用了。
剩下有两个不错,一个是LiteSpeed Web Server(http://freshmeat.net/projects/lsws/),还有一个就是lighttpd。

先说LiteSpeed,这个不是开源软件,但标准版非商业使用是免费的,当然,只有二进制版本。

这个软件速度稳定性都不错,而且管理界面友好(web管理界面,他的配置文件是xml,很难配置),而且支持的功能也不少,
文档比较齐全。但配置起来却让我摸不着头脑,总是不能按照预期想法运行,由于没有形成一个社区,
网上资源也很少,最后只能放弃.

lighttpd(www.lighttpd.net)是一个开源软件,历史只有两三年。
但功能不弱,我想用到的fastcgi,url rewrite都有,而且最重要的是,性能很强劲。

在默认模式下,lighttpd使用poll()作为event handler,如果在linux2.4下,还可以选择rtsig作为event handler。

如果不使用大文件(>4G)支持,lighttpd使用sendfile()来发送文件,完全的zero-copy。

如果他的功能还不能满足你的要求,你甚至可以自己写一个plugin,满足需求。

缺点就是bug比较多,软件并不稳定,而且文档太简略。

尤其是使用内存,很难说清楚具体使用量,一般在10-20M(繁忙站点),但有时候会突发到100多M,并稳定下来。

不过相对apache的使用量,这个已经不算多。
同时,软件不稳定也很让人头痛,比如突然segfault,对于一个繁忙站点,这个是不能接受的!
文档简略也很让人头痛,有些功能需要你自己猜测才懂得怎么配置。

不过总得来说,试用下来的感觉很好,如果配置得当,在相同并发下,使用的cpu和内存远小于apache。

比如bbs,使用lighttpd后网页速度明显加快,高峰时期达到300+req/s,并发600+。但只使用了20多M内存,4%cpu。

具体配置可以参考网上的资料,下面说说要注意的地方:
1,编译的时候比较奇怪,我至今没弄清楚怎么选定只编译特定的模块。
看了一下configure文件,大概是只要相应的库存在,就会编译相应的模块。
比如如果有pcre的dev文件,就会编译rewrite模块。我只能放弃编译的静态版本的lighttpd的想法。
2,它的Conditional Configuration非常有用,可以实现很多想法。比如限制php只在特定目录下可以使用。简单的虚拟主机。
不过似乎$HTTP[\"url\"]的块里面不能使用mod_rewrite,只能二选其一。
3,lighttpd支持监听多端口,不过配置比较奇异,要使用Conditional Configuration。
比如$SERVER[\"socket\"] == \"0.0.0.0:8000\" {}
就会让lighttpd同时监听server.port和8000端口。注意,{}里面不能再配置server.port,否则会导致重复绑定端口而退出。
4,linux2.4下使用rtsig后,性能表现要比poll要好很多,推荐使用!只需要增加server.event-handler = \"linux-rtsig\"
到配置文件就可以了。

不过,软件实现方面有bug。在运行lighttpd时一定要加上-D参数,让lighttpd不自动运行到后台。
否则你会发现一切正常,但就是不能访问。

估计是进程在设定socket fd的owner process后再daemonize,系统不能发送连接信号到程序。
当然,一个程序运行于前台不是我们所需要的,我的解决方案是使用daemon这个软件包。
daemon是一个daemonize某个前台程序的工具,让人高兴的是,在子进程非正常退出的时候,daemon还会自动respawn!
这点有些类似于init进程,不过要比init好用点。
daemon可以指定respawn的次数,间隔时间,放弃时间等等,否则,一个配置错误会让daemon不停的respawn,让服务器假死。
这样就曲线解决了lighttpd不稳定的问题。

5,如果你的站点很繁忙,那就把keepalive时间和次数减少点,比如
server.max-keep-alive-requests = 5
server.max-keep-alive-idle = 5
否则,即使lighttpd很强劲,处理太多fd也不是好想法,而且很容易导致fd overflow。

6,lighttpd使用fastcgi模式兼容php(还有python,ruby,perl等等,只要能使用fastcgi模式)。
不过有一点兼容问题,否则PATH_INFO环境变量不太对,php会报告no input file,你需要在php fcgi server配置文件里增加
\"broken-scriptfilename\" => \"enable\" 然后在php.ini里面增加cgi.fix_pathinfo=1

lighttpd虽然不错,但大多情况下我还是推荐使用apache。
1,如果你不介意性能,或者有很充足的硬件,那就用apache吧,维护成本,bug成本,安全成本都会降低
2,你不希望出错,每一个连接都很重要,使用apache吧
3,你懒得配置lighttpd(确实要比apache复杂,如果你只是简单应用)
4,你要用php,但是fastcgi模式的php不兼容你的web应用。
5,你是apache fans

下面的情况,你需要选择lighttpd
1,你认为简单就是美,apache太庞大了
2,你没有充足的硬件,性能又很重要
3,你要尝试新事物
当然,你还可以选择同时运行apache和lighttpd,一个做前台,一个做后台。至于谁前谁后,似乎网上都有实例

下面是lighttpd官方网站给出的lighttpd特点,你可以参考参考;)

virtual hosts
virtual directory listings
URL-Rewriting, HTTP-Redirects
automatic expiration of files
Large File Support (64bit fileoffsets)
Ranges (start-end, start-, -end, multiple ranges)
on-the-fly output-compression with transparent caching
deflate, gzip, bzip2
authentication
basic, digest
backends: plain files, htpasswd, htdigest, ldap
fast and secure application controlled downloads
Server Side Includes
User Tracking
FastCGI, CGI, SSI
PHP-Support:
same speed as or faster than apache + mod_php4
includes a utility to spawn FastCGI processes (neccesary for PHP 4.3.x)
via FastCGI and CGI interface
support Code Caches like Turckmm, APC or eaccelarator
load-balanced FastCGI
(one webserver distibutes request to multiple PHP-servers via FastCGI)
Security features:
chroot(), set UID, set GID
protecting docroot
strict HTTP-header parsing

2008年6月28日星期六

frame中使用JAVASCRIPT实现跳转 IE 与 FF兼容

在 制作 www.86-00.com 网站中,在一个查询天气的页面里 网址: http://160.86-00.com/tq/ 通过 js对 frame 进行跳转。

但是 直接用 document.all.disp.src="网址"; 时出现 IE可以跳转但 firefox 不可以。

原因:
用idName字符串取得对象的问题
(1)现有问题
在IE中,利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象,在MF 中不能。
(2)解决方法
用 getElementById(idName) 代替 eval(idName)。

改为: document.getElementById("disp").src="网址"; 就可以同时在 IE 与 firefox 实现用 js 将frame跳转。

附 搜集资料整理:
以下以 IE 代替 Internet Explorer,以 MF 代替 Mozzila Firefox

document.form.item 问题
(1)现有问题:
现有代码中存在许多 document.formName.item("itemName") 这样的语句,不能在 MF 下运行
(2)解决方法:
改用 document.formName.elements["elementName"]
(3)其它
参见 2

集合类对象问题
(1)现有问题:
现有代码中许多集合类对象取用时使用 (),IE 能接受,MF 不能。
(2)解决方法:
改用 [] 作为下标运算。如:document.forms("formName") 改为 document.forms["formName"]。
又如:document.getElementsByName("inputName")(1) 改为 document.getElementsByName("inputName")[1]
(3)其它

window.event
(1)现有问题:
使用 window.event 无法在 MF 上运行
(2)解决方法:
MF 的 event 只能在事件发生的现场使用,此问题暂无法解决。可以这样变通:
原代码(可在IE中运行):

...

新代码(可在IE和MF中运行):

...

此外,如果新代码中第一行不改,与老代码一样的话(即 gotoSubmit 调用没有给参数),则仍然只能在IE中运行,但不会出错。所以,这种方案 tpl 部分仍与老代码兼容。

HTML 对象的 id 作为对象名的问题
(1)现有问题
在 IE 中,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF 中不能。
(2)解决方法
用 getElementById("idName") 代替 idName 作为对象变量使用。

用idName字符串取得对象的问题
(1)现有问题
在IE中,利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象,在MF 中不能。
(2)解决方法
用 getElementById(idName) 代替 eval(idName)。

变量名与某 HTML 对象 id 相同的问题
(1)现有问题
在 MF 中,因为对象 id 不作为 HTML 对象的名称,所以可以使用与 HTML 对象 id 相同的变量名,IE 中不能。
(2)解决方法
在声明变量时,一律加上 var ,以避免歧义,这样在 IE 中亦可正常运行。
此外,最好不要取与 HTML 对象 id 相同的变量名,以减少错误。
(3)其它
参见 问题4

event.x 与 event.y 问题
(1)现有问题
在IE 中,event 对象有 x, y 属性,MF中没有。
(2)解决方法
在MF中,与event.x 等效的是 event.pageX。但event.pageX IE中没有。
故采用 event.clientX 代替 event.x。在IE 中也有这个变量。
event.clientX 与 event.pageX 有微妙的差别(当整个页面有滚动条的时候),不过大多数时候是等效的。

如果要完全一样,可以稍麻烦些:
mX = event.x ? event.x : event.pageX;
然后用 mX 代替 event.x
(3)其它
event.layerX 在 IE 与 MF 中都有,具体意义有无差别尚未试验。

关于frame
(1)现有问题
在 IE中 可以用window.testFrame取得该frame,mf中不行
(2)解决方法
在frame的使用方面mf和ie的最主要的区别是:
如果在frame标签中书写了以下属性:
frame src="xx.htm" id="frameId" name="frameName"
那么ie可以通过id或者name访问这个frame对应的window对象
而mf只可以通过name来访问这个frame对应的window对象
例如如果上述frame标签写在最上层的window里面的htm里面,那么可以这样访问
ie: window.top.frameId或者window.top.frameName来访问这个window对象
mf: 只能这样window.top.frameName来访问这个window对象
另外,在mf和ie中都可以使用window.top.document.getElementById("frameId")来访问frame标签
并且可以通过window.top.document.getElementById("testFrame").src = ’xx.htm’来切换frame的内容
也都可以通过window.top.frameName.location = ’xx.htm’来切换frame的内容
关于frame和window的描述可以参见bbs的‘window与frame’文章
以及/test/js/test_frame/目录下面的测试
----adun 2004.12.09修改

在mf中,自己定义的属性必须getAttribute()取得

在mf中没有 parentElement parement.children 而用
parentNode parentNode.childNodes
childNodes的下标的含义在IE和MF中不同,MF使用DOM规范,childNodes中会插入空白文本节点。
一般可以通过node.getElementsByTagName()来回避这个问题。
当html中节点缺失时,IE和MF对parentNode的解释不同,例如





MF中input.parentNode的值为form, 而IE中input.parentNode的值为空节点
MF中节点没有removeNode方法,必须使用如下方法 node.parentNode.removeChild(node)

const 问题
(1)现有问题:
在 IE 中不能使用 const 关键字。如 const constVar = 32; 在IE中这是语法错误。
(2)解决方法:
不使用 const ,以 var 代替。

body 对象
MF的body在body标签没有被浏览器完全读入之前就存在,而IE则必须在body完全被读入之后才存在

url encoding
js中如果书写url就直接写&不要写&例如var url = ’xx.jsp?objectName=xx&objectEvent=xxx’;
frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器
一般会服务器报错参数没有找到
当然如果是在tpl中例外,因为tpl中符合xml规范,要求&书写为&
一般MF无法识别js中的&

nodeName 和 tagName 问题
(1)现有问题:
在MF中,所有节点均有 nodeName 值,但 textNode 没有 tagName 值。在 IE 中,nodeName 的使用好象
有问题(具体情况没有测试,但我的IE已经死了好几次)。
(2)解决方法:
使用 tagName,但应检测其是否为空。


元素属性
IE下 input.type属性为只读,但是MF下可以修改

document.getElementsByName() 和 document.all[name] 的问题
(1)现有问题:
在 IE 中,getElementsByName()、document.all[name] 均不能用来取得 div 元素(是否还有其它不能取的元素还不知道)。

2008年6月25日星期三

PHP 去掉回车换行符

通过 str_replace实现 回车换行操作
$str = str_replace(array("\r","\n"),array('',''), $str);

2008年6月24日星期二

对 Win2003 的安全设置策略

一 设置和管理账户
1、系统管理员账户最好少建,更改默认的管理员帐户名(Administrator)和描述,
密码最好采用数字加大小写字母加数字的上档键组合,长度最好不少于14位。
2、新建一个名为Administrator的陷阱帐号,为其设置最小的权限,然后随便输入
组合的最好不低于20位的密码。
3、将Guest账户禁用并更改名称和描述,然后输入一个复杂的密码,然后禁用。
4、开始-程序-管理工具-本地安全策略,选择
计算机配置-Windows设置-安全设置-账户策略-账户锁定策略,
将账户设为“三次登陆无效”,“锁定时间为30分钟”,“复位锁定计数设为10分钟”。
5、在安全设置-本地策略-安全选项中将“不显示上次的用户名”设为启用 。
6. 本地策略-安全选项-对匿名连接的额外限制.选择(不允许枚举 SAM 帐号和共享)

二 网络服务安全管理

1、禁止C$、D$、ADMIN$一类的缺省共享
打开注册表,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters,
在右边的窗口中新建Dword值,名称设为AutoShareServer值设为0. 注册表不了解.不要随便更改.
2、 解除NetBios与TCP/IP协议的绑定
  右击网上邻居-属性-右击本地连接-属性-双击Internet协议-高级-Wins-禁用TCP/IP上的NETBIOS
3、关闭不需要的服务,以下为建议选项
开始-所有程序-管理工具-服务
   Computer Browser:维护网络计算机更新,禁用
   Distributed File System: 局域网管理共享文件,不需要禁用
   Distributed linktracking client:用于局域网更新连接信息,不需要禁用
   Error reporting service:禁止发送错误报告
   Microsoft Serch:提供快速的单词搜索,不需要可禁用
   NTLMSecuritysupportprovide:telnet服务和Microsoft Serch用的,不需要禁用
   PrintSpooler:如果没有打印机可禁用
   Remote Registry:禁止远程修改注册表
   Remote Desktop Help Session Manager:禁止远程协助
   Messenger:信使服务(windows2000)
   Task Scheduler: 允许程序在指定时间运行(不用计划任务就禁用掉)
   TCP/IP NetBIOS Helper Service: NetBIOS (NetBT)”服务以及 NetBIOS 名称解析的支持
注:新上架的服务器已经做过其他安全设置只开以下端口,需要开其他端口可以在。
右击网上邻居-属性-Internet协议(TCP/IP)属性-高级-选项-TCP/IP筛选-属性-TCP端口-添加
你想要开的端口.
    默认开启的端口列表:
   FTP:20.21
   mail:25.110
   Web:80
   pcanywhere:5631
   远程桌面:3389 (3389不要关闭,否则将无法远程连接)

三 系统安全管理
  1.对于系统的NTFS磁盘权限设置,C盘只给administrators 和system权限,其他的权限不给,
其他的盘也可以这样设置,这里给的system权限也不一定需要给,
只是由于某些第三方应用程序是以服务形式启动的,需要加上这个用户,否则造成启动不了。
  2. Windows目录要加上给users的默认权限,否则ASP和ASPX等应用程序就无法运行。
  3. 另外在c:/Documents and Settings/这里相当重要,
后面的目录里的权限根本不会继承从前的设置,如果仅仅只是设置了C盘给administrators权限,
而在All Users/Application Data目录下会 出现everyone用户有完全控制权限,
这样入侵这可以跳转到这个目录,写入脚本或只文件,再结合其他漏洞来提升权限.
  4. net.exe,cmd.exe,tftp.exe,netstat.exe,regedit.exe,at.exe,attrib.exe,cacls.exe
这些文件都设置只允许administrators.system访问.guests禁止访问

四 打开相应的审核策略

  开始-程序-管理工具-本地安全策略-安全设置-本地策略-审核策略
  注:windows2003已经开启部分.windows2000没有开启.可以根据实际情况来设置.
  推荐的要审核的项目是:
  登录事件 成功 失败
  账户登录事件 成功 失败
  系统事件 成功 失败
  策略更改 成功 失败
  对象访问 失败
  目录服务访问 失败
  特权使用 失败

2008年6月17日星期二

Extjs2.0之横向Radio经典布局

我想大家最需要的就是这样的布局

但是找遍google,要么是太复杂在render里添加后续radio,要么是采用FieldSet方式额外加了一大框。但是我想像中需要的却是上面这种方式。

经 过测试,上面这样的radio横向布局是可以做到的,关键是采用table的layout及radio行的isFormField设置为true,设置 isFormField这点尤其重要,因为panel默认不是属于FormField的,因此即使设置了fieldLabel属性也不不会显示 label。

生成此window的js如下:

(new Ext.Window({
id:
'hall_addPrjWindow',
title:
'title',
layout:
'fit',
width:
500,
height:
300,
buttonAlign:
'center',
closeAction:
'hide',
modal:
true,
items:[
{
xtype:
'form',
width:
400,
frame:
true,
defaultType:
'textfield',
items:[
{
id:
'prjNm',
fieldLabel:
'项目名称',
name:
'prjNm',
value:
''
}
,{
xtype:
'panel',
layout:
'table',
fieldLabel:
'项目权限',
defaultType:
'radio',
isFormField:
true,
items: [
{
name:
'prjPermissionCode',
boxLabel:
'自由进入',
value:
''
}
,{
name:
'prjPermissionCode',
boxLabel:
'需要验证',
value:
''
}
]
}
,{
id:
'prjStartupDate',
fieldLabel:
'预计启动日期',
name:
'prjStartupDate',
value:
''
}
]
}
],
buttons:[
{
text:
'建立新项目',
handler:
function(){

}

}
]
}
)).show();