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),如下图所示。

LAMP 应用_LNMP应用

此次通过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"创建验证的用户和密码


第四步:域名重定向

        LAMP 应用_LNMP应用_02

将此段写入httpd-vhosts.conf相应的虚拟主机,就可以实现域名重定向到指定的域名。


4、日志信息


第一步:配置日志格式,配置的路径在/usr/local/apache2/conf/httpd.conf

LAMP 应用_LNMP应用_03


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小时,与配置的信息一致。

LAMP 应用_LNMP应用_04

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”则可以显示。

LAMP 应用_LNMP应用_05

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文件会被下载,如下图所示

LAMP 应用_LNMP应用_06


<Directory /data/www/>

    php_admin_flag engine off

    <filesmatch "(.*)php">

            Order deny,allow

            Deny from all

    </filesmatch>

</Directory>        #解决了php文件被下载的问题

LAMP 应用_LNMP应用_07


参考:http://www.aminglinux.com/bbs/thread-6519-1-1.html