首页 > 其他 > 详细

LAMP环境搭建与配置

时间:2020-12-11 16:40:56      阅读:20      评论:0      收藏:0      [点我收藏+]

 

LAMP是Linux Apache MySQL PHP的简写,即把Apache、MYSQL以及PHP安装在Linux系统上,组成一个环境来运行PHP 的脚本语言,通常是网站。Apache是最常用的Web服务软件,而MySQL是比较小型的数据库软件,这两个软件以及PHP都可以安装到Windows的机器上。

我们可以把Apache+PHP安装在一台机器上,再把MySQL安装在另一台机器上,也可以把他们三个安装在同一台机器上。但Apache和PHP需要在同一台机器上,这是因为PHP是作为Apache的一个模块存在的,它们必须在一起。

 

 

一、 安装MySQL

MySQL是一个关系型数据库。

1.下载软件包

建议把软件包都放到这个目录下,方便管理。

 技术分享图片

下载源码包:

wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz

 

2.初始化

解压:

 技术分享图片

 

 

 

移动位置:

 技术分享图片

 

 

 

建立用户:

 技术分享图片

 

 

 

创建datadir,数据库文件会放到这里,并修改权限:

 技术分享图片

 

 

 技术分享图片

 

 

最后一条命令中,--usr表示定义数据库的以哪个用户的身份在运行,--datadir表示定义数据库的安装目录(建议放到大空间的分区上)。执行最后一条命令时,有个错误信息“FATAL ERROR:please install the following Perl modules before executing ./scripts/mysql_install_db:Data::Dumper”,则会使因为缺少包perl-Module-Install,使用命令yum install -y perl-Module-Install安装它。

安装后重新执行最后一条命令,如果接下来看到两个OK,并且会在/data/mysql目录下生成几个文件和目录,说明执行正确。

 

3.配置MySQL

首先复制配置文件:

 技术分享图片

 

 

 

因为系统默认就有/etc/my.cnf,所以会提示是否覆盖,直接按“y”即可。

然后打开配置文件,做一些简单的配置,把配置文件改成一下内容:

 技术分享图片

 

 

 

 

basedirsh是MySQL包所在的路径,datadir是定义的存放数据的地方,默认情况下,错误日志也会记录在这个目录下面。port定义MySQL服务监听的端口,如果不定义默认就是3306。server_id定义该MySQL服务的ID号,这个用在做主从配置的时候。socket定义MySQL服务监听的套接字地址,在Linux系统下面,很多服务不仅可以监听一个端口(通过TCP/IP的方式通信),也可以监听socket,两个进程就可以通过这个socket文件通信。下面几个buffer是关于内存的配置参数,保持默认即可。

然后复制启动脚本文件:

 技术分享图片

 

 

 

 

修改启动脚本:

 技术分享图片

 

 

 

 

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

把启动脚本加入系统服务项,设定开机启动:

 技术分享图片

 

 

 

 

启动MySQL:

 技术分享图片

 

 

 

 

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

检查MySQL是否启动,查看进程:

 技术分享图片

 

 

 

 

查看端口:

 技术分享图片

 

 

二、 安装Apache

Apache是一个基金会的名字,httpd才是我们要安装的软件包,早期它的名字就叫apache。

下载源码包:

 技术分享图片

 

wget http://mirrors.cnnic.cn/apache/httpd/httpd-2.4.27.tar.gz

wget http://mirrors.hust.edu.cn/apache/apr/apr-1.5.2.tar.gz

wget http://mirrors.hust.edu.cn/apache/apr/apr-util-1.5.4.tar.gz

 

首先是解压下载好的源码包:

 技术分享图片

 

 

 技术分享图片

 

 技术分享图片

 

 

其中apr(包含apr和apr-util)可以理解成一个通用的函数库,主要是为上层应用提供支持。在这里httpd是依赖apr和apr-util的,如果不安装这两个东西,httpd就无法工作。

先来安装apr以及apr_util:

 技术分享图片

 

 

 技术分享图片

 

 技术分享图片

 

 

如果在安装apr_util时出现如下错误:

 技术分享图片

 

 

 

 

解决办法是:

 技术分享图片

 

 

 

 

安装完apr以及apr-util,继续安装httpd,配置编译参数:

 技术分享图片

 

 

 技术分享图片

 

 

这里,--prefix指定安装目录,--enable-so表示启用DSO。DSO的意思是,把某些功能以模块(一个功能模块就是一个so文件,这些文件在编译完httpd后会看到)的形式展现出来。enable-mods-shared=most表示以共享的方式安装大多数功能模块,安装完后会在modules目录下面看到这些文件。因为选择了大多数,所以后面的编译时间就会大大增加。另外,为了避免在make的时候出现错误,最好提前安装好一些库文件:

 技术分享图片

 

 

 

 

最后编译和安装:

 技术分享图片

 

 

 

 

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

 技术分享图片

 

 

 

 

安装完后,查看httpd的目录结构以及modules目录下面的模块文件:

 技术分享图片

这些模块并不会全部加载,如果想使用哪个模块,在配置文件里配置即可。

查看加载了哪些模块:

 技术分享图片

 

前面以AH00558开头的行,并不是错误,仅仅是一个警告,你可以在配置文件中定义ServerName使其消失。这些带有shared字样的,表示该模块为共享模块;当然还有static字样的,它表示以静态的形式存在。动态和静态的区别在于,静态模块直接和主程序(/usr/local/apache2.4/bin/httpd)绑定在一起,我们看不到,而动态的模块都是一个个独立存在的文件(modules目录下面的.so文件即是)。

 

 

三、 安装PHP

首先下载PHP5:

 技术分享图片

 

wget http://cn2.php.net/distributions/php-5.6.30.tar.gz

 

接着解压源码包:

 技术分享图片

 

 

 

 

然后配置编译参数:

 技术分享图片

 

 

 技术分享图片

 

 

 

关于PHP的编译参数比较多,大体意思是:编译PHP可以指定我们需要的功能模块,跟前面的httpd类似。apxs为httpd的一个工具,因为有它会自动把PHP模块安装到httpd的modules目录下,也就是说PHP将会以一个模块的形式和httpd结合在一起工作。

错误1:

 

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

解决方法:

 

#yum install -y libxml2-devel

 

错误2:

 

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

解决方法:

 

#yum install -y openssl openssl-devel

 

 

 

错误3:

checking for BZip2 in default path... not found

configure: error: Please reinstall the BZip2 distribution

 

 

 

解决方法:

 

#yum install -y bzi2 bzip2-devel

 

 

 

错误4:

configure: error: php.h not found

 

 

 

解决方法:

 

#yum install -y libpng libpng-devel

 

 

 

错误5:

configure: error: freetype.h not found

 

 

 

解决方法:

 

#yum install -y freetype freetype-devel

 

 

 

错误6:

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

 

 

 

解决方法:

#yum install -y epel-release
#yum install -y libmcrypt-devel

 

 CentOS默认的yum源没有libcrypt-devel这个包,所以只能借用epel yum拓展源。

然后编译和安装:

 技术分享图片

 

 

 

 

make的时间会在5分钟以上,请耐心等待。也许还会遇到诸多错误,请仔细查看报错信息,安装缺失的库即可。当然也可以把错误复制粘贴到网上搜索一下。

最后复制配置文件:

 技术分享图片

 

 

 

 

 

四、 配置httpd支持PHP

 

httpd的主配置文件为/usr/local/apache2.4/conf/httpd.conf,编辑这个文件:

 技术分享图片

 

 

 

 

搜索ServerName,把#ServerName www.example.com:80前面的#去掉。

找到如下内容:

<Directory />

    AllowOverride none

    Require all denied

</Directory>

 

改写如下:

<Directory />

    AllowOverride none

    Require all granted

</Directory

 

 

修改它的目的是,允许所有请求,如果不设置该行,则我们访问的时候会报403错误。

再搜索下面这一行:

 

 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.php

</IfModule>

 

 

 

五、 测试LAMP是否成功

httpd、MySQL和PHP安装之后,需要先检查httpd的配置文件是否正确,只有正确配置才可以正确解析PHP文件。

 

1.测试配置文件是否正确

启动httpd之前需要先检验配置文件是否正确。

 技术分享图片

 

 

 

 

如果有错误,请继续修改配置文件httpd.conf,如果配置正确则会显示“Syntax OK”。

启动httpd的命令:

 技术分享图片

 

 

 

 

查看是否启动的命令:

 技术分享图片

 

 

 

 

如果显示这一行则说明已经启动了httpd。

另外,我们也可以使用curl命令进行简单的测试:

 技术分享图片

 

 

 

 

如果显示这一行则说明测试成功。

 

2.测试是否正确解析PHP

首先编写一个测试脚本:

 技术分享图片

 

 

 

 

保存脚本后继续测试:

 技术分享图片

 

 

 

 

如果能显示一上信息则说明PHP解析正确。

LAMP环境搭建好之后,其实仅仅是安装上了软件,我们还有很多具体的配置工作要做,所以需要多练习配置httpd或者PHP。

 

 

六、 httpd配置

 

1.默认虚拟主机

早期的Linux服务器上,一个服务器只能运行一个网站,也就是说只能跑一个域名。但随着技术的发展,一个服务器上可以跑多个域名了,这样可以帮我们节省了很多成本。其实这里的服务器就叫做主机,早期一个主机对应一个站点。现在不同了一个主机可以跑多个站点,所以就有了虚拟主机的概念。我们可以把一台服务器虚拟出来多个主机出来,这样就实现了一台服务器上跑多个站点。

既然服务器上可以有多个虚拟主机,每个虚拟主机都会定义一个域名(当然也可以定义多个),只要把这个域名解析指向到该台服务器,我们自然就可以访问这个站点了。咱们访问一个网站,需要在浏览器里面输入域名,然后就能访问到网站内容。这个过程是需要浏览器和远程服务器通信的,网站内容就是从服务器上读取到的。而这个服务器就是由你的域名来决定在哪里的而域名之所以能决定服务器在哪里,就是因为这个域名做了解析指向。域名解析服务器IP地址,这个行为是由DNS服务器来完成的。

假如你访问的域名指向了你的服务器,而你又在这台服务器上做了配置标记了这个域名,这样这个域名就能被正常访问。但如果没有在服务器上给这个域名做标记,是不能正常返回结果的。

httpd有一个特点,它首先是支持多个虚拟主机的,也就是说可以在一个服务器上运行多个站点,标记多个域名。但如果没有标记的域名也指向了这台服务器,那总得有一个处理这个域名的虚拟主机。而这个虚拟主机就叫做“默认虚拟主机”。通俗点讲,你的服务器上有很多域名,很多站点,很多虚拟主机,这些域名都是在httpd的配置文件中做过标记的,都是“名花有主”的都是一一对应的,每个域名都能对应着自己的虚拟主机。但是,有一个特殊的域名也指向了服务器,却没有跟它对应的虚拟主机。这时候httpd就会把这个域名直接丢给一个特殊的虚拟主机来处理。那这个特殊的虚拟主机就是“默认虚拟主机”。

任何一个域名指向这台服务器,只要是没有对应的虚拟主机,就会由这个默认虚拟主机来处理。

 

编辑配置文件httpd.conf(httpd服务的主配置文件):

 技术分享图片

 

 

 

 

搜索关键词httpd-vhost,找到这一行把行首的 # 删除。

保存配置文件,任何编辑虚拟主机配置文件:

 技术分享图片

 

 

 

 

该文件最后两段(以<VirtualHost *:80>开头,以</VirtualHost>结尾),这样一段就是一个虚拟机,在这里面可以定义网站的域名和对应的网站程序所在目录。而默认虚拟主机就是第一个配置段,把该配置文件里面的两段</VirtualHost>重新编辑:

<VirtualHost *:80>

    ServerAdmin webmaster@dummy-host.example.com

    DocumentRoot "/usr/local/apache2.4/docs/abc.com"

    ServerName abc.com

    ServerAlias www.abc.com  www.aaa.com

    ErrorLog "logs/abc.com-error_log"

    CustomLog "logs/abc.com-access_log" common

</VirtualHost>

 

<VirtualHost *:80>

    DocumentRoot "/usr/local/apache2.4/docs/111.com"

    ServerName 111.com

    ErrorLog "logs/111.com-error_log"

    CustomLog "logs/111.com-access_log" common

</VirtualHost>

 

 

 

 

 

 

ServerAdmin指定管理员邮箱,这个没有什么实质作用。DocumentRoot为该虚拟主机站点的根目录,网站的程序就放在这个目录下面。ServerName为网站的域名,ServerAlias为网站的第二域名,ServerAlias后面的域名可以写多个,用空格分离,但ServerName后面的域名不支持写多个。ErrorLog为站点错误日志,CustomLog为站点访问日志。

假如在虚拟主机配置文件中,我们只定义了两个站点——abc.com和111.com,那么当把第三个域名111.com指向本机的时候,当在浏览器访问111.com时,回去访问abc.com,也就是默认虚拟主机。

做个测试:

 技术分享图片

 

 

 技术分享图片

 

 

 技术分享图片

 

 

 技术分享图片

 

 

 

由此,可以看出默认虚拟主机为abc.com,不管把什么域名指向到该服务器,只要配置文件中没有标记,就会访问这个默认虚拟主机。

 

2.用户认证

这个功能就是在用户访问网站的时候,需要输入用户名密码才能顺利访问。一些比较重要的站点或者网站后台通常会加上用户认证,目的是保证安全。

先对abc.com站点做一个全站的用户认证:

 技术分享图片

 

 

 

 

这样httpd的配置文件配置完成,但还需要创建密码文件:

 技术分享图片

 

 

 

 

htpasswd命令为创建用户的工具,-c为create(创建),-m指定密码加密方式为MD5,/data/.htpasswd为密码文件,gym为要创建的用户。第一次执行该命令需要加-c,第二次再创建新的用户时就不用加-c了,否则/data/.htpasswd文件就会被重置,之前的用户被清空。

 技术分享图片

 

 

 

 

配置完成后,需要到宿主机(你的真实电脑Windows)上去修改一下hosts文件,类似Linux上的/etc/hosts,把www.abc.com域名指向你的这台Linux机器,这样才能通过浏览器访问到www.abc.com。

Windows上的hosts文件所在路径为C:\Windows\System32\drivers\etc\hosts。在最下面增加一行(左边的IP地址为Linux IP):

  # 192.168.100.129 www.abc.com  

保存hosts文件后,就可以用Windows的浏览器去访问www.abc.com了。这会弹出一个用于认证的提示框。

 技术分享图片

 

 

 

 

输入用户名和密码后,将会进入www.abc.com网站。上面的操作是针对整个站点做的认证,其实也可以针对某个目录或者某个文件进行认证,比如要对www.abc.com/admin/目录进行认证,只需要修改一个地方,把<Directory /usr/local/apache2.4/docs/abc.com>改为<Directory /usr/local/apache2.4/docs/abc.com/admin>。如果是一个文件,比如www.abc.com/admin.php,则需要这样做:

 技术分享图片

 

 

 

 

3.配置域名跳转

一个网站可能会有多个域名。做域名跳转主要有两方面的作用:第一,一个站点有多个域名会对SEO有影响,说白了就是百度搜索关键词的排名有影响,如果把多个域名全部跳转到指定的一个域名,这样以这个域名为中心,就可以把权重集中在这个域名上,所以搜索关键词的排名也就靠前了;第二,如果之前的某个域名不再使用了,但是搜索引擎还留着之前老域名的链接,这意味着用户可能会搜到我们的网站并且点击老的域名,故需要把老域名做个跳转跳到新域名,这样用户搜的时候,也可以访问到网站。

把111.com域名跳转到www.111.com:

 技术分享图片

 

 

 

 

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

 技术分享图片

 

 

 

 

如果没有任何输出,则需要编辑配置文件。

 技术分享图片

 

 

 

 

搜索rewrite,找到那行把前面的#删除。

 技术分享图片

 

 

 

 

有这一行输出,说明正常加载rewrite模块。

配置完成后,进行测试:

 技术分享图片

 

 

 

 

可以看到状态码为301,跳转后的网站(location那行)为

http://111.com/。

 

4.配置访问日志

访问日志的作用很大,不仅可以记录网站的访问情况,还可以再网站有异常发生时帮助我们定位问题,比如当有攻击时,是可以通过查看日志看到一些规律的。

要配置pttpd访问日志,首先要在主配置文件中定义访问日志的格式,打开主配置文件:

 技术分享图片

 

 

 技术分享图片

 

 

 

可以看到两个格式的日志,建议使用第一个,记录的信息会更全。

%h为访问网站的IP;%l为远程登录名,这个字段基本上为“-”;%u为用户名,当使用用户认证时,这个字段为认证的用户名;%t为时间;%r为请求的动作(比如curl -I时就为HEADE);%s为请求的状态码,携程%>s为最后的状态码;%b为传输数据大小;%{Referer}i为referer信息(请求本次地址上一次的地址就为referer);%{User-Agent}i为浏览器标识,比如你用Firefox或者Chrome浏览器,则该字段显示内容不一样,是带有浏览器的标识的。对于这个日志格式,你可以自定义调整各个字段的位置,也可以额外增加其他字段,比如可以增加%D(请求耗费时间)。

然后继续编辑虚拟主机配置文件:

 技术分享图片

 

 

 技术分享图片

 

 

 

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

 技术分享图片

 

 

 

 

发现生成了日志,并且有相关的日志记录。另外,用Firefox浏览器访问一下,再次查看日志,多了一行,内容如下:

 技术分享图片

 

 

 

 

一个网站会有很多元素,尤其是图片、js、css等静态的文件非常多,用户每请求一个页面就会访问诸多的图片、js等静态元素,这些元素的请求都会被记录在日志中。如果一个站点访问量很大,那么访问日志文件增长会非常快,一天就可以达到几GB。这不仅对于服务器的磁盘空间造成影响,更重要的是会影响磁盘的读写速度。访问日志很重要,又不能不记录。还好这些巨量的静态元素请求记录到日志里的意义并不大,所以可以限制这些静态元素去记录日志,并且需要把日志按天归档,一天一个日志,这样也可以防止单个日志文件过大。

配置如下:

 技术分享图片

 

 

 技术分享图片

 

 

 

先定义了一个img环境变量,把gif、jpg、png、bmg、swf、js、css等格式的文件全部归类到img里,后面的env=!img有用到一个“!”,这相当于取反了,意思是把img以外的类型文件记录到日志里

正常应该CustomLog后面为日志文件名,但在这里用一个管道符的话,它就会把日志内容交给后面的rotatelogs命令处理。这个rotatelogs为httpd自带切割日志工具,它会把访问日志按我们定义的文件名格式进行切割。

保存配置文件后,测试配置文件是否有错误,没有错误重新加载服务:

 技术分享图片

 

 

 技术分享图片

 

 

 

再测试一下“在日志不记录静态元素”的配置:

 技术分享图片

 

 

 

 

去除静态元素日志,日志文件会瘦身很多。

 

5.配置静态元素过期时间

在上面的日志里,会发现有一个状态码为304,这个状态码表示该文件已经缓存到用户电脑里了,再次请求它的时候不用从服务器上下载,而是直接访问用户电脑里面的缓存。这样做的目的是降低服务器的资源消耗,还可以提升用户访问网站的速度。平时我们访问一个网站时很多元素为静态小图片,那这些小图片完全可以缓存在电脑里,这样再次访问该站点时,速度就会很快。

那到底能缓存多久呢?如果服务器上的某个图片更改了,那么一个访问新的图片才对。这就涉及一个静态文件缓存时长的问题,也叫做“缓存过期时间”。在httpd的配置文件中,我们是可以控制这个时间的。

编辑虚拟主机配置文件:

 技术分享图片

 

 

 技术分享图片

 

 

 

这部分配置用到了mod_expires模块,相关配置内容并不难理解,通过字面也可以大致猜到其含义。这里gif、jpeg、png格式的文件过期时长为1天,css、js、flash格式的文件过期时长为2小时,其他文件过期时长为0,也就是不缓存。

保存配置文件,检查配置是否有问题,没问题重新加载服务:

 技术分享图片

 

 

 

 

检查httpd是否加载expires模块:

 技术分享图片

 

 

 

 

没有任何输出,说明当前httpd并不支持expires模块,所以需要修改配置文件,打开该模块

 技术分享图片

 

 

 

 

搜索expires关键词,找到下面的行

 技术分享图片

 

 

 

 

把本行前面的#删掉

 技术分享图片

 

 

 

 

下面,使用curl来测试它的效果:

 技术分享图片

 

 

 

 

max-age=86400,说明图片将缓存86400秒,也就是一天。既然有缓存,那么我们请求该图片时也应该为304才对,但这里却是200。这是因为我们是curl工具请求的,它并不像浏览器那样可以缓存这些文件。其中max-age=0,说明没有缓存该类型的文件。

 

6.配置防盗链

防盗链,通俗讲,就是不让别人盗用你网站上的资源。这个资源,通常指的是图片、视频、歌曲、文档等。

配置防盗链:

 技术分享图片

 

 

 

 

编辑虚拟主机配置文件

 技术分享图片

 

 

 

 

首先允许访问链接referer,其中^$为空referer,当直接在浏览器里输入图片地址去访问它时,它的referer就为空。任何又使用filesmatch来定义需要保护的链接类型,访问txt、doc、mp3、zip、rar、jpg、gif格式的文件,当访问这样类型的文件时就会被限制。

 技术分享图片

 

 

 技术分享图片

 

 

 

使用-e来定义referer,这个referer一定要以http://开头,否则不管用

 技术分享图片

 

 

 

访问HTML类型的文件时,也不会被保护

 

7.访问控制

对于一些比较重要的网站内容,除了可以使用用户认证限制访问之外,还可以通过其他一些方法做到限制,比如可以限制IP,也可以限制user_agent。限制IP指的是限制访问网站的来源IP,而限制user_agent,通常是用来限制而已或者不正常的请求。

编辑配置文件:

 技术分享图片

 

 

 技术分享图片

 

 

使用<Directory>来指定要限制访问的目录,order定义控制顺序,那个在前面就先匹配哪个规则。在本例中deny在前面,使用先匹配Deny from all,这样所有的来源IP都会被限制,然后匹配Allow from 127.0.0.1,这样又允许了127.0.0.1这个IP。最终的效果是,只允许来源IP为127.0.0.1的访问。

验证过程:

 技术分享图片

 

 

 技术分享图片

 

 技术分享图片

 

 技术分享图片

 

 

本机有两个IP,一个是192.168.100.130,一个是127.0.0.1,通过这两个IP都可以访问到站点。而来源IP分别为192.168.100.130和127.0.0.1,其实和本机IP是一样的。

 技术分享图片

 

 

 

 

浏览器访问提示Forbidden,其实就是403。再看日志,可以查看到对应的来源IP为192.168.100.1,希望不要把来源IP和本机IP搞混了。前面之所以本机IP和来源IP一样,就是因为它相当于自己访问自己。而后面用浏览器访问,相当于拿Windows机器访问Linux服务器。

 技术分享图片

 

 

 

 

也可以单独针对某个文件来做限制:

 技术分享图片

 

 

 

 

对于使用PHP语言编写的网站,有一些目录是有需求上传文件的。如果网站代码有漏洞,让黑客上传了一个用PHP代码写了一个用PHP代码写的木马,由于网站可以执行PHP程序,最终会让黑客拿到服务器权限。为了避免这种情况发生,我们需要把能上传文件的目录直接禁止解析PHP代码,配置如下:

 技术分享图片

 

 

 

 

验证过程:

 技术分享图片

 

 

 技术分享图片

 

 技术分享图片

 

 

这说明123.php是不能正常解析的。下面来研究一下user_agent,为浏览器标识,当用curl访问时,user_agent为“curl/7.29.0”。“蜘蛛爬虫”抓取数据类似于用户用浏览器访问网站,当“蜘蛛爬虫”太多或者访问太频繁,就会浪费服务器资源。另外,也可以限制恶意请求,这种恶意请求我们通常称作cc攻击,它的原理很简单,就是用很多用户的电脑提示访问同一个站点,当访问量或者频率达到一定层次,会耗尽服务器资源,从而使之不能正常提供服务。这种cc攻击其实有很明显的规律,其中这些恶意请求的user_agent相同或者相似,那我们就可以通过限制user_agent发挥防攻击的作用。

下面是针对user_agent来做访问控制:

 技术分享图片

 

 

 技术分享图片

 

 

这个需求也用到了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为自定义的“aaa”没有匹配任何条件,所以状态码为200。

 

 

七、 PHP配置

虽然PHP是以httpd一个模块的形式存在,但是PHP本身也有自己的配置文件。

查看PHP配置文件所在位置的命令为:

 技术分享图片

 

 

 

 

php.ini为PHP的配置文件,可以看出其在/usr/local/php/bin/php.ini,第一行的Warrning为警告信息,可以忽略,取消这个警告需要编辑php.ini,找到data.timezone设置如下:

 技术分享图片

 

 

 技术分享图片

 

 

再次执行不再提示警告信息:

 技术分享图片

 

 

 

1.PHP的disable_functions

PHP内有诸多内置的函数,有一些函数(比如exec)会直接调取Linux系统命令,如果开放将会非常危险。因此,基于安全考虑应该把一些存在安全风险的函数禁掉:

 技术分享图片

 

 

 技术分享图片

 

 

更改完php.ini后,由于需要在httpd中调用PHP,所以还需要重启httpd服务使其生效。

 

2.配置error_log

PHP的日志对于程序员来说特别重要,它是排查问题的手段。设置成PHP错误日志,有诸多步骤:

 技术分享图片

 

 

 

 

搜索log_errors,改为:

 技术分享图片

 

 

 

 

再搜索error_log,改为:

 技术分享图片

 

 

 

 

再搜索error_reporting,改为:

 技术分享图片

 

 

 

 

再搜索display_errors,改为:

 技术分享图片

 

 

 

 

log_errors可以设置为on或者off,如果想让PHP记录错误日志,需要设置为on。error_log设定错误日志路径;error_reporting设定错误日志的级别,E_ALL为所有类型的日志,不管是提醒还是警告都会记录。在开发环境下面设置为E_ALL,可以方便程序员排查问题,但也会造成日志记录很多无意义的内容。&符号表示并且,~表示排除,所以两个组合在一起就是在E_ALL的基础上排除掉notice相关的日志。display_errors设置为on,则会把错误日志直接显示在浏览器里,这样对于用户访问来说体验不友好,而且还会暴露网站的一些文件路径等重要信息,所以要设置为off。设置完php.ini,还需做一些额外的操作:

 技术分享图片

 

 

 

 

下面做一个演示:

 技术分享图片

 

 

 技术分享图片

 

 

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

 技术分享图片

 

 

 

 

通过日志可以判断,123.php文件第三行少了分号。

 

3.配置open_basedir

一个服务器上跑很多网站,这是几乎所有小公司为节省成本采用的做法,但这样做也会有一些弊端:多个网站跑在同一个服务器上,如果其中一个 网站被黑,很可能连累到其他站点。为了避免这种尴尬的事情发生,我们应当做一些预防手段。

还好PHP有一个概念叫做open_basedir,它的作用是将网站限定在指定目录里,就算该站点被黑,黑客也只能在该目录下有所作为,而不能左右其他目录。如果你的服务器上只有一个站点,那可以直接在php.ini中设置open_basedir参数。但如果服务器上跑的站点比较多,那在php.ini中设置就不合适了,因为在php.ini中只能定义一次,也就是说所有站点都一起定义限定目录,那这样似乎起不到隔离多个站点的目的。

在php.ini中设置open_basedir:

 技术分享图片

 

 

 技术分享图片

 

 

open_basedir可以是多个目录,用:分隔。

 

 

八、 PHP动态拓展模块安装

编译httpd时,有涉及动态和静态模块,其实PHP也一样有这样的说法。所谓动态,就是一个独立存在的.so文件,在httpd中PHP就是以动态模块的形式被加载的。PHP一旦编译完成后,要想再增加一个功能模块的话,要么重新编译PHP,要么直接编译一个扩展模块(生成一个.so文件),然后在php.ini中配置以下,就可以被加载使用了。

查看PHP都加载了哪些功能模块:

 技术分享图片

 

 

 

 

安装PHP的redis扩展模块:

 技术分享图片

 

 

 技术分享图片

 

 

生成configure文件

 技术分享图片

 

 

 技术分享图片

 

 

查看扩展模块存放目录,可以在php.ini中自定义该路径

 技术分享图片

 

 

 

 

可以看到redis.so

 技术分享图片

 

 

 

 

增加一行配置(可以放到最后一行)

 技术分享图片

 

 

 技术分享图片

 

 

查看是否加载了redis模块

 技术分享图片

 

 

 

 

 

 

 

 

 

LAMP环境搭建与配置

原文:https://www.cnblogs.com/ko-no-dio-da/p/14120035.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!