Skip to content

Latest commit

 

History

History
1016 lines (682 loc) · 38 KB

3.21_20170616_LAMP.md

File metadata and controls

1016 lines (682 loc) · 38 KB

LAMP

LAMP是一套应用组合,L是linux,A是apache,M是mariadb或mysql等,P是php、perl或python。也还有LAMMP,另外一个M是memcached。

HTTP协议可以传输超文本和多媒体资源,这类资源叫做静态资源,这些内容从服务端到客户端都没有改变。而动态资源一般在服务端是一个程序,而传输到客户端的是程序的执行结果。

当客户端请求一个动态资源时,web服务端会将客户端的请求发送给相关的程序解释器,程序解释器运行后将结果返回给web服务端,然后web服务端将数据封装成响应报文发送。在web服务端和后台的相关程序之间,使用CGI来进行交互。httpd有一个模块cgi_module就是实现CGI协议的模块,httpd就是CGI的客户端。如果相关的程序解释器作为一个服务通过套接字与web服务端通信,这种CGI叫做fastCGI。

一个程序是有指令和数据组成,读取文本文件中的数据进行查找,效率低下,因此为了更高效快速的完成对数据的处理查找,所以使用了专门的数据管理系统,比如数据库。程序和数据管理系统之间通过数据库的应用层协议进行沟通,程序可以调用库,库可以将程序的请求封装称为数据库可以理解的报文还可以接收并还原数据库发送的协议报文。

安装这些程序包使用yum -y install httpd php php-mysql mariadb-server(CentOS 7)

yum -y install httpd php php-mysql mysql-server(CentOS 6)

启动mariadb后使用ss -tnl检查3306端口是否监听用以确定是否服务是否启动

httpd和php的结合方式有三种:

  • php作为httpd的模块:把php编译成httpd的DSO对象。在prefork模型是libphp5,在event和worker是libphp5-zts

    rpm -ql php

  • fastcgi(fpm):php作为独立的服务

  • cgi

简单验证组合是否可用

  1. 安装完成php后,将php模块载入到httpd,重启httpd,启动mariadb。需要注意的是当前安装php是针对于httpd的prefork机制工作的,如果httpd使用其他MPM,需要使用其他的php rpm包

    CentOS 7
    systemctl start httpd
    systemctl start mariadb
    CentOS 6
    service httpd start
    service mysqld start
    
  2. 在/var/www/html下建立test_php.php用来测试php是否可以工作。使用浏览器访问该页面

    <?php
       phpinfo(); #php内置信息页,显示运行环境
    ?>
    
  3. 在/var/www/html下建立test_db.php用来测试php是否可以连接到mariadb。如果网页无法访问数据库,需要确认selinux是否是关闭状态。

    <?php
        $conn=mysql_connect('127.0.0.1','mysql','');
        if ($conn)
            echo "Success";
        else
            echo "Failure";
        mysql_close();
    
    ?>

动手:wordpress和phpMyAdmin

php解释器如何与Mariadb交互:php解释器是php程序运行环境,不需要与数据库通信,用到数据存储系统的程序才需要与数据存储交互。

存储系统有文件系统、SQL、NoSQL、...

  • 文件系统:文件
  • SQL:Mariadb、Oracle、MSSQL、...
  • NoSQL:redis、mongodb、hbase、...
  • NewSQL

php

PHP是通用服务器端脚本编程语言,其主要用于web开发以实现动态web页面,它也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时,php还提供了一个命令行接口,因此,其也可以在大多数系统上作为一个独立的shell来使用。

Rasmus Lerdorf于1994年开始开发PHP,它是初是一组被Rasmus Lerdorf称作“Personal Home Page Tool” 的Perl脚本, 这些脚本可以用于显示作者的简历并记录用户对其网站的访问。后来,Rasmus Lerdorf使用C语言将这些Perl脚本重写为CGI程序,还为其增加了运行Web forms的能力以及与数据库交互的特性,并将其重命名为“Personal Home Page/Forms Interpreter”或“PHP/FI”。此时,PHP/FI已经可以用于开发简单的动态web程序了,这即是PHP 1.0。1995年6月,Rasmus Lerdorf把它的PHP发布于comp.infosystems.www.authoring.cgi Usenet讨论组,从此PHP开始走进人们的视野。1997年,其2.0版本发布。

1997年,两名以色列程序员Zeev Suraski和Andi Gutmans重写的PHP的分析器(parser)成为PHP发展到3.0的基础,而且从此将PHP重命名为PHP: Hypertext Preprocessor。此后,这两名程序员开始重写整个PHP核心,并于1999年发布了Zend Engine 1.0,这也意味着PHP 4.0的诞生。2004年7月,Zend Engine 2.0发布,由此也将PHP带入了PHP 5时代。PHP5包含了许多重要的新特性,如增强的面向对象编程的支持、支持PDO(PHP Data Objects)扩展机制以及一系列对PHP性能的改进。

Zend Engine是开源的、PHP脚本语言的解释器,它最早是由以色列理工学院(Technion)的学生Andi Gutmans和Zeev Suraski所开发,Zend也正是此二人名字的合称。后来两人联合创立了Zend Technologies公司。

Zend Engine 1.0于1999年随PHP 4发布,由C语言开发且经过高度优化,并能够做为PHP的后端模块使用。Zend Engine为PHP提供了内存和资源管理的功能以及其它的一些标准服务,其高性能、可靠性和可扩展性在促进PHP成为一种流行的语言方面发挥了重要作用。

Zend Engine的出现将PHP代码的处理过程分成了两个阶段:首先是分析PHP代码并将其转换为称作Zend opcode的二进制格式(类似Java的字节码),并将其存储于内存中;第二阶段是使用Zend Engine去执行这些转换后的Opcode。

Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。PHP执行PHP脚本代码一般会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend):

  1. Scanning(Lexing) —— 将PHP代码转换为语言片段(Tokens)
  2. Parsing —— 将Tokens转换成简单而有意义的表达式
  3. Compilation —— 将表达式编译成Opocdes
  4. Execution —— 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能

扫描-->分析-->编译-->执行

基于PHP的特殊扩展机制如opcode缓存扩展也可以将opcode缓存于php的共享内存中,从而可以让同一段代码的后续重复执行时跳过编译阶段以提高性能。由此也可以看出,这些加速器并非真正提高了opcode的运行速度,而仅是通过分析opcode后并将它们重新排列以达到快速执行的目的。

常见的php加速器有:

1、APC (Alternative PHP Cache) 遵循PHP License的开源框架,PHP opcode缓存加速器,目前的版本不适用于PHP 5.4。项目地址,http://pecl.php.net/package/APC。

2、eAccelerator 源于Turck MMCache,早期的版本包含了一个PHP encoder和PHP loader,目前encoder已经不在支持。项目地址, http://eaccelerator.net/。

3、XCache 快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境。项目地址,http://xcache.lighttpd.net/

4、Zend Optimizer和Zend Guard Loader Zend Optimizer并非一个opcode加速器,它是由Zend Technologies为PHP5.2及以前的版本提供的一个免费、闭源的PHP扩展,其能够运行由Zend Guard生成的加密的PHP代码或模糊代码。 而Zend Guard Loader则是专为PHP5.3提供的类似于Zend Optimizer功能的扩展。项目地址,http://www.zend.com/en/products/guard/runtime-decoders

5、NuSphere PhpExpress NuSphere的一款开源PHP加速器,它支持装载通过NuSphere PHP Encoder编码的PHP程序文件,并能够实现对常规PHP文件的执行加速。项目地址,http://www.nusphere.com/products/phpexpress.htm

php的配置文件在/etc/php.ini和/etc/php.d/*.ini。配置文件(php.ini)在PHP启动时被读取。对于服务器模块版本的PHP,仅在web服务器启动时读取一次。对于CGI和CLI 版本,每次调用都会读取。

php.ini核心配置选项:http://php.net/manual/zh/ini.core.php php.ini配置选项列表:http://php.net/manual/zh/ini.list.php

Mariadb

Mariadb是关系型数据库的一种开源实现,数据结构模型有层次模型、网状结构、关系模型。关系模型将数据组织成二维关系,由行和列组成。

RDMBS设计范式

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。

(1) 第一范式(1NF)

所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。

说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的设计基本要求,一般设计中都必须满足第一范式(1NF)。不过有些关系模型中突破了1NF的限制,这种称为非1NF的关系模型。换句话说,是否必须满足1NF的最低要求,主要依赖于所使用的关系模型。

(2) 第二范式(2NF)

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。

第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。

(3) 第三范式(3NF)

第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。

常见的RDBMS:

  • MySQL:MySQL、MariaDB、Percona-Server
  • PostgreSQL(pgsql),其企业版本为EnterpriseDB
  • Oracle
  • MSSQL

SQL(Structure Query Language)是结构化查询语言。

每一个关系型数据库都应该使用一个服务监听的套接字通过应用层协议来和用户进行通信,这个应用层协议是数据存储协议,不同的关系型数据库有各自的数据储存协议。Server端监听于套接字,接收并处理客户端的应用请求,Client使用程序接口(CLI、GUI)或者应用编程接口。

数据库的基础概念

  • 约束:constraint,向数据表提供的数据要遵守的限制
    • 主键:一个或多个字段组合,填入的数据必须能在本表中唯一标识本行。必须提供数据,不能为空。一个表只能存在一个
    • 唯一键:一个或多个字段组合,填入的数据必须能在本表中唯一标识本行。允许为空。一个表可以存在多个
    • 外键:一个表中的某字段可填入数据取决于另一个表的主键已有的数据
    • 检查性
  • 索引:将表中的一个或多个字段中的数据复制一份另存,并且此些数据需要按特定次序排序存储
  • 关系运算
    • 选择:选择部分符合条件的行
    • 投影:挑选需要的字段(列)
    • 连接

数据抽象

物理层:决定数据的存储格式,即RDBMS在磁盘上如何组织文件

逻辑层:描述DB存储什么数据,以及数据间存在什么样的关系

视图层:描述DB中的部分数据

关系模型的分类

关系模型

实体-关系模型

基于对象的关系模型

半结构化的关系模型

MySQL和MariaDB

安装MySQL的三种方法

  1. 编译安装

  2. 二进制格式的程序包:展开至特定路径,并简单配置后使用

  3. 程序包管理器提供的程序包

    rpm:有OS Vendor和项目官方提供的RPM包

    deb

MariaDB的特性

MySQL和MariaDB都支持插入式存储引擎:存储管理器有多种实现版本,功能和特性均略有差别,用户可以根据需要灵活选择。存储引擎也称之为“表类型”

相比于MySQL,MariaDB支持更多的存储引擎、诸多扩展和新特性、提供了较多的测试组件、true open source

MariaDB的安装

在CentOS 7中直接提供了MariaDB,在CentOS 6中需要编译安装或者使用二进制格式的程序包

CentOS 6中使用二进制格式安装MariaDB

(1) 准备数据目录:以/mydata/data为例;

(2) 配置mariadb

# groupadd -r -g 306 mysql
# useradd -r -g 306 -u 306 mysql
# tar xf mariadb-VERSION.tar.xz -C /usr/local
# ln -sv 
# cd /usr/local/mysql
# chown -R root:mysql ./*
# scripts/mysql_install_db --datadir=/mydata/data --user=mysql
# cp supper-files/mysql.server /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld

(3) 准备配置文件

配置格式:类ini格式,为各程序均通过单个配置文件提供配置信息;

配置文件查找次序:/etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file=/PATH/TO/CONF_FILE --> ~/.my.cnf。配置文件会yi依次查找所有的配置文件,后查找的配置生效。

# mkdir /etc/mysql
# cp support-files/my-large.cnf /etc/mysql/my.cnf

编辑配置文件,添加三个选项: datadir = /mydata/data innodb_file_per_table = on skip_name_resolve = on

Mariadb程序组成

客户端:MysqlCLI交互式客户端程序,还有mysqldump和mysqladmin

服务端:mysqld_safe、mysqld、mysqld_multi

服务器监听两种socket地址

  • ip socket:监听在tcp的3306端口,支持远程通信
  • unix socket:监听在sock文件上(/tmp/mysql.sock、/var/lib/mysql/mysql.sock),仅支持本地通信,server地址只能是localhost和127.0.0.1

命令行交互式客户端mysql

mysql,直接使用mysql用户名默认为root,服务器主机默认为localhost,用户密码为空。

-uUsername:Username
-hHOST:服务器主机地址
-pPASSWORD:用户密码

mysql的用户帐号由两部分组成,‘USERNAME’@'HOST',HOST用于限制此用户可通过哪些主机远程连接mysql服务,支持使用通配符

%:匹配任意长度的任意字符,如172.16.%.%
_:匹配任意单个字符

安装完mysql后,要运行/usr/local/mysql/bin/mysql_secure_installation,进行安全初始化,设定root密码、删除匿名用户,禁止管理员远程登录等。

mysql的命令分为客户端命令和服务端命令

  • 客户端命令是本地执行的,使用help可以查看命令列表,客户端命令有两种形式,一种是完整形式,一种是简写格式。
  • 服务端命令是通过mysql协议发往服务器执行并取回结果。每个命令都必须有命令结束符号,默认为分号。

关系型数据库的常见组件

  • 数据库:database
  • 表:table,表有行row和列column
  • 索引:index
  • 视图:view
  • 用户:user
  • 权限:privilege
  • 存储过程:procedure(开发用)
  • 存储函数:function(开发用)
  • 触发器:trigger(开发用)
  • 事件调度器:event schedule(开发用)

SQL语句

  • DDL(Data Definition Language):CREATE、DROP、ALTER
  • DML(Data Manipulation Language):INSERT、DELETE、UPDATE、SELECT
  • DCL(Data Control Language):GRANT、REVOKE

sql语句要么使用全小写,要么使用全大写,因为缓存识别语句是根据语句的md5码,如果大小写混用,缓存很难命中。

获取命令使用帮助mysql> HELP KEYWORD

创建数据库:CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME'

删除数据库:DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME'

创建数据库时还可以指定数据库的特性:指明字符集CHARACTER SET 'charecter set name'指明排序规则COLLATE 'collate name'

查看支持所有的字符集:SHOW CHARACTER SET

查看支持所有排序规则:SHOW COLLATIONS

查看数据库:mysql> SHOW DATABASES

创建表:CREATE TABLE [IF NOT EXISTS] tb_name (col1 datatype 修饰符, col2 datatype 修饰符) ENGINE=''

查看所有的引擎:SHOW ENGINES;除了定义字段名和字段类型,还可以定义主键PRIMARY KEY(col1,...)、索引INDEX(col1,...)、唯一键UNIQUE KEY(col1,...)

查看表:SHOW TABLES [FROM db_name]

查看创建命令:SHOW CREATE TABLE TABLE_NAME

查看表状态:SHOW TABLE STATUS LIKE ‘table_name’\G

查看表结构:DESC [db_name.]tb_name

修改表:ALTER TABLE 'TABLE_NAME'

​ 添加字段ADD new_col data_type [FIRST|AFTER an_exist_col]

​ 删除字段drop

​ 修改字段alter(删除字段的默认值)、change(修改字段名称)、modify(修改字段属性定义)

​ 添加索引add

​ 删除索引drop

​ 修改表选项:基本不会修改表选项

清空表:DROP TABLE [IF EXISTS] tb_name ;

查看表上的索引:SHOW INDEXES FROM [DB_NAME.]TABLE_NAME;

索引是特殊的数据结构,索引是为了加速查询操作,主键和唯一键默认就是索引,索引要定义在查找键(查找字段)上,即要定义在查找时作为查找条件的字段。索引有索引名称,单键索引默认名为字段名。索引没有修改需求,不合适删除后,重新创建索引。

创建索引:CREATE INDEX index_name ON TABLE_NAME (index_col_name,...)

删除索引:DROP INDEX index_name ON table_name

DML语句:

插入:INSERT tb1_name [(col_name,...)] VALUES (val1,...),(...)

删除:DELETE FROM tb1_name [WHERE where]

查询:SELECT col1,col2,... FROM tb1_name [WHERE clase] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];

​ 字段表示:*所有字段

​ as字段别名col1 AS Alias1

WHERE clase的用法:

操作符:== < > <= != 、BETWEEN...AND...、LIKE 通配符、RLIKE 正则表达式(慢)、IS NULL、IS NOT NULL

逻辑操作:and、or、not

删除表中的行:DELETE FROM tbname [WHERE clause][LIMIT [m,]n];

修改行:UPDATE tbl_name SET col1=new_val1, col2=new_val2, ... [WHERE clause][ORDER BY 'col_name' [DESC]][LIMIT [m,]n];

数据类型

  • 字符型

    • 定长字符型:CHAR(#), BINARY(#)
    • 变长字符型: VARCHAR(#), VARBINARY(#)
    • 对象存储:
      • TEXT:不区分大小写
      • BLOB:区分字符大小写
    • 内置类型:
      • ENUM:枚举
      • SET:集合
  • 数值型

    • 精确数值型

      • 整形int

        ​ tinyint: 1 byte

        ​ smallint: 2 bytes

        ​ mediumint: 3 bytes

        ​ int: 4 bytes

        ​ bigint: 8 bytes

      • 十进制decimal

    • 近似数值型

      • 单精度浮点型float
      • 双精度浮点型double
  • 日期时间型

    • 日期DATE
    • 时间TIME
    • 日期时间DATETIME
    • 时间戳TIMESTAMP
    • 年份YEAR(2),YEAR(4)

常用的数据类型修饰符

所有类型适用:

  • NOT NULL:非空约束
  • DEFAULT VALUE: 设定默认值
  • PRIMARY KEY:主键
  • UNIQUE KEY:唯一键

数值型适用:

  • UNSIGNED:无负号,不表示负数
  • AUTO_INCREMENT:自增长

用户账号及权限管理

mariadb的用户帐号用两部分组成:‘user’@‘host’,user是用户名,host是此用户访问mysql服务时允许通过哪些主机远程连接,host可以是IP地址,网络地址、主机名或者通配符。

mysql服务端在验证客户端身份时,会尝试将客户端的ip地址反解为主机名,根据主机名检查权限,考虑性能,应该禁止检查主机名,在mysql的配置文件中my.cnf中mysql字段修改skip_name_resolve=yes。

创建用户帐号:CREATE USER 'username'@'host' [IDENTIFIED BY 'password'];

删除用户:DROP USER 'username'@'host';

创建完用户后要对用户授权,即用户可以做哪些操作,mysql的权限级别有管理权限、数据库权限、表操作权限、字段级别权限,存储例程。授权使用GRANT priv_type,... ON [object_type] db_name.tb_name TO 'user'@'host' [IDENTIFIED BY 'password'][WITH GRANT OPTION];

priv_type: ALL [PRIVILEGES]

db_name.tb_name:

.: 所有库的所表; db_name.*: 指定库的所有表; db_name.tb_name: 指定库的指定表; db_name.routine_name:指定库的存储例程;

查看指定用户获得的授权:

SHOW GRANTS FOR 'user'@'host';

SHOW GRANTS FOR CURRENT_USER;

回收授权:

REVOKE priv_type, ... ON db_name.tb_name FROM 'user'@'host';

MariaDB服务进程启动时会读取mysql库中的所有授权表至内存中;

(1) GRANT或REVOKE等执行权限操作会保存于表中,MariaDB的服务进程会自动重读授权表;

(2) 对于不能够或不能及时重读授权表的命令,可手动让MariaDB的服务进程重读授权表:mysql> FLUSH PRIVILEGES;

练习

在CentOS 7中使用搭建LAMP,使用三个虚拟主机,vhost1: pma.stuX.com, phpMyAdmin, 同时提供https服务;vhost2: wp.stuX.com, wordpress;vhost3: dz.stuX.com, Discuz

编译安装LAMP

httpd对fastcgi协议的支持:

httpd-2.2: 需要额外安装fcgi模块;

httpd-2.4: 自带fcgi模块;

安装的次序:httpd、Mariadb、php

编译安装apache

1、解决依赖关系

httpd-2.4.9需要较新版本的apr和apr-util,因此需要事先对其进行升级。升级方式有两种,一种是通过源代码编译安装,一种是直接升级rpm包。这里选择使用编译源代码的方式进行,它们的下载路径为ftp://172.16.0.1/pub/Sources/new_lamp。

(1) 编译安装apr

# tar xf apr-1.5.0.tar.bz2
# cd apr-1.5.0
# ./configure --prefix=/usr/local/apr
# make && make install

(2) 编译安装apr-util

# tar xf apr-util-1.5.3.tar.bz2
# cd apr-util-1.5.3
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
# make && make install

(3) httpd-2.4.9编译过程也要依赖于pcre-devel软件包,需要事先安装。此软件包系统光盘自带,因此,找到并安装即可。

2、编译安装httpd-2.4.9

# tar xf httpd-2.4.9.tar.bz2
# cd httpd-2.4.9
# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --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
# make && make install

补充:

(1)构建MPM为静态模块 在全部平台中,MPM都可以构建为静态模块。在构建时选择一种MPM,链接到服务器中。如果要改变MPM,必须重新构建。为了使用指定的MPM,请在执行configure脚本 时,使用参数 --with-mpm=NAME。NAME是指定的MPM名称。编译完成后,可以使用 ./httpd -l 来确定选择的MPM。 此命令会列出编译到服务器程序中的所有模块,包括 MPM。

(2)构建 MPM 为动态模块

在Unix或类似平台中,MPM可以构建为动态模块,与其它动态模块一样在运行时加载。 构建 MPM 为动态模块允许通过修改LoadModule指令内容来改变MPM,而不用重新构建服务器程序。在执行configure脚本时,使用--enable-mpms-shared选项即可启用此特性。当给出的参数为all时,所有此平台支持的MPM模块都会被安装。还可以在参数中给出模块列表。默认MPM,可以自动选择或者在执行configure脚本时通过--with-mpm选项来指定,然后出现在生成的服务器配置文件中。编辑LoadModule指令内容可以选择不同的MPM。

3、修改httpd的主配置文件,设置其Pid文件的路径

编辑/etc/httpd/httpd.conf,添加如下行即可: PidFile "/var/run/httpd.pid"

4、提供SysV服务脚本/etc/rc.d/init.d/httpd,内容如下:

#!/bin/bash
#
# httpd        Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server.  It is used to serve \
#        HTML files and CGI.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid

# Source function library.
. /etc/rc.d/init.d/functions

if [ -f /etc/sysconfig/httpd ]; then
        . /etc/sysconfig/httpd
fi

# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}

# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""

# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.

# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/apache/bin/apachectl
httpd=${HTTPD-/usr/local/apache/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0

start() {
        echo -n $"Starting $prog: "
        LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}

stop() {
  echo -n $"Stopping $prog: "
  killproc -p ${pidfile} -d 10 $httpd
  RETVAL=$?
  echo
  [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
    echo -n $"Reloading $prog: "
    if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
        RETVAL=$?
        echo $"not reloading due to configuration syntax error"
        failure $"not reloading $httpd due to configuration syntax error"
    else
        killproc -p ${pidfile} $httpd -HUP
        RETVAL=$?
    fi
    echo
}

# See how we were called.
case "$1" in
  start)
  start
  ;;
  stop)
  stop
  ;;
  status)
        status -p ${pidfile} $httpd
  RETVAL=$?
  ;;
  restart)
  stop
  start
  ;;
  condrestart)
  if [ -f ${pidfile} ] ; then
    stop
    start
  fi
  ;;
  reload)
        reload
  ;;
  graceful|help|configtest|fullstatus)
  $apachectl $@
  RETVAL=$?
  ;;
  *)
  echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
  exit 1
esac

exit $RETVAL

而后为此脚本赋予执行权限:chmod +x /etc/rc.d/init.d/httpd

加入服务列表:chkconfig --add httpd

启动服务并测试

安装mysql-5.5.33

1、准备数据存放的文件系统

新建一个逻辑卷,并将其挂载至特定目录即可。这里不再给出过程。

这里假设其逻辑卷的挂载目录为/mydata,而后需要创建/mydata/data目录做为mysql数据的存放目录。

2、新建用户以安全方式运行进程:

# groupadd -r mysql
# useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql
# chown -R mysql:mysql /mydata/data

3、安装并初始化mysql-5.5.33

首先下载平台对应的mysql版本至本地

# tar xf mysql-5.5.33-linux2.6-i686.tar.gz -C /usr/local
# cd /usr/local/
# ln -sv mysql-5.5.33-linux2.6-i686  mysql
# cd mysql 

# chown -R root:mysql  .
# scripts/mysql_install_db --user=mysql --datadir=/mydata/data

4、为mysql提供主配置文件:

# cd /usr/local/mysql
# cp support-files/my-large.cnf  /etc/my.cnf

并修改此文件中thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行: thread_concurrency = 2

另外还需要添加如下行指定mysql数据文件的存放位置: datadir = /mydata/data

5、为mysql提供sysv服务脚本:

# cd /usr/local/mysql
# cp support-files/mysql.server  /etc/rc.d/init.d/mysqld
# chmod +x /etc/rc.d/init.d/mysqld
添加至服务列表:
# chkconfig --add mysqld
# chkconfig mysqld on

启动服务并测试

为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤: 6、输出mysql的man手册至man命令的查找路径:

编辑/etc/man.config,添加如下行即可: MANPATH /usr/local/mysql/man

7、输出mysql的头文件至系统头文件路径/usr/include:

这可以通过简单的创建链接实现:

# ln -sv /usr/local/mysql/include  /usr/include/mysql

8、输出mysql的库文件给系统库查找路径:

# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
而后让系统重新载入系统库:
# ldconfig

编译安装php-5.4.26

1、解决依赖关系:

请配置好yum源(系统安装源及epel源)后执行如下命令:

# yum -y groupinstall "Desktop Platform Development" 
# yum -y install bzip2-devel libmcrypt-devel libxml2-devel

2、编译安装php-5.4.26

# tar xf php-5.4.26.tar.bz2
# cd php-5.4.26
# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml  --enable-sockets --with-apxs2=/usr/local/apache/bin/apxs --with-mcrypt  --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2  --enable-maintainer-zts

说明: 1、这里为了支持apache的worker或event这两个MPM,编译时使用了--enable-maintainer-zts选项。 2、如果使用PHP5.3以上版本,为了链接MySQL数据库,可以指定mysqlnd,这样在本机就不需要先安装MySQL或MySQL开发包了。mysqlnd从php 5.3开始可用,可以编译时绑定到它(而不用和具体的MySQL客户端库绑定形成依赖),但从PHP 5.4开始它就是默认设置了。

# ./configure --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd

# make
# make test
# make intall

为php提供配置文件:

# cp php.ini-production /etc/php.ini

3、 编辑apache配置文件httpd.conf,以apache支持php

# vim /etc/httpd/httpd.conf
 1、添加如下二行
   AddType application/x-httpd-php  .php
   AddType application/x-httpd-php-source  .phps

 2、定位至DirectoryIndex index.html 
   修改为:
    DirectoryIndex  index.php  index.html

而后重新启动httpd,或让其重新载入配置文件即可测试php是否已经可以正常使用。

测试页面index.php示例如下:

<?php
  $link = mysql_connect('127.0.0.1','root','mageedu');
  if ($link)
    echo "Success...";
  else
    echo "Failure...";

  mysql_close();
?>

安装xcache,为php加速:

1、安装

# tar xf xcache-3.0.3.tar.gz
# cd xcache-3.0.3
# /usr/local/php/bin/phpize
# ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config
# make && make install

安装结束时,会出现类似如下行: Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-zts-20100525/

2、编辑php.ini,整合php和xcache:

首先将xcache提供的样例配置导入php.ini

# mkdir /etc/php.d
# cp xcache.ini /etc/php.d

说明:xcache.ini文件在xcache的源码目录中。

接下来编辑/etc/php.d/xcache.ini,找到zend_extension开头的行,修改为如下行: zend_extension = /usr/local/php/lib/php/extensions/no-debug-zts-20100525/xcache.so

注意:如果php.ini文件中有多条zend_extension指令行,要确保此新增的行排在第一位。

启用服务器状态

mod_status模块可以让管理员查看服务器的执行状态,它通过一个HTML页面展示了当前服务器的统计数据。这些数据通常包括但不限于: (1) 处于工作状态的worker进程数; (2) 空闲状态的worker进程数; (3) 每个worker的状态,包括此worker已经响应的请求数,及由此worker发送的内容的字节数; (4) 当前服务器总共发送的字节数; (5) 服务器自上次启动或重启以来至当前的时长; (6) 平均每秒钟响应的请求数、平均每秒钟发送的字节数、平均每个请求所请求内容的字节数;

启用状态页面的方法很简单,只需要在主配置文件中添加如下内容即可:

<Location /server-status>
    SetHandler server-status
    Require all granted
</Location>

需要提醒的是,这里的状态信息不应该被所有人随意访问,因此,应该限制仅允许某些特定地址的客户端查看。比如使用Require ip 172.16.0.0/16来限制仅允许指定网段的主机查看此页面。

ab测试示例:未启用xcache和启用xcache后,对phpMyAdmin的主而面进行请求测试的结果如下所示:

测试环境:
  主机CPU:Core 2 Duo i3-3210
  内存大小:734MB

Requests per second:    36.38 [#/sec] (mean)
Time per request:       274.871 [ms] (mean)
Time per request:       27.487 [ms] (mean, across all concurrent requests)


Requests per second:    144.23 [#/sec] (mean)
Time per request:       69.332 [ms] (mean)
Time per request:       6.933 [ms] (mean, across all concurrent requests)

配置apache-2.4.9以fpm方式的php-5.4.26

一、apache、MySQL的安装与前一部分相同;请根据其进行安装;

二、编译安装php-5.4.26

1、解决依赖关系:

请配置好yum源(可以是本地系统光盘)后执行如下命令:

# yum -y groupinstall "X Software Development" 

如果想让编译的php支持mcrypt扩展,此处还需要下载如下两个rpm包并安装之: libmcrypt-2.5.7-5.el5.i386.rpm libmcrypt-devel-2.5.7-5.el5.i386.rpm mhash-0.9.9-1.el5.centos.i386.rpm mhash-devel-0.9.9-1.el5.centos.i386.rpm

2、编译安装php-5.4.26

# tar xf php-5.4.26.tar.bz2
# cd php-5.4.26
# ./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml  --enable-sockets --enable-fpm --with-mcrypt  --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2

说明:如果使用PHP5.3以上版本,为了链接MySQL数据库,可以指定mysqlnd,这样在本机就不需要先安装MySQL或MySQL开发包了。mysqlnd从php 5.3开始可用,可以编译时绑定到它(而不用和具体的MySQL客户端库绑定形成依赖),但从PHP 5.4开始它就是默认设置了。

# ./configure --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd

# make
# make intall

为php提供配置文件:

# cp php.ini-production /etc/php.ini

3、配置php-fpm

为php-fpm提供SysV init脚本,并将其添加至服务列表:

# cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm
# chmod +x /etc/rc.d/init.d/php-fpm
# chkconfig --add php-fpm
# chkconfig php-fpm on

为php-fpm提供配置文件:

# cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf 

编辑php-fpm的配置文件:

# vim /usr/local/php5/etc/php-fpm.conf
配置fpm的相关选项为你所需要的值,并启用pid文件(如下最后一行):
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
pid = /usr/local/php5/var/run/php-fpm.pid 

接下来就可以启动php-fpm了:

# service php-fpm start

使用如下命令来验正(如果此命令输出有中几个php-fpm进程就说明启动成功了):

# ps aux | grep php-fpm

默认情况下,fpm监听在127.0.0.1的9000端口,也可以使用如下命令验正其是否已经监听在相应的套接字。
# netstat -tnlp | grep php-fpm
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      689/php-fpm 

三、配置httpd-2.4.9

1、启用httpd的相关模块

在Apache httpd 2.4以后已经专门有一个模块针对FastCGI的实现,此模块为mod_proxy_fcgi.so,它其实是作为mod_proxy.so模块的扩充,因此,这两个模块都要加载 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

2、配置虚拟主机支持使用fcgi

在相应的虚拟主机中添加类似如下两行。 ProxyRequests Off ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/PATH/TO/DOCUMENT_ROOT/$1

http://www.magedu.com/admin/index.php

/web/host1/admin/index.php fcgi://127.0.0.1:9000/web/hosts/admin/index.php

例如:

<VirtualHost *:80>
    DocumentRoot "/www/magedu.com"
    ServerName magedu.com
    ServerAlias www.magedu.com

  ProxyRequests Off
  ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/www/magedu.com/$1

    <Directory "/www/magedu.com">
        Options none
        AllowOverride none
        Require all granted
    </Directory>
</VirtualHost>

ProxyRequests Off:关闭正向代理
ProxyPassMatch:把以.php结尾的文件请求发送到php-fpm进程,php-fpm至少需要知道运行的目录和URI,所以这里直接在fcgi://127.0.0.1:9000后指明了这两个参数,其它的参数的传递已经被mod_proxy_fcgi.so进行了封装,不需要手动指定。

3、编辑apache配置文件httpd.conf,让apache能识别php格式的页面,并支持php格式的主页

# vim /etc/httpd/httpd.conf
 1、添加如下二行
   AddType application/x-httpd-php  .php
   AddType application/x-httpd-php-source  .phps

 2、定位至DirectoryIndex index.html 
   修改为:
    DirectoryIndex  index.php  index.html

补充:Apache httpd 2.4以前的版本中,要么把PHP作为Apache的模块运行,要么添加一个第三方模块支持PHP-FPM实现。

CentOS 7上实现LAMP: 解决依赖关系:

yum -y install @"Development Tools" libxml2-devel mariadb-devel bzip2-devel

构建分离式LAMP需要注意的问题:

  1. 动态资源部署应用程序服务器(php-fpm),静态资源部署于web服务器
  2. php以fpm方式工作时,它不会被编译成httpd的模块,因此,无须再httpd的配置文件中使用loadModule
  3. 编译php时,需要连接mysql或其他数据库管理系统时,需要启用其相关的驱动模块
  4. php与mysql不在同一节点时,连接mysql的用户账号要有远程访问数据库的权限