源码编译LAMP

在LAMP架构中(这里只谈MySQL+PHP),Apache和PHP进行交互,PHP与MySQL交互,PHP和MySQL通过php-mysql进行通信,基本是固定死的。而Apache和PHP却有三种联系方式:

作为模块基本不现实,不但性能低,扩展性和可用性(冗余)也低,不是大型公司,就算对小型公司业务场景也很难应付

通过CGI进行通信,对于动态页面全部由apache进程启用php解释器,然后再释放。性能极低。

PHP自己独立成一个应用,Apache通过fcgi和PHP的fpm-php联系。性能好,可拓展型高。所以单讲FCGI方式

像这样的架构,PHP压力的的话,可以加PHP Server,MySQL压力大的话,可以加MySQL Server。也可以加中间件,比如mencache等等,整个系统压力大的话,可以多搭建几个这样的系统,前端用F5,LVS,或者nginx等调度器进行调度,加上监控等,一个高性能,高可用架构就出来了。之后又的考虑尽量人少操作,避免误操。然后就需要自动化运维,虚拟化等等。日志多了,又需要分布式存储和大数据等等,总之。网站架构就这样一步一步过来的。

Apache

解压

[root@Apache src]# ls
apr-1.5.2.tar.gz  apr-util-1.5.4.tar.gz  debug  httpd-2.4.18.tar.gz  kernels
[root@Apache src]# for i in `ls *.tar.gz`; do tar xf  $i; done

编译安装apr

[root@Apache src]# cd apr-1.5.2
[root@Apache apr-1.5.2]# ./configure --prefix=/usr/local/apr
[root@Apache apr-1.5.2]# make && make install

编译安装apr-util

[root@Apache apr-1.5.2]# cd ../apr-util-1.5.4
[root@Apache apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@Apache apr-util-1.5.4]# make && make install

编译Apache

[root@Apache apr-util-1.5.4]# yum -y install pcre-devel openssl-devel 
[root@Apache httpd-2.4.18]# ./configure --prefix=/usr/local/apache \ 
--sysconfdir=/etc/httpd \     指定配置文件所在地
--with-apr=/usr/local/apr \   依赖关系apr
--with-apr-util=/usr/local/apr-util \   依赖关系apr-util
--enable-so \                 支持DSO动态卸载
--enable-ssl \                支持SSL加密传输
--enable-rewrite \            支持URL重写
--with-zlib \                 支持压缩传输
--with-pcre  \                支持CDI
--enabled-modules=most \      支持常用的模块
--enable-mpms-shared=all \    支持所有的MPM(所有也就3种)
--with-mpm=event              设定EVENT为默认模块

后续操作

[root@Apache httpd-2.4.18]# /etc/httpd/httpd.conf
加入下面这一行
PidFile  "/var/run/httpd.pid"
并将其中一些配置改成想要的配置

[root@Apache httpd]# vim /etc/rc.d/init.d/httpd
将[https://github.com/chenyanshan/sh/blob/master/httpd]的内容复制进去,稍微改一下

[root@Apache httpd]# vim /etc/sysconfig/httpd
HTTPD_LANG="C"
httpd=/usr/local/httpd/bin/httpd
pidfile=/var/run/httpd.pid
lockfile=/var/lock/subsys/httpd

[root@Apache httpd]# chmod +x /etc/rc.d/init.d/httpd
[root@Apache httpd]# chkconfig --add httpd
[root@Apache httpd]# service httpd start
Starting httpd: AH00557: httpd: apr_sockaddr_info_get() failed for Apache.LAMP
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
                                                           [  OK  ]
[root@Apache httpd]# vim /etc/hosts
127.0.0.1 yourServerName        //加入这项
[root@Apache httpd]# vim /etc/httpd/httpd.conf 
ServerName yourServerName:80    //去掉注释,修改后面的youServerName
[root@Apache httpd]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

访问一下

修改主配文件/etc/httpd/httpd.conf

1、将支持fast cgi的模块打开
mod_proxy_fcgi.so是Apache2.4之后为FastCGI设立的模块,是作为mod_proxy.so模块的扩充,这两个模块都要加载
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
2、设置虚拟主机,并在其中加入这两项
ProxyRequests Off       //正向代理off
ProxyPassMatch ^/(.*)\.php$ fcgi://PHPServerIP:9000/PATH/TO/DOCUMENT_ROOT/$1.php
ProxyPassMatch的作用是匹配以php结束的URL,并由fcgi发送到PHPServer去。9000是php-fpm监听的端口

MySQL

为了数据的安装和性能,MySQL的数据一般都单独存放在一个硬盘,至少也的单独一个文件系统

[root@localhost ~]# fdisk /dev/sdb
Command (m for help): n              //创建一个分区
Command action
   e   extended
   p   primary partition (1-4)
p                                    //选择创建主分区
Partition number (1-4): 1            //扇区 1-4选择一个
First cylinder (1-3916, default 1):  //起始点,不填表示默认
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-3916, default 3916): +10G   //大小

Command (m for help): t               //改变文件系统类型
Selected partition 1
Hex code (type L to list codes): 8e   //改成8e
Changed system type of partition 1 to 8e (Linux LVM)
Command (m for help): w               //保存退出

让系统识别新分区

[root@localhost ~]# partx -a /dev/sdb
BLKPG: Device or resource busy
error adding partition 1
[root@localhost ~]# kpartx -af /dev/sdb
[root@localhost ~]# cat /proc/partitions 
major minor  #blocks  name
   8        0   67108864 sda
   8        1     512000 sda1
   8        2   66595840 sda2
   8       16   31457280 sdb
   8       17   10490412 sdb1

创建LVM

[root@localhost ~]# pvcreate /dev/sdb1              //创建物理卷
  Physical volume "/dev/sdb1" successfully created
[root@localhost ~]# vgcreate mysql /dev/sdb1        //创建逻辑卷组
  Volume group "mysql" successfully created
[root@localhost ~]# lvcreate -L 5G -n mydata mysql  //创建逻辑卷
  Logical volume "mydata" created.
[root@localhost ~]# mkfs.ext4 /dev/mysql/mydata     //创建文件系统
[root@localhost ~]# mkdir -p /mysql/mydata   
[root@localhost ~]# mount /dev/mysql/mydata /mysql/mydata/ 
[root@localhost ~]# grep mydata /etc/mtab >> /etc/fstab   //开机自动挂载

创建用户

[root@localhost mysql-5.5.33]# groupadd -r -g 306 mysql
[root@localhost mysql-5.5.33]# useradd -g mysql -r -s /sbin/nologin -u 306 mysql

解决依赖性

[root@localhost mysql-5.5.33]# yum -y install bison-devel gcc gcc-c++ ncurses-devel

编译安装MySQL

安装cmake
yum -y install cmake
[root@localhost mysql-5.5.33]# cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \  //指定安装目录
-DMYSQL_DATRADIR=/mysql/mydata \           //指定数据目录
-DSYSCONFDIR=/etc \                        //指定配置文件目录
-DWITH_INNOBASE_STORAGE_ENGINE=1 \         //编译INNODB存储引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \          //编译ARCHIVE存储引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \        //编译BLACKHOLE存储引擎
-DWITH_READLINE=1 \                        //高级功能支持选项
-DWITH_SSL=system \                        //支持SSL传输
-DWITH_ZLIB=system \                       //支持压缩传输
-DWITH_LIBWRAP=0 \                         //停止支持tcp_wrapper
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \        //SOCKET文件存放地
-DDEFAULT_CHARSET=utf8 \                  
-DDEFAULT_COLLATION=utf8_general_ci       

#make && make install 

后续操作

[root@localhost mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@localhost mysql]# chkconfig --add mysqld
[root@localhost mysql]# chkconfig mysqld on	  
[root@localhost mysql]# cat support-files/my-huge.cnf > /etc/my.cnf 
[root@localhost mysql]# vim /etc/my.cnf 
datadir = /mysql/mydata     //你的数据目录
[root@localhost mysql]#  scripts/mysql_install_db --user=mysql --datadir=/mysql/mydata
[root@localhost mydata]# service mysqld start
Starting MySQL.. SUCCESS! 
[root@localhost mydata]# mysql
mysql> GRANT ALL ON *.* TO 'phpUser'@'192.168.100.%' IDENTIFIED BY 'phpPass'; 
mysql> FLUSH PRIVILEGES;

标准编译安装后续操作

[root@localhost mydata]# vim /etc/man.config          //让MySQL支持man
[root@localhost mydata]# ln -sv /usr/local/mysql/include  /usr/include/mysql   //输出mysql的头文件至系统头文件路径
`/usr/include/mysql' -> `/usr/local/mysql/include'
[root@localhost mydata]# ldconfig		      //重新载入头文件
[root@localhost mydata]# vim /etc/profile.d/mysql.sh  //修改PATH环境变量
[root@localhost mydata]# . /etc/profile.d/mysql.sh

PHP

[root@PHP php-5.4.26]# ./configure --prefix=/usr/local/php \
--with-openssl \                           启用SSL加密传输
--enable-fpm \                             启用php-fpm
--enable-mbstring  \                       多字节字串,中文2字节才能组成一个字串
--with-freetype-dir  \                     字体生成工具,需要安装freetype-devel
--with-jpeg-dir \                          启用jpeg
--with-png-dir  \                          启用png
--with-zlib \                              压缩库
--with-libxml-dir=/usr \                   解析xml的,默认去/usr/local下面找, 
--enable-xml \
--with-mcrypt \                            没装libmcrypt-devel,就不要这项
--with-config-file-path=/etc \             配置文件php.ini存放地址
--with-config-file-scan-dir=/etc/php.d \   扩展配置文件存放地
--with-bz2 \                               支持bz2压缩
--enable-maintainer-zts \                  安装httpd的时候使用了event,这里就需要启用
--with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd  
mysqlnd从PHP5.3开始可用,编译时绑定到它就不用和具体的MySQL客户端库绑定形成依赖,从PHP5.4开始成为默认设置

[root@PHP php-5.4.26]# make && make intall

编译时间较长,这个时候我们可以做其他的配置

php配置文件:

[root@PHP php-5.4.26]# cp php.ini-production /etc/php.ini

将启动脚本复制到/etc/rc.d/init.d/,再加入开机启动

[root@PHP php-5.4.26]# cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm
[root@PHP php-5.4.26]# chmod +x /etc/rc.d/init.d/php-fpm
[root@PHP php-5.4.26]# chkconfig --add php-fpm
[root@PHP php-5.4.26]# chkconfig php-fpm on

php-fpm配置:

[root@PHP php-5.4.26]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf 
[root@PHP php-5.4.26]# vim /usr/local/php/etc/php-fpm.conf
只需要改下面几项,和Apache的MPM模式差不多
pm.max_children = 50      //最大线程数
pm.start_servers = 5      //启动进程的时候的线程数
pm.min_spare_servers = 2  //最少闲置线程数
pm.max_spare_servers = 8  //最多闲置线程数
pid = /usr/local/php/var/run/php-fpm.pid 
listen = PHPServerIP:9000

[root@PHP php-5.4.26]# service php-fpm start

在PHPServer上面建立测试页面(页面建立文件根据你Apache虚拟主机里面设置的选项来):

测试PHP的运行状态
[root@PHP ~]# vim /web/html/test1.php
<?php
		phpinfo();
?>

测试PHP与MySQL的连接情况
[root@PHP ~]# vim /web/html/test2.php
<?php
      $link=mysql_connect('192.168.100.87','phpUser','phpPass');
        if(!$link)
                echo "connect MySQL failed";
        else
                echo "connect success";
        mysql_close();
?>