在LAMP架构中(这里只谈MySQL+PHP),Apache和PHP进行交互,PHP与MySQL交互,PHP和MySQL通过php-mysql进行通信,基本是固定死的。而Apache和PHP却有三种联系方式:
- 1、PHP作为Apache模块
- 2、PHP通过CGI和Apache联系
- 3、PHP独立,通过fast cgi和Apache联系
作为模块基本不现实,不但性能低,扩展性和可用性(冗余)也低,不是大型公司,就算对小型公司业务场景也很难应付
通过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();
?>