errorlog /var/log/httpd-error.log loglevel warn logformat %h %l %u %t %r %;s %b %{referer}i %{user-agent} combined logformat %h %l %u %t %r %;s %b common logformat %{referer}i -; %u referer logformat %{user-agent}i agent #
errorlog /var/log/httpd-error.log
loglevel warn
logformat %h %l %u %t %r %>;s %b %{referer}i %{user-agent} combined
logformat %h %l %u %t %r %>;s %b common
logformat %{referer}i ->; %u referer
logformat %{user-agent}i agent
#customlog /var/log/httpd-access.log common
#customlog /var/log/httpd-referer.log referer
#customlog /var/log/httpd-agent.log agent
customlog /var/log/httpd-access.log combined 这里定义了系统日志的形式,对于服务器错误记录, 由errorlog、 loglevel 来定义不同的错误日志文件及其记录内容。
对于系统的访问日志,缺省使用customlog参数定义日志的位置,缺省使用 combined 参数指定将所有的访问日志放在一个文件中,然而也可以将不同种类的访问日志放在不同的日志记录文件中,这是通过在 customlog中指定不同的记录类型来完成的。common表示普通的对单页面请求访问记录,referer表示每个页面的引用记录,可以看出一个页面中包含的请求数,agent表示对客户机的类型记录,显然可以将现有的combined 定义的设置行注释掉,并使用common、referer和agent作为customlog的参数,来为不同种类的日志分别指定日志记录文件。
显然,logformat是用于定义不同类型的日志进行记录时使用的格式, 这里使用了以%开头的宏定义,以记录不同的内容。 如果这些参数指定的文件使用的是相对路径,那么就是相对于serverroot的路径。
serversignature on
一些情况下,例如当客户请求的网页并不存在时,服务器将产生错误文档,缺省情况下由于打开了 serversignature选项,错误文档的最后一行将包含服务器的名字、apache的版本等信息。有的管理员更倾向于不对外显示这些信息,就可以将这个参数设置为off,或者设置为email,最后一行将替换为对 serveradmin 的email提示。
alias /icons/ /www/icons/
options indexes multiviews
allowoverride none
order allow,deny
allow from all
alias参数用于将url与服务器文件系统中的真实位置进行直接映射,一般的文档将在documentroot 中进行查询,然而使用alias定义的路径将直接映射到相应目录下,而不再到documentroot 下面进行查询。因此alias可以用来映射一些 公用文件的路径,例如保存了各种常用图标的icons路径。这样使得除了使用符号连接之外,文档根目录(documentroot)外的目录也可以通过使用了alias映射,提供给浏览器访问。 定义好映射的路径之后,应该需要使用directory语句设置访问限制。
scriptalias /cgi-bin/ /www/cgi-bin/
allowoverride none
options none
order allow,deny
allow from all
scriptalias也是用于url路径的映射,但与alias的不同在于,scriptalias 是用于映射cgi程序的路径,这个路径下的文件都被定义为cgi程序,通过执行它们来获得结果,而非由服务器直接返回其内容。缺省情况下cgi程序使用cgi-bin目录作为虚拟路径。
# redirect old-uri new-url
redirect参数是用来重写url的,当浏览器访问服务器上的一个已经不存在的资源的时候,服务器返回给浏览器新的url,告诉浏览器从该url中获取资源。这主要用于原来存在于服务器上的文档,改变了位置之后,而又希望能使用老url能访问到,以保持与以前的url兼容。
indexoptions fancyindexing
addiconbyencoding (cmp,/icons/compressed.gif) x-compress x-gzip
addiconbytype (txt,/icons/text.gif) text/*
addiconbytype (img,/icons/image2.gif) image/*
addiconbytype (snd,/icons/sound2.gif) audio/*
addiconbytype (vid,/icons/movie.gif) video/*
addicon /icons/binary.gif .bin .exe
addicon /icons/binhex.gif .hqx
addicon /icons/tar.gif .tar
addicon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
addicon /icons/compressed.gif .z .z .tgz .gz .zip
addicon /icons/a.gif .ps .ai .eps
addicon /icons/layout.gif .html .shtml .htm .pdf
addicon /icons/text.gif .txt
addicon /icons/c.gif .c
addicon /icons/p.gif .pl .py
addicon /icons/f.gif .for
addicon /icons/dvi.gif .dvi
addicon /icons/uuencoded.gif .uu
addicon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
addicon /icons/tex.gif .tex
addicon /icons/bomb.gif core
addicon /icons/back.gif ..
addicon /icons/hand.right.gif readme
addicon /icons/folder.gif ^^directory^^
addicon /icons/blank.gif ^^blankicon^^
defaulticon /icons/unknown.gif
#adddescription gzip compressed document .gz
#adddescription tar archive .tar
#adddescription gzip compressed tar archive .tgz
readmename readme
headername header
indexignore .* *~ *# header* readme* rcs cvs *,v *,t
当一个http请求的url为一个目录的时候,服务器返回这个目录中的索引文件。但如果一个目录中不存在缺省的索引文件,并且该服务器又许可显示目录文件列表的时候,就会显示出这个目录中的文件列表,为了使得这个文件列表能具有可理解性,而不仅仅是一个简单的列表,就需要前面的这些设置参数。如果使用了indexoptions fancyindexing选项,可以让服务器产生的目录列表中针对各种不同类型的文档引用各种图标。而哪种文件使用哪种图标,则使用下面的 addiconbyencoding、addiconbytype以及addicon来定义,分别依据mime 的编码、类型以及文件的后缀来判断使用何种图标。如果不能确定文档使用的图标,就使用 defaulticon定义的缺省图标。
同样,使用adddescription可以为不同类型的文档加入不同的描述。并且,服务器还在目录下,查询使用readmename和headername定义的文件(自动加上 .html后缀,如果没有发现,再使用.txt后缀进行搜索),如果发现了这些文件,就在文件列表之前首先显示这些文件的内容,以使得普通目录列表具备更大的可理解性。
indexignore让服务器在列出文件列表时忽略相应的文件, 这里使用模式配置的方式定义文件名。
addencoding x-compress z
addencoding x-gzip gz
addencoding用于告诉一些使用压缩的mime类型,这样可以让浏览器进行解压缩操作。
addlanguage en .en
addlanguage fr .fr
addlanguage de .de
addlanguage da .da
addlanguage el .el
addlanguage it .it
languagepriority en fr de
一个html文档可以同时具备多个语言的版本,如对于file1.html文档可以具备file1.html.en、file1.html.fr 等不同的版本,每个语言后缀必须使用 addlanguage进行定义。这样服务器可以针对不同国家的客户,通过与浏览器进行协商,发送不同的语言版本。而languagepriority 定义不同语言的优先级,以便在浏览器没有特殊要求时,按照顺序使用不同的语言版本回应对file1.html 的请求。这个国际化的能力实际的应用并不多。
#addtype application/x-httpd-php .phtml
#addtype application/x-httpd-php-source .phps
addtype参数可以为特定后缀的文件指定mime类型,这里的设置将覆盖 mime.types中的设置。
#addhandler cgi-script .cgi
addhandler是用于指定非静态的处理类型,用于定义文档为一个非静态的文档类型,需要进行处理,再向浏览器返回处理结果。例如上面注释中的设置是将以.cgi结尾的文件设置为cgi-script类型,那么服务器将启动这个cgi程序以进行处理。如果需要在前面aliasscript定义的路径之外执行cgi程序,就需要使用这个参数进行设置,此后以.cgi结尾的文件将被当作cgi程序执行。在配置文件、这个目录中的.htaccess以及其上级目录的.htaccess中必须允许执行cgi程序,这需要通过options execcgi参数设定。
#addtype text/html .shtml
#addhandler server-parsed .shtml
另外一种动态进行处理的类型为server-parsed,由服务器自身预先分析网页内的标记,将标记更改为正确的html标识。由于server-parsed需要对text/html 类型的文档进行处理,因此首先定义了对应的.shtml为text/html类型。
然而要支持ssi,还要首先要在配置文件(或.htaccess)中使用options includes允许该目录下的文档可以为ssi类型,或使用options includesnoexec让执行普通的ssi标志,但不执行其中引用的外部程序。
另一种指定server-parsed类型的方式为使用xbitback设置选项,如果将 xbithack设置为on,服务器将检查所有text/html类型的文档(包括.html后缀的文档),如果发现文件属性具备执行位 “x,则服务器就认为它是服务器分析文档,需要服务器进行处理。推荐使用addhandler进行设置,而将xbitback 设置为off,因为使用xbitback将对所有的html文档都执行额外的检查,降低了效率。
#addhandler send-as-is asis
#addhandler imap-file map
#addhandler type-map var
上面被注释的addhandler用于支持apache服务器的asis、map和var处理能力
# action media/type /cgi-script/location
# action handler-name /cgi-script/location
因为apache内部提供的处理功能有限,因此可以使用action为服务器定义外部程序作为可处理的动态文档类型,这些外部程序与标准cgi程序相同,都是对输入的数据处理之后,再输出不同mime类型的结果。例如要定义一个对特殊后缀wri都先执行wri2txt进行处理操作,再返回结果的操作,可以使用:
action windows-writer /bin/wri2txt
addhandler windows-writer wri
更进一步,可以直接使用action定义对某个mime类型预先进行处理操作,这需要例子中第一种格式的action 参数设置方式。这样设置方式就不再需要额外的addhandler用来将处理操作与文件后缀联系起来,而是使用action直接处理mime类型的文件。但如果文档后缀没有正式的mime类型,还需要先定义一个mime类型。
#metadir .web
#metasuffix .meta
meta信息是在文档发送给客户之前,预先发送给客户浏览器一些数据,因此浏览器可以通过head请求来访问这些meta信息而不必真正通过get来返回全部文档数据。服务器通常发送给浏览器的是一些标准的http头信息,如果要想增加额外的信息,就需要使用metadir来定义meta数据存放的目录, 而metas uffix用于指定包含meta数据的文件后缀。
#errordocument 500 the server made a boo boo.
#errordocument 404 /missing.html
#errordocument 404 /cgi-bin/missing_handler.pl
#errordocument 402
http://some.other_server.com/subscription_info.html
如果客户请求的网页不存在,或者没有访问权限等情况发生时,服务器将产生一个错误代码,同时也将回应客户浏览器一个标识错误的网页。errordocument就用于设置当出现哪个错误时应该回应客户浏览器那些内容,errordocument的第一个参数为错误的序号,第二个参数为回应的数据,可以为简单的文本,本地网页,本地cgi程序,以及远程主机上的网页。
browsermatch mozilla/2 nokeepalive
browsermatch msie 4.0b2; nokeepalive downgrade-1.0 force-response-1.0
browsermatch realplayer 4.0 force-response-1.0
browsermatch java/1.0 force-response-1.0
browsermatch jdk/1.0 force-response-1.0
browsermatch命令为特定的客户程序,设置特殊的参数,以保证对老版本浏览器的兼容性,并支持新浏览器的新特性。
# sethandler server-status
# order deny,allow
# deny from all
# allow from .your_domain.com
# sethandler server-info
# order deny,allow
# deny from all
# allow from .your_domain.com
## deny from all
# errordocument 403 http://phf.apache.org/phf_abuse_log.cgi
用于设置访问控制的设置主要是针对目录和文件进行设置的,然而也可以针对不同的url进行访问控制的设置,这样就不必担心scriptalias、alias是否将路径设置到了受控制的目录之外了。针对url进行控制的语句为 location语句,这样不但能对服务器上的文件、cgi提供保护,此外,它还能保护不能找到对应文件,而是由服务器本身提供的特殊功能url。http://servername/server-status用于报告当前apache服务器的状态,http://servername/server-info用于报告apache 服务器的统计信息。与此相关的设置还有extendedstatus参数,可以让服务器输出更详细的的报告。
#proxyrequests on
# order deny,allow
# deny from all
# allow from .your_domain.com
#proxyvia on
#cacheroot /www/proxy
#cachesize 5
#cachegcinterval 4
#cachemaxexpire 24
#cachelastmodifiedfactor 0.1
#cachedefaultexpire 1
#nocache a_domain.com another_domain.edu joes.garage_sale.com
apache服务器本身就具备代理的功能,然而这要求加载入mod_proxy模块。这能使用ifmodule语句进行判断,如果存在mod_proxy模块,就使用proxyrequests打开代理支持。此后的directory用于设置对proxy功能的访问权限设置,以及用于设置缓冲的各个参数设置。
虚拟主机
#namevirtualhost 12.34.56.78:80
#namevirtualhost 12.34.56.78
# serveradmin webmaster@host.some_domain.com
# documentroot /www/docs/host.some_domain.com
# servername host.some_domain.com
# errorlog logs/host.some_domain.com-error_log
# customlog logs/host.some_domain.com-access_log common
缺省设置文件中的这些内容是用于设置命名基础的虚拟主机服务器时使用。其中namevirtualhost 来指定虚拟主机使用的ip地址,这个ip地址将对应多个 dns名字,如果apache使用了listen 参数控制了多个端口,那么就可以在这里加上端口号以进一步进行区分对不同端口的不同连接请求。此后,使用 virtualhost 语句,使用namevirtualhost指定的ip地址作参数,对每个名字都定义对应的虚拟主机设置。
虚拟主机是在一台web服务器上,可以为多个单独域名提供web服务,并且每个域名都完全独立,包括具有完全独立的文档目录结构及设置,这样域名之间完全独立,不但使用每个域名访问到的内容完全独立,并且使用另一个域名无法访问其他域名提供的网页内容。
虚拟主机的概念非常有用,因为虽然一个组织可以将自己的网页挂在具备其他域名的服务器上的下级往址上,但使用独立的域名和根网址更为正式,易为众人接受。传统上,必须自己设立一台服务器才能达到单独域名的目的,然而这需要维护一个单独的服务器,很多小单位缺乏足够的维护能力,更为合适的方式是租用别人维护的服务器。没有必要为一个机构提供一个单独的服务器,完全可以使用虚拟主机能力,使服务器为多个域名提供web服务,而且不同的服务互不干扰,对外就表现为多个不同的服务器。
有两种设定虚拟主机的方式,一种是基于http 1.0标准,需要一个具备多ip地址的服务器,再配置dns 服务器,给每个ip地址以不同的域名,最后才能配置apache的配置文件,使服务器对不同域名返回不同的web文档。由于这需要使用额外的ip地址,对每个要提供服务的域名都要使用单独的ip地址,因此这种方式实现起来问题较多。可以在一个网络界面上绑定多个ip地址,linux下需要使用ifconfig的 alias参数来进行这个配置,但此时会影响网络性能。
http 1.1标准在协议中规定了对浏览器和服务器通信时,服务器能够跟踪浏览器请求的是哪个主机名字。因此可以利用这个新特性,使用更轻松的方式设定虚拟主机。这种方式不需要额外的ip地址,但需要新版本的浏览器支持。这种方式已经成为建立虚拟主机的标准方式。要建立非ip基础的虚拟主机,多个域名是不可少的配置,因为每个域名就对应一个要服务的虚拟主机。因此需要更改dns服务器的配置,为服务器增加多个c name选项,如:
linux in a 192.168.1.64
vhost1 in cname linux
vhost2 in cname linux
基本的设置选项都是为了linux主机设定的,如果要为vhost1和vhost2设定虚拟主机,就要使用virtualhost语句定义不同的选项,在语句中可以使用配置文件前面中的大部分选项,而可以重新定义几乎所有的针对服务器的设置。
namevirtualhost 192.168.1.64
documentroot /www/data
servername linux.example.org.cn
documentroot /vhost1
servername vhost1.example.org.cn
documentroot /vhost2
servername vhost2.example.org.cn
这里需要注意的是,virtualhost的参数地址一定要和namevirtualhost定义的地址相一致,必须保证所有的值严格一致,apache服务器才承认这些定义是为这个ip地址定义的虚拟主机。
此外,定义过namevirtualhost之后,那么对这个ip地址的访问都被区分不同的虚拟主机进行处理,而对其他ip地址的访问,例如127.0.0.1,才应用前面定义的缺省选项。
另外一些加速方法
1、 web 页面和 cgi 页面采用了浏览器缓冲技术。具体的方法可以参考附录一:采用 mod_gzip 加速apache
2、 不要让 x windows 运行在你的 web 服务器上,用 ctrl-alt-backspace 关闭 x 。
3、 在 cgi 脚本中:
文件 i/o:打开的文件数目越少越好。
shell 命令:采用全路径来调用 shell 命令。
在web 页面目录中,不要让文件数超过 1000 个,文件越多花费在定位上的时间也越多。
4、 在 web 服务器上的图片越少越好,保证每个图片都经由图片压缩器运行。
5、 应该配置尽量多的内存,内存的大小对系统性能影响非常大。
6、 可以用strace命令调试调用。
当你不确定httpd.conf里的设置更改对进程的影响时,strace或许能奏效,通过观察输出的行数,可以判断对一个固定页面访问时需要的调用数。如:
#ps –ef|grep http
#strace –p http_pid
accept(18, 0xffbefa50, 0xffbefa74, 1) = 3
fcntl(24, f_setlkw, 0x001d0e10) = 0
sigaction(sigusr1, 0xffbef908, 0xffbef988) = 0
getsockname(3, 0xffbefa60, 0xffbefa74, 1) = 0
setsockopt(3, 6, 1, 0xffbef9c4, 4, 1) = 0
read(3, g e t / c a s e i n c.., 4096) = 590
sigaction(sigusr1, 0xffbed800, 0xffbed880) = 0
time() = 1043377552
stat(/docroot/osc-new/www/caseincident/listcase.php, 0x0022bf58) = 0
umask(077) = 0
umask(0) = 077
setitimer(itimer_prof, 0xffbef628, 0x00000000) = 0
sigaction(sigprof, 0xffbef4f8, 0xffbef578) = 0
sigprocmask(sig_unblock, 0xffbef618, 0x00000000) = 0
getsockopt(6, 65535, 8192, 0xffbe67b0, 0xffbe67ac, 0) = 0
setsockopt(6, 65535, 8192, 0xffbe67b0, 4, 0) = 0
setitimer(itimer_prof, 0xffbef788, 0x00000000) = 0
sigaction(sigusr1, 0xffbef908, 0xffbef988) = 0
read(3, 0x001e5bc0, 4096) (sleeping...)
附录一、采用 mod_gzip 加速apache
说明:本附录为全文引用,时间限制,未经测试。
我们知道 mod_gzip 是用来在服务器端把客户请求的内容压缩后发送给客户端的一个 apache 模块。本站的 zope 通过 fastcgi 来实现和 apache 的结合,apache 是解析 html 页面的服务程序。安装好 mod_gzip 后就即能压缩普通静态页面也能压缩 zope 文档。
一、安装
http://www.hyperspacecommunications.com/products/mod_gzip.html
页面上有 mod_gzip 的二进制码版本和源码下载。如果你使用前者的话,直接把文件拷贝到 apache home 的 libexec 目录下就可以了。下载 mod_gzip.c 后,如果你的 apache 用 dso 模式安装的话,用下面简单的命令就可以安装了:
# /www/bin/apxs -i -a -c mod_gzip.c
二、配置
安装完毕以后把下列配置加入httpd.conf :
# mod_gzip 配置
loadmodule gzip_module libexec/mod_gzip.so
addmodule mod_gzip.c
mod_gzip_on yes
mod_gzip_minimum_file_size 1002
mod_gzip_maximum_file_size 0
mod_gzip_maximum_inmem_size 60000
mod_gzip_item_include mime application/x-httpd-php
mod_gzip_item_include mime text/*
# 压缩 zope 的内容:
mod_gzip_item_include file [^.]*$
mod_gzip_item_include mime httpd/unix-directory
mod_gzip_dechunk yes
mod_gzip_temp_dir /tmp
mod_gzip_keep_workfiles no
mod_gzip_item_include file \.php$
mod_gzip_item_include file \.txt$
mod_gzip_item_include file \.html$
mod_gzip_item_exclude file \.css$
mod_gzip_item_exclude file \.js$
并添加下面的行:
logformat %h %l %u %t \%r\ %>;s %b \%{referer}i\ \%{user-agent}i\ mod_gzip: %{mod_gzip_compression_ratio}npct. mod_gzip
把对应虚拟主机配置中的日志文件参数修改为 mod_gzip
三、压缩效果 mod_gzip 已经对 .html 和那些没有点的文件作了压缩,压缩率达到了 70-80%。但是,mod_gzip 对图片文件不作压缩。
四、总结
结合,mod_gzip 和缓冲工具等,我们完全可以使一台配置较低的 pc 有足够的能力处理各种 html/cgi 等的请求。