第14章 LAMP环境搭建与配置
可以把apache+php安装在一台机器上,再把mysql安装在另一台机器上。也可以都安装在同一台机器上。php是作为apache的一个模块存在的,他们俩必须在一起。
为了少出点错误,先把这些东西都安装了
yum install -y libxml2-devel
yum install -y openssl openssl-devel
yum install -y bzip2 bzip2-devel
yum install -y libpng libpng-devel
yum install -y freetype freetype-devel
yum install -y libtool*
yum install -y libmcrypt-devel
yum install -y perl-Module-Install
yum install -y gcc
yum install -y expat-devel
14.1 安装mysql
14.1.1 下载软件包,初始化

echo $?查看是否执行正确,若返回值为0则正确,不是0就错了哦
14.1.2 配置mysql
首先复制配置文件

修改配置文件

复制启动脚本文件并修改其属性

修改启动脚本
vim /etc/init.d/mysqld

把mysql服务加入系统服务列表,设置开机启动,启动服务



14.2 安装apache
解压源码包,httpd依赖于apr和apr-util,需要安装。

先安装apr和apr-util




出现错误:

解决:

安装httpd
cd /usr/local/src/httpd-2.4.39

make && make install
14.3 安装php


有很多报错,最后删掉了上图中的--with-jpeg-dir
开始安装,时间很长

安装完成

复制配置文件

14.4 配置httpd支持PHP
修改该配置文件以下四个部分
vi /usr/1ocal/apache2.4/conf/httpd.conf
1.搜索ServerName删掉前面的#
2.搜索AddType添加一行配置
3.搜索index.html添加一行配置
4.搜索Require把最后一个单词改成granted

14.5 测试LAMP是否成功
14.5.1 测试配置文件是否正确

启动httpd:

14.5.2 测试是否正确解析PHP
编写一个测试脚本

保存脚本后继续测试

能显示以上信息则说明php解析正确
14.6 httpd配置
14.6.1 默认虚拟主机
httpd支持多个虚拟主机,也就是可以在一个服务器上运行多个站点,标记多个域名,负责处理没有被标记域名的虚拟主机就叫做默认虚拟主机。编辑httpd服务的主配置文件httpd.conf来配置默认虚拟主机。
vim /usr/1ocal/apache2.4/conf/httpd.conf
查找关键词httpd-vhosts,把这一行前面的的井号删除

保存主配置文件,继续编辑虚拟主机配置文件
vim /usr/1ocal/apache2.4/conf/extra/httpd-vhosts.conf
第一个字段是默认虚拟主机,把最下面两个字段改成如下内容

ServerAdmin指定管理员邮箱,没啥用。DocumentRoot为该虚拟机站点的根目录,网站的程序就放在这个目录下面。servername为网站的域名,serveralias为网站的第二域名,serveralias后面的域名可以写多个,用空格分开。errorlog为站点的错误日志,customlog为访问日志。
我在这里只定义了两个站点,ljl.com和123.com,当第三个域名abc.com指向本机的时候会去访问默认虚拟主机ljl.com。

第二步网站默认的主页就是index.html
第五步的操作是重新加载httpd服务,避免重启
由此看出默认虚拟主机为ljl.com,不管把什么域名指向该服务器,只要配置文件中没有标记,就会访问这个默认虚拟主机。
14.6.2 用户认证
这个功能就是在用户访问网站时需要输入用户名密码才能顺利访问,目的是保证安全。对123.com站点做一个全站的用户认证。编辑刚刚的配置文件
vi /usr/1ocal/apache2.4/conf/extra/httpd-vhosts.conf

(文字部分不是配置文件内容)
配置文件配置完成,还需要创建密码文件:

注:
htpasswd为创建用户的工具,-c为create,-m指定密码加密方式为MD5
/data/.htpasswd为密码文件,ljl为要创建的用户,第一次执行该命令需要加-c,第二次创建新用户不要加-c,否则该文件会被重置,之前的用户被清空。
配置完成后,需要在windows上修改一下hosts文件,把www.123.com域名指向这台linux机器,才能够通过浏览器访问到www.123.com。
编辑hosts文件:


连接www.123.com。
这是针对整个站点多的认证,也可以对某个目录或文件进行认证,比如对www.123.com/admin/目录进行认证,只需把<Directory /data/wwwroot/www.123.com>修改成<Directory /data/wwwroot/www.123.com/admin/>。如果是一个文件比如www.123.com/admin.php,就要这样做:

14.6.3 配置域名跳转
把123.com域名跳转到www.123.com,配置如下:
vim /usr/1ocal/apache2.4/conf/extra/httpd-vhosts.conf

(//后面的文字不是配置文件的内容)
RewriteRule后面由空格划分成三部分,第一部分为当前的URL(也就是网址),不过这个URL是不把域名算在内的。第二部分为要跳转的目标地址,这个地址可以写全(包含了域名),当然也可以不加域名,默认就是前面定义的ServerName。第三部分为一些选项,需要用方括号括起来,301为状态码,它称作“永久重定向”(还有一种跳转用的状态码为302,叫作“临时重定向”), L表示“Iast", 意思是跳转一次就结束了。 要实现域名跳转,需要有rewrite模块支持,所以先查看httpd是否已经加载该模块,如果没有还需要配置:

没有任何输出,需要编辑配置文件:


这个输出说明正常加载rewrite模块
配置完后进行测试:

状态码为301,跳转后的网址为http://www.123.com
14.6.4 配置访问日志
访问日志作用很大,不仅可以记录网站的访问情况,还可以在网站有异常发生时帮助我们定位问题,比如当有攻击时,是可以通过查看日志看到一些规律的。要配置httpd访问日志,首先要在主配置文件中定义访问日志的格式,打开主配置文件:
vi /usr/1ocal/apache2.4/conf/httpd.conf //搜索LogFormat
%h为访问网站的IP;%l为远程登录名,这个字段基本上为“-”;%u为用户名,当使用用户认证时,这个字段为认证的用户名;%t为时间;‰r为请求的动作(比如用curl -I时就为HEADE );%s为请求的状态码,写成%>s为最后的状态码;‰b为传输数据大小;%{Referer}i为referer信息;%{(User-Agent}i为浏览器标识,比如你用Firefox或者Chrome浏览器,则该字段显示内容不一样,是带有浏览器的标识的。
继续编辑虚拟主机配置文件:
vi /usr/1ocal/apache2.4/conf/extra/httpd-vhosts.conf

保存配置文件后,测试语法并重新加载配置


已经生成了日志,并且有相关的日志记录,用浏览器访问一下,再次查看日志,多了一行


这样看,如果一个站点访问量很大,那么访问日志文件增长会非常快,很占空间,所以可以限制这些静态元素去记录日志,而且把日志按天归档,一天一个日志,就可以防止单个日志文件过大,配置如下:
vi /usr/1ocal/apache2.4/conf/extra/httpd-vhosts.conf

先定义了一个image-request环境变量,把gif、jpg 、 png、bmp、swf、js、css等格式的文件全部归类到image-request里,后面的env=!image-request用到一个“!”,这相当于取反,意思是把image-request以外的类型文件记录到日志里。
保存配置文件后,测试配置文件是否有错误,没有错误重新加载服务。
/usr/1ocal/apache2.4/bin/apachectl -t
/usr/1ocal/apache2.4/bin/apachectl graceful
curl -xlocalhost:80 -I 123.com再次访问生成新的日志
14.6.5 配置静态元素过期时间
在日志中,有一个状态码为304,该状态码表示该文件已经缓存到用户的电脑里了,再次请求时不用从服务器上下载,而是直接访问用户电脑里的缓存。这样可以降低服务器的资源消耗,提升用户访问网站的速度。如果服务器上的某个图片更改了,应该访问新的图片才对,这就涉及“缓存过期时间”问题,我们可以编辑虚拟主机配置文件来控制这个时间。

这部分配置用到了mod_expires模块,设置gif,jpeg,png格式的文件过期时长为一天,css,js,flash过期时长为2小时,其他文件时长为0,也就是不缓存。保存配置文件,重新加载服务:

修改配置文件vi /usr/1ocal/apache2.4/conf/httpd.conf,打开expires模块
搜索关键词expires,删掉前面的#


有这行输出说明已经正确加载该模块
14.6.6 配置防盗链
防盗链就是不让别人盗用你网站上的资源。这个资源通常是图片视频歌曲文档等。配置防盗链之前,先了解一下referer,你通过a网站一个页面里面的链接去访问b网站的一个页面,那么这个b网站页面的referer就是a网站那个页面。也就是说,一个referer其实就是一个网址。我们通过限制referer来实现防盗链的功能,配置防盗链:
编辑虚拟主机配置文件:vi /usr/1ocal/apache2.4/conf/extra/httpd-vhosts.conf
添加如下内容:

首先定义允许访问链接的referer,其中^$为空referer,当直接在浏览器里数图片地址去访问它时,它的referer就为空,然后又实用filesmatch来定义需要保护的文件类型,访问txt|doc|mp3|zip|rar|jpg|gif格式的文件就会被限制。测试一下:

使用-e来定义referer,一定要以http://开头,访问html类型的文件不会被保护

访问txt类型的文件会显示403的状态码。
14.6.7 访问控制
1.限制ip访问,编辑配置文件vi /usr/1ocal/apache2.4/conf/extra/httpd-vhosts.conf
改成如下内容:

使用<Directory>来指定要限制访问的目录,order定义控制顺序,哪个在前面就先匹配哪个规则。deny在前面,所以先匹配Deny from all,这样所有的来源IP都会被限制,然后匹配Allow from192.168.150.20,这样又允许了这个IP。最终的效果是,只允许来源IP为192.168.150.20的访问。
对于使用PHP语言编写的网站,如果网站代码有漏洞,让黑客上传了一个用PHP代码写的木马,由于网站可以执行PHP程序,最终会让黑客拿到服务器权限。为了避免这种情况发生,我们需要把能上传文件的目录直接禁止解析PHP代码,配置如下:
vim /usr/1ocal/apache2.4/conf/extra/httpd-vhosts.conf

验证:

这说明1.php是不能正常解析的。
2.user_agent限制访问。user_agent为浏览器标识我们可以用它限制一些访问,比如限制一些不太友好的搜索引擎爬虫,也可以限制恶意请求,这些恶意请求通常称作cc攻击,我们可以通过限制user_agent发挥防攻击的作用,针对user_agent来做访问控制:
编辑虚拟主机配置文件:
vim /usr/1ocal/apache2.4/conf/extra/httpd-vhosts.conf

这个需求也用到了rewrite模块,%{HTTP_uSER_AGENT}为user_agent的内置变量,在本例中当user_agent匹配curl或者baidu.com时,都会触发下面的规则。方括号中的OR表示“或者”",NC表示“不区分大小写”",F相当于Forbidden。验证过程如下:

curl的-A选项指定user_agent。第一个请求,user_agent为“curl/7.29.0”匹配了第一个条件,所以会403;第二个请求,user_agent为自定义的“123123”没有匹配任何条件,所以状态码为200。
14.7 PHP配置
查看php配置文件所在位置的命令为:

php.ini是php的配置文件,它的位置在/usr/local/php/etc/php.ini,第一行为警告信息,取消警告需要编辑php.ini,找到date.timezone设置如下:

保存配置后再次执行不再提示警告信息:

14.7.1 PHP的disable_functions
PHP有诸多内置的函数,有一些函数(比如exec )会直接调取Linux系统命令,如果开放将会非常危险。因此,基于安全考虑应该把一些存在安全风险的函数禁掉,编辑php配置文件:
vim /usr/local/php/etc/php.ini
搜索disable_functions

这些被禁掉的函数是不能在php代码中调用的,更改完php.ini后,由于需要在httpd中调用php,所以还需要重启httpd服务使其生效。
14.7.2 配置error_log
设置php错误日志有诸多步骤:
编辑配置文件vim /usr/local/php/etc/php.ini,搜索以下内容并更改:

设定错误日志路径

让php记录错误日志

E_ALL为所有类型的日志,&表示并且,~表示排除,组合在一起就表示在所有日志的基础上排除掉notice相关的日志

设置为on,会把错误日志直接显示在浏览器里,会暴露网站一些文件路径等重要信息,所以要设置为off
要保证php的错误日志所在目录存在,并且权限为可写

在文件中写入内容,故意丢掉分号


出现了状态码500,说明我们访问的页面存在错误,需要查看php的错误日志来判定错误原因:

通过日志可以判断文件test.php第三行少了一个分号
14.7.3 配置open_basedir
open_basedir的作用是将网站限定在指定目录里,如果该站点被黑,黑客只能黑在该目录下,不能左右其他目录,在php.ini中设置open_basedir,编辑配置文件vim /usr/local/php/etc/php.ini:

open_basedir可以是多个目录,用冒号分开,我已经限制php只能在/tmp和/data/wwwroot/www.123.com两个目录下面活动。

发现ljl.com/1.php不能访问,查看错误日志:

给单个虚拟主机配置open_basedir,编辑文件vim /usr/1ocal/apache2.4/conf/extra/httpd-vhosts.conf

起作用的就是这句php_admin_value,它可以定义php.ini里面的参数,除此之外像error
_log之类的也可以定义,这样就可以实现一个虚拟主机定义一个open_basedir。
14.8 PHP动态扩展模块安装
所谓动态,就是一个独立存在的.so文件,php一旦编译完成,要想在增加一个功能模块,要么重新编译php,要么直接编译一个扩展模块(生成一个.so文件),然后在php.ini中配置一下,就可以被加载使用了。查看php都加载了那些功能模块:

安装一个php的redis扩展模块:



再次执行



# /usr/local/php/bin/php -i |grep extension_dir //查看扩展模块存放目录,可以在php.ini自定义路径
# ls /usr/local/php/lib/php/extensions/no-debug-zts-20131226/ //可以看到redis.so
# vim /usr/local/php/etc/php.ini //增加一行配置,可以放到最后一行
extension= =redis.so
# /usr/local/php/bin/php -m |grep redis //查看是否加载了redis模块
redis
浙公网安备 33010602011771号