image
       一共需要9台服务器,程序部分由一台负载均衡和两台Nginx+PHP服务器组成,数据库部分由两台MySql服务器组成,文件存储部分由两台Nginx(其中一台是Nginx+PHP)和一台NFS服务器组成。还有一台Memcached服务器作为数据缓存,用于处理读写频繁的热门数据。

编号 服务器 硬件侧重点
1 Nginx(www.itshop.test) 网卡性能
2 Nginx(file.itshop.test) 内存容量、磁盘性能
3 Nginx + PHP(upload.itshop.test) 网卡性能
4 Nginx + PHP CPU性能
5 Nginx + PHP CPU性能
6 NFS 磁盘容量
7 MySQL(主) CPU、内存、磁盘整体性能
8 MySQL(从) CPU、内存、磁盘整体性能
9 Memcached 内存容量
  1. 部署Linux服务器
  • 选择CentOS 7 系统最小化部署在vmware fusion虚拟机上。(root 19960621)(andy 19960621)
  • 使用命令:ip addr查看网络信息。
  • 使用命令:vi /etc/sysconfig/network-scripts/ifcfg-ens33修改网卡配置,修改或增加以下几项。
1
2
ONBOOT="yes"                 BOOTPROTO="static"              IPADDR="172.16.212.11"
NETMASK="255.255.255.0" GATEWAY="172.16.212.1" DNS1="172.16.212.1"
  • 确保在CentOS中可以ping通主机中的虚拟接口vmnet8地址。
  • 编写脚本来改变各个克隆系统的地址。
1
2
3
4
5
6
文件名:netconfig.sh
#!/bin/bash
ens33=/etc/sysconfig/network-scripts/ifcfg-ens33
if [ "$1" = "" ]; then exit 3; fi
sed -i 's/IPADDR=.*/IPADDR=172.16.212.1'$1'/' $ens33
sed -i 's/UUID=.*/UUID='`uuidgen`'/g' $ens33
  • 根据下图先从1号系统克隆出6、7和9号系统CentOS系统。
    image
  • 克隆后,运行脚本./netconfig.sh 6 改变系统ip地址。
  • 启动sshd服务,方便主机通过ssh连接系统,命令:service sshd start。
  1. 安装Nginx
  • 更新下yum源。
  • 安装依赖包
-y install gcc pcre-devel openssl-devel ```
1
2
- 下载安装包。
``` wget http://nginx.org/download/nginx-1.14.0.tar.gz
  • 解压文件。
zxvf nginx-1.14.0```
1
2
- 编译安装,并增加http\_realip_module模块。
``` ./configure --with-http_ssl_module --with-http_realip_module && make && make install
  • 创建软链接到/usr/local/sbin目录中,该目录在PATH变量中,所以直接创建软链接之后,就可以直接使用nginx命令。
-s/usr/local/sbin/nginx ```
1
- 在CentOS中,service命令实际上是调用了/etc/init.d目录下的shell脚本。所以编写nginx的shell脚本,将脚本放在/etc/init.d/目录下。
#! /bin/bash
DAEMON=/usr/local/nginx/sbin/nginx
case "$1" in
    start)
        echo "Starting nginx daemon..."
        $DAEMON && echo "SUCCESS"
    ;;
    stop)
        echo "Stopping nginx daemon..."
        $DAEMON -s quit && echo "SUCCESS"
    ;;
    reload)
        echo "Reloading nginx daemon..."
        $DAEMON -s reload && echo "SUCCESS"
    ;;
    restart)
        echo "Restarting nginx daemon..."
        $DAEMON -s quit
        $DAEMON && echo "SUCCESS"
    ;;
    *)
        echo "Usage: service nginx (start|stop|restart|reload)"
        exit 2
    ;;
esac
1
- 设置开机启动:chkconfig --add nginx
报错:error reading information on service nginx: Invalid argument
目前不知道如何解决。
1
- 配置并启动Nginx。
# useradd -s /sbin/nologin -M www
# mkdir -p /data/www
# cp ../html/* /data/www
# chown -R www:www /data/www
# vi ../conf/nginx.conf
改动部分如下:
# configure user
user  www www;
worker_processes  1;

# modify server block:

    server {
        listen       80;
        server_name  localhost;
	root /data/www;
	index index.html index.htm;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        #error_page   500 502 503 504  /50x.html;
        #location = /50x.html {
        #    root   html;
        #}

# firewall-cmd --zone=public --add-port=80/tcp --permanent # 开放80端口。
1
2
3
4
5
6
7
- 查看nginx是否启动:ps -aux |grep nginx
- 查看nginx监听端口:netstat -an | grep 80
- CentOS中,无netstat和ifconfig命令,需安装:yum install net-tools。
- 在游览器中访问地址,成功打开nginx欢迎页面。
![image](https://note.youdao.com/yws/api/personal/file/WEB5c5cb87d060b173a95b4d4ff6b28ad66?method=download&shareKey=77b7e46502ecf5851deafeec193416b0)
- 克隆虚拟机,基于1号服务器克隆出两台虚拟机,作为2、3号服务器使用。使用前面的netconfig.sh脚本进行网络配置。
- 配置物理机的hosts文件,完成配置后,在游览器中分别访问这几个域名。
172.16.212.11 itshop.test
172.16.212.11 www.itshop.test
172.16.212.12 file.itshop.test
172.16.212.13 upload.itshop.test
1
2
3
3. Nginx + PHP服务器搭建
- 在3号服务器上安装PHP。安装完后php -v显示php版本信息。
- 部署Nginx + PHP环境
cp php.ini-production /usr/local/php/lib/php.ini  # 复制php.ini配置你文件
vi /usr/local/php/lib/php.ini  # 配置时区为PRC?

# 创建服务脚本、设置开机启动
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
chkconfig --add php-fpm

# 复制php-fpm配置文件、启动服务
cd /usr/local/php/etc
cp php-fpm.conf.default php-fpm.conf
cd php-fpm.d
cp www.conf.default www.conf
vi www.conf
更改如下:
[www]
user=www
group=www
listen=/tmp/php-cgi.sock
listen.owner=www
listen.group=www

#启动php-fpm
service php-fpm start

# 在Nginx配置文件中加入PHP支持,server模块。
location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass   unix:/tmp/php-cgi.sock;
        include        fastcgi.conf
    }

# 测试,在/data/www下创建index.php内容如下:
<?php
phpinfo();
?>

# 在游览器中地址输入ip:/index.php
1
2
3
![image](https://note.youdao.com/yws/api/personal/file/WEBcacc65278849272bd250c13788d520c3?method=download&shareKey=a262787ec230fc14cb2257fc34e18f88)
- 克隆虚拟机,基于3号服务器克隆出4号和5号虚拟机,并用脚本配置网络。
- 配合防火墙,4、5号服务器不需要被外部访问,只允许1号负载均衡服务器的IP地址进行访问。
// TODO  未完成
1
2
3
- 配置反向代理和负载均衡
![image](https://note.youdao.com/yws/api/personal/file/WEBc1fa6f184b9413cee095af0ba3c73911?method=download&shareKey=6a33442152b2f0d02333cba283fc9612)
- 还需在后端服务器nginx中配置如下
real_ip_header X-Real-IP;
set_real_ip_from 
1
2
3
4
- 访问172.16.212.11/index.php查看其中的server_addr为后端服务器ip交替出现。
4. 搭建NFS文件服务器。
- 为了使23号服务器能够同时访问6号服务器中的文件,就需要利用NFS实现文件共享。
- 在6号服务器中,执行命令:yum -y install nfs-utils,之后配置NFS端口号。
# vi /etc/sysconfig/nfs

#找到如下一行,取消注释
MOUNTD_PORT=892
1
- 开启服务
# 开启rpcbind服务
# service rpcbind start
# 开启nfs服务
# service nfs start
# 配置NFS服务开机自动自启
chkconfig nfs on

# 开启与NFS相关的端口号 TODO 未成功
iptables -I INPUT -p udp --dport 111 -j ACCEPT
iptables -I INPUT -p udp --dport 892 -j ACCEPT
iptables -I INPUT -p tcp --dport 2049 -j ACCEPT
iptables save  # TODO 没用
解决方法:
http://blog.163.com/xavier_666/blog/static/25884000720163299503423/
1
- 配置共享目录
# 创建用于共享的目录
mkdir /share
chmod 777 /share
# 配置/share为共享目录,语法是“路径 IP段(权限)”, 任意IP为*表示
echo '/share *(rw)' > /etc/exports
注: *号与(rw)之间并没有空格
# 使配置生效
service nfs reload
1
- 在2号服务器中挂载NFS共享目录,实现远程文件的读写操作。
# 安装NFS软件包
yum -y install nfs-utils
# 查看NFS服务器中的共享目录
showmout -e 172.16.212.16

# 将NFS服务器中的共享/share目录挂载到本地目录"/data/share"(也可以是其他目录)
mkdir /data/share
mount 172.15.212.15:/share /data/share

# 读写文件测试
cd /data/share
echo Hello  >test.txt
cat test.txt

# 使2号服务器开启自动挂载NFS目录
echo '172.16.212.16:/share /data/share nfs defaults 0 0' >> /etc/fstab
1
2
3
4
5
- 在2号服务器中配置文件缓存。通过部署文件缓存服务器降低后端文件存储服务器的压力。
![image](https://note.youdao.com/yws/api/personal/file/WEBb66f7180d6ba8085b9832efe20000900?method=download&shareKey=0eb6d6d844c9ab099aaf94c748765dcd)
5. 配置文件上传服务器,3号服务器。
- 挂载NFS共享目录
- 配置Nginx对请求数据量的限制。
#在server块中
client_max_body_size 20m;
另外,在php.ini中对于上传文件的限制,增加到10M.
# vi /usr/local/php/lib/php.ini
post_max_size=20M  # 通过POST提交的最大限制
file_uploads=On    # 是否允许文件上传
upload_max_filesize=10M    # 上传文件最大限制
;upload_tmp_dir=           # 上传文件临时保存目录,默认为/tmp目录

# 重启服务
service php-fpm reload
servcie nginx reload
1
- 上传文件测试 在第三个服务器上编写如下脚本页面:
Download"; } }
1
2
3
4
5
6
- 测试后,发现6号文件服务器中/share/upload/目录下存在上传的文件。
6. 搭建MySQL数据库服务器。
- 安装依赖包 yum -y install gcc-c++ cmake ncurses-devel
- 下载免安装的mysql,解压文件到/usr/local。
- 在/etc/bashrc中设置环境变量添加指向Mysql下bin目录。
- 配置MySQL。
vi /etc/my.cnf #找到如下配置进行更改 datadir=/data/mysql socket=/tmp/mysql.sock user=mysql
# 根据my.cnf中的配置,创建mysql用户
useradd -s /sbin/nologin -M mysql

# 运行mysql_install_db程序初始化数据库,初始化后将会在数据库中保存目录中生成的数据库文件
./scripts/mysql_install_db  [ 未完成 ]
#启动MySql
在mysql目录的bin目录下启动mysqld
#配置防火墙允许3306端口访问。
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

# 启动mysql后修改密码
./mysqladmin -uroot -pCcRH#UK2Nztn password 123456
1
2
3
- 实现MySQL主从复制
- 基于7号服务器克隆出8号服务器,配置网络信息。
- 主数据库服务器开启bin日志
# vi /etc/my.conf
log-bin=mysqlbin-log
server-id=17
1
- 创建用于从数据库登录主数据库的用户
CREATE USER 'slave'@'172.16.212.18' IDENTIFIED BY '123456';
1
- 配置从服务器。
mysql> CHANGE MASTER TO master_host='172.16.212.17', master_user='slave', \
-> master_password='123456', master_log_file='mysqlbin-log.000002', master_log_pos=639;

mysql> start slave;

mysql> show slave status \G

# 若要停止从服务器同步,在从服务器mysql中执行
slave stop

# 检测 TODO 主从数据库  相关命令
在主数据库中插入数据,从数据库中同样也插入数据。
在从数据库中插入数据,在主数据库中并不能看到数据。
成功。
1
2
3
7. 搭建Memcached缓存服务器。
- 安装依赖包:yum -y install gcc libevent-devel
- 编译安装Memcached
tar -zxvf memcached-1.5.8.tar.gz
cd memcached-1.5.8
./configure
make && make install
1
- 添加系统服务、配置开机自启
cd scripts
cp memcached-init /etc/init.d/memcached
chkconfig --add memcached
1
- 在memcached服务脚本中还调用了start-memcached脚本,需拷贝
mkdir -p /usr/share/memcached/scripts
cp start-memcached /usr/share/memcached/scripts/
1
- 为start-memcached脚本创建连接
ln -s /usr/local/bin/memcached /usr/bin/memcached
1
- 目前还不能通过service命令启动memcached服务,因为memcached中的脚本依赖于perl和start-stop-daemon,需单独下载。
tar -xvf dpkg_1.13.11.tar.gz 
cd dpkg-1.13.11/
./configure --without-libselinux && make
cp utils/start-stop-daemon /usr/local/sbin/
1
- 启动Memcached服务。
vi /etc/memcached.conf 创建配置文件,内容如下:
-m 512      # 分配的内存大小,单位是MB,默认为64MB
-p 11211    # 配置监听的TCP端口,默认为11211
-u nobody   # 配置Memcached的工作用户
-c 1024     # 配置最高并发连接数,默认1024
-t 16       # 配置使用的线程数,默认为4

注:可以通过:/usr/local/bin/memcached -H 查看说明,根据服务器的硬件配置。

service memcached start
iptables -I INPUT -p tcp --dport 11211 -j ACCEPT
1
- PHP访问Memcached。
将PHP的Memcached扩展和libmemcached下载到3、4、5号服务器中,进行以下安装过程:
# 安装依赖包
yum -y install cyrus-sasl-devel
# 编译安装libmemcached
tar -zxvf libmemcached-1.0.18.tar.gz 
cd libmemcached-1.0.18
./configure && make && make install && cd ..

# php7 这种方法不行
# 为PHP的Memcached扩展生成configure文件
tar -zxvf memcached-2.2.0.tgz
cd memcached-2.2.0
/usr/local/php/bin/phpize
# 编译安装PHP的Memcached扩展
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install && cd ..

https://blog.csdn.net/xahuo/article/details/50372736

# 在PHP配置文件php.ini中加载Memcached扩展
vi /usr/local/php/lib/php.ini
; memcached extension
extension=usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/memcached.so
# PHP_FPM重新加载配置
service php-fpm reload

# 在/data/www下编写测试页面test.php
<?php
$mem=new Memcached();
$mem->addServer('172.16.212.19', 11211);
$mem->set('UserName', 'James');
echo $mem->get('UserName');
?>

# 使用telnet测试端口是否可以访问: telnet 172.16.212.19 11211
# 9号服务器需要打开端口
iptables -I INPUT -p tcp --dport 11211 -j ACCEPT
# 访问成功
1
2
8. ThinkPHP项目部署
- 创建MySQL独立数据库用户
# 在7号服务器中启动MySql客户端,登录MySql服务器
mysql -uroot -p123456
# 创建数据库
CREATE DATABASE itshop;
# 为4、5号服务器创建无权限用户itshop,密码为123456
create user 'itshop'@'172.16.212.14' identified by '123456';
create user 'itshop'@'172.16.212.15' identified by '123456';
# 为用户分配指定数据库的权限