LAMP是Linux+Apache+MySQL+PHP的简称,是用于搭建web服务器的一种解决方案。虽然从RHEL 7开始Red Hat公司推荐使用MariaDB而不是MySQL,但在我这篇文章当中,我还是决定继续使用MySQL。
在本文档中,我使用CentOS 7来搭建LAMP平台。系统安装时选择的是basic server版本,详细版本号为CentOS 7.0.1406,核心版本号为3.10.0-123.el7.x86_64。CentOS 7系统安装在虚拟机上,IP为172.31.2.2,其可与物理机正常通信。本文档所涉及的所有操作均使用root账号进行。
这篇文章只是我个人学习的总结,主要参考了鸟哥的Linux私房菜和各软件的官方文档,但因为本人对PHP技术和数据库技术可以说基本不了解,所以里面可能会有一些设定不很清楚或优化不到位的地方,敬请知晓。
安装Apache软件
Apache软件的软件包名称叫做httpd,因此,要安装Apache软件,就使用下述命令:
[root@localhost ~]# yum install httpd
如上图所示,安装的Apache 软件版本为2.4版。根据红帽官方文档说明,RHEL 7 (或CentOS 7)上可用的Apache版本正是2.4版的。
安装完成后,Apache是以httpd服务的形式存在的。因此,要启动Apache并将其设置为开机启动,就使用命令:
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# systemctl enable httpd.service
然后,检查httpd服务状态:
[root@localhost ~]# systemctl status httpd.service
如上图所示,“enabled”表示httpd服务已设为开机启动,“active(running)”则表示httpd服务正在运行中。
这样的话,HTTP协议就已被启动起来了,由于HTTP协议使用到tcp端口80,因此防火墙要放通tcp端口80:
[root@localhost ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
重启防火墙以让更改立刻生效:
[root@localhost ~]# firewall-cmd --reload
使用以下命令检查配置是否成功:
[root@localhost ~]# firewall-cmd --list-all
如上图所示,tcp端口80已放通。
然后这个时候,就可以在物理机上使用浏览器来访问刚刚搭建的web服务器了。不过,因为这个时候还未创建任何页面,所以它显示的是Apache软件自带的测试页面:
设置Apache配置文件
Apache软件的主配置文件为/etc/httpd/conf/httpd.conf。关于Apache 2.4版软件的详细说明文档,可在网页http://httpd.apache.org/docs/2.4/en/中查阅到。特别是,关于主配置文件httpd.conf中各指令的详细说明,可在网页http://httpd.apache.org/docs/2.4/mod/directives.html中查阅到。
关于Apache 2.4版软件的详细说明文档,也可以将它安装在本地Linux主机上面,使用命令yum install httpd-manual即可安装它。安装完成后,重启httpd服务。在web服务运行正常的情况下,可在本地Linux主机上面使用网址http://localhost/manual/来访问它。在其它设备上面,则使用相应的网址即可,如在本实例中,我可以在物理机上使用网址http://172.31.2.2/manual/来访问它。
另外还需要知道:/etc/httpd/conf.d目录下以.conf结尾的配置文件也会被读取;可加载模块(如PHP)的配置文件应放置在/etc/httpd/conf.modules.d目录下,并且也以.conf结尾。
下面介绍一下httpd.conf这个配置文件的内容(少量配置有修改):
ServerRoot "/etc/httpd" //服务器根目录:本配置文件中没有使用绝对路径的地方,都认为是在该目录下
Listen 80 //侦听80端口
Include conf.modules.d/*.conf
//该设定让/etc/httpd/conf.modules.d目录下以.conf结尾的配置文件也会被读取进来。DSO对象的配置文件应放置在此目录下
User apache
Groupapache
//当你使用浏览器访问web服务器时,会产生相应的httpd进程,该进程所属的用户和组就由这里设定。
//从这里开始,下面的设定适用于“主”服务器,与虚拟主机区别开来。但如果<VirtualHost>部分未设定这些值,也会使用这些值
ServerAdmin root@localhost //系统管理员的邮箱。改成自己的邮箱即可。
ServerName www.speedsnail.com //设置主机名。生产环境中,该主机名应该是能被正确解析成这台服务器的IP的。
<Directory />
AllowOverride none
Require all denied
</Directory>
//<Directory 目录路径>和</Directory>:用于设定指定目录(这里是系统根目录)的访问权限。目录路径那里可以使用绝对
//路径和相对路径,还可以搭配使用通配符和正则表达式。
//AllowOverride:如果指定目录下(这里是系统根目录)存在一个.htaccess文件,那么AllowOverride设定的是,该文件里面的
//设置是否能够覆盖<Directory>这部分的设置,或该文件里面的设置可以覆盖的是<Directory>这部分的哪些设置。none表示不
//允许进行覆盖。
//Require:设定哪些用户可以访问该目录(这里是系统根目录)。all denied表示不允许访问该目录。
DocumentRoot "/var/www/html"
//设定网页存放目录。比如说,访问http://host/index.html实际上就是访问这个host的/var/www/html/index.html这个文档。
<Directory "/var/www">
AllowOverride None
Require all granted //all granted表示可无条件访问该目录。
</Directory>
<Directory"/var/www/html">
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
//Options:用于设定在该目录中哪些特性可用。FollowSymLinks,让该目录下的符号链接可以生效。默认这里还有个Indexes选
//项,建议拿掉。它的作用是,当浏览器访问该目录(而非该目录下的某一个档案)时,如果该目录下没有默认网页(如index.html),
//那么此时就会返回该目录下的文件名列表。
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
//<IfModule 模块>和</IfModule>:如果Apache有加载这里指定的模块,那么Apache就会对它们之间的语句进行处理。
//也可以使用<IfModule!模块>和</IfModule>,那么就表示没有加载指定的模块时才进行处理。
//这里的模块可以是模块ID(如rewrite_module),也可以是模块文件名(如mod_rewrite.c)。
//DirectoryIndex:这就是设置默认网页的,即当浏览器访问某一个目录时,会返回该目录下的index.html文件(如果存在的话)。
//也可以接多个档名,如DirectoryIndexindex.html index.htm index.cgi index.pl,这样就会返回找到的第一个文件。
<Files ".ht*">
Require all denied
</Files>
//<Files 文件名>和</Files>:对指定文件名的文件应用这里指定的语句。
//这里的语句的意思是:任意目录下,文件名符合.ht*的文件都会被禁止访问。
ErrorLog "logs/error_log" //错误日志所在文档为/etc/httpd/logs/error_log
LogLevel warn //设置日志记录级别
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b\"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b\"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined //客户端访问服务器的日志会记在/etc/httpd/logs/access_log
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
//ScriptAlias会将URL路径映射到指定目录,并且让该目录具有CGI脚本执行权限(因此CGI脚本都可放置在该目录下)。
//以这里的设定举个例子,假如在浏览器中输入http://example.com/cgi-bin/foo,此时就会执行/var/www/cgi-bin/foo这个
//CGI脚本。
<Directory"/var/www/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule mime_module> //这部分是关于MIME的
TypesConfig /etc/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset Off
//AddDefaultCharset会强制客户端浏览器使用指定的字符集编码方式。这可能会有问题,所以要将它关闭。实际上,所使用的编
//码方式在网页里有声明。
<IfModule mime_magic_module>
MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on //允许Apache使用系统核心支持的sendfile来传送文件给客户端
IncludeOptional conf.d/*.conf //在/etc/httpd/conf.d目录下以.conf结尾的配置文件也会被读取
从上面也可以知道,默认情况下,网页文档可以放置在/var/www/html目录下,CGI脚本可以放置在/var/www/cgi-bin目录下;错误日志在/etc/httpd/logs/error_log,访问日志在/etc/httpd/logs/access_log。
设定好配置文件后,要测试配置文件语法有没有问题,可使用命令:
[root@localhost ~]#apachectl configtest
然后,重启httpd服务:
[root@localhost ~]# systemctl restart httpd
安装PHP
使用以下命令安装PHP软件:
[root@localhost ~]# yum install php
从上图可以看到,安装的PHP版本为5.4版。
安装完成后,PHP会生成配置文件/etc/httpd/conf.d/php.conf,因为该配置文件在/etc/httpd/conf.d目录下,所以它会被Apache所读取。PHP还会生成配置文件/etc/httpd/conf.modules.d/10-php.conf,该配置文件也会被Apache所读取,它的设定让Apache可以加载PHP模块。不过,PHP软件本身的配置文件其实是/etc/php.ini。
下面介绍一下配置文件/etc/httpd/conf.d/php.conf:
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
//<FilesMatch 正则表达式>和</FilesMatch>:文件名与正则表达式相匹配的文件,将适用这里设定的语句。
//SetHandler:强制所有匹配的文件使用指定handler进行处理。
AddType text/html .php //设定扩展名为.php的档案的类型为text/html
DirectoryIndex index.php //默认网页档名增加index.php
php_value session.save_handler"files"
php_value session.save_path "/var/lib/php/session"
下面介绍一下配置文件/etc/httpd/conf.modules.d/10-php.conf:
<IfModule prefork.c>
LoadModule php5_module modules/libphp5.so
</IfModule>
//如果Apache使用的多处理模块(MPM)是prefork(默认),那么Apache就会加载LoadModule指定的模块(PHP模块)
最后,来看看配置文件/etc/php.ini。在该文件的开头处,有说明针对生产环境和开发环境,有一些设定值可以进行修改,以提高PHP的效能。假设该web服务器是用于生产环境的,将下面的这些设定值改成这样(或确认这些设定值是这样的):
display_errors = Off //当发生错误时,不将错误信息显示出来(到浏览器上)
display_startup_errors = Off //不将PHP启动时发生的错误信息显示出来(到浏览器上)
error_reporting = E_ALL &~E_DEPRECATED & ~E_STRICT //这一项设定PHP会告知的错误或信息类型
html_errors = On //当PHP显示或记录错误信息时,将该信息格式化成HTML格式
log_errors = On //这让PHP可以将错误信息日志记录到日志文件里
ignore_repeated_errors = On //忽略重复的错误信息
ignore_repeated_source = On //当忽略重复的错误信息时忽略信息源
post_max_size = 25M //PHP所允许的POST数据的最大值。可按照需要进行调整
file_uploads = On //允许文件上传,默认为On
upload_max_filesize = 20M //上传文件所允许的最大值。可按照需要进行调整
memory_limit = 128M //PHP可用的最大内存。可按照需要进行调整
然后,重启httpd服务:
[root@localhost~]# systemctl restart httpd
为了测试Apache能不能正常调用PHP,在/var/www/html目录下新建一个phpinfo.php文档,内容如下所示:
其中的<?php ?>是PHP程序的语法,phpinfo ();则是PHP程序提供的一个函式库,该函式库可以显示出你这个web服务器的相关信息。然后,使用浏览器来访问服务器的这个文件,看看页面能不能正常打开。如果正常的话,应该可以看到下面这个页面:
测试完后,因为这个页面里面的信息还挺重要的,所以应该把phpinfo.php这个档案删除。
安装MySQL
由于从RHEL 7开始Red Hat公司推荐使用MariaDB替换MySQL,因此默认情况下,并没有提供MySQL的安装包,也就是没办法直接使用yum命令安装MySQL软件。为了要安装MySQL,我选择的是去官网http://dev.mysql.com/downloads/repo/yum/下载安装包,不过在下载之前需要先注册。因为使用的是CentOS 7系统,所以我下载的是mysql-community-release-el7-5.noarch.rpm这个文件。
下载下来后,将它放在/root目录下,然后使用命令:
[root@localhost ~]# yum localinstall mysql-community-release-el7-5.noarch.rpm
使用上面这个命令可以将MySQL Yum Repository添加到系统的软件库列表(repositorylist)。然后可以使用下面的命令检查添加是否成功:
[root@localhost ~]# yum repolist enabled | grep mysql
然后,使用下面的命令安装MySQL:
[root@localhost ~]# yum install mysql-community-server
如上图所示,这个命令会安装MySQL server,附带的,它会安装一些支撑软件,包括MySQL client、共享客户端库(mysql-community-libs)等软件。注意到,这里安装的MySQL版本为5.6版。
安装完成后,启动mysqld服务并将其设为开机启动:
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# systemctl enable mysqld
然后,检查mysqld服务状态:
[root@localhost ~]# systemctl status mysqld
查看mysqld服务侦听端口:
[root@localhost ~]# netstat -atulpn | grep mysqld
如上图所示,MySQL侦听tcp端口3306。但因为防火墙并未放通该端口,所以从其它设备上是无法访问本服务器的MySQL数据库的。但因为这里的MySQL也仅是提供给本机的PHP使用的,所以也就不必放通tcp端口3306。
根据MySQL官方手册,建议安装完MySQL数据库后使用下面的命令来增强数据库的安全性:
[root@localhost ~]# mysql_secure_installation
该命令程序可以协助你设置数据库root账号的密码,移除匿名用户账号,是否允许远程登录root账号,移除自带的test数据库,最后还会问你是否要重新加载特权表以让修改生效。我是设置了数据库root账号密码,其它的都选是(Y)。
如果不想使用上面的命令,那可以使用下面的命令来给root账号设置密码,回车后它会提示你输入密码的:
[root@localhost ~]# mysqladmin -u root password
如果要修改root账号的密码,可使用下面的命令,回车后,它会提示你输入密码,然后再设置新密码:
[root@localhost ~]# mysqladmin -u root -p password
用root账号进入MySQL管理后台,它会提示你输入密码:
[root@localhost ~]# mysql -u root –p
创建本地用户:
mysql> create user '用户名'@'localhost' identified by '密码';
创建新数据库:
mysql> create database 数据库名;
将指定数据库的所有权限授给指定用户:
mysql> grant all privileges on 数据库名.* to '用户名'@'localhost';
刷新系统权限表:
mysql> flush privileges;
进入mysql数据库(系统自带),并查询是否存在指定用户(如果有出现一堆东西,则表明存在):
mysql> use mysql;
mysql> select * from user where user = '用户名';
如果要删除本地用户,使用:
mysql> drop user '用户名'@'localhost';
如果要删除数据库,使用:
mysql> drop database 数据库名;
查看存在的数据库:
mysql> show databases;
退出MySQL管理后台:
mysql> exit
下面为实际所进行的操作:
[root@localhost ~]# mysql -u root -p
Enter password:
mysql> create user'myuser'@'localhost' identified by '1234'; //新建本地用户myuser,密码为1234
mysql> create database mydb; //新建数据库mydb
mysql> grant all privileges on mydb.*to myuser@localhost; //将数据库mydb的所有权限授权给本地用户myuser
mysql> flush privileges; //刷新系统权限表
mysql> use mysql; //进入数据库mysql(该数据库为系统自带)
mysql> select * from user where user ='myuser'; //查询数据库mysql中是否存在用户myuser
mysql> show databases; //显示所有已有的数据库
mysql> exit
上面设定好后,就可以使用myuser这个账号登录MySQL了,并且可以发现该用户拥有一个数据库mydb。
关于MySQL,还需要知道:
/etc/my.cnf:这是MySQL的配置文件。不过,因为我还玩不转MySQL,所以先暂时不动它。
/var/lib/mysql:这是数据库实际存放目录。毫无疑问,不能删,并且,要注意,给予其所在分区足够的容量。
/var/log/mysqld.log:这是MySQL的错误日志文件。
安装php-mysql
php-mysql是一个用于让PHP程序使用MySQL数据库的模块。要安装该模块,使用命令:
[root@localhost ~]# yum install php-mysql
然后,重启httpd服务:
[root@localhost ~]# systemctl restart httpd
为了测试PHP能否连接到MySQL数据库,在/var/www/html目录下新建一个文档test.php。因为之前已经在MySQL中新建了一个数据库mydb,并给这个数据库建了个用户myuser,密码是1234,所以test.php的内容是这样的:
[root@www ~]# vim /var/www/html/test.php
<?php
$mydbhost = 'localhost'; //数据库服务器
$mydbuser = 'myuser'; //用户名
$mydbpwd = '1234'; //密码
$mydbname = 'mydb'; //数据库名称
$db =mysql_connect($mydbhost,$mydbuser,$mydbpwd) or die(‘Cannot find the database.’);
mysql_select_db($mydbname,$db) or die(‘Cannotconnect the database.’);
?>
Everything is OK!
上面这个测试页面的内容纯粹是我百度出来的,不过测试后的确有用。在浏览器中访问test.php这个页面,如果测试失败的话(可以试着改一下用户名或数据库名称),那么就会显示Cannot find the database或Cannot connect the database;如果测试成功的话,就会显示Everythingis OK!。如下所示:
不过,虽然测试成功了,但查看Apache的错误日志文件,还是发现有报错“mysql_connect():Headers and client library minor version mismatch”。百度了一下,说是使用PHP5运行旧式PHP程序代码出现的兼容性问题。解决方法是,使用php-mysqlnd模块来代替php-mysql模块。即执行yum remove php-mysql和yum install php-mysqlnd,然后重启httpd服务。然后再测试,发现的确没有再报错。不过,因为我不是网页开发人员,所以暂时不确定使用php-mysqlnd这个模块会不会有什么其它的问题,所以就只是把这个问题写在这了。
修改SELinux规则
有可能未来Apache需要进行联机工作,那么就先修改一下,让SELinux规则放行:
[root@www ~]# setsebool -P httpd_can_network_connect=1
然后确认一下修改是否生效:
[root@www ~]# getsebool httpd_can_network_connect
安装PHP缓存器XCache
其实,到上面那里为止,基本的LAMP平台已经架设好了。但为了优化LAMP平台,所以还需要进行一些工作。XCache是一款开源的PHP缓存器/优化器,它通过把编译 PHP 后的数据缓冲到共享内存从而避免重复的编译过程, 使客户端访问时服务器能够直接使用缓冲区已编译的代码从而提高速度,同时降低服务器负载。到我写这篇文章为止,XCache最新的版本为3.2.0。我选择使用官网提供的源码来安装XCache。
由于我这台服务器在安装系统时是以最小化模式安装的,所以要使用源码,得先安装编译器:
[root@www ~]# yum install gcc
再安装php-devel,它用于让PHP可以支持扩展工具(如XCache):
[root@www ~]# yum install php-devel
然后,使用XCache官网提供的源码来安装XCache:
[root@www ~]# wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz
[root@www ~]# tar -zxfxcache-3.2.0.tar.gz
[root@www ~]# cd xcache-3.2.0
[root@www xcache-3.2.0]# phpize --clean
[root@www xcache-3.2.0]# phpize
[root@www xcache-3.2.0]# ./configure--enable-xcache
[root@www xcache-3.2.0]# make
[root@www xcache-3.2.0]# make install
[root@www xcache-3.2.0]# cat xcache.ini>> /etc/php.ini
//千万注意,有两个>号,表示把xcache.ini的配置追加到php.ini后面。如果只有一个>号,会把php.ini原有的配置覆盖掉。
//建议在操作前可以先备份/etc/php.ini文件。
然后,重启httpd服务:
[root@www ~]# systemctl restart httpd
这样就安装完了,那怎么确认XCache有没有正常运行呢。在我这篇文章的前面部分,不是有使用一个phpinfo.php页面吗?就打开那个页面,搜索xcache,应该可以搜索到关于XCache的相关信息,可以看到XCache是enabled的:
另外,其实XCache有提供管理后台。如果要使用XCache管理后台,可以这样做。首先,在/var/www/html目录下新建一个档案,假设为account.php,将这个档案的内容该成如下所示:
[root@www ~]# vim/var/www/html/account.php
<?php
echo md5("1234"); //双引号内可以填入你想要使用的密码
?>
然后,从浏览器访问这个页面,可以得到一串数字和字母的组合,我得到的是81dc9bdb52d04dc20036dbd8313ed055。然后,再修改/etc/php.ini中的这两个设定的值:
xcache.admin.user ="admin" //双引号内可以填入你想要使用的用户名
xcache.admin.pass ="81dc9bdb52d04dc20036dbd8313ed055" //双引号内填入刚刚得到的那串组合
再将XCache安装包里面的htdocs整个目录复制到/var/www/html目录下:
[root@www ~]# cp -a/root/xcache-3.2.0/htdocs /var/www/html
修改目录htdocs及其子目录和档案的所属用户和组,我选择将其都改为root:
[root@www ~]# chown -R root:root/var/www/html/htdocs
使用restorecon命令来重置目录htdocs及其子目录和档案的SELinux相关设定:
[root@www ~]# restorecon -Rv/var/www/html/htdocs
最后,使用浏览器访问地址http://服务器IP/htdocs/,然后输入你设定的用户名和密码,就可以打开XCache的管理后台了:
补充信息:关于重启httpd服务
有三种方法可以重启httpd服务:
1、 若要完全重启httpd服务:
[root@localhost ~]# systemctl restart httpd.service
该命令会中断正在运行的httpd进程。在安装或移除一个动态加载模块(如PHP)后,需要使用此命令。
2、 让httpd服务重新读取它的配置文件:
[root@localhost ~]# systemctl reload httpd.service
该命令会让httpd重新加载配置文件,同时也会中断httpd进程的运行。
3、 让httpd服务重新读取它的配置文件并且不影响httpd服务的运行:
[root@localhost ~]# apachectl graceful
该命令会让httpd重新加载配置文件,并且不会中断httpd服务。但现有的http请求将会继续使用旧的配置。