我在RedHat EL 4上安装了Apache2.20,一开始,我是对如何配置这个东西一窍也不通的。
在网上搜索了一下就按照那些乱七八糟的配法配了,配完了果然不能用……
后来,我的经理过来了,帮我配置了,让我不要用<VirtualDirectory> 他把我要试用的站点直接指向了DocumentRoot,结果这样一配置,就果然可以用了。
然而,我知道,这个不是长久之计,因为这个样子的话,我就只能在一个单一的目录下放置站点了,以后有新的站点,也没有好的管理办法,绝对是要改掉的。
所以,今天我决定重新配置一下。
配置完了,才发现,其实是很简单的东西,但是由于一些东西没有搞对,一些简单的关系没有弄清楚,造成经历了很多麻烦的事情,特别记录如下。
其实,我的目标很简单,我想配置一个标准的简单的,没有任何“麻烦事情的”站点,用类似http://127.0.0.1/~user/ 这样的网址就可以访问的,可以在每个帐户下放一个网站的那种配置,可以按照帐号来把各个站点分开。以下就是我第一次自以为配置完成的文件:
ServerRoot "/usr/local/apache2"
PidFile logs/httpd.pid
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
Listen 80
LoadModule php5_module modules/libphp5.so
<IfModule !mpm_netware_module>
#这里,我特地按照一般推荐的,把apache的uid和gid都改掉了
#免不了groupadd ,useradd等等,在Linux内添加了Apache2的帐户
User www
Group www
</IfModule>
ServerAdmin root@localhost
#这里,我就不取名字了,怎么简单怎么来
ServerName 127.0.0.1
#这里,本来是我试验用的站点的目录,现在还给Apache2
DocumentRoot "/usr/local/apache2/htdocs/"
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
<Directory "/usr/local/apache2/htdocs/">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
#这里就是我瞎配置的,因为按照网上的说法,添加了UserDir就可以了,我本来加在外面的,但是不行,一直出现我没有Access Permission的错误,后来又看了Apache2的英文文档,就又加到了里面,但是还是不行,就这么瞎摸索了好一阵子,网上多数的建议是Linux的文件系统的权限过严,要用chmod换成777才可以,但是我都试过了,甚至还用chown -R换成了nobody:nobody,仍然没有Access Permission,愤怒啊
#<IfModule userdir_module>
# UserDir www/
# DirectoryIndex index.html index.php index.htm index.cgi
# Order allow,deny
# Allow from all
#</IfModule>
<IfModule dir_module>
DirectoryIndex index.html index.php index.htm index.cgi
</IfModule>
<FilesMatch "^/.ht">
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>
ErrorLog logs/error_log
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t /"%r/" %>s %b /"%{Referer}i/" /"%{User-Agent}i/"" combined
LogFormat "%h %l %u %t /"%r/" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t /"%r/" %>s %b /"%{Referer}i/" /"%{User-Agent}i/" %I %O" combinedio
</IfModule>
CustomLog logs/access_log common
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
</IfModule>
<IfModule cgid_module>
#
# ScriptSock: On threaded servers, designate the path to the UNIX
# socket used to communicate with the CGI daemon of mod_cgid.
#
#Scriptsock logs/cgisock
</IfModule>
<Directory "/usr/local/apache2/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
DefaultType text/plain
<IfModule mime_module>
TypesConfig conf/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType application/x-httpd-php .php .phtml
</IfModule>
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
其实,发现,如果真的碰到问题,能解决的还是文档,解决的根本还是理解。我最后是在网上发现了一篇httpd.conf中文版,我决定耐下性子来仔细研读,终于发现了问题的症结,抱着尝试的心理,只做了简单的修改,就配置成功了。
关键问题在这个地方:
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
这段,看到了吧,从根目录开始,所有的目录都被Deny了,当然无论怎么chmod都打不开任何页面啦,这个是Apache2做得很好的一个安全机制。先全部关掉,然后要用哪个开哪个,确保了安全。
看懂了这一段,我加了如下一段,马上就可以用http://192.168.0.177/~username/ 看到了phpinfo()了:
<Directory "/home/*/www/">
Order deny, allow
Allow from all
<Directory>
总结一下,做什么事情绝不能浮躁啊~~要耐心,认真,踏实,特写下此文作为备忘录。
如果出现了
Forbidden
You don't have permission to access /~xxx/ on this server.
这样的消息,代号403,那么第一个先检查有没有用<Directory>给那个目录开放了权限,如果开了,那么再检查Linux文件系统的权限,一般从根目录开始755就肯定可以解决了。