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/attachment/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软件,出现了下面这种情况:
然后我重新安装了64位的mysql,出现了第二个问题:
这种情况是因为缺少lib库文件,只要安装一下即可:
命令:yum install -y compat-libstdc++-33
还有一种情况:
命令:yum install -y libaio
mysql初始化成功后会出现下面的情况:
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/attachment/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
但是,我却出现了这样的状况!!
虽然不妨碍使用,可是看着错误总觉得别扭。
经过查找发现,这个问题应该是没有在 /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
作用:将一些静态的模块还有一些动态的模块列出来
命令:/uer/local/apache2/bin/apachectl -l
作用:把静态的模块列出来
命令:/uer/local/apache2/bin/apachectl -t
作用:查看配置文件有没有语法错误。
那么配置文件在哪里呢?
在这里:ls /usr/local/apache2/conf/heepd.conf
重启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/attachment/forum/epel-release-6-8_32.noarch.rpm
64位下载地址: www.lishiming.net/data/attachment/forum/epel-release-6-8_64.noarch.rpm
命令1:rpm -ivh 'http://www.lishiming.net/data/attachment/forum/epel-release-6-8_32.noarch.rpm'
命令2:rpm -ivh 'http://www.lishiming.net/data/attachment/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/attachment/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/conftpd.conf
命令:vim /usr/local/apache2/conftpd.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。
我在安装过程中有一个错误
这是因为我在配置/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
如果有显示这行,则启动了。
也可以使用curl命令简单测试:
命令:curl localhost
只有显示这样才正确。
测试是否正确解析php:
命令:vim /usr/local/apache2/htdocs/1.php
写入:
<?php
echo "php解析正常";
?>
保存后,继续测试:
命令:curl localhost/1.php
看是否能看到如下信息:
只有显示这样才正确。
六.搭建Discuz论坛
1.首先要去下载一个Discuz
官网:http://download.comsenz.com/DiscuzX/3.2/
2.创建一个目录用来作为Discuz程序的根目录
命令:mkdir /data/www
命令:cd /data/www
命令:wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_GBK.zip
3.解压一下压缩包
命令:unzip Discuz_X3.2_SC_GBK.zip
4.将程序目录下的文件挪出来,并删除程序目录以外的所以程序
5.配置apache的配置文件
命令:vim /usr/local/apache2/conf/httpd.conf
然后将虚拟主机打开
然后编辑这个虚拟主机的配置文件
命令:vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
将下面这个<VirtualHost *:80>删除,再编辑上面的:
1.去掉第一行的管理员邮箱;
2.将第二行的DocumentRoot的绝对路径改成/data/www;
3.ServerName改为:www.wyl.com(这个随意,改成什么都行)
4.ServerAlias改为:www.cyy.com(这个也随意)
5.后面的错误的日志和访问日志我们暂时不去接触,加#注释掉。
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,属性,安全,编辑,所有用户的编辑成 允许即可
8.在windows系统的终端上ping两个网站 www.wyl.com www.cyy.com
ping通即可
9.然后在浏览器中输入www.wyl.com
然而并没有想象中那么顺利,出现了好多问题。
第一个问题:
无法加载网页!!!
原因:没有启动80端口,也就是apache没有启动
解决方案:/usr/local/apache2/bin/apachectl restart
第二个问题:
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>
问题解决后就会出现这个页面!!
点击我同意后进入下一个页面
出现这样的情况,这么多的目录文件的权限不可写,该怎么办呢?
我们来看看apache的进程是以哪个用户的身份运行的
命令:ps aux | grep http
我们可以看出apache的进程是以daemon的用户运行的。
那么有两种方法可以解决这个问题。
1.把这些目录文件的所属主改成daemon;
2.把这些目录文件加上可写权限;
我建议用第一个方法,第二种方法太不安全了
命令:chown -R daemon config data uc_client/data uc_server/data
这样问题就解决了:
下一步,选择第一项就行
下面就要开始安装数据库了
开始配置mysql
create database discuz
grant all on discuz.* to 'wangyl'@'localhost' identified by '密码'
然后填写资料
然后就是等待安装完毕就行了
6.1.apache用户认证
有时候,我们需要给一些特殊的访问设置一个用户认证机制,增加安全。
比如我们刚刚安装好的 discuz 论坛,是有一个管理后台的。
虽然管理后台本身就有密码,但我们为了更加安全,可以再设置一层用户认证。
首先打开配置文件
命令:vim /usr/local/apache2/conf/extratpd-vhosts.conf
在对应的虚拟主机配置中加入如下配置:
<Directory /data/www/任意的目录或文件>
AllowOverride AuthConfig
AuthName "alksdjflkasjdf"
AuthType Basic
AuthUserFile /data/.htpasswd
require valid-user
</Directory>
首先指定要对哪个目录进行验证, AuthName 自定义, AuthUserFile 指定用户密码文件在哪里。
命令:/usr/local/apache2/binpasswd -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论坛,为了防止这个现象,我们这样来进行。
我们在<VirtualHost *:80>上再创建一个,如下图
创建配置中提到的目录
命令: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/extratpd-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
重启 apache 后,在浏览器访问 www.cyy.com 会直接跳转到 www.wyl.com。
如果想快速测试效果,其实可以直接在 Linux 命令行下使用 curl 命令。
命令:curl -x127.0.0.1:80 www.aminglinux.com/bbs/forum.php -I
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
说明:
上面是两行,注意不要写成多于两行。
ErrorLog 是错误日志, CustomLog 是访问日志。
最前面的那个竖线其实就是管道符,意思是把产生的日志交给 rotatelogs 这个工具,而这个工具就是 apache 自带的切割日志的工具。
-l 的作用是校准时区为 UTC,也就是北京时间。
最后面的 86400,单位是秒,所以正好是一天,那么日志会每天切割一次。
而最后面的 combined 为日志格式。
关于日志格式在/usr/local/apcahe2/conf/httpd.conf 里面定义。
%h:来源IP
%l:
%u:用户
%t:时间
6.5.Apache不记录指定文件类型日志
如果一个站点访问量特别大,那么访问日志就会很多。
但有一些访问日志我们其实是可以忽略掉的,比如网站的一些图片,还有 js, css 等静态对象。
而这些文件的访问往往是巨量的,而且即使记录这些日志也没有什么用。
那如何忽略掉这些访问的日志呢?
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/apache/bin/rotatelogs -l /usr/local/apache/logs/oem.discuz.qq.com-access_%Y%m%d.log 86400" combined env=!image-request
说明:
在原来日志配置的基础上,增加了一些 image-request 的定义,比如把 gif、 jpg、bmp、 swf、 js、 css 等结尾的全标记为 image-request。
然后在配置日志的时后加一个标记env=!image-request,这里有个叹号,表示取反,这样就可以把这些忽略了。
6.6. Apache 配置静态缓存
这里的静态文件指的是图片、 js、 css 等文件,用户访问一个站点,其实大多数元素都是图片、 js、 css 等,这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,目的就是为了下次再请求时不再去服务器上下载,这样就加快了速度,提高了用户体验。
但这些静态文件总不能一直缓存,它总有一些时效性。
那么这节我们讲的就是这个过期时间。
配置如下:
<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>
说明:这里的时间单位可以 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
看那一行 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
说明:在 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
很多很多的源码包都在ext/目录下:
如果目录下没有我们需要的模块,那么我们就要去网上去下载一个
举个例子,我们编译一个curl模块
命令:/use/local/php/bin/phpize
该命令的作用是:是为了生成configue这个可执行文件
命令:./configue --with-php-config=/usr/local/php/bin/php-config
安装时候出现一个小问题
错误: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/
extension_dir是用来存放扩展模块的
命令:/usr/local/php/bin/php -i | grep extension_dir
本文出自 “萨摩耶的忧伤” 博客,谢绝转载!