Apache配置入门笔记
-
随便记录一下,不求严谨,但求无原则性错误。-- DebaoZhang 20111023
Apache是一个http服务器,在无连接的时候,它除了监听配置文件中指定的IP地址和TCP端口号外不做任何工作;当一个请求出现在一个有效的端口时,Apache接受HTTP请求并分析其头部,然后它根据配置文件中设定的规则,做出某种合适的动作。
Apache通过一个配置文件进行设置
- 配置文件是编译期被指定的(通常叫 httpd.conf)
- 两个例子:
-
C:/Program Files/Apache Software Foundation/Apache2.2/conf/httpd.conf
-
/etc/apache2/apache2.conf
-
-
可以通过命令行参数 -f 指定
- 配置文件内通过include可以包含其他的配置文件
绑定端口与虚拟主机
用 Listen 指定要绑定的端口号
- 可以指定具体的IP
- 可以用多条命令指定多个端口号
Listen 80Listen 127.0.0.1:8080Listen 10.0.2.15:8081Listen [fe80::222:5fff:feb9:82d0]:8888
不同的IP和端口组合可以用来做虚拟主机,这需要通过VirtualHost进一步配置(必须先用Listen设置监听地址)
<VirtualHost 127.0.0.1:8080>...</VirtualHost><VirtualHost 10.0.2.15:8081>ServerNname host.example.com...</VirtualHost><VirtualHost 10.0.2.15:8081>ServerNname host.example2.com...</VirtualHost>
虚拟主机可以基于
- IP地址
- 端口号
- 域名(通过HTTP请求header中的Host字段)
路径转换?
我们在浏览器中打交道的是一堆url:
http://www.example.com/index.htmlhttp://www.example.com/faq.html?#question10http://www.example.com:8080/cgi-bin/draw.cgi?type=recthttp://user:pass@www.example.com/
浏览器通过GET或POST想服务器发送请求
GET /index.html HTTP/1.1 Host:www.example.com
服务器此时需要根据这个路径发送一个合适的文件给浏览器。
- 如果请求的是磁盘上的静态文件,此时需要的是到磁盘文件系统的映射
- 如果请求的是动态生成的文件,仍需要能找到脚本或程序才行
DocumentRoot
比如,前面请求的 /index.html 对应磁盘的哪个文件。则需要DocumentRoot指定一个目录作为根目录。
比如:
DocumentRoot /var/www
或
DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs"
- 注:结尾不再加一个斜杠
-
每一个虚拟主机也都该指定自己的DocumentRoot
还有一个ServerRoot的东西,是用来配置服务器的配置文件、日志文件等所在目录的,与这儿没什么关系。
Alias?
可能还需要访问位于DocumentRoot之外的文件
Alias /docs /var/web
这样一来,http://www.exemaple.com/docs/... 被映射到该目录 www.2cto.com
还有一个ScriptAlias,功能类似,只是其内容均被视为脚本。
ScriptAlias /cgi-bin/ "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/"
这两个命令还有两个对应的支持正则匹配的版本
-
AliasMatch
-
ScriptAliasMatch
其他
比如:
-
linux 可以使用soft link方式(并在Option中设置FollowSymLinks)
-
使用mod_userdir模块的UserDir指令
- 使用重定向功能 Redirct
- ...
当然实在不存在的东西,只能404错误了
文件和目录设置
对目录的单独设置是通过Directory进行的
<Directory /var/web/dir1>Options +Indexes</Directory>
对文件的单独设置是通过Files进行
<Files private.html>Order allow,denyDeny from all</Files>
在路径上,尽管它们都可以接受shell风格通配符,但更复杂的匹配则需要使用相应的支持正则的版本
-
DirectoryMatch
-
FilesMath
.htaccess
可以通过在目录下放置一个.htaccess文件对该目录进行控制。
主配置文件内的:
<Directory /www/htdocs/example>AddType text/example .exm</Directory>
等价于在该目录下的.htaccess文件中放入:
AddType text/example .exm
但这个不建议被使用(除非没有主配置文件的设置权限)了。
-
.htaccess 文件的名字可以改成其他的,通过 AccessFileName指令
-
该文件内可以使用哪些指令,可通过AllowOverride进行设置
-
AllowOverride 设置为None(默认值是All) 可完全禁止 .htaccess的使用
- 这个文件与授权控制无关!!
Location
与前面的Directory和Files针对的磁盘文件路径不同,Location设置的是URL地址中路径部分。
比如:
<Location /private>Order Allow,DenyDeny from all</Location>
将禁止访问http://www.example.com/private123等所有以 /private 开头的路径
认证与授权
这个东西会3组模块(真的比较繁...,使用LoadModule加载):
首先设置认证类型(使用AuthType指令,目前只支持两种?)
- Basic
- Digest
- ...
根据认证类型选择认证支持模块(通过AuthBasicProvider或AuthDigestProvider)设置,提供密码等验证信息
-
AuthBasicProvider
- file (默认值)
- dbm
- dbd
- ...
-
AuthDigestProvider
- file
- dbm
设置授权支持模块(参考Require指令?),意图是:如何使用前面的密码信息?
简单例子
AuthType BasicAuthName "From Example.com"#AuthBasicProvider fileAuthUserFile /usr/apache2/passwd/passwordsRequire user debao
-
AuthType 选择basic认证方式
-
AuthName 是用户看到的信息(同一个name的浏览器也可以自动处理)
-
AuthBasicProvider 选择 file,这是默认值
-
AuthUserFile 设置密码文件
- Require user 控制密码文件中哪些用户可以通过授权(使用Require valid-user可是使得所有密码正确的用户通过授权)
密码文件通过htpasswd来生成,对于digest方式,则需要使用htdigest来生成密码文件。
Deny Allow
这二者可以提供简单的基于IP地址的访问控制
Order deny,allowDeny from allAllow from 192.168.0.2
文件类型
当浏览器请求一个文件时,服务器一般都需要同时提供mime信息
-
TypesConfig 指令指定一个包含扩展名和mime对应关系的文件
-
使用 AddType 指令添加新的对应关系
-
MimeMagicFile 指定一个包含文件开头的魔串和mime对应关系的文件
-
DefaultType 指定默认类型
对于纯文本文件,如果让服务器提供编码信息。AddDefaultCharset指令可以做到,不过这会覆盖html等文件自身提供的编码信息。
CGI
使用 ScriptAlias指令可以设置cgi目录
ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/
如果在该目录之外的以某种后缀结尾(.py)的文件作为脚本,则需要使用
<Directory /home/*/public_html>Options +ExecCGIAddHandler cgi-script .py</Directory>
首先是Options中允许CGI脚本执行,然后使用AddHandler设置。
如果某个目录下全是cgi脚本,则可以使用
SetHandler cgi-script
wsgi
对于python来说,CGI方式应该不怎么使用了吧。主要是wsgi这种方式了。
-
下载 wsgi : http://code.google.com/p/modwsgi/
- 在apache配置文件中使用
LoadModule wsgi_module modules/mod_wsgi.soWSGIScriptAlias /wiki "F:/Moin/mywiki/moin.wsgi"
参考
-
http://lamp.linux.gov.cn/Apache/ApacheMenu/urlmapping.html
-
http://lamp.linux.gov.cn/Apache/ApacheMenu/urlmapping.html
-
http://docstore.mik.ua/orelly/linux/apache/ch01_01.htm