LAMP 是Linux Apache MySQL PHP的简写,其实就是把Apache, MySQL以及PHP安装在Linux系统上,组成一个环境来运行php的脚本语言。

    Apache是最常用的WEB服务软件,而MySQL是比较小型的数据库软件,这两个软件以及PHP都可以安装到windows的机器上。下面开始如何构建这个LAMP环境。


一.安装mysql

    我们平时安装MySQL都是源码包安装的,但是由于它的编译需要很长的时间。所以,建议您安装二进制免编译包。

    可以到MySQL官方网站去下载 http://dev.mysql.com/downloads/

    具体版本根据您的平台和需求而定,目前比较常用的为mysql-5.0/mysql-5.1, 5.5版本虽然已经发布有段日子了,但是貌似用在线上跑服务的还是少数。

    所以,可以使用下面地址下载:

    mirrors.sohu.com/mysql/

    注意,什么样的机型就要下对应的版本,64位的要下64位的,32位的就要下32位的!


    1.下载mysql到/usr/local/src/ 

    命令1:wget http://www.lishiming.net/data/p_w_upload/forum/mysql-5.1.40-linux-i686-icc-glibc23.tar.gz(32位)

    命令2:wget http://syslab.comsenz.com/downloads/linux/mysql-5.1.40-linux-x86_64-icc-glibc23.tar.gz(64位)

    

    2.解压

    命令:tar zxvf /usr/local/src/mysql-5.1.40-linux-i686-icc-glibc23.tar.gz

    

    3.把解压完的数据移动到/usr/local/mysql

    命令:mv mysql-5.1.40-linux-i686-icc-glibc23 /uer/local/mysql

    

    4.建立mysql用户

    命令:useradd -s /sbin/nologin mysql

    

    5.初始化数据库

    命令1:cd /usr/local/mysql

    命令2:mkdir -p /data/mysql ; chown -R mysql:mysql /data/mysql

    命令3:./scripts/mysql_install_db --user=mysql --datadir=/data/mysql

    --user 定义数据库的所属主, --datadir 定义数据库安装到哪里,建议放到大空间的分区上,这个目录需要自行创建。这一步骤很关键,我在mysql初始化数据上挣扎了好久,出现好几个问题。


    第一个问题,我的系统是64位的系统,却安装了32位的mysql软件,出现了下面这种情况:

wKioL1XlV76BdlQEAAHQzb5KPYE566.jpg

    然后我重新安装了64位的mysql,出现了第二个问题:

wKiom1XlVduyoDLTAAO7pWcV2dM482.jpg

    这种情况是因为缺少lib库文件,只要安装一下即可:

    命令:yum install -y compat-libstdc++-33

    还有一种情况:

wKiom1aYaXaRjuRqAABh61MmQms425.png    命令:yum install -y libaio

    mysql初始化成功后会出现下面的情况:

wKiom1XlVsjBlZ88AAYi-F4mnCU608.jpg    

    6.拷贝配置文件

    命令:cp support-files/my-large.cnf /etc/my.cnf

    

    7.拷贝启动脚本文件修改其属性

    命令:cp support-files/mysql.server  /etc/init.d/mysqld

    命令:chmod 755 /etc/init.d/mysqld

    

    8.修改启动脚本 

    命令:vim /etc/init.d/mysqld

    需要修改的地方有 “datadir=/data/mysql” (前面初始化数据库时定义的目录)

    

    9.把启动脚本加入系统服务项,并设定开机启动,启动mysql 

    命令:chkconfig --add mysqld

    命令:chkconfig mysqld on

    命令:service mysqld start

    如果启动不了,请到 /data/mysql/ 下查看错误日志,这个日志通常是主机名.err. 

    检查mysql是否启动的命令为:

    命令:ps aux |grep mysqld


二.安装Apache

    apache也需要到官网下载合适的版本,目前使用较多的版本为2.0或者2.2,建议下载2.2版本。

    apache官网下载地址: http://www.apache.org/dyn/closer.cgi

    

    您也可以使用阿铭提供的地址下载。

    

    1.切换到/usr/local/src/,下载。

    命令1:cd /usr/local/src/

    命令2:wget  http://www.lishiming.net/data/p_w_upload/forum/httpd-2.2.24.tar.bz2


    2.解压:

    命令:tar jvxf httpd-2.2.24.tar.bz2


    3.配置编译参数:

    命令1:cd httpd-2.2.24

    命令2: ./configure \

    --prefix=/usr/local/apache2 \

    --with-included-apr \

    --enable-so \

    --enable-deflate=shared \

    --enable-expires=shared \

    --enable-rewrite=shared \

    --with-pcre

    

    --prefix 指定安装到哪里;

    --enable-so 表示启用DSO;

    --enable-deflate=shared 表示共享的方式编译deflate;

    后面的参数同理。


    如果这一步您出现了这样的错误:

    error: mod_deflate has been requested but can not be built due to prerequisite failures


    解决办法是:

    命令:yum install -y zlib-devel


    为了避免在make的时候出现错误,所以最好是提前先安装好一些库文件:

    命令:yum install -y pcre pcre-devel apr apr-devel


    4.编译:

    命令:make


    5.安装:

    命令:make install


    以上两个步骤都可以使用 echo $? 来检查是否正确执行,否则需要根据错误提示去解决问题。


    6.启动服务:

    命令:/usr/local/apache2/bin/apachectl start


    7.查看监听端口:

    命令:netstat -lnp

    查看一下监听端口是否为80

    

    但是,我却出现了这样的状况!!

wKioL1XmjtOAiKqPAADa0qcwaJk582.jpg


    虽然不妨碍使用,可是看着错误总觉得别扭。

    经过查找发现,这个问题应该是没有在 /etc/httpd/conf/httpd.conf 中设定 ServerName。

    所以apache会用主机上的名称来取代,首先会去找 /etc/hosts 中有没有主机的定义。

    所以要解决这个问题可以设定httpd.conf文件中的 ServerName,如下:

    

    (1)命令:vim /usr/local/apache2/conf/httpd.conf

    修改httpd.conf文件,增加:ServerName www.example.com:80
    或者在 /etc/hosts 中填入自己的主机名称 bogon,如下:

    (2)127.0.0.1 bogon 


    介绍下下面几条命令:

    命令:/uer/local/apache2/bin/apachectl -M

    作用:将一些静态的模块还有一些动态的模块列出来

wKioL1XmnyDTpKKgAANpLvqeJak540.jpg

    命令:/uer/local/apache2/bin/apachectl -l

    作用:把静态的模块列出来

wKiom1XmnfvRo25zAAFdrVmfFeU686.jpg

    命令:/uer/local/apache2/bin/apachectl -t

    作用:查看配置文件有没有语法错误。

    那么配置文件在哪里呢?

    在这里:ls /usr/local/apache2/conf/heepd.conf

wKiom1XmnhCzUs86AAC8Sw_MMII566.jpg   

    重启apache

    命令1:/usr/local/apache2/bin/apachectl restart

    命令2:/usr/local/apache2/bin/apachectl graceful

    那么这两个命令有什么区别吗?

    命令1是把进程杀死在重新开启

    命令2是原来的进程还存在,只是重新加载一下

    但两者就结果而言是一样的


三.安装PHP

    因为公司一直在使用5.2版本,但是考虑到版本太老,难免会有些漏洞。

    所以建议您使用5.3或者5.4版本。

    php官方下载地址: http://www.php.net/downloads.php

    给个懒人通道:http://php.net/get/php-5.4.36.tar.bz2/from/a/mirror


    1.下载php:

    命令:cd /usr/local/src

    命令:wget http://cn2.php.net/distributions/php-5.4.36.tar.bz2

    

    2.解压:

    命令:tar zxf php-5.4.36.tar.bz2


    3.配置编译参数:

    命令:cd php-5.4.36

    命令:./configure \

    --prefix=/usr/local/php \

    --with-apxs2=/usr/local/apache2/bin/apxs \

    --with-config-file-path=/usr/local/php/etc  \

    --with-mysql=/usr/local/mysql \

    --with-libxml-dir \

    --with-gd \

    --with-jpeg-dir \

    --with-png-dir \

    --with-freetype-dir \

    --with-iconv-dir \

    --with-zlib-dir \

    --with-bz2 \

    --with-openssl \

    --with-mcrypt \

    --enable-soap \

    --enable-gd-native-ttf \

    --enable-mbstring \

    --enable-sockets \

    --enable-exif \

    --disable-ipv6


    在这一步,遇到如下错误:

    configure: error: xml2-config not found. Please check your libxml2 installation.

    解决办法是:

    命令:yum install -y libxml2-devel

   

    然而,我们会发现,并没有这些库文件,那么我就要来下载这些库文件的下载包

    32位下载地址: www.lishiming.net/data/p_w_upload/forum/epel-release-6-8_32.noarch.rpm

    64位下载地址: www.lishiming.net/data/p_w_upload/forum/epel-release-6-8_64.noarch.rpm

    命令1:rpm -ivh 'http://www.lishiming.net/data/p_w_upload/forum/epel-release-6-8_32.noarch.rpm'

    命令2:rpm -ivh 'http://www.lishiming.net/data/p_w_upload/forum/epel-release-6-8_64.noarch.rpm'

    

    还有错误:

    configure: error: Cannot find OpenSSL's <evp.h>

    解决办法是:

    命令:yum install -y openssl openssl-devel


    错误:

    error: jpeglib.h not found

    解决方案:

    命令:yum install libjpeg-devel

    

    错误:

    checking for BZip2 in default path... not found

    configure: error: Please reinstall the BZip2 distribution

    解决办法:

    命令:yum install -y bzip2 bzip2-devel


    错误:

    configure: error: png.h not found.

    解决办法:

    命令:yum install -y libpng libpng-devel

    

    错误:

    configure: error: freetype.h not found.

    解决办法:

    命令:yum install -y freetype freetype-devel


    错误:

    configure: error: mcrypt.h not found. Please reinstall libmcrypt.

    解决办法:

    命令:rpm -ivh "http://www.lishiming.net/data/p_w_upload/forum/month_1211/epel-release-6-7.noarch.rpm"

    命令:yum install -y  libmcrypt-devel


    因为centos6.x 默认的yum源没有libmcrypt-devel 这个包,只能借助第三方yum源。


    4.编译:

    命令:make

    在这一步,您也许还会遇到诸多错误,没有关系,请仔细查看报错信息,解决办法很简单,就是装缺少的库。您可以把错误信息复制到google上搜一下。

    这个过程可能等待时间会很长,请耐心等候!


    5.安装:

    命令:make install


    6.拷贝配置文件:

    命令:cp php.ini-production /usr/local/php/etc/php.ini

    

    下面说下PHP一些小技巧:

    命令1:/usr/local/php/bin/php -m

    作用:查看有哪些模块(静态加载的)


    命令2:/usr/local/php/bin/php -i

    作用:查看一下相关的配置


四.测试PHP解析

    目的是能够实现怎么去跑一个php网站。

    

    Apache主配置文件为:/usr/local/apache2/confspacer.giftpd.conf

    命令:vim /usr/local/apache2/confspacer.giftpd.conf

    

    找到:

    AddType application/x-gzip .gz .tgz

    在该行下面添加:
    AddType application/x-httpd-php .php


    找到:
    <IfModule dir_module>
        DirectoryIndex index.html
    
</IfModule>

    将该行改为:
    <IfModule dir_module>
        DirectoryIndex index.html index.htm index.php
    </IfModule>

    

    找到:
    ServerName www.example.com:80
    修改为:
    ServerName localhost:80


五.测试LAMP是否成功

    启动apache之前先检验配置文件是否正确:
    命令:/usr/local/apache2/bin/apachectl -t

    如果有错误,请继续修改httpd.conf。

    我在安装过程中有一个错误

wKioL1XuVRixptopAACfNz2CY1s429.jpg

    这是因为我在配置/usr/local/apache2/conf/httpd.conf的时候

    AddType application/x-httpd-php .php加一个空格   


    如果是正确的则显示为 “Syntax OK”。


    启动apache的命令为:
    命令:/usr/local/apache2/bin/apachectl start


    查看是否启动:
    命令:netstat -lnp |grep httpd

wKioL1XuUdKSBlHRAAD-SeeqdEA065.jpg

    如果有显示这行,则启动了。 


    也可以使用curl命令简单测试:
    命令:curl localhost

wKiom1XuT_WRnOmQAAE-Fma5oUs893.jpg

    只有显示这样才正确。

    

    测试是否正确解析php:
    命令:
vim /usr/local/apache2/htdocs/1.php


    写入:
    <?php
        echo "php解析正常";
    ?>

    保存后,继续测试:
    命令:curl localhost/1.php

    看是否能看到如下信息:

wKiom1XuduWBHGKNAADAomKtwRw915.jpg

    只有显示这样才正确。


六.搭建Discuz论坛

    1.首先要去下载一个Discuz

    官网:http://download.comsenz.com/DiscuzX/3.2/

wKioL1Xue0zDJrIMAAHTMz4YxME219.jpg

    

    2.创建一个目录用来作为Discuz程序的根目录

    命令:mkdir /data/www

    命令:cd /data/www

    命令:wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_GBK.zip

wKioL1XufNOzccgtAAPREd8uY1U743.jpg

    3.解压一下压缩包

    命令:unzip Discuz_X3.2_SC_GBK.zip


    4.将程序目录下的文件挪出来,并删除程序目录以外的所以程序

wKioL1Xuf3KDsSX9AAMmjJdnJHc251.jpg

    5.配置apache的配置文件

    命令:vim /usr/local/apache2/conf/httpd.conf

    然后将虚拟主机打开

wKiom1Xufs7xiQ1zAAHAemC146E159.jpg

    然后编辑这个虚拟主机的配置文件

    命令:vim /usr/local/apache2/conf/extra/httpd-vhosts.conf

wKioL1XugfuSWrBEAALYZd8pNoY933.jpg

    将下面这个<VirtualHost *:80>删除,再编辑上面的:

    1.去掉第一行的管理员邮箱;

    2.将第二行的DocumentRoot的绝对路径改成/data/www;

    3.ServerName改为:www.wyl.com(这个随意,改成什么都行)

    4.ServerAlias改为:www.cyy.com(这个也随意) 

    5.后面的错误的日志和访问日志我们暂时不去接触,加#注释掉。

wKioL1XuhPXBjDn-AAGva2i_de4739.jpg

    6.查看有没有错误:

    命令:/usr/local/apache2/bin/apachectl -t


    7.在windows系统下。

    打开C盘 → Windows → System32 → drivers → etc 

    找到hosts文件,并用写字板打开它

    并且在localhost name resolution is handled within DNS itself下添加

    192.168.1.135 www.wyl.com www.cyy.com 


    期间我遇到了一个小问题,就是hosts文件无法写入保存。

    解决方法很简单:右击hosts,属性,安全,编辑,所有用户的编辑成  允许即可

wKioL1XukMqz1Kl0AAGrNzCoiYE835.jpg

    

    8.在windows系统的终端上ping两个网站 www.wyl.com www.cyy.com

    ping通即可

wKioL1XukbvREJp-AALsB1L7Ex8349.jpg

    9.然后在浏览器中输入www.wyl.com

    然而并没有想象中那么顺利,出现了好多问题。

    第一个问题:

    无法加载网页!!!

    原因:没有启动80端口,也就是apache没有启动

    解决方案/usr/local/apache2/bin/apachectl restart


    第二个问题:

    wKioL1Xuk6jA6ZluAABhuvTnpBg349.jpg

    403!403!403!403!403!403!403!403!403!403!403!403!

    原因:我也不知道!!

    解决方案:编辑一下主配置文件vim /usr/local/apache2/conf/httpd.conf

    将里面有一段

    <Directory />

    Options FollowSymLinks

    AllowOverride None

    Order deny,allow

    Deny from all

    </Directory> 

    

    改成 

    <Directory />

    Options FollowSymLinks

    AllowOverride None

    Order deny,allow

    Allow from all

    </Directory>


    问题解决后就会出现这个页面!!

wKioL1XumGzRlVitAAPl8vGke2U479.jpg

    

    点击我同意后进入下一个页面

wKiom1Xulomy1nzlAAL42mzP3O4222.jpg

    

    出现这样的情况,这么多的目录文件的权限不可写,该怎么办呢?

    我们来看看apache的进程是以哪个用户的身份运行的

    命令:ps aux | grep http

wKioL1Xumb7CX7EzAAM8qC0mdy0407.jpg

    我们可以看出apache的进程是以daemon的用户运行的。

    那么有两种方法可以解决这个问题。

    1.把这些目录文件的所属主改成daemon;

    2.把这些目录文件加上可写权限;

    

    我建议用第一个方法,第二种方法太不安全了

    命令:chown -R daemon config data uc_client/data uc_server/data

    这样问题就解决了:

wKioL1Xum1ij2jLWAALtt0y6i5c249.jpg


    下一步,选择第一项就行wKioL1Xum_WQmXFdAAGXMjSKG14174.jpg

    下面就要开始安装数据库了

wKioL1XunH7BO8mVAAJiI0A5HPQ959.jpg

    开始配置mysql

    create database discuz

    grant all on discuz.* to 'wangyl'@'localhost' identified by '密码'
wKiom1XuoOTDxExZAAILs82Wm7A696.jpg

   然后填写资料

wKioL1Xuo9yjZ_xXAAKFKNGT6uY823.jpg


    然后就是等待安装完毕就行了

wKioL1XupDayytzwAAKmvvnz188051.jpg


6.1.apache用户认证

    有时候,我们需要给一些特殊的访问设置一个用户认证机制,增加安全。

    比如我们刚刚安装好的 discuz 论坛,是有一个管理后台的。

    虽然管理后台本身就有密码,但我们为了更加安全,可以再设置一层用户认证。


    首先打开配置文件

    命令:vim /usr/local/apache2/conf/extraspacer.giftpd-vhosts.conf

    在对应的虚拟主机配置中加入如下配置:
    <Directory /data/www/任意的目录或文件>
        AllowOverride AuthConfig
        AuthName "alksdjflkasjdf"
        AuthType Basic
        AuthUserFile /data/.htpasswd
        require valid-user
    </Directory>

    首先指定要对哪个目录进行验证, AuthName 自定义, AuthUserFile 指定用户密码文件在哪里。

    命令:/usr/local/apache2/binspacer.gifpasswd -cm /data/.htpasswd wangyl
    

    这一步是要创建进行验证的用户。

    第一次要几个-c 选项,目的是为了创建/data/.htpasswd密码文件,回车后输入要设定的密码就 ok 啦。
    

    然后重启 apache 服务
    命令:/usr/local/apache2/bin/apachectl -t

    先检查配置是否正确
    命令:/usr/local/apache2/bin/apachectl graceful

6.2.默认虚拟主机

    我们发现你在输入虚拟主机的ip,或者在hosts里面添加如何一个域名的时候,也能正常访问discuz论坛,为了防止这个现象,我们这样来进行。

wKioL1Xv6FngAXDSAAJgf7eKkSI249.jpg

    我们在<VirtualHost *:80>上再创建一个,如下图

wKiom1Xv5pzzmcRUAAJqyWwCKzQ925.jpg

    创建配置中提到的目录

    命令:mkdir /tmp/tmp


    其实这个默认虚拟主机就是配置文件里的第一个虚拟主机。

    关于默认虚拟主机有个特点,凡是解析到这台机器的域名,不管是什么域名,只要在配置文件中没有配置,那么都会访问到这个主机上来。 

    举例,我们直接用 ip 访问,会访问到这个站点上来。为了避免别人乱解析,所以应该把默认也就是第一个虚拟主机给禁止掉。

    在这里我们使用 allow,deny 语句,已经禁掉了,至于它的含义,后面会介绍。这时候,我们用 ip 去访问,发现已经提示:

    Forbidden

    You don't have permission to access / on this server.


6.3.域名301跳转

    一个站点难免会有多个域名,而多个域名总得有一个主次。

    比如我的网站可以用两个

    域名访问:www.wyl.com和www.cyy.com

    但大家发现不管我用哪个域名访问,最终都会跳到 www.wyl.com 上来。

    那么,这个行为就叫做域名跳转,这里的 301 只是一个状态码,跳转除了 301 外还有 302。

    下面我们来配置如何让 www.cyy.com 跳转到 www.wyl.com。


    进入虚拟主机的配置文件

    命令:vim /usr/local/apache2/conf/extraspacer.giftpd-vhosts.conf
    

    在对应的虚拟主机配置文件中加入
    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_HOST} ^www.cyy.com$
        RewriteRule ^/(.*)$ http://www.wyl.com/$1 [R=301,L]
    </IfModule>

    如果是多个域名,可以这样设置:
    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_HOST} ^www.aaa.com [OR]
        RewriteCond %{HTTP_HOST} ^www.cyy.net$
        RewriteRule ^/(.*)$ http://www.wyl.com/$1 [R=301,L]
    </IfModule>
    

    或者:
    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_HOST} !^www.wyl.com$
        RewriteRule ^/(.*)$ http://www.wyl.com/$1 [R=301,L]
    </IfModule>


    配置完文件后,我们出来要查看下rewrite模块有没有加载出来。

    命令:/usr/local/apache2/bin/apachectl -M

wKioL1XxMenS8rzcAAMrlBs20EU647.jpg

    重启 apache 后,在浏览器访问 www.cyy.com 会直接跳转到 www.wyl.com。

    

    如果想快速测试效果,其实可以直接在 Linux 命令行下使用 curl 命令。
    命令:
curl -x127.0.0.1:80 www.aminglinux.com/bbs/forum.php -I

wKioL1XxTw6ioNGOAAF6WJJGHUc644.jpg


6.4.Apache日志切割

    这里的日志指的是访问日志,我们每访问一次网站,那么就会记录若干条日志。

    日志如果不去管理,时间长了日志文件会越来越大。

    我们如何避免产生这么大的日志文件?其实,apache 有相关的配置,使日志按照我们的需求进行归档,比如每天一个新日志,或者每小时一个新日志。

    

    那下面我们配置成按天归档日志。
    命令:
vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
    在对应的虚拟主机配置文件中加入
    ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/wyl.com-error_%Y%m%d.log 86400"
    CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/wyl.com-access_%Y%m%d.log 86400" combined

wKioL1XyUb6grcP_AALXvJR9QfI678.jpg   

    说明: 

    上面是两行,注意不要写成多于两行。 

    ErrorLog 是错误日志, CustomLog 是访问日志。

    最前面的那个竖线其实就是管道符,意思是把产生的日志交给 rotatelogs 这个工具,而这个工具就是 apache 自带的切割日志的工具。 

    -l 的作用是校准时区为 UTC,也就是北京时间。

    最后面的 86400,单位是秒,所以正好是一天,那么日志会每天切割一次。

    而最后面的 combined 为日志格式。

   

    关于日志格式在/usr/local/apcahe2/conf/httpd.conf 里面定义。

wKiom1XyVOqhJVktAAFncqAjFC0318.jpg

    %h:来源IP

    %l:

    %u:用户

    %t:时间

    

6.5.Apache不记录指定文件类型日志

    如果一个站点访问量特别大,那么访问日志就会很多。

    但有一些访问日志我们其实是可以忽略掉的,比如网站的一些图片,还有 js, css 等静态对象。

    而这些文件的访问往往是巨量的,而且即使记录这些日志也没有什么用。

    那如何忽略掉这些访问的日志呢?

    SetEnvIf Request_URI ".*\.gif$" p_w_picpath-request

    SetEnvIf Request_URI ".*\.jpg$" p_w_picpath-request

    SetEnvIf Request_URI ".*\.png$" p_w_picpath-request

    SetEnvIf Request_URI ".*\.bmp$" p_w_picpath-request

    SetEnvIf Request_URI ".*\.swf$" p_w_picpath-request

    SetEnvIf Request_URI ".*\.js$" p_w_picpath-request

    SetEnvIf Request_URI ".*\.css$" p_w_picpath-request

    CustomLog "|/usr/local/apache/bin/rotatelogs -l  /usr/local/apache/logs/oem.discuz.qq.com-access_%Y%m%d.log 86400" combined env=!p_w_picpath-request

wKiom1Xye_fgL-LFAAQ4BKQ6_lQ237.jpg

    

    说明:

    在原来日志配置的基础上,增加了一些 p_w_picpath-request 的定义,比如把 gif、 jpg、bmp、 swf、 js、 css 等结尾的全标记为 p_w_picpath-request。

    然后在配置日志的时后加一个标记env=!p_w_picpath-request,这里有个叹号,表示取反,这样就可以把这些忽略了。


6.6. Apache 配置静态缓存

    这里的静态文件指的是图片、 js、 css 等文件,用户访问一个站点,其实大多数元素都是图片、 js、 css 等,这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,目的就是为了下次再请求时不再去服务器上下载,这样就加快了速度,提高了用户体验。


    但这些静态文件总不能一直缓存,它总有一些时效性。

    那么这节我们讲的就是这个过期时间。

    配置如下:

    <IfModule mod_expires.c>

        ExpiresActive on

        ExpiresByType p_w_picpath/gif "access plus 1 days"

        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/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>


    说明:这里的时间单位可以 days、 hours 甚至是 min。

    两种不同的方法,上面使用的是mod_expires,而下面用的是 mod_headers。

    要想使用这些模块,必须要事先已经支持。

    如何查看是否支持,使用命令:

    /usr/local/apache2/bin/apachectl -M


6.7.Apache 配置防盗链

    配置防盗链的作用就是防止别人在你的网站里直接拿走图片

    SetEnvIfNoCase Referer "^http://.*\.apelearn\.com" local_ref

    SetEnvIfNoCase Referer ".*\.aminglinux\.com" local_ref

    SetEnvIfNoCase Referer "^$" local_ref

    <filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)">

    Order Allow,Deny

    Allow from env=local_ref

    </filesmatch>


6.8 Apache 访问控制

    在前面我们更改 httpd.conf 的时候就已经出现了 allow, deny 这两个关键词,其实这节最核心的东西就是这两个。先来看看 allow 和 deny 的规则。


    首先举个例子

    Order deny,allow

    deny from all

    allow from 192.168.1.135


    我们判断的依据是这样的:

    1. 看 Order 后面的,哪个在前,哪个在后

    2. 如果 deny 在前,那么就需要看 deny from 这句,然后看 allow from 这一句

    3. 规则是一条一条的匹配的,不管是 deny 在前还是 allow 在前,都是会生效的。

    比如例子中,先 deny 了所有,然后又 allow了192.168.1.135,所以192.168.1.135是通过的。


    讲完了 allow, deny 我们再来看看具体的应用吧。

    1.某个目录做限制,比如该目录很重要,只允许我们公司的 ip 访问,当然这个目录可以是网站根目录,也就是整个站点都要做限制了。

    <Directory /data/www/>

        Order deny,allow

        Deny from all

        Allow from 192.168.1.135

    </Directory>

    说明:只允许192.168.1.135访问,其他 IP 全部拒绝掉。


    2.针对请求的 uri 去限制,前面安装的 discuz 论坛,访问后台是 admin.php,那我们就可以针对这个 admin.php 做限制。

    <filesmatch "(.*)admin(.*)">

        Order deny,allow

        Deny from all

        Allow from 192.168.1.135

    </filesmatch>

    说明:这里用到了 filesmatch 语法,表示匹配的意思。


6.9.Apache 禁止解析 php

    某个目录下禁止解析 php,这个很有用,我们做网站安全的时候,这个用的很多,比如某些目录可以上传文件,为了避免上传的文件有***,所以我们禁止这个目录下面的访问解析 php。

    <Directory /data/www/data>

        php_admin_flag engine off

    <filesmatch "(.*)php">

        Order deny,allow

        Deny from all

    </filesmatch>

    </Directory>

    说明: php_admin_flag engine off 这个语句就是禁止解析 php 的控制语句,但只这样配置还不够,因为这样配置后用户依然可以访问 php 文件,只不过不解析了,但可以下载,用户下载 php 文件也是不合适的,所以有必要再禁止一下。


6.10.Apache 禁止指定 user_agent

    user_agent 我把它叫做浏览器标识。

    这一小节主要针对这些 user_agent 来做一些限制。

    配置如下:

    <IfModule mod_rewrite.c>

        RewriteEngine on

        RewriteCond %{HTTP_USER_AGENT} ^.*curl* [NC,OR]

        RewriteCond %{HTTP_USER_AGENT} ^*Firefox/4.0* [NC,OR]

        RewriteCond %{HTTP_USER_AGENT} ^*Tomato Bot/1.0* [NC]

        RewriteRule .* - [F]

    </IfModule>

    同样是使用 rewrite 模块来实现限制指定 user_agent.

    在本例中, RewriteRule .* - [F] 可以直接禁止访问。

    rewritecond 用 user_agent 来匹配, *Firefox/4.0* 表示,只要 user_agent 中含有 Firefox/4.0 就符合条件,其中*表示任意字符, NC 表示不区分大小写, OR 表示或者,连接下一个条件。


    假如我现在要把百度的搜索引擎限制掉,可以加一条这样的规则:

    RewriteCond %{HTTP_USER_AGENT} ^*Baiduspider/2.0* [NC]

    RewriteRule .* - [F]

    既然有了或者 OR,那有没有并且呢?你只要不写 OR 就是并且的意思。


6.11.Apache 通过 rewrite 限制某个目录

    我们可以 allow 和 deny 去现在网站根目录下的某个子目录,当然这个 rewrite 也可以实现,配置如下:

    <IfModule mod_rewrite.c>

        RewriteEngine on

        RewriteCond %{REQUEST_URI} ^.*/目录/* [NC]

        RewriteRule .* - [F]

    </IfModule>


7.1php.ini配置文件详解

    有时候我们并不知道 php.ini 所在路径,这时候就需要通过命令来查一查在哪里。

    命令:/usr/local/php/bin/php -i |head

wKiom1X6ZkCBNwaTAAP5kHuXgqc402.jpg

    看那一行 Loaded Configuration File -> /usr/local/php/etc/php.ini。

    如果这里为 None,那么就说明没有加载到具体的 php.ini。

    找到 php.ini 后,用 vim 打开它,发现很多行都是以;开头的,这个符号在 php.ini 中作为注释符号,也就是说只要是以;开头的行都是不起作用的。而php.ini 中常用的配置有如下:


    1.配置 disable_function

    disable_functions=eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close

wKioL1X6aQihybXUAAG2xNrdxJA423.jpg

    说明:在 php 中有非常多的函数,在这些函数中有一些是不×××全的,所以有必要把它们禁 v 0 掉、 。像 exec, shell_exec 都是在 php 代码中执行 linux shell 命令,很危险,要禁掉。


    2.配置 error_log

    如果你是 php 开发人员,那我相信你会经常遇到调试代码的情况,作为一个运维人员我们理应学会简单的 php 错误排查技能,其实 php 的错误跟 linux 下其他服务都是一样的,遇到错误后要查看错误日志,根据报错信息来判断错误的原因。那如何查看 php 的错误信息呢?

    遇到错误时,我们访问网站通常会显示白页,什么都没有,状态码是 500。

    那么怎么办呢?

    1.可以直接把错误信息显示在浏览器中,配置方法是,在 php.ini 中找到 display_error=on,重启apache 服务后,刷新网页,发现不再是白页,而是具体的错误。这样我们就可以根据错误来调试 php 代码了。这种情况适合临时调试,但是这种情况不适合长期配置,因为所有错误都会显示在浏览器上,假如哪天 php 程序员不小心写错一段代码,而且没测试直接上传到服务器上了,那么我们的用户就会直接看到这些错误,这样是不合适的。

    2.所以还有第二种情况,把错误信息输出到一个日志文件中,具体配置如下:

    命令:vim /usr/local/php/etc/php.ini 

    加入或者更改

    display_error=off

    log_errors=on

    error_log=/usr/local/php/logs/error.log

    说明:该文件一开始是不存在的,为了避免权限问题不能自动生成该文件,我们可以先创建该文件,并且修改权限为 777

    error_reporting = E_ALL | E_STRICT

    说明: 首先要把错误不再浏览器显示,第二打开错误日志开关,然后指定错误日志的路径,最后是定义错误日志的级别。配置完成后记得要重启 apache 服务,才会生效。

    

    3.配置 open_basedir

    在 php 中是有这个 open_basedir 概念的,它的意思是,把执行 php 的用户限定在指定的路径下,这样通过权限缩小的方式达到安全目的。

    作为一个网站,其实我们只需要让 php用户访问到网站的代码即可,没有必要让它去访问其他目录。那如何配置呢?

    命令:vim /usr/local/php/etc/php.ini 

    加入或者更改

    open_basedir = /dir1/:/dir2

    说明: /dir1 和/dir2 为我们允许 php 可以访问的两个目录,同样也可以是多个,目录之间用:分隔。一旦限定后,如果 php 试图去访问除/dir1 和/dir2 外的目录下的文件时,就会报错了。

    错误类似于:Warning: file_exists() [function.file-exists]: open_basedir restriction in effect.File(../123.php) is not within the allowed path(s):

    除了在 php.ini 中定义 open_basedir 外,其实我们还可以在 apache 的配置文件中定义,因为一个 apache 下可能有多个站点,我们要针对不同的站点限定不同的 open_basedir,配置如下。

    命令:vim httpd.conf 或者虚拟主机配置文件

    加入

    php_admin_value open_basedir "/dir1/:/dir2/"


7.2php扩展模块如何安装

    查看php编译加载完的模块

    命令:/usr/local/php/bin/php -m

    

    当我们编译完成php后,发现我们还需要让php支持另外的模块。    

    我们有两种安装方式。

    1.这时候可以重新编译 php,加上配置参数;

    2.或者直接编译出一个独立的模块文件。然后让php去调用它。


    一般我们使用第二种安装方式,那么如何编译呢?

    首先先找到php的源码包

    命令:cd /usr/local/src/php-5.4.36

wKioL1X6i4fhdNaFAAVJsPu1Ogc450.jpg

    很多很多的源码包都在ext/目录下:

wKiom1X6iYXyd7hsAAc0NxAIVp4337.jpg

    如果目录下没有我们需要的模块,那么我们就要去网上去下载一个

    举个例子,我们编译一个curl模块

wKioL1X6jJzhnZrCAAOzSsmLvY0759.jpg

    命令:/use/local/php/bin/phpize

    该命令的作用是:是为了生成configue这个可执行文件

wKioL1X6jXXAi9CvAAOsaEb3ZQU020.jpg

    命令:./configue --with-php-config=/usr/local/php/bin/php-config

    安装时候出现一个小问题

wKiom1X6joqQriUnAARIoNqZKjU038.jpg

    错误:configure: error: Please reinstall the libcurl distribution -easy.h should be in <curl-dir>/include/curl/ 

    解决:yum install curl curl-devel 


    命令:make

    命令:make install

    执行完命令后,会把模块的文件放在这个目录下

     /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/

wKiom1X6j9GS8PgHAANxQiGt_pE605.jpg

    extension_dir是用来存放扩展模块的

    命令:/usr/local/php/bin/php -i | grep extension_dir