POOPE 发表于 2021-7-4 10:26:09

搭建高性能LAMP架构:LAMP+FastCGI

  在生产环境中,Apache、MySQL、PHP通常都分别工作在不同的主机上,而且使用的是高可用集群,以分担单个服务器的压力,同时避免单点故障,所以,我今天向大家介绍的就是位于不同主机上的LAMP架构,使我们的操作更贴近生产环境
  1、搭建前规划
  操作系统Centos6.4 x86_64位
  Apache ------> 172.16.251.77 (static IP)
MySQL -------> 172.16.251.78 (static IP)
PHP ---------> 172.16.251.79 (static IP)
  2、环境准备
(1)配置yum网络源;
# cd /etc/yum.repos.d/
# mkdir bak
# mv *.repo bak
# cd
# vim /etc/yum.repos.d/CentOS-Base.repo
# CentOS-Base.repo

name=CentOS-$releasever - Base
baseurl=http://172.16.0.1/cobbler/ks_mirror/centos-6.5-x86_64/
enable=1
gpgcheck=1
gpgkey=http://172.16.0.1/cobbler/ks_mirror/centos-6.5-x86_64/RPM-GPG-KEY-CentOS-6
cost=1000

name=Fedora EPEL
baseurl=http://172.16.0.1/fedora-epel/6/x86_64/
enable=1
gpgcheck=0
cost=2000
  (2)系统时间同步:最好的做法是添加定时任务,每隔一定时间同步一次
# crontab -e
*/5 * * * * /sbin/hwclock -s &>/dev/null
# crontab -l
*/5 * * * * /sbin/hwclock -s &>/dev/null
# hwclock -s

  (3)关闭防火墙(iptables和selinux)
清除链规则:iptables -F
关闭selinux:setenforce 0
查看selinux的状态:getenforce

  3、Apache端:
(1)下载Apache相关源码包
# mkdir tools#创建一个目录,用于存放源码包,方便管理
# cd tools/
# ls
apr-1.5.0.tar.bz2apr-util-1.5.3.tar.bz2httpd-2.4.9.tar.bz2
# lftp 172.16.0.1/pub
lftp 172.16.0.1:/pub> cd Sources/sources/httpd/
lftp 172.16.0.1:/pub/Sources/sources/httpd> mget apr-1.5.0.tar.bz2 apr-util-1.5.3.tar.bz2 httpd-2.4.9.tar.bz2
lftp 172.16.0.1:/> exit
(2)卸载系统自带的lamp软件包
rpm -e `rpm -q mysql` --nodeps &>/dev/null
rpm -e `rpm -q httpd` --nodeps&>/dev/null
  rpm -e `rpm -q php` --nodeps&>/dev/null
  (3)安装编译所需依赖包:
yum -y install libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-develkrb5-devel libidn libidn-devel openssl openssl-devel pcre pcre-devel libtermcaplibtermcap-develgcc gcc-c++
(4)编译安装apr(1.5.0版本)和apr-util(1.5.3版本)
# tar xf apr-1.5.0.tar.bz2
# cd apr-1.5.0
# ./configure --prefix=/usr/local/apr
# make && make install
# cd ..
# 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
# cd ..

  (5)编译安装Apache(httpd 2.4.9版本)
# tar xf httpd-2.4.9.tar.bz2
# cd httpd-2.4.9
# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --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
  (6)修改httpd的主配置文件,设置其Pid文件的路径
编辑/etc/httpd/httpd.conf,添加如下行即可:
PidFile"/var/run/httpd.pid"
  (7)将httpd添加为系统服务,可使用service启动,并可使用chkconfig加载服务列表
# cp /usr/local/apache/bin/apachectl /etc/init.d/httpd
# vim /etc/init.d/httpd #添加如下两行(在第3行添加即可)
# chkconfig: - 85 15
# description: Apache is a World Wide Web server.
# chkconfig --add httpd
# chkconfig --list httpd
httpd            0:off    1:off    2:off    3:off    4:off    5:off    6:off
# chkconfig --level 35 httpd on
# service httpd start
# ss -tnl|grep ":80"
LISTEN   0      128                      :::80                      :::*
(8)导出头文件,库文件和apache man 帮助信息
输出apache的头文件至系统头文件路径/usr/include:
这可以通过简单的创建链接实现:
# ln -sv /usr/local/apache/include /usr/include/apache
`/usr/include/apache' -> `/usr/local/apache/include'
  输出apache的库文件给系统库查找路径:(我没看到),可先忽略它
  # ldconfig
导出apache的man帮助信息
# vim /etc/man.config
MANPATH /usr/local/apache/man

测试httpd服务能否成功运行:
# cd /usr/local/apache/htdocs #默认站点
# ls
index.html
在浏览器输入http://172.16.251.77/看是否会出现"It Works"字样
我的在这里是ok的,参考截图httpd1-ok

  至此,apache的配置告一段落
  

  3、MySQL端:
  (1)下载MySQL源码包
  # mkdir tools
# cd tools/
# lftp 172.16.0.1/pub/Sources
lftp 172.16.0.1:/pub> cd Sources/
lftp 172.16.0.1:/pub/Sources> cd 6.x86_64/
lftp 172.16.0.1:/pub/Sources/6.x86_64/mysql> getmysql-5.5.33-linux2.6-x86_64.tar.gz
186839926 bytes transferred in 37 seconds (4.79M/s)                                       lftp 172.16.0.1:/pub/Sources/6.x86_64/mysql> exit

  (2)创建运行mysql数据库的系统用户和系统组mysql
# groupadd -r mysql
# useradd -g mysql -r -s /sbin/nologin mysql
  (3)编译安装mysql-5.5.33
  # tar xfz mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/src
# cd /usr/src/
# mv mysql-5.5.33-linux2.6-x86_64/ /usr/local/
# cd $_
# ln -sv mysql-5.5.33 mysql
`mysql' -> `mysql-5.5.33'
# ls
binetcgamesincludeliblib64libexecmysqlmysql-5.5.33sbinsharesrc

  (4)为数据库创建专门的数据存放目录和存储设备

  # mkdir /data #创建数据存放目录

  # fdisk /dev/sda#创建磁盘分区
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (7859-15665, default 7859):
Using default value 7859
Last cylinder, +cylinders or +size{K,M,G} (7859-15665, default 15665): +20G

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 8e
Changed system type of partition 3 to 8e (Linux LVM)

Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.

echo -n -e "n\np\n3\n\n+20G\nt\n3\n8e\n\w\n" |fdisk /de/sda
  

  执行操作1和操作2,以便新增磁盘分区可以系统快速识别

  # kpartx -af /dev/sda 操作1
  device-mapper: reload ioctl on sda1 failed: Invalid argument
create/reload failed on sda1
device-mapper: reload ioctl on sda2 failed: Invalid argument
create/reload failed on sda2
device-mapper: reload ioctl on sda3 failed: Invalid argument
create/reload failed on sda3
# partx -a /dev/sda 操作2
  BLKPG: Device or resource busy
error adding partition 1
BLKPG: Device or resource busy
error adding partition 2
  查看新增的磁盘分区是否被系统识别
  # cat /proc/partitions
major minor#blocksname

   8      0125829120 sda
   8      1   204800 sda1
   8      2   62914560 sda2
   8      3   20979891 sda3#sda3是我们刚才划分的,说明该分区此时已被系统识别
253      0   20971520 dm-0
253      1    2097152 dm-1
253      2   10485760 dm-2
253      3   20971520 dm-3
  创建lvm卷,以应对数据库的快速增长

  # pvcreate /dev/sda3
Physical volume "/dev/sda3" successfully created
# vgcreate myvg /dev/sda3
Volume group "myvg" successfully created
# lvcreate -L 10G -n mydata myvg
Logical volume "mydata" created
查看系统当前的具有所有的lvs属性的逻辑卷
# lvs
LV   VG   Attr      LSizePool Origin Data%Move Log Cpy%Sync Convert
mydata myvg -wi-a---- 10.00g                                             
root   vg0-wi-ao--- 20.00g                                             
swap   vg0-wi-ao---2.00g                                             
usr    vg0-wi-ao--- 10.00g                                             
var    vg0-wi-ao--- 20.00g
  格式化逻辑卷
# mke2fs -t ext4 /dev/myvg/mydata

设置开机自动挂载
# vim /etc/fstab
/dev/myvg/mydata      /data                   ext4    defaults,noatime 0 0

  挂载/etc/fstab文件中所有支持自动挂载的文件系统/磁盘分区
  # mount -a
验证lvm设备是否挂载成功
# mount|grep "/data"
/dev/mapper/myvg-mydata on /data type ext4 (rw,noatime)
# cd /data/
# mkdir mydata
# chown -R mysql.mysql mydata/
# ll
total 20
drwx------ 2 rootroot16384 Mar 22 15:51 lost+found
drwxr-xr-x 2 mysql mysql4096 Mar 22 15:55 mydata

  

  初始化mysql
# cd /usr/local/mysql
# chown -R root.mysql ./*
# ln -sv mysql-5.5.33-linux2.6-x86_64 mysql
# cd mysql
# scripts/mysql_install_db --datadir=/data/mydata/ --user=mysql

# cp support-files/mysql.server /etc/init.d/mysqld
# chkconfig --add mysqld
# chkconfig --list mysqld
mysqld             0:off    1:off    2:on    3:on    4:on    5:on    6:off

# cp support-files/my-large.cnf /etc/my.cnf
cp: overwrite `/etc/my.cnf'? y
# vim /etc/my.cnf
在自段下面添加
datadir = /data/mydata
并将thread_concurrency修改为CPU个数的2倍
thread_concurrency = 4

# service mysqld start
Starting MySQL.......                                    
# ls /tmp/
ks-script-n4bQu7ks-script-n4bQu7.logmysql.sockyum.log

将mysql命令添加至系统PATH变量
# vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
# . $_

# mysql
mysql> select user,host,password from mysql.user;
+------+-------------------------+----------+
| user | host                  | password |
+------+-------------------------+----------+
| root | localhost               |          |
| root | station25.magelinux.com |          |
| root | 127.0.0.1               |          |
| root | ::1                     |          |
|      | localhost               |          |
|      | station25.magelinux.com |          |
+------+-------------------------+----------+
6 rows in set (0.01 sec)

mysql> use mysql
Database changed
mysql> update user set password=PASSWORD('123456') where user='root';
Query OK, 4 rows affected (0.04 sec)
Rows matched: 4Changed: 4Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> drop user ''@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> drop user ''@'station25.magelinux.com';
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye

# vim .my.cnf

user = root
host = localhost
password = 123456

导出头文件,且/usr/include/mysql不能写成/usr/include/mysql/这样的形式
# ln -sv /usr/local/mysql/include/ /usr/include/mysql
`/usr/include/mysql' -> `/usr/local/mysql/include/'

# vim /etc/ld.so.conf.d/mysql.conf
/usr/local/mysql/lib
# ldconfig -p|grep mysql
    libtcmalloc_minimal.so.0 (libc6,x86-64) => /usr/local/mysql/lib/libtcmalloc_minimal.so.0
    libmysqlclient_r.so.16 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient_r.so.16
    libmysqlclient.so.18 (libc6,x86-64) => /usr/local/mysql/lib/libmysqlclient.so.18
    libmysqlclient.so.16 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient.so.16
    libmysqlclient.so (libc6,x86-64) => /usr/local/mysql/lib/libmysqlclient.so

4、PHP端:
# yum -y install libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-develkrb5-devel libidn libidn-devel openssl openssl-devel pcre pcre-devel libtermcaplibtermcap-develgcc gcc-c++
# mkdir tools
# cd tools/
# lftp 172.16.0.1/pub/Sources/sources
cd ok, cwd=/pub                           
lftp 172.16.0.1:/pub/Sources/sources> cd php/
lftp 172.16.0.1:/pub/Sources/sources/php> mget php-5.4.26.tar.bz2 phpMyAdmin-4.0.5-all-languages.zipxcache-3.0.3.tar.bz2
lftp 172.16.0.1:/pub/Sources/sources/php> exit

# tar xf php-5.4.26.tar.bz2
# cd php-5.4.26
# ./configure --prefix=/usr/local/php--with-openssl--enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml--enable-sockets--with-mcrypt--with-config-file-path=/etc--with-config-file-scan-dir=/etc/php.d --with-bz2--enable-maintainer-zts --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --enable-fpm
# make && make install

# cp php.ini-production /etc/php.ini
# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
# chmod +x /etc/init.d/php-fpm
# chkconfig --add php-fpm
# chkconfig php-fpm on
# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
编辑php-fpm的配置文件:
# vim /usr/local/php/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/php/var/run/php-fpm.pid

说明:pid这里原本是一个相对路径,而且和我们编译安装的位置不一样,所以需要修改,但是,若你在编译php的时候,若没有指定pid文件的存放路径,那你怎么知道pid文件在哪呢?
方法:grep pid /etc/init.d/php-fpm
php_fpm_PID=${prefix}/var/run/php-fpm.pid
其他无效信息已省略...
${prefix}指的是php编译安装的路径,即为/usr/local/php


启动php-fpm
# service php-fpm start
Starting php-fpmdone

使用如下命令来验正(如果此命令输出有中几个php-fpm进程就说明启动成功了):
# ps aux|grep "php-fpm"|grep -v "grep"
root      42780.00.4694684604 ?      Ss   17:13   0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)                                                                  
nobody    42790.00.3694683932 ?      S    17:13   0:00 php-fpm: pool www                                                                                                            
nobody    42800.00.3694683936 ?      S    17:13   0:00 php-fpm: pool www                                                                                                            
nobody    42810.00.3694683936 ?      S    17:13   0:00 php-fpm: pool www                                                                                                            
nobody    42820.00.3694683936 ?      S    17:13   0:00 php-fpm: pool www                                                                                                            
nobody    42830.00.3694683936 ?      S    17:13   0:00 php-fpm: pool www   

默认情况下,fpm监听在127.0.0.1的9000端口,也可以使用如下命令验正其是否已经监听在相应的套接字
# ss -tnl|grep ":9000"
LISTEN   0      128               127.0.0.1:9000                     *:*   


######################Starting##############################
Apache 77
创建站点目录及测试页
# mkdir -p /web/{a.com,b.org}/htdocs
# cd /etc/httpd/extra/
# vim httpd-vhosts.conf
# service httpd graceful
# ss -tnl|grep ":80" |grep -v "grep"
LISTEN   0      128                      :::80                      :::*   
# /etc/init.d/httpd -M#查看已被编译安装的模块
Loaded Modules:#主要是为了看proxy_module (shared),proxy_fcgi_module (shared)是否编译进去
core_module (static)
so_module (static)
http_module (static)
authn_file_module (shared)
authn_core_module (shared)
authz_host_module (shared)
authz_groupfile_module (shared)
authz_user_module (shared)
authz_core_module (shared)
access_compat_module (shared)
auth_basic_module (shared)
reqtimeout_module (shared)
filter_module (shared)
mime_module (shared)
log_config_module (shared)
env_module (shared)
headers_module (shared)
setenvif_module (shared)
version_module (shared)
proxy_module (shared)   
proxy_fcgi_module (shared)
mpm_event_module (shared)
unixd_module (shared)
status_module (shared)
autoindex_module (shared)
dir_module (shared)
alias_module (shared)

# cd ..
# ls
conf.dextrahttpd.confmagicmime.typesoriginal

主配置文件相关的操作:
# vim httpd.conf
# 在httpd主配置文件中将中心主机用"#"注释掉,操作如下行:
#DocumentRoot "/usr/local/apache/htdocs"

# 在默认首页位置添加index.php,这样,服务器被访问的时候,就会先找到index.php,若该文件存在,就停止查找;若该文件不存在,就会继续向右查找,以此类推
<IfModule dir_module>
    DirectoryIndexindex.phpindex.html
</IfModule>

# 因为在后面我要在/etc/httpd/extra/httpd-vhosts.conf中,即在扩展配置文件中定义虚拟主机,所以
需要开启Virtual hosts的功能,操作如下2行:
# Virtual hosts 此行是注释不用理会
Include /etc/httpd/extra/httpd-vhosts.conf#此行默认是被注释掉的,要启用它,需将行首的#去掉


添加如下两行:
AddType application/x-httpd-php.php
AddType application/x-httpd-php-source.phps
作用:

#若proxy_module和proxy_fcgi_module模块已成功编译进httpd,那么在主配置文件中就会有下面这样两行,
#不过,这两行默认都未被启用,若想启用,将这两行行首的注释去掉
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

扩展配置文件相关的操作:
# cd extra
# vim httpd-vhosts.conf
<VirtualHost *:80>
    ServerAdmin webadmin@a.com
    DocumentRoot "/web/a.com/htdocs"
    ServerName www.a.com
    ServerAlias a.com
    ErrorLog "logs/a.com-error_log"
    CustomLog "logs/a.com-access_log" combined
      <Directory "/web/a.com/htdocs">
                Options None
                Require all granted
      </Directory>
    ProxyRequests Off
    ProxyPassMatch ^/(.*\.php)$ fcgi://172.16.251.79:9000/web/a.com/htdocs/$1
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webadmin@b.org
    DocumentRoot "/web/b.org/htdocs"
    ServerName www.b.org
    ServerAlias b.org
    ErrorLog "logs/b.org-error_log"
    CustomLog "logs/b.org-access_log" combined
      <Directory "/web/b.org/htdocs">
                Options None
                Require all granted
      </Directory>
    ProxyRequests Off
    ProxyPassMatch ^/(.*\.php)$ fcgi://172.16.251.79:9000/web/b.org/htdocs/$1
</VirtualHost>

向Apache端/etc/hosts文件中添加域名解析
172.16.251.77 www.a.com a.comwww.b.org b.org

因为我们待会要通过宿主机的浏览器,使用域名来访问我们的站点,所以我们也需要修改宿主机的hosts文件,以便支持域名解析功能,(若有DNS就更好了)
路径:C:\Windows\System32\drivers\etc
添加如下行
172.16.251.77 www.a.com www.b.org www.c.com www.d.org
有时候,宿主机上的防火墙可能会阻止我们修改此文件,暂时关闭宿主机上的防火墙即可


78 MySQL端,此时不用进行其他的配置
79 PHP端,配置如下:
# vim /usr/local/php/etc/php-fpm.conf
# 修改监听的地址为PHP所在服务器IP,端口不变,默认是监听127.0.0.1:9000
listen = 172.16.251.79:9000

启动php-fpm服务
# service php-fpm restart
Gracefully shutting down php-fpm warning, no pid file found - php-fpm is not running ?
Starting php-fpmdone

查看监听的地址是否为本机IP(172.16.251.79),且端口为9000
# ss -tnl|grep ":9000"
LISTEN   0      128         172.16.251.79:9000            

创建站点目录
# mkdir -p /web/{a.com,b.org}/htdocs
# cd
# vim /web/a.com/htdocs/index.php
Wecome to www.a.com
<?php
    phpinfo();
?>

# vim /web/b.org/htdocs/index.php
Wecome to www.b.org
<?php
    phpinfo();
?>

添加完测试页后,其实不需要重启php-fpm服务的

查看php-fpm脚本都支持哪些选项
# service php-fpm
Usage: /etc/init.d/php-fpm {start|stop|force-quit|restart|reload|status}

启动php-fpm服务
# service php-fpm reload

至此,所有配置工作已完成

现在,我们可通过宿主机的浏览器来访问刚刚我们新建的站点了
www.a.com/ 或 a.com
www.b.org 或 b.org
都可访问相应的站点
结果我已保存成网页,可供大家查看
  到目前为止,位于不同主机上的LAMP架构已搭建完毕,不过由于时间有限,我只能先介绍到这里,稍后,我会在此文的基础上继续为大家演示如何使用php加速插件,提高访问速度,以及LAMP架构的优化,使我们的站点逐渐健壮起来。
  歉意:此文,尚未仔细排版,有些粗糙,还请各位博友多多包涵,稍后我会对此文重新排版发布的....

  

  下面我将为php程序安装一个加速插件,并使之生效
  # cd tools/
# tar xf xcache-3.0.3.tar.bz2

  # 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/
  

  编辑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
  早期的xcache版本,找到zend_extension开头的行,修改为如下行:
zend_extension = /usr/local/php/lib/php/extensions/no-debug-zts-20100525/xcache.so

  xcache 3.0.3版本,操作如下:
  
;; non-Windows example:
extension = /usr/local/php/lib/php/extensions/no-debug-zts-20100525/xcache.so
;; Windows example:
; extension = php_xcache.dll
  注意:如果php.ini文件中有多条zend_extension(早期版本)或extension(新版本)指令行,要确保此新增的行排在第一位。
  保存退出,并重启service php-fpm restart
  访问测试已ok

  

  


  
页: [1]
查看完整版本: 搭建高性能LAMP架构:LAMP+FastCGI