[转载]apache学习笔记

*************************************************************
源码安装apache2.0,DSO(动态加载模块方式),也是通常安装方式:
$./configure --prefix=/usr/local/apache2s --with-layout=Apache --enable-modules-most --enable-mods-share=all
$make
$make install
*************************************************************
安装第三方模块:
/path/to/apache/bin/apxs -cia module.c
-c(compile)编译
-i(install)安装
-a(activate)启动
对于只有一个.c文件的模块,可以用这个命令安装,如果是有多个源码文件的模块,则需要其本身的安装说明
*************************************************************
安装mod_perl
$cd mod_perl_2.0.2/
$perl Makefile.PL USE_APXS=1 WITH_APXS=/usr/local/apache2s/bin/apxs EVERYTHING=1 PERL_USELARGEFILES=0
$make
$make install
然后:
将LoadModule perl_module modules/mod_perl.so这句话加入到httpd.conf文件中,重启apache
检查:
$/usr/local/apache2s/bin/apxs -q LIBEXECDIR   显示模块所在目录(例如:/usr/local/apache2/modules)
*************************************************************
安装php模块:
$cd php-4.4.4/
$./configure --with-apxs=/usr/local/apache2/bin/apxs (apache1.3)
或$./configure --with-apxs2=/usr/local/apache2/bin/apxs (apache2.X)
$make
$make install
修改配置文件,添加:
LoadModule php4_module modules/libphp4.so

AddType application/x-httpd-php .php .php3 .any_file_in_php
AddHandler application/x-httpd-php .php .php3 .any_file_in_php
这样这台服务器的php网页就可以正常访问了!
*************************************************************
日志格式中状态码内容,详见PaoloDocuments/apache/http协议规范文件RFC2616.txt
*************************************************************
指定日志记录格式,组合日志格式(combined)或通用日志格式(common),修改配置文件:
CustomLog logs/access_log combined    组合日志格式
CustomLog logs/access_log common      通用日志格式
*************************************************************
LogLevel 配置文件中的这个指令指定日志记录等级(但无论指定什么记录等级,日志都会记录notice等级的信息)
*************************************************************
通用日志格式与组合日志格式的"%h"控制符表示远程请求用户的身份,依据HostNameLookups指令的设定值,可能是主机名也可能是IP地址。如果想永远记录IP地址,则使用“%a”控制符
*************************************************************
记录从客户端收到的cookie
CustomLog logs/cookies_in.log "%{UNIQUE_ID}e %{Cookie}i"
CustomLog logs/cookies2_in.log "%{UNIQUE_ID}e %{Cookie2}i"
记录由服务器设定并传送给客户端的cookie值:
CustomLog logs/cookies_out.log "%{UNIQUE_ID}e %{Set-Cookie}o"
CustomLog logs/cookies2_out.log "%{UNIQUE_ID}e %{Set-Cookie2}o"
*************************************************************
不记录来自本机网页的图像请求:
<FilesMatch /.(jpg|gif|png$)>
SetEnvIfNoCase Referrer "^http://www.example.com/" local_referrer=1
</FilesMatch>
Customlog logs/access_log combined env=!local_referrer
*************************************************************
按照日或小时来记录请求:
CustomLog "| /usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/access_log.%Y-%m-%d 86400" combined
其中:
rotatelogs的第一个参数是主日志文件名如果有%字符,则表示日志文件名中时间的格式,如果没有指定时间格式,则是以秒为单位,从1970.1.1日算起的秒数
            第二个参数是产生新日志的间隔是多少秒。也可以是大小如果把上例中的86400换成5M,则表时日志达到5M时,就会产生一个新的日志,日志的名字是access_log.%Y-%m-%d格式的
参阅:man -M /usr/local/apache2/man rotatelogs.8
*************************************************************
logresolve 将日志中记录的IP地址解析为主机名
例如:
$logresolve -c < /usr/local/apache2/logs/access_log.raw > access_log.resolved
也可以让apache在处理过程中使用IP地址,然后在记录日志时,以管道方式的日志记录进程来解析,修改配置文件:
HostnameLookups off
CustomLog "|/usr/local/apache2/bin/logresolve -c >> /usr/local/apache2/logs/access_log.resolved" combined
*************************************************************
只有一个IP,但想在系统上支持多个网站:
NameVirtualHost *
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/dummy-host.example.com
    ServerName dummy-host.example.com
    ServerAlias www.paolo.com                    ######p这条指令可对虚拟主机设定多个名称
    ErrorLog logs/dummy-host.example.com-error_log
    CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
其中:"*"表示所设定的主机可在所有的地址上运行。对于只有单一地址的机器,这表示会在该地址上运行,同时也会在loopback地址上运行。
如果NameVirtualHost 后面放置主机名称可能会在启动服务器时停用虚拟主机的机制。
虚拟主机会使用户无法再访问配置文件中的主服务器。如果想让主服务器成为默认服务器,则必须在虚拟主机区块中先将它列出。
对于每个虚拟主机名称,还需要在DNS中添加相关记录。
*************************************************************
$/usr/local/apache2/bin/httpd -S    显示虚拟主机的配置
*************************************************************
ErrorDocument 404 /err.html    这个指令可以让没有打到指定网页的时候,不显示404错误,而是err.html页面。错误号可以是其它的号码,如403、500等
例如:
<VirtualHost *>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/wangqi.paolo.com
    ServerName wangqi.paolo.com
    ErrorLog logs/wangqi.paolo.com-error_log
    CustomLog logs/wangqi.paolo.com-access_log combined
    ErrorDocument 404 /err.html
</VirtualHost>
根据以上配置,访问wangqi.paolo.com/index.html时,如果/www/docs/wangqi.paolo.com目录下没有index.html文件时,则会显示/www/docs/wangqi.paolo.com目录下的err.html文件
*************************************************************
如果是有多个IP的情况下,想在每个地址上支持一个网站:
NameVirtualHost 127.0.0.1
<VirtualHost 10.4.5.230>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/paolo.paolo.com
    ServerName paolo.paolo.com
    ErrorLog logs/paolo.paolo.com-error_log
    CustomLog logs/paolo.paolo.com-access_log combined
</VirtualHost>
<VirtualHost 10.4.5.231>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/cissy.paolo.com
    ServerName cissy.paolo.com
    ErrorLog logs/cissy.paolo.com-error_log
    CustomLog logs/cissy.paolo.com-access_log combined
</VirtualHost>
以上配置根据所访问的IP地址不同,会访问不同的虚拟主机。如果服务器上还有其它的IP地址,但是没有在配置文件的虚拟主机区块列出来时,这时访问这个其它的IP地址,请求会被送至在配置文件主设定区的虚拟主机
*************************************************************
建立以IP寻址的默认虚拟主机,以配置文件中加入下面代码:
<VirtualHost _default_>
    DocumentRoot /www/htdocs
    ErrorDocument 404 /err.html
</VirtualHost>
加入以上代码后,如果访问本地的IP,但是该IP确没有在配置文件中配置时,则会访问以上代码指定的页面
*************************************************************
混用以IP寻址及以名称寻址虚拟主机:
ServerName 127.0.0.1
NameVirtualHost 10.4.5.135
NameVirtualHost 10.4.5.230
<VirtualHost 10.4.5.135>                       ################此处不同
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/cissy.paolo.com
    ServerName cissy.paolo.com                 ################此处不同
    ErrorLog logs/cissy.paolo.com-error_log
    CustomLog logs/cissy.paolo.com-access_log combined
</VirtualHost>
<VirtualHost 10.4.5.230>                          ################此处不同
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/cissy.paolo.com
    ServerName wangqi.paolo.com                          ################此处不同
    ErrorLog logs/wangqi.paolo.com-error_log
    CustomLog logs/wangqi.paolo.com-access_log combined
</VirtualHost>
<VirtualHost 10.4.5.230>                          ################此处不同
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/cissy.paolo.com
    ServerName paolo.paolo.com                          ################此处不同
    ErrorLog logs/paolo.paolo.com-error_log
    CustomLog logs/paolo.paolo.com-access_log combined
</VirtualHost>
*************************************************************
mod_vhost_alias   模块可以建立大量的虚拟主机
*************************************************************
将URL对应至特定目录。也就是说,如果我们访问http://10.4.5.135/paolo,我们如果不想让他访问/usr/local/apache2/htdocs/paolo,而是让它访问其它的目录中的内容,我们可以在配置文件中加入如下:
Alias /paolo /home/paolo/apache_paolo
然后还要把指定的目录加入到配置文件中,以让apache可以访问,默认情况下apache是不访问DocumentRoot以外的目录的。
<Directory "/home/paolo/apache_paolo">
    Order allow,deny
    Allow from all
</Directory>
这种用Alias的目录指定,其实是用Alias的第二个参数去替换第一个参数。本例中就是用/home/paolo/apache_paolo去替换/paolo,因此,我们访问http://10.4.5.135/paolo,其实上是访问http://10.4.5.135/home/paolo/apache_paolo
这种方法对"/"符号要求非常严格,如果上例我们写成Alias /paolo/ /home/paolo/apache_paolo,而我们在访问http://10.4.5.135/paolo/index.html,其实是访问http://10.4.5.135/home/paolo/apache_paoloindex.html,这是错误的,因为/home/paolo/apache_paolo替换的是/paolo/,注意,这里把最后的“/”也替换了,所以转换后就是前面所说那样错误的URL。
Alias也可以为现有的网页内容创建新的URL,例如要想原来http://10.4.5.135/php/phpinfo.php内容,通过http://10.4.5.135/newphp/phpinfo.php也可以访问,只要在配置文件中加入如下一行:
  Alias /newphp /usr/local/apache2/htdocs/php
Alias只影响本地URI,不会影响URL的主机名部分
*************************************************************
让服务器的用户都有自己的URL,有自己的网页空间,配置文件:
UserDir public_html     
配置文件中有这行指令后,再在用户主目录下创建public_html目录,里面放入网页就可以了。访问的URL为,以wangqi这个用户为例:http://10.4.5.135/~wangqi/
还要将配置文件中一段注释去掉:
#<Directory /home/*/public_html>
#    AllowOverride FileInfo AuthConfig Limit Indexes
#    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#    <Limit GET POST OPTIONS PROPFIND>
#        Order allow,deny
#        Allow from all
#    </Limit>
#    <LimitExcept GET POST OPTIONS PROPFIND>
#        Order deny,allow
#        Deny from all
#    </LimitExcept>
#</Directory>
以配置访问权限。
另一种方式:
UserDir /www/user/*/htdocs
这种方法后的参数是完整的路径名,把用户的页面文件都放在了统一的目录下(/www/usr/下),后面的*号是用户名命名的目录。访问方法和上面第一种方法一样
*************************************************************
AliasMatch ^/testph(p|ps) /usr/local/apache2/htdocs/php
用AliasMatch指令,可以用正则表达式的方式将多个URL对应至同一个目录,以上指令,可以用:
http://10.4.5.135/testphp/phpinfo.php
http://10.4.5.135/testphps/phpinfo.php来访问同一个目录中的内容
*************************************************************
重定向至其他URL,修改配置文件:
Redirect /sohu http://www.sohu.com
以上指令访问http:10.4.5.135/sohu时,实际访问的是http://www.sohu.com
Redirect指令有几个参数:
temp:表示文件当前不在原来所请求的位置上,可以将来还会在这个位置上,现在只是临时的。这样,客户端会记住原始请求的URL。
permanent:表示被请求的文件不在指定位置上,而是永久在新的位置上。这样,客户端会记住新的URL
gone:表示文件不在此位置,而且以后也不在新的位置上。相当于404错误。但服务器会承认所请求的文件原来在此位置。所以不会被视为错误。
seeother:表示文件不在所请求的位置,而且被不同位置的其它文件取代了(前三个参数都是指同一个文件,这个参数请是不同位置的不同文件取代了原来位置的原来文件)
默认情况下是使用temp参数
用RedirectMatch指令可以用正则表达式的方式将多个URL重定向至同一位置。具体用法详见前面AliasMatch的用法
*************************************************************
接受不区分大小写的URL:
1.安装mod_speling模块
2.在配置文件中添加:
 CheckSpelling On
*************************************************************
mod_rewrite模块可以重写URL请求中的文件,替换成指定的;可以拒绝访问未被引用的请求;可以依据查询字符串来重写;可以将所有请求重定向是单一主机;将服务器的全部或部分请求重定向至SSL等相关工作
具体用法详见《apache经典实例》,比较复杂,不写了!
*************************************************************
使用系统帐号在web上进行身份验证:
在配置文件中在想要控制的文件目录的领域下:
<Directory "/usr/local/apache2/htdocs">
AuthType Basic
AuthName HomeDir
AuthUserFile /etc/passwd
Require valid-user
Satisfy All
</Directory>
注意,由于/etc/passwd的文件格式和htpasswd管理的文件格式是一样的,所以我们才可以用/etc/passwd进行身份验证,不过我们现在的linux系统都采用/etc/shadow文件来存储密码,所以就无法用这种方式进行身份验证了。这时我们登录网页,虽然会提示我们输入用户名和密码,但永远无法正确通过验证
所以此方法已不再适用,除非改成用/etc/passwd存放用户密码
*************************************************************
在子目录中放宽安全限制
也就是说,比如我们现在已经在/usr/local/apache2/htdocs/这个目录上加上了用户名和密码的认证。但我们想在/usr/local/apache2/htdocs/php这个目录中不需要认证,使用户可以直接访问
要达到上面的要求我们可以这样,在配置文件中加入:
<Directory "/usr/local/apache2/htdocs/php">
Satisfy Any
Order Deny,Allow
Allow from all
</Directory>
或者:
在/usr/local/apache2/htdocs/php目录下建立.htaccess文件,把
Satisfy Any
Order Deny,Allow
Allow from all
这三行内容写在.htaccess文件里面。
*************************************************************
如果已经限制了一个目录的访问,需要用户名和密码,但想要放开这个目录中的其中一个文件(例如:back.html)的权限,使其可以任意访问,在配置文件中添加:
<Files back.html>
Satisfy Any
Order Deny,Allow
Allow from all
</Files>
*************************************************************
查看通过验证的用户名称:
可以查看REMOTE_USER环境变更。在access_log中也可以看到。
*************************************************************
禁止通过代理服务器访问特定的URL,修改配置文件:
ProxyBlock .rm .ra .mp3

<Directory proxy:http://10.4.5.135/music/>
Order Allow,Deny
Deny from all
Satisfy All
</Directory>
上述方法都无法满足要求时,可以使用正则表达式的方式,使用Rewrite指令。
*************************************************************
想拒绝所有对目录中文件的访问,除了特殊指定扩展名的文件(比如.html文件):
<Directory "/usr/local/apache2/htdocs/test">
Satisfy all
Order Allow,Deny
Deny from all
        <Files *.html>
          Order Deny,Allow
          Allow from all
          Satisfy any
        </Files>
</Directory>
以上指令,使得test目录及其子目录下的所有非.html文件无法访问,只有.html的文件可以访问
*************************************************************
ab -n 1000 -c 20 http://10.4.5.135/back.html      测试apache性能的工具
其中:
-n 1000 表示请求的数目
-c 20 表示一次送出20 个请求
-h 可以查看帮助
*************************************************************
取得网站快照,修改配置文件:
<Location /server-status>
    SetHandler server-status
#    Order deny,allow
#    Deny from all
#    Allow from .example.com
</Location>
ExtendedStatus On
*************************************************************
将经常查看的文件存入高速缓存区,修改配置文件:
MMapFile /usr/local/apache2/htdocs/index.html              需要安装mod_file_cache模块
*************************************************************
将目录列表存入高速缓存区,修改配置文件:
IndexOptions +TrackModified
*************************************************************
 
原文地址:https://www.cnblogs.com/pekkle/p/6568856.html