1、PHP 不能解析
apachectl -M 查看是否加载了模块php5_module,或者进入目录/usr/loacl/apache2/modules/,通过ls 查看是否有相应模块。也可查看apache的配置文件是否加载了。
LoadModule php5_module modules/libphp5.so
模块的加载,主要与在编译apache文件时的apxs有关。所以在编译加载模块时,必须加载该文件(加载方式:--with-apxs2=/usr/local/apache2/bin/apxs)。
在使用这个功能之前,请先确认是否已经加载了 mod_so 模块,方法是:
/usr/local/apache2/bin/httpd -l
在列出的内容中,如果有 mod_so 那么说明已经加载了该模块。
如何编译安装扩展模块,例如,我想增加 mod_status.so 这个模块
/usr/local/apache2/bin/apxs -i -a -c mod_status.c
请注意,这里的mod_status.c 的路径一定要写对了,不然会报错,一般情况下,这个C文件在你 的源码包下,比如:
/usr/local/src/httpd-2.0.59/modules/generators/mod_status.c #模块的路径为解压安装文件 的目录
Libraries have been installed in:
/usr/local/services/apache-2.0.59/modules
完成后,请看提示 Libraries have been installed in: 模块就会安装到这里了。
2、PHP 虚拟主机
<IfModule dir_module>
DirectoryIndex index.html index.php #设置当Apache服务得到一个目录请求的时候访问的文件【即默认首页】
</IfModule>
如果不添加 index.php 会一直出现如下问题
You don't have permission to access /install/ on this server.
LAMP出现500错误,且apache配置没有错误,那么重新配置php的php.ini文件,然后重新启动apache
apache的配置文件必须启用,启用指定到httpd-vhosts.php的相关路径(在apache的httpd.conf配置文件中修改,启用“Include conf/extra/httpd-vhosts.conf”)。
启用了其他相关目录的web存放页面,需设置httpd.conf中<Directory>的相关参数,如下所示,表示新增加/data/123/为web的新目录,且“Allow from all”表示允许访问。
<Directory /data/123/>
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
</Directory>
限制IP的规则:(Allow from + 具体IP地址,然后deny from all,其匹配的规则一条一条向下匹配)
3、配置discuz论坛
第一步:解压discuz后,在root用户下默认的所属主和组都是root。而apache的运行进程中,允许访问的用户为daemon(可通过ps -aux | grep httpd),如下图所示。
此次通过discuz安装向导就会提醒,某些目录没有安装权限,可通过如下命令解决
chown -R daemon + 相应目录。
第二步:mysql连接授权给普通用户,用于配置discuz连接数据库,连接的用户名为user
mysql -uroot -p******
grant all to *.* 'user'@'localhost' identified by '密码'
第三步:出于安全考虑,后台登陆需验证,仅控制admin.php页面
在apache配置文件中(httpd.conf),添加如下信息,其中data/123/admin.php为后台登陆的 物理地址
<Directory /data/123/admin.php>
AllowOverride AuthConfig
AuthName "后台验证"
AuthType Basic
AuthUserFile /data/123/.htpasswd
require valid-user
</Directory>
再调用"/usr/local/apache2/bin/.htpasswd -c /data/123/.htpasswd test"创建验证的用户和密码
第四步:域名重定向
将此段写入httpd-vhosts.conf相应的虚拟主机,就可以实现域名重定向到指定的域名。
4、日志信息
第一步:配置日志格式,配置的路径在/usr/local/apache2/conf/httpd.conf
combined 日志实例
192.168.30.54 - - [24/Mar/2015:16:33:33 +0800] "GET /static/p_w_picpath/common/online_member.gif HTTP/1.1" 304 - "http://123.com/forum.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"
%h 远端主机(192.168.30.54)
其中%h 是记录访问者的IP,如果在web的前端有一层代理,那么这个%h其实就是代理机器的IP。在这种情况下,%{X-FORWARDED-FOR}i 字段会记录客户端真实的IP。所以log日志改为:
LogFormat "%h %{X-FORWARDED-FOR}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
%l 远端登录名(由identd而来,如果支持的话),除非IdentityCheck设为"On",否则将得到一个"-"。(-)
%u 远程用户名(根据验证信息而来;如果返回status(%s)为401,可能是假的)(-)
%t 时间,用普通日志时间格式(标准英语格式)(24/Mar/2015:16:33:33 +0800)
%r 请求的第一行(GET /static/p_w_picpath/common/online_member.gif HTTP/1.1)
%s 状态。对于内部重定向的请求,这个状态指的是原始请求的状态,—%>s则指的是最后请求的状态。(304)
%b 以CLF格式显示的除HTTP头以外传送的字节数,也就是当没有字节传送时显示’-'而不是0。(-)
User-Agent:浏览器信息(Chrome)
—————————————————————————————————————————
CLF每行的格式如下:
host ident authuser date request status bytes
即:主机 用户身份 作者 日期 请求报文 状态 字节数
例子:
192.168.30.54 - frank [10/Oct/2015:13:55:36 +0800] "GET /apache_pb.gif HTTP/1.0" 200 2326
其中:
192.168.30.54 主机
"-" 用户身份(未知)
frank 作者
[10/Oct/2015:13:55:36 +0800] 日期
"GET /apache_pb.gif HTTP/1.0" 请求
200 状态
2326 字节数
—————————————————————————————————————————
第二步:日志的应用,如下所示,表示应用在虚拟主机下
<VirtualHost *:80>
CustomLog "logs/123.com-access_log" combined
</VirtualHost>
logs/123.com-access_log #日志的路径(为httpd.confd中ServerRoot指定的目录下)和名称(123.com-access_log)
combined #调用httpd.conf的combined表示的日志格式
不记录图片日志:如下所示,表示不记录图片gif日志(既没有GET/static/p_w_picpath/common/online_member.gif类型的消息记录),注意需要把其引用到日志下,如下通过p_w_picpath-request进行引用
<VirtualHost *:80>
CustomLog "logs/123.com-access_log" combined env=!p_w_picpath-request
SetEnvIf Request_URI ".*\.gif$" p_w_picpath-request
</VirtualHost>
如只记录URLwww.test.com/test/... 的日志信息
在httpd.conf 或者 相关的虚拟主机配置文件中添加
SetEnvIf Request_URI "^/test/.*" aaa-request #表示已/test/开头的URL进行记录
CustomLog "|/usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/aaa-access_%Y%m%d.log 86400" combined env=aaa-request
apache日志自动切割。(bin/cronolog工具在apache2目录下)
方法一: 使用 cronolog 为每一天建立一个新的日志
CustomLog "|bin/cronolog logs/access_%Y%m%d.log" combined
也可以按小时
CustomLog "|bin/cronolog logs/access_%Y%m%d%h.log" combined
方法二:使用 rotatelogs 每一天记录一个日志
CustomLog "|bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined
每小时
CustomLog "|bin/rotatelogs -l logs/access_%Y%m%d%H.log 3600" combined
5、配置静态文件缓存(相对于CDN)
写入到对于的虚拟主机配置中
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/data/www"
#通过mod_expires.c控制缓存
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType p_w_picpath/gif "access plus 1 days" #对gif文件缓存1天
ExpiresByType p_w_picpath/jpeg "access plus 24 hours"
ExpiresByType p_w_picpath/png "access plus 24 hours"
ExpiresByType text/css "now plus 2 hour"
ExpiresByType application/x-javascript "now plus 2 hours"
ExpiresByType application/x-shockwave-flash "now plus 2 hours"
ExpiresDefault "now plus 0 min"
</IfModule>
#通过mod_header.c控制缓存
<Ifmodule mod_headers.c>
<filesmatch "\.(html|htm|txt)$">
header set cache-control "max-age=3600"
</filesmatch>
<filesmatch "\.(css|js|swf)$">
header set cache-control "max-age=604800"
</filesmatch>
<filesmatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$">
header set cache-control "max-age=29030400"
</filesmatch>
</ifmodule>
</VirtualHost>
验证:如下图所示,crome浏览器,通过按f12出现如下的对话框中,选择network,现在header,出现max-age=86400,即缓存24小时,与配置的信息一致。
6、配置防盗链(指定了的域名才可以引用相关的文件,不然不能显示)
盗链是指在自己的页面上展示一些并不在自己服务器上的内容
SetEnvIfNoCase Referer "^http://.*\.yourdomin\.com" local_ref
SetEnvIfNoCase Referer ".*\.yourdomin\.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)">
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
理解:只有在其指定了的域名(^http://.*\.yourdomin\.com),且匹配的内容(txt|doc|mp3|zip|rar|jpg|gif)才能执行引用,否则无法显示其内容。
eg,如下所示,图片的网络地址为www.1.com/test.jpg,发布到www.2.com是不能显示的(设置了防盗链)。而”指定允许引用的域名为www.1.com”则可以显示。
7、安全设置
第一部分:针对某个目录的访问控制
通过配置apache的虚拟主机配置,httpd-vhosts.conf
在相关的虚拟主机段如下,表示只现在目录的访问
<Directory /data/123/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
第二部分:针对访问uri 限制ip(filesmatch指定文件匹配)
<filesmatch "(.*)admin(.*)">
Order deny,allow
Allow from 127.0.0.1
Allow from 2.2.2.2
Deny from all
</filesmatch> #其他IP是不能访问包含admin关键字的URL
<Directory>与<filesmatch>一样的等级,一个针对目录,一个针对文件,目录里面可以使用<filesmatch>对文件进行匹配。
第三部分:apache禁止php解析以及防止php文件被下载
<Directory /data/www/>
php_admin_flag engine off
</Directory> #可以关闭php解析,但是php文件会被下载,如下图所示
<Directory /data/www/>
php_admin_flag engine off
<filesmatch "(.*)php">
Order deny,allow
Deny from all
</filesmatch>
</Directory> #解决了php文件被下载的问题
参考:http://www.aminglinux.com/bbs/thread-6519-1-1.html