Apache的常用配置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache的常用配置相关的知识,希望对你有一定的参考价值。
1. 配置启动脚本
如果是源码编译安装,需手动配置启动脚本,
官方源码包中已经提供了这个脚本:build/rpm/httpd.init
cp /usr/local/src/httpd-2.4.25/build/rpm/httpd.init /etc/init.d/httpd
注意文件中有三处主要的地方需要修改下的:
httpd=${HTTPD-/usr/local/apache2/bin/httpd}
pidfile=${PIDFILE-/usr/local/apache2/logs/${prog}.pid}
CONFFILE=/usr/local/apache2/conf/httpd.conf
请根据自己的实际情况更改相应的路径!
然后运行如下命令加入启动列表:
chmod +x /etc/init.d/httpd
chkconfig --add httpd
chkconfig httpd on
vi /usr/local/apache2/conf/httpd.conf
找到
#ServerName www.example.com:80
改成
ServerName localhost:80
检查配置文件语法
/usr/local/apache2/bin/apachectl -t
用脚本启动apache
/etc/init.d/httpd start
[[email protected] ~]# /etc/init.d/httpd start
正在启动 httpd: [确定]
2. 配置虚拟主机
vi /usr/local/apache2/conf/httpd.conf
找到
#Include conf/extra/httpd-vhosts.conf
删除前面的#号
Apache2.2版和2.4配置语法稍有不同,接下来需根据相应版本修改
Apache2.2版:
找到
<Directory />
Order deny,allow
Deny from all
</Directory>
改成
<Directory />
Order deny,allow
Allow from all
</Directory>
Apache2.4版:
找到
<Directory />
AllowOverride none
Require all denied
</Directory>
改成
<Directory />
AllowOverride none
Require all granted
</Directory>
改完保存文件退出
vi /usr/local/apache2/conf/extra/httpd-vhosts.conf
加入如下配置:
<VirtualHost *:80>
DocumentRoot "/data/www"
ServerName www.test.com
ServerAlias www.a.com
</VirtualHost>
3. 为虚拟主机配置用户认证
例如对网站admin目录设置用户认证,在相应的虚拟主机配置文件段中加入:
<Directory "/data/www/admin">
AllowOverride AuthConfig
AuthName "test"
AuthType Basic
AuthUserFile /data/.htpasswd
require valid-user
</Directory>
保存后,创建验证用户
/usr/local/apache2/bin/htpasswd -cm /data/.htpasswd test
参数说明:
-c:创建一个新文件。增加第二个用户时需去掉-c,否则会覆盖之前生成的文件。
-m: 使用MD5加密,2.4版可以省略这个参数,默认就是这个。
-d: 使用CRYPT加密,2.2版的默认加密方式。
4. 配置域名跳转
<IfModule mod_rewrite>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.a.com$
RewriteRule ^/(.*)$ http://www.test.com/$1 [R=301,L]
</IfModule>
如果是多个域名,可以这样设置:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.domain.com [OR]
RewriteCond %{HTTP_HOST} ^www.domain1.com$
RewriteRule ^/(.*)$ http://www.domain2.com/$1 [R=301,L]
或者:
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.domain2.com$
RewriteRule ^/(.*)$ http://www.domain2.com/$1 [R=301,L]
防止rewrite出现死循环
例如:
RewriteRule ^(.*) /abc/$1 [R,L]
本来访问的是www.abc.com结果变成了www.abc.com/abc/abc/abc/.....
加上一个条件即可:
RewriteCond %{REQUEST_URI} !^/abc
RewriteRule ^(.*) /abc/$1 [R,L]
这样就不再循环了。
5. 配置apache的访问日志
ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/test.com-error_%Y%m%d.log 86400"
#不记录指定文件类型的日志
SetEnvIf Request_URI ".*\.gif$" image-request
SetEnvIf Request_URI ".*\.jpg$" image-request
SetEnvIf Request_URI ".*\.png$" image-request
SetEnvIf Request_URI ".*\.bmp$" image-request
SetEnvIf Request_URI ".*\.swf$" image-request
SetEnvIf Request_URI ".*\.js$" image-request
SetEnvIf Request_URI ".*\.css$" image-request
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/test.com-access_%Y%m%d.log 86400" combined env=!image-request
6. 配置静态文件缓存
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/gif "access plus 1 days"
ExpiresByType image/jpeg "access plus 24 hours"
ExpiresByType image/png "access plus 24 hours"
ExpiresByType text/css "now plus 2 hour"
ExpiresByType application/x-javascript "now plus 2 hours"
ExpiresByType application/javascript "now plus 2 hours"
ExpiresByType application/x-shockwave-flash "now plus 2 hours"
ExpiresDefault "now plus 0 min"
</IfModule>
或者使用mod_headers模块实现
<IfModule mod_headers.c>
# htm,html,txt类的文件缓存一个小时
<filesmatch "\.(html|htm|txt)$">
header set cache-control "max-age=3600"
</filesmatch>
# css,js,swf类的文件缓存一个星期
<filesmatch "\.(css|js|swf)$">
header set cache-control "max-age=604800"
</filesmatch>
# jpg,gif,jpeg,png,ico,flv,pdf等文件缓存一年
<filesmatch “\.(ico|gif|jpg|jpeg|png|flv|pdf)$”>
header set cache-control “max-age=29030400″
</filesmatch>
</IfModule>
7. 配置防盗链
SetEnvIfNoCase Referer "^http://www.test.com" local_ref
SetEnvIfNoCase Referer "www.a.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
8. 访问控制
1) 允许或限制ip访问
<Directory /data/www/admin>
Order deny,allow
Deny from all
Allow from 192.168.0.1
</Directory>
关于Order Allow,Deny的几个例子:
Order Deny,Allow
Deny from All
先拒绝,再允许,默认为允许,当拒绝与允许冲突时,允许优先,结果为拒绝所有
Order Allow,Deny
Deny from All
交换Allow,Deny顺序,这也是拒绝所有
Order Allow,Deny
Allow from All
先允许,再拒绝,默认为拒绝,当拒绝与允许冲突时,拒绝优先,结果为允许所有
Order Deny,Allow
Allow from All
交换Allow,Deny顺序,这也是允许所有
Order Allow,Deny
allow from 192.168.0.1
Deny from all
拒绝所有
Order deny,allow
deny from 192.168.0.1
allow from all
允许所有
Order Deny,Allow
Deny from all
allow from 192.168.0.1
只允许192.168.0.1
Order allow,deny
allow from all
deny from 192.168.0.1
允许所有,只有192.168.0.1被拒绝
2) 禁止访问admin.php
<Directory /data/www>
<Filesmatch "^admin.php(.*)$">
Order deny,allow
Deny from all
</Filesmatch>
</Directory>
3) 禁止解析php
<Directory /data/www>
php_admin_flag engine off
<filesmatch "(.*)php">
Order deny,allow
Deny from all
</filesmatch>
</Directory>
几点说明:
1. 配置文件修改完毕后先用/usr/local/apache2/bin/apachectl -t检查配置文件有无语法错误,然后再使用/usr/local/apache2/bin/apachectl graceful重新加载配置文件。
2. 如果是share方式编译,使用相应模块时需在httpd.conf中打开。
例如启用rewrite模块:
vi /usr/local/apache2/conf/httpd.conf
去掉下面这句前的#号:
#LoadModule rewrite_module modules/mod_rewrite.so
3. 可以使用/usr/local/apache2/bin/httpd查看模块加载情况:
httpd -l 输出一个静态编译在服务器中的模块的列表。它不会列出使用LoadModule指令动态加载的模块。
httpd -M 输出一个已经启用的模块列表,包括静态编译在服务器中的模块和作为DSO动态加载的模块。
以上是关于Apache的常用配置的主要内容,如果未能解决你的问题,请参考以下文章