lamp是目前web服务器最基础的框架,理解其主要原理可以帮助我们在更高层次的学习和操作中事半功倍。
LAMP的组成:
a: apache (httpd)
m: mysql, mariadb
p: php或perl或python(此次使用的是php)
数据库(mysql、mariadb):
作为数据库来说,centos 6和centos 7操作上没太多的不同,只不过,一个6上叫mysql、进程名叫mysqld,7上叫mariadb、进程名叫mariadb.service。而我认为,既然是一个库,就不要来回挪地方,只需要搭建一个就好,不同类型的php可以安装在不同主机上,但都可以指向这一个库。此次我将数据库放在了centos 7.2上,这台7上的ip为172.16.0.215,直接yum install mariadb-server。
接着修改l配置文件:/etc/my.cnf
在"[mysql]"栏后面加上下列字段:
innodb_file_per_table=ON
skip_name_resolve=ON
AddDefaultCharset UTF-8
注意:此操作6上是不支持的
之后就是systemctl start mariadb.service
(当然,还可以systemctl enable mariadb.service来设置开机启动)
centos 6上就是service mysqld start(开机启动是chkconfig mysqld on)
我在配置完以后运行了一下mysql_secure_installation,它的作用是删除匿名登录的用户权限和test库,并设置密码,说实话,作为实验来说,运行不运行都没关系,反正里面没什么重要信息(而且运行时全是大段英文,密码设置的很乱,还不如自己去完成那些操作了)。
接下来是设置密码(还是自己操作的安心一点,再给root设一遍好了)
输入命令:mysql,如果没有之前的配置,直接就能进去;
接着键入:SET PASSWORD FOR ‘root‘@‘localhost‘ =PASSWORD(‘mageedu‘)
注意:这个root是mysql的root,而不是root用户
接着是授权,我们只是为了搭建,所以就用root和名为mysql的库
GRANT ALL ON mysql.* TO ‘root‘@‘172.16.%.%‘ IDENTIFIED BY ‘mageedu‘;
%代表任意长度的任意字符,这里相当于授权的这个网段
httpd
首先我们确定安装的版本为当下最为适用的2.4版本,还是安装在这台主机上,yum install安装,接着启动服务并开机启动,它的基础配置之前的博文里提到过,就不在赘述了。而如果在6上,httpd-2.4版本需要编译安装
php
http与php结合的方式:
CGI:通用网关接口:Common Gatway Interface
modules (把php编译成为httpd的模块)
FastCGI:fpm:C/S架构,通过套接字通信
目前我们主要使用的方式有两种,就是模块化php以及php-fpm,而模块化php中,如果httpd的MPM为prefork,php使用的是libphp5.so模块,如果是其他两种,则是 libphp5-zts.so。
好了,由于模块化php肯定要和httpd在同一台主机上,所以我们还是在这台主机上进行yum install php。而httpd的配置我并没有修改,是默认的prefork,所以不用多余安装libphp5-zts.so这个模块。
同时,在另一台ip为172.16.0.214的centos 7主机上,我们安装php-fpm,同样yum install。centos 7上的php是5.4版本的,如果在6上要用同样的版本,需要编译安装。
需要注意的是:模块化的php和php-fpm是不兼容的,php-fpm是一种实现CGI协议的管理程序,而不是模块,两者会冲突。
我们把两种php安装在不同的主机上,避免了冲突,而另一个重要意义是:将php-fpm放在另一台主机上,就可以实现跨主机的构建lamp方式;而在172.16.0.215上就是同一台主机构建了。我们刚刚提到过, FastCGI是通过套接字通信的,当用户请求php文件时,httpd作为反向代理通过CGi协议,把解析完成的php文件映射到网页页面上,而文本文件就在httpd的本地而不是数据库里,httpd是与php-fpm直接通信的,而数据库的通信对象也是php-fpm,所以,将httpd与数据库二者放在同一主机上,只要php-fpm在别处,两台和三台主机没什么不同。当然,我们还要分别在两台主机上安装php-mysql用来联系php和数据库。
其实上述就是lamp的基本环境,几乎改动一下一些配置就可以把框架搭起来,而在这里,我通过构建虚拟httpd服务器搭建,并通过脚本实现,直接上图:
此脚本可用于php模块化的情况,最早是在学httpd时,想快速配置虚拟服务器写的小脚本,后来发现只要再加入不是很多的东西,就可以完成一个简单的lamp框架,于是就有了这么一个东西,取名xhttpd,后跟create ’NAME‘可以创建一个httpd虚拟机并带有连接mysql的php页面,如果是add后跟两个数字,则是批量创建名为www#的httpd虚拟机(例如add 1 10,就是创建www1到www10),del和list就是删除和查看,加-a就是全部;
由于amp三者都在同一台主机上,所以其实没什么好说的。说实话,脚本写的很low,甚至会给完美主义者带来些许的不适,但是它能用,而且很方便,分分钟搞出一个虚拟服务器,一言不合就把服务器删了也不会心疼(当然,还是有前面的环境做基础,程序都没装啥都不好使)。
不能忘了的是,我们还有php-fpm跨主机的构建,我在上个脚本基础上做了一些改动,但还是不能一蹴而就,因为毕竟脚本在httpd的主机上,而php-fpm在另一台主机上(ip尾号为214的主机)。
由图可见,仅仅是函数部分做了一些改动,路径也改了改,但名都差不多,主路径还是一样的,至于用法简直一毛一样。
这里的问题是,我httpd主机上自己不提供php文件的解析,所以我把生成index.php的函数注释掉了,改为生成一个简单的文本页面,然后当php-fpm能在这台主机上时,把解析php的路径和主页面的写成一致的,就可以改回来了。
而在php-fpm主机上,由于它是一个进程,所以会生成配置文件/etc/php-fpm.conf, /etc/php-fpm.d/*.conf;
/etc/php-fpm.conf中没什么需要修改的,而 /etc/php-fpm.d/下只有一个默认的www.conf,那么就改它了:
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
user = apache
group = apache
这是默认的值;将 listen.allowed_clients改为httpd主机的ip 172.16.0.215(也可以把listen改成本机的172.16.0.214,保险点没有错);user和group涉及到session权限;
后面还有pm的模式static和dynamic,默认是dynamic,设置的值也还好,就不改了;
最后是pm方式的php进程存储session的路径:
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
但要注意的是session路径本身不存在。
于是我们保存配置并创建session目录,然后确保运行php-fpm进程的用户对此目录有读写权限;
# mkdir /var/lib/php/session
# chown apache.apache /var/lib/php/session
接着,注意到httpd主机上的脚本里写的fcgi路径/data/fpm-vhosts/,在下面创建连接mysql的页面index.php就好了,脚本里的可以复制粘贴,但别忘了把反斜线去掉。
这样,结合我的fhttpd脚本,就可以同样构建好跨主机的lamp框架了,只要往这两个框架下能解析到php文件的那条路径下放程序文件,就可以在框架中跑各种程序了。
下面是两种情况下采用ab的压测对比,同为172.16.0.215主机,并发100,请求1000(目测这是极限了,很慢,就没敢往上加)
前两图为php模块化的情况,每秒10个左右,很尴尬,后面两个是php-fpm情况,一次21,一次37,但之后都稳定在35、36左右,没有保存图,但就算以21算都是前者的2倍了,高下立判。
之后我在两种框架下都部署了xcache,但结果竟然都一毛一样!显然失败了,下图为php模块化下部署xcache
php-fpm也是一点作用没有,图就不贴了。
最后是httpd-2.4和php-5.4的编译安装及配置
安装httpd-2.4:
CentOS 6专用:
(1) apr
# ./configure --prefix=/usr/local/apr
# make && make install
(2) apr-util
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
# make && make install
注意:后面编译主体时,apr和apr-util要写的是实际编译安装的路径
CentOS 7专用:
# yum install apr-devel apr-util-devel
# yum install pcre-devel openssl-devel libevent-devel
# ./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork --with-pcre --with-zlib --with-apr=/usr --with-apr-util=/usr
# make -j #
# make install
安装php-5.4:
# yum install libxml2-devel gd-devel freetype-devel libmcrypt-devel
# ./configure --prefix=/usr/local/php54 --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --enable-xml --enable-sockets --with-freetype-dir --with-gd --with-libxml-dir=/usr --with-zlib --with-jpeg-dir --with-png-dir --with-mcrypt --with-apxs2=/usr/local/apache24/bin/apxs --with-config-file-path=/etc/php54.ini --with-config-file-scan-dir=/etc/php54.d
# make -j #
# make install
cp php.ini-production /etc/php54.ini
注意:如果httpd使用了线程式MPM,则编译php时应该额外使用--enable-maintainer-zts;
配置httpd:
LoadModule php5_module modules/libphp5.so
AddType application/x-httpd-php .php
DirectoryIndex index.php index.html
以上就是我的配置,如有差错,欢迎指正。