LAMP架构讲解

  1. 云栖社区>
  2. 博客>
  3. 正文

LAMP架构讲解

技术小阿哥 2017-10-30 14:49:00 浏览918
展开阅读全文

第一章、LAMP部署


一、模块加载方式

httpd结合php时使用的模块加载方式:


1、 module:rpm安装方式默认方式,就是说RPM安装默认就安装好了,不需要自己设置。

工作方式:httpd自己生成一个php的子进程,并解释php脚本语言。

2、CGI(不常用)

工作方式:需要本地安装php程序,并单独生成一个php进程。

3、FASTCGI:httpd-2.2不支持fstcgi,需要打补丁,2.4及以上的支持fastCGI。

工作方式:动静分离的前提条件,php程序生成一个独立的进程并且以套接字的方式对外提供服务,httpd生成一个php的客户端请求发给php服务器。


Linux系统架构师必备--LAMMP架构详解http://edu.51cto.com/lession/id-75729.html


二、LAMP架构模型

这里的memcached缓存服务器要求php应用程序支持,就是说通过php开发出来的应用程序要支持memcached功能,否者缓存无效,比如php软件开发的wordpress论坛程序,要能使用memcached,需要在开发Wordpress的时候设计成支持它。

如果一台memcached不够用的话,添加新的缓存服务器,如何缓存和查询呢?

php应用程序通过“一致性hash算法”来分别向不同的memcached上存储数据,并记录下来存储位置,然后当需要读缓存的时候在通过记录的位置进行精确查询。

redis是更高效的键值存储程序,有缓存的特点,键值存储和内存存储。


屏幕快照 2017-07-13 上午9.41.02.jpg


        传统web服务器都是采用静态页面方式,对系统要求比较低,可以将web应用程序同网页放在相同的服务器上即可,随着动态网页的兴起和用户访问数量的递增,传统单台服务器不能满足要求了,因为动态网页服务器要求使用web应用程序,数据库以及动态开发程序,这个开发程序可以是php、jsp,他是动态网页和数据库进行交互的程序,而实现与数据库真正通讯需要的是数据库驱动程序,当然不同的动态开发程序与数据库的驱动链接的驱动是不同的。

        应用程序要和数据库通信同样要遵循一定的规范和标准,这个标准就是由odbc来制定的,对于php和MySQL之间进行通信就要使用php-odbc协议了,并且应用程序和数据库之间也需要驱动程序,这个驱动程序就是PHP-mysql啦。

        而通常通过最简单的yum安装php的话,默认安装php需要的依赖包只有php主程序,php-cli、php-common即可。

        如果要和MySQL通信就需要再安装php-odbc、php-mysql啦。

        当用户访问量增加,一台服务器的应用程序不能满足要求的时候就可以创建多个,这个能力称为伸缩性。当有多台数据库服务器时,只可以有一台服务器为可以进行写操作的,其他服务器与这台主服务器进行数据同步,但可以担任查询的功能。也就是说在应用程序进行写操作时只可以与主数据库通讯,当进行查询的时候可以和任意数据库通讯。

        为了简化通讯,设计了中间件即实现应用程序和数据库之间的通讯,类似路由转发的功能。

当然由于web服务会有一个28法则,就是最常访问的数据往往是总数据的20%,可以将这个20%的数据进行缓存,包括本地缓存和反向代理、CDN方式,memcached就是其中的一种,将常用的数据缓存下来。

而memcached的使用要求动态开发程序在设计的时候就支持此功能才可以,memcached使用迭代的方式对应用程序的请求进行查询,如果没有请求的缓存,就会直接返回没有找到,然后应用程序服务器再到数据库上进行查询,同样的memcached的缓存也是由应用程序服务器来觉定那些数据需要缓存。

        这点memcached和其他缓存服务器是不同的,其他缓存服务器同时采用递归查询方式,会一直帮应用程序查询,指导查询到结果为止。

        redis支持更复杂的缓存,键值格式,内存存储,支持10万/秒的读写请求。



第二篇、PHP


一、php的由来

        php(personal home page tool)是通过perl脚本开发的脚本编程语言,用于实现动态web页面,将其脚本嵌入到html源码中的服务器端脚本语言之一。

        后来由c语言进行重新编写,并命名为php1.0。经以色列人重新编写后重新命名为hypertext preprocessor。并编写了解释器zend engine,这个就是为脚本进行编译解释的软件,并将php版本带入了5时代。


php本身并不需要和MySQL进行连接通信,实际的通信是由php“程序”完成的,就是说由php开发出来的应用程序,如wordpress。

        php安装完毕后主配置文件通常在 /etc/php.ini,是用于和MySQL进行通信的配置文件。

        /etc/http/conf.d/php.conf ,则用于配置和httpd之间进行通信的规则。

[root@localhost ~]# ll /etc/httpd/conf.d/

总用量 12

-rw-r--r--. 1 root root 674 3月  22 08:29 php.conf

-rw-r--r--. 1 root root 392 7月  12 2017 README

-rw-r--r--. 1 root root 299 7月   7 06:34 welcome.conf


        

二、zend engine

zend engine是开源的,是php语言的解释器,最早由以色列理工学院的学生发明,engine为php提供了内存和资源管理的功能以及其他一些标准服务。

zend engine将php代码的处理过程分为了两个阶段,首先是分析php代码并将其转化为zend opcode的二进制格式后存到内存中,第二阶段是使用zend engine去执行转换后的opcode码。


三、opcode

一种php脚本编译后的中间语言,就像java的bytecode、或者.net的MSL。

用途:通常用户请求的是源码,php要将其编译成二进制码供计算机操作,而opcode就是为了减少源码到二进制程序的编译时间,提高了效率生成的中间码。

php(zend engine)执行php脚本代码一般经历四个步骤

1、scanning-将php代码转换成语言碎片(tokens)

2、parsing-将tokens转换成简单而有意义的表达式

3、compliatin-将表达式编译成opcode

4、execution-顺序执行opcode,解释脚本实现功能。


四、php加速器(缓存的是代码、请求命令本身,而不是数据,这是和memcached的区别)

实质就是zend engine将php脚本编译为opcode后放到内存中,在用户请求解释完成后并不急于销毁,而是放到缓存中留个其他用户继续 使用。这样重新进行排序,以提升执行速度

常见的加速器:(性能提升1-2倍)

1、APC

2、eAccelerator

3、Xcache,性能好,使用率高。具有生产环境的使用经验,适合部署实际环境中。

4、zend Optimizer和Zend Guard loader实质上是加密工具。

5、nuSphere phpexpress:专业的php加速器。


五、php的源码目录

1、build-放置一些跟源码编译相关的文件,比如构建前的buildconf脚本以及一些检查环境的脚本

2、ext-包括php的函数的定义和实现。

3、main-php最为核心的内容,是实现php的基础设施。

4、pear-php扩展和应用仓库,包含pear的核心文件。

5、SAPI-包括各种服务器抽象层的代码。

6、TSRM-php线程安全是构建在TSRM库之上的。

7、zend-zhend引擎的实现目录。

8、test-测试脚本合集。

.......

php.ini官方文档

配置参数:http://php.net/manual/zh/

Linux系统架构师必备--编译安装LAMP之PHP:http://edu.51cto.com/lession/id-75732.html


第三篇 以模块方式安装PHP


一、php的安装(编译安装)

前提条件是已经安装完毕web程序,建议同样使用编译安装。

为什么要编译安装httpd和php

因为只有编译安装httpd程序才可以实现fastcgi的功能。

从源代码编译 

编译 PHP 时需要 --enable-fpm 配置选项来激活 FPM 支持。

以下为 FPM 编译的具体配置参数(全部为可选参数):

--with-fpm-user - 设置 FPM 运行的用户身份(默认 - nobody)
--with-fpm-group - 设置 FPM 运行时的用户组(默认 - nobody)
--with-fpm-systemd - 启用 systemd 集成 (默认 - no)
--with-fpm-acl - 使用POSIX 访问控制列表 (默认 - no) 5.6.5版本起有效


1、httpd2.4安装(此版本之后的才支持FCGI,同时建议不要删除系统自带的httpd)


a、安装apr、apr-util、pcre、openssl、openssl-devel软件包

[root@localhost apr-1.5.2]# ./configure --prefix=/usr/local/apr

[root@localhost apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr

[root@localhost httpd-2.4.18]# ./configure --prefix=/usr/local/pcre

[root@localhost httpd-2.4.18]# yum install openssl-devel


APR和APR-UTILS主要是为不同平台提供相同的通用接口而产生的,默认情况下,linux是有安装这两个软件包的,所有在编译安装httpd的时候也可以同时编译安装新的apr软件。


b、编译安装configure

[root@localhost httpd-2.4.18]# ./configure --prefix=/usr/local/httpd-2.4 --sysconfdir=/etc/httpd-2.4 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=event --with-config-file=/etc/httpd-2.4/ --with-pcre=/usr/local/pcre/


--enable-so:支持动态模块加载。

--enable-ssl:支持ssl加密认证功能,需要openssl-devel支持。


--with-mpm=event(worker)

这里说一下mpm,httpd采用的mpm模块有三种prefork、worker、event。

prefork模块在经过编译安装并加载到httpd中的时候,模块名称为:mod_php

worker、event模型在加载模块时,名称为:mod_php_zt

所以在对应于httpd的模块加载类型,如果加载的类型是event、worker的话,那么在php编译安装的时候,就需要使用--enable-maintainer-zts的参数了。如果是prefork的话,php就不需要这个参数了。


c、优化httpd

如果是系统中本身就预先安装了httpd程序,可以直接编辑此文件,并将apachectl、httpd等变量参数重新指向编译安装的路径。

如果没有预先安装,则可以将编译安装路径的文件apachectl复制到/etc/rc.d/init.d/目录下,并命名为httpd(随意),就可以实现service httpd start这样的启动了,也可以创建链接到/sbin/中,实现同样的简便启动功能。

[root@localhost httpd-2.4.18]# scp /etc/init.d/httpd /etc/init.d/httpd2.4

修改启动程序/etc/init.d/httpd2.4:

apachectl=/usr/local/httpd-2.4/bin/apachectl

httpd=${HTTPD-/usr/local/httpd-2.4/bin/httpd}

pidfile=${PIDFILE-/usr/local/http-2.4/logs/httpd.pid}


开机自启动:

[root@localhost httpd-2.4.18]# chkconfig --add httpd2.4

[root@localhost httpd-2.4.18]# chkconfig httpd2.4 on

[root@localhost httpd-2.4.18]# chkconfig --list httpd2.4

httpd2.4        0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭



d、添加php网页文件的支持

addtype application/x-httpd-php .php

addtype application/x-httpd-php-source .phps

directoryindex index.php


e、查看httpd启动后的基本配置信息:


[root@localhost php-5.5.32]# httpd -S

VirtualHost configuration:

ServerRoot: "/usr/local/httpd-2.4"

Main DocumentRoot: "/usr/local/httpd-2.4/htdocs"

Main ErrorLog: "/usr/local/httpd-2.4/logs/error_log"

Mutex default: dir="/usr/local/httpd-2.4/logs/" mechanism=default 

PidFile: "/usr/local/httpd-2.4/logs/httpd.pid"

Define: DUMP_VHOSTS

Define: DUMP_RUN_CFG

User: name="daemon" id=2

Group: name="daemon" id=2




2、php安装

a、安装libmcrypt-devel 、mhash-devel程序。

安装epel仓库The newest version of 'epel-release' for EL6

[root@localhost ~]# yum install  libmcrypt-devel mhash-devel


b、编译安装PHP-5.5.32(rpm安装MySQL5.5,编译安装httpd2.4)

[root@localhost php-5.5.32]# ./configure --prefix=/usr/local/php --with-mysql=mysqlnd --with-openssl -with-mysqli=mysqlnd --enable-mbstring -with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-sockets --with-apxs2=/usr/local/httpd-2.4/bin/apxs --with-mcrypt --with-config-file-path=/etc  --with-bz2 --enable-maintainer-zts --with-config-file-scan-dir=/etc/php.d

[root@localhost php-5.5.32]# make && make install


注意:PHP编译安装完毕后,会在对应的http的http.conf文件中加载php模块,形式为:

LoadModule php5_module        modules/libphp5.so

但是要想让httpd能够识别php网页,还需要在httpd.conf添加一下内容



addtype application/x-httpd-php .php

addtype application/x-httpd-php-source .phps

directoryindex index.php

问题解决:

问题:编译安装过程中出现libmysqlclient_r.a无法找到,需要将/usr/lib64/mysql/libmysqlclient.a创建链接到/usr/lib/目录下。

checking for specified location of the MySQL UNIX socket... no

configure: error: Cannot find libmysqlclient_r under /usr/.


Note that the MySQL client library is not bundled anymore!

处理方法:

[root@localhost php-5.5.32]# ln -sv  /usr/lib64/mysql/libmysqlclient.a /usr/lib/libmysqlclient_r.a




此编译方式为课堂上老师使用的方式,适用于编译安装MySQL5.5.33,php5.4

[root@localhost php-5.5.32]# ./configure --prefix=/usr/local/php --with-mysql=/usr/ --with-openssl -with-mysqli=/usr/bin/mysql_config --enable-mbstring -with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-sockets --with-apxs2=/usr/local/httpd-2.4/bin/apxs --with-mcrypt --with-config-file-path=/etc  --with-bz2 --enable-maintainer-zts --with-config-file-scan-dir=/etc/php.d



3、效果演示

修改网页文件内容如下:

[root@localhost php-5.5.32]# vim /usr/local/httpd-2.4/htdocs/index.php 


<html><body><h1>It works!</h1></body></html>

<?php

        phpinfo();


?>

进入php源文件目录,复制php.ini.production到/etc/目录下

[root@localhost php-5.5.32]# cp php.ini-production /etc/php.ini


检查httpd脚本运行情况,及当前启动的httpd路径

[root@localhost htdocs]# httpd -v

Server version: Apache/2.4.18 (Unix)

Server built:   Jul 12 2017 11:16:55

[root@localhost htdocs]# hash

hits command

   2 /usr/local/httpd-2.4/bin/httpd



本文转自 blackstome 51CTO博客,原文链接:http://blog.51cto.com/137783/1968762,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
技术小阿哥
+ 关注