部署社交网站
一、简介
本项目案例结合 SVN 、 LNMP 和 MySQL 三种环境,部署一个社交网站,本社交网站采用 PHP 语言开发,搭建 SVN 服务器进行版本控制和集中管理 PHP 程序员开发的代码,以 Nginx 作为前端服务器,通过 fastcgi 协议访问后端的 PHP 服务器,调用 PHP 页面;为保证数据安全,搭建 MySQL 主从复制环境存储用户重要数据;另外搭建 MFS 分布式文件系统来存储用户照片。
1.SVN 服务器:可以参考百度介绍 http://baike.baidu.com/link?url=fJT4nk4sgyc97MYSciYwlzMp2uRVsi-FkGYOEA7UtvPk4ioBl1NTaAAFRbBhuu6-YOAqaGFomxlu2j3AKgNlba
2.MFS 分布式文件系统,比 NFS 分布式文件系统更加强大,其他分布式式文件系统还有 HDFS 分布式文件系统和 fastDFS 分布式文件系统等
3.MySQL 环境,此案列环境限于本人机器设备配置问题,只配置了 mysql 主从复制,如果是真实环境中,还可以配置双击热备,借助 amoeba 环境实现读写分离,负载均衡等功能,大型网络环境还可以配置 MySQL 集群。
二、案例环境
1. 网络拓扑图
2. 网络关系逻辑图
3. 主机环境
操作系统 CentOS6.5-64
Nginx : 192.168.0.10 /24 软件: nginx
PHP : 192.168.0.12/24 软件: php , mfs , fuse
MySQL Master : 192.168.0.100/24 软件: cmake , mysql
MySQL Slave : 192.168.0.101/24 软件: cmake , mysql
Master Server : 192.168.0.20/24 软件: mfs
MetaLogger : 192.168.0.200/24 软件: mfs
Chunk1 : 192.168.0.21/24 软件: mfs
Chunk2 : 192.168.0.22/24 软件: mfs
Chunk3 : 192.168.0.23/24 软件: mfs
SVN : 192.168.0.172/24 软件: subversion
真实环境中,最好先搭建一台 ftp 服务器,安装过程中会使用到安装光盘里的文件,并且可以方便下载需要安装的软件包,本地配置 yum 文件时指向 ftp 服务器
mfs 源码包下载地址为 http://sourceforge.net/projects/moosefs/files/moosefs/1.6.27/mfs-1.6.27-5.tar.gz
fuse 源码安装包下载地址 http://nchc.dl.sourceforge.net/project/fuse/fuse-2.x/2.9.2/fuse-2.9.2.tar.gz
本案例实现过程是在 vmware 虚拟机环境下完成的
4. 主机内部环境
a 设置主机名
root@localhost ~#hostname nginx
root@localhost ~# vim /etc/hosts
192.168.0.10 nginx
192.168.0.12 php
192.168.0.100 master
192.168.0.101 slave1
192.168.0.20 mfsmaster
192.168.0.200 mfslogger
192.168.0.21 chunk1
192.168.0.22 chunk2
192.168.0.23 chunk3
192.168.0.172 svn
root@nginx ~#vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=nginx
//其他主机以相同方式设置
b. 关闭防火墙
root@localhost ~#vim /etc/selinux/config
SELINUX=disabled
root@localhost ~#service iptables stop
root@localhost ~#setenforce 0
c. 设置主机 ip 地址
root@localhost ~#vim /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
HWADDR=00:0C:29:49:0F:81
TYPE=Ethernet
UUID=d97bca82-0440-41f9-9cd0-02fe0909cee6
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.0.10
NETMASK=255.255.255.0
root@localhost ~#service network restart
//其他主机以相同方式设置并且根据自己机器中网卡设备的显示符设定 DEVICE
d. 配置本地 yum 服务
root@localhost ~#rm -fr /etc/yum.repos.d/*
root@localhost ~#cat >/etc/yum.repos.d/local.repo
[local]
name=cjenlet
baseurl=file:///media/
enabled=1
gpgcheck=0
end
[root@localhost ~]# mount /dev/cdrom /media/
三、案例实施
根据网络逻辑拓扑图,先部署 LNMP 环境,简单测试,接着部署 MFS 环境,把 MFS 文件系统挂载在 PHP 服务器存放用户照片的目录上,再部署 SVN 管理环境,把 Nginx 和 PHP 的 webphp 目录链接到 SVN 的 webphp 目录,集中管理,最后再搭建 MySQL 环境,供 PHP 程序员开发的代码中的调用和发布上线后用户数据的录入和输出。
1. 部署 Nginx 服务器
A. 安装 nginx 服务器
[root@nginx ~]# yum -y install pcre-devel zlib-devel
[root@nginx ~]# useradd -M -s /sbin/nologin nginx
[root@nginx ~]# tar xvf nginx-1.6.0.tar.tgz
[root@nginx ~]# cd nginx-1.6.0/
[root@nginx nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --user=nginx --group=nginx
[root@nginx nginx-1.6.0]# make&&make install
B. 修改 nginx 配置文件
[root@nginx ~ ]#vim /usr/local/nginx/conf/nginx.conf
C. 启动 nginx
[root@nginx ~ ]#ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ // 把 nginx 的启动文件软链接到系统用户可执行命令的目录里
[root@nginx ~ ]#nginx
[root@nginx ~ ]#netstat -anpl |grep nginx
2. 部署 PHP 服务器
A. 安装 php 服务器
[root@php ~]# yum -y install gd libxml2-devel libjpeg-devel libpng-devel mysql-devel
[root@php ~]# useradd -M -s /sbin/nologin php
[root@php ~]# tar xvf php-5.3.28.tar.gz
[root@php ~]# cd php-5.3.28/
[root@php php-5.3.28]# cp /usr/lib64/mysql/libmysqlclient.so.16.0.0 /usr/lib/libmysqlclient.so
//PHP 默认去 /usr/lib/ 搜索 libmysqlclient.so
[root@php php-5.3.28]# ./configure --prefix=/usr/local/php --with-gd --with-zlib --with-mysql --with-mysqli --with-mysql-sock --with-config-file-path=/usr/local/php --enable-mbstring --enable-fpm --with-jpeg-dir=/usr/lib
[root@php php-5.3.28]# make&&make install
B. 配置 php-fpm 进程
[root@php php-5.3.28]# cd /usr/local/php/etc/
[root@php etc]# cp php-fpm.conf.default php-fpm.conf
[root@php etc]# vim php-fpm.conf
// 找到这些内容,然后修改
pid = run/php-fpm.pid
user = php
group = php
listen = 0.0.0.0:9000
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
C. 启动 php-fpm 进程
[root@php etc]# /usr/local/php/sbin/php-fpm
D. 访问 nginx 测试
先在 php 主机新建一个 php 测试页面
[root@php etc]# mkdir -p /var/www/html/webphp
[root@php etc]# vim /var/www/html/webphp/index.php
phpinfo();
?>
通过外部浏览器访问 192.168.0.10/index.php
3. 部署 MFS 分布式文件系统
A. 搭建 Master Server
a. 安装 mfs
[root@mfsmaster ~]# yum -y install zlib-devel
[root@mfsmaster ~]#useradd mfs -s /sbin/nologin
[root@mfsmaster ~]#tar zxf mfs-1.6.27-5.tar.gz
[root@mfsmaster ~]#cd mfs-1.6.27
[root@mfsmaster mfs-1.6.27]#./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
[root@mfsmaster mfs-1.6.27]#make &&make install
b. 复制相关配置文件
[root@mfsmaster mfs-1.6.27]#cd /usr/local/mfs/etc/mfs/
[root@mfsmaster mfs]#cp mfsexports.cfg.dist mfsexports.cfg
[root@mfsmaster mfs]#cp mfsmaster.cfg.dist mfsmaster.cfg
[root@mfsmaster mfs]#cp mfstopology.cfg.dist mfstopology.cfg
[root@mfsmaster mfs]#cd /usr/local/mfs/var/mfs/
[root@mfsmaster mfs]#cp metadata.mfs.empty metadata.mfs
c. 相关配置文件参数解释
//mfsmaster.cnf: 主配置文件
//mfsexports.cnf: 被挂载目录及权限配置文件
mfsmaster.cnf 的参数:
# WORKING_ USER = mfs // 运行 master server 的用户
#WORKING_ GROUP = mfs // 运行 master server 的组
# SYSLOG_IDENT = mfsmaster //master server 在 syslog 中的标识,说明是由 master serve 产生的
# LOCK_MEMORY = 0 // 是否执行 mlockall() 以避免 mfsmaster 进程溢出(默认为 0 )
# NICE_LEVEL = -19 // 运行的优先级 ( 如果可以默认是 -19; 注意 : 进程必须是用 root 启动 )
# EXPORTS_FILENAME = /usr/local/mfs/etc/mfsexports.cfg // 被挂接目录及其权限控制文件的存放位置
# DATA_PATH = /usr/local/mfs/var/mfs // 数据存放路径,此目录下大致有三类文件, changelog , sessions 和 stats ;
# BACK_LOGS = 50 //metadata 的改变 log 文件数目 ( 默认是 50);
# REPLICATIONS_ DELAY_INIT = 300 // 延迟复制的时间(默认是 300s ) ;
# REPLICATIONS_ DELAY_DISCONNECT = 3600 //chunkserver 断开的复制延迟(默认是 3600 );
# MATOML_LISTEN_HOST = * //metalogger 监听的 IP 地址 ( 默认是 * ,代表任何 IP) ;
#MATOML_LISTEN_PORT = 9419 //metalogger 监听的端口地址 ( 默认是 9419) ;
#MATOCS_LISTEN_ HOST = * // 用于 chunkserver 连接的 IP 地址(默认是 * ,代表任何 IP );
#MATOCS_LISTEN_PORT = 9420 // 用于 chunkserver 连接的端口地址(默认是 9420 );
#MATOCU_LISTEN_HOST = * // 用于客户端挂接连接的 IP 地址 ( 默认是 * ,代表任何 IP) ;
#MATOCU_LISTEN_PORT = 9421 // 用于客户端挂接连接的端口地址(默认是 9421 );
#CHUNKS_LOOP_TIME = 300 //chunks 的回环频率(默认是: 300 秒);
# CHUNKS_DEL_LIMIT = 100
#CHUNKS_WRITE_REP_LIMIT = 1 // 在一个循环里复制到一个 chunkserver 的最大 chunk 数目(默认是 1 )
# CHUNKS_READ_REP_LIMIT = 5 // 在一个循环里从一个 chunkserver 复制的最大 chunk 数目(默认是 5 )
# REJECT_OLD_ CLIENTS = 0 // 弹出低于 1.6.0 的客户端挂接( 0 或 1 ,默认是 0 )
注意:
凡是用 # 注释掉的变量均使用其默认值
修改 DATA_PATH 指定的目录要权限为 mfs , chown -R mfs:mfs /usr/local/mfs/var/mfs
mfsexports 访问控制对于那些老客户是没用的
注意开通监听的端口,为保证数据安全,请修改端口
mfsexports.cnf 的参数:
# 客户端 IP 允许挂载的目录 客户端拥有的权限
192.168.0.0/24 / rw,alldirs,maproot=0
/ 标识 MFS 的根
. 标识 MFSMETA 文件系统
地址可以指定的格式:
IP 格式 | 说明 |
* | 所有的 ip 地址 |
n.n.n.n | 单个 ip 地址 |
n.n.n.n/b | IP 网络地址 / 位数掩码 |
n.n.n.n/m.m.m.m | IP 网络地址 / 子网掩码 |
f.f.f.f-t.t.t.t | IP 段 |
权限说明:
权限 | 说明 |
ro | 只读模式 |
rw | 读写模式 |
alldirs | 许挂载任何指定的子目录 |
maproot | 映射为 root ,还是指定的用户 |
password | 指定客户端密码 |
d. 启动 Master Server
mfsmaster.cnf 和 mfsexports.cnf 保持默认值
[root@mfsmaster mfs]# /usr/local/mfs/sbin/mfsmaster start
[root@mfsmaster mfs]# ps -ef |grep mfs
/usr/local/mfs/sbin/mfsmaster [-vdu] [-t locktimeout] [-c cfgfile] [start|stop|restart|reload]
//master 服务操作, 最好不要 kill master ,安全停止执行 mfsmaster stop ,否则下次启动因 metadata.mfs.back 而出现问题,还需要使用备份来恢复
$/usr/local/mfs/sbin/mfscgiserv // 启动 WEBUI 监控服务
截图的监控启动信息显示:允许所有主机访问 mfsmaster 的端口 9425 进行监控 MFS 系统
访问 http://mfsmaster:9425 或者 http://192.168.0.20:9425
B. 搭建 MetaLogger Server
a. 安装 mfs ,此步奏和搭建 Master Server 的安装过程一样
b. 配置文件
[root@mfslogger ~]# cd /usr/local/mfs/etc/mfs/
[root@mfslogger mfs]# cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
[root@mfslogger mfs]# vim mfsmetalogger.cfg
MASTER_HOST = mfsmaster
如果没有设置域名解析, hosts 文件没有主机名记录,那么改用 mfsmaster 主机的 ip 地址指定
c. 启动 MetaLogger Server 服务器
[root@mfslogger mfs]# /usr/local/mfs/sbin/mfsmetalogger start
[root@mfslogger mfs]# ps -ef |grep mfs
//[root@mfslogger mfs]# /usr/local/mfs/sbin/mfsmetalogger -s // 停止 MetaLogger Server
C. 搭建 Chunk Server
本案例中三台 chunk Server 的搭建步骤是一样的
a. 安装 mfs
此案装过程和搭建 Master Server 的安装过程只有一处差异
//[root@mfsmaster mfs-1.6.27]#./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
// 这是 mfsmaster 主机安装配置
[root@mfsmaster mfs-1.6.27]#./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount
b. 配置文件
[root@chunk1 mfs]#
cp mfschunkserver.cfg.dist mfschunkserver.cfg
[root@chunk1 mfs]#
cp mfshdd.cfg.dist mfshdd.cfg
[root@chunk1 mfs]# vim mfschunkserver.cfg
MASTER_HOST = mfsmaster
[root@chunk1 mfs]# vim mfshdd.cfg
/data // 添加一行 /data ,在这里 /data 是一个给 MFS 的分区,生产环境中最好使用独立的分区或者磁盘挂载到此目录
[root@chunk1 mfs]# mkdir /data/
[root@chunk1 mfs]# chown -R mfs.mfs /data/
c. 启动 Chunk Server
[root@chunk1 mfs]# /usr/local/mfs/sbin/mfschunkserver start
[root@chunk1 mfs]# ps -ef |grep mfs
4. 挂载 MFS 分布式文件系统
以 php 主机作为 MFS 的客户端, php 主机需要另外安装两个重要软件 mfs 和 fuse
A. 安装 fuse
a. 安装
[root@php ~]# yum -y install zlib-devel
[root@php ~]# tar xvf fuse-2.9.2.tar.gz
[root@php ~]# cd fuse-2.9.2/
[root@php fuse-2.9.2]# ./configure
[root@php fuse-2.9.2]#make &&make install
b. 配置环境变量
[root@php fuse-2.9.2]#echo "export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH">>/etc/profile
[root@php fuse-2.9.2]#source /etc/profile
B. 安装 mfs
[root@php ~ ]#cd
[root@php ~ ]#useradd mfs -s /sbin/nologin
[root@php ~ ]#tar xvf fuse-2.9.4.tar.gz
[root@php ~ ]#cd mfs-1.6.27
[root@php mfs-1.6.27]#./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver --enable-mfsmount
[root@php mfs-1.6.27]#make &&make install
C. 挂载 MFS
[root@php ~]#mkdir -p /var/www/html/webphp/uploads/photos
[root@php ~]#modprobe fuse
[root@php ~]#/usr/local/mfs/bin/mfsmount /var/www/html/webphp/uploads/photos -H mfsmaster
[root@php ~]#echo "export PATH=/usr/local/mfs/bin:$PATH">>/etc/profile
[root@php ~]#source /etc/profile
[root@php ~]#df -TH // 查看挂载情况
[root@php ~]#mfsgetgoal -r /var/www/html/webphp/uploads/photos/
5. 部署 SVN 管理环境
A. 安装 svn
[root@svn ~]# yum -y install subversion
[root@svn ~]# svnserve --version
B.为 PHP 程序员创建仓库目录 repo
[root@svn ~]# mkdir -p /opt/svn/repo
// 创建目录
[root@svn ~]# svnadmin create /opt/svn/repo/
// 创建一个新的仓库
[root@svn ~]# ls !$
conf db format hooks locks README.txt
C. 调整 SVN 参数
[root@svn ~]# vim /opt/svn/repo/conf/svnserve.conf
[general] // 总体配置
anon-access = none
// 匿名用户没有任何权限
auth-access = write
// 认证用户具有写权限
password-db = /opt/svn/repo/conf/passwd // 用户的密码文件
authz-db = /opt/svn/repo/conf/authz // 用户信息文件,主要是权限内容
D. 启动 SVN 服务
[root@svn ~]# svnserve -d -r /opt/svn/repo/
[root@svn ~]# netstat -tunpl|grep svnserve
//关闭 svnserve 服务通过 kill 进程来实现, ps -ef|grep svn
E. 为 PHP 程序员创建账户并赋权
[root@svn ~]# vim /opt/svn/repo/conf/passwd
格式为:用户名 = 用户密码
[root@svn ~]# vim /opt/svn/repo/conf/authz
[/]
sysadmin = r // 根目录即 /opt/svn/repo 目录下, sysadmin 具有读的权限
alpha = r //alpha 用户对根目录有读的权限
[/webphp]
sysadmin = r // 运维工程师具有读的权限,用于部署
alpha = rw //alpha 用户对此目录有读写的权限,用户导入 PHP 代码
[root@svn ~]# cd /opt/svn/repo/ // 必须进入此目录,才能导入新创键的 webphp 目录
[root@svn repo]# mkdir webphp
[root@svn repo]# svn import webphp file:///opt/svn/repo/webphp -m "cjenlet" // 初始化 webphp 目录
F. 映射 SVN 仓库 webphp 服务目录到 Nginx 和 PHP 服务器的 webphp 服务目录上
Nginx 主机:
[root@nginx ~]# cd /usr/local/nginx/html/
[root@nginx html]# ls
50x.html index.html
[root@nginx html]# svn co svn://192.168.0.172/webphp
PHP 主机:
[root@php ~]# cd /var/www/html/
[root@php html]# svn co svn://svn/webphp
// 根据提示,先输入 php 主机本地 root 用户密码,在以 sysadmin 登入 repo 仓库 , 根据权限, sysadmin 只有读的权限,即 PHP 程序员开发的代码上传到中心 repo 仓库中, php 主机可以下载代码到本地目录,而不能把在本地修改过的代码或者其他本地文件添加到仓库中以更新文件版本。这就是说,一个 PHP 开发小组开发完成代码并上传到仓库后, PHP 服务器只需 update 本地代码就可以更新本地 phh 代码了。
6. 部署 MySQL 数据库,部署主从复制
A. 安装部署过程可以参考我的实验报告《 MySQL 主从复制与读写分离 》
B. 创建一个可供 PHP 程序员调用数据库
[root@master ~]#mysql -uroot -pabc123.
mysql>create database cjenlet;
mysql>grant all privileges on cjenlet.* to php@'192.168.0.%' identified by 'abc123.';
// 创建一个数据库名字有自己定,这里为 cjenlet
// 创建一个账户 php ,可以通过 192.168.0 网段的所有可用地址访问 cjenlet 数据库,权限非常大,除了没 // 有创建用户并给其他用户赋权的权力,其他权限都有。
// 这样,只要把用户名 php ,密码和 mysql 的 ip 地址给开发程序员就可以了。
四、收获总结
通过这个实验案例:
1. 可以温习、回顾和巩固 LNMP , MySQL , MFS 的环境知识
2. 可以接触到 SVN 这种强大的文件管理工具
3. 可以扩展到和深入到更多的网络知识,如 LAMP 网络服务、 MySQL 集群、 NFS 和 fastDFS 分布式文件系统、 SVN 网络文件管理和版本控制
4. 解决了许多问题,如 MySQL 数据库本 root 用户无法本地登录问题及其牵扯到的旁支问题,
5. 扩展和强化了我的认知,如 MFS 分布式文件系统让我认识到 MySQL 集群的重要性
6. 整个实验过程让我对整个网络服务认知提升到了一个新的高度, 让我有种迫切需要掌握新知识冲动,以达到融汇贯通的境地。
7. 整个实验花了我四天时间,重新部署了 MySQL 主从复制与读写分离, MFS , NFS , LNMP ,都是自己一个人完成,希望以后能够有团队协作。
8. 路漫漫其修远兮,吾将上下而求索。