LNMP分布式集群(机器的安装与克隆与软件配置与案例测试完整版)
文章目录
- 一、实验目的
- 二、实验环境(本实验的硬件和软件环境)
- 三、实验实现过程(请写出实验步骤与结果截图)
- 1、LNMP分布式部署结构图
- (1)安装CentOS6.1
- (2)内存配额控制
- 2、机器的安装与克隆
- A 安装centos(略)
- B创建脚本文件 netconfig.sh
- 克隆虚拟机1、6、7、9,并配置网卡
- 1号服务器部署Nginx环境
- 克隆虚拟机 2,3
- 编辑hosts文件
- 3、Nginx+PHP服务器搭建
- 4、克隆4号和5号虚拟机
- 配置防火墙
- 5、配置反向代理和负载均衡
- 6、搭建NFS文件服务器
- 1) 安装和启动NFS服务
- 2)配置共享目录
- 7、配置文件缓存服务器
- (1)配置Nginx缓存功能
- 8、配置文件上传服务器
- (1)挂载NFS共享目录
- (2)配置Nginx对请求数据量的限制
- 9、搭建MySQL数据库服务器
- (1)编译安装MySQL
- (2)配置MySQL
- (3)启动MySQL并添加到服务
- (4)配置MySQL中的用户
- 10、实现MySQL主从复制
- (1)克隆虚拟机
- (2)主服务器开启bin日志
- (3)创建用于主从复制的用户
- (3)查看主服务器bin日志状态
- (4)配置从服务器
- (5)测试同步情况
- 11、搭建Memcached缓存服务器
- (1) 编译安装Memcached
- (2) 启动Memcached服务
- (3) PHP访问Memcached
- 11、ThinkPHP项目部署
- (1) 创建MySQL独立数据库用户
- (2) 上传项目文件到站点目录
- (3) 配置项目数据库
- (4) 单一入口配置(报错没关系)
- 12、利用Memcached保存Session
- 13、文件上传下载分离
- 大工告成!!!
一、实验目的
1、掌握分布式集群的原理
2、掌握LNMP分布式部署
(1) centos的安装与克隆及网络的配置
(2) 部署Nginx环境
(3) Nginx+PHP服务器搭建
(4) 配置反向代理和负载均衡
二、实验环境(本实验的硬件和软件环境)
硬件:PC电脑一台;
配置: centos6.10系统
软件:VMware16及以上
三、实验实现过程(请写出实验步骤与结果截图)
1、LNMP分布式部署结构图


(1)安装CentOS6.1
在完成1号服务器的Linux系统安装后,可以利用VMware克隆出其他服务器。

(2)内存配额控制
内存配额控制的原因:防止物理机内存不足。
若物理机有8G内存,推荐为每台虚拟机分配512M;
若物理机有4G内存,则可以在虚拟机安装CentOS系统后利用VMware降低内存大小为256M;
若物理机内存低于4G,则建议减少虚拟机的数量,在一台虚拟机中安装多个服务,利用不同的端口号来
区分。
2、机器的安装与克隆
- 0号机的安装(只安装centos )
A 安装centos(略)
打开配置文件后,参考表进行编辑,从而使虚拟机能够访问网络。
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0ONBOOT=yes BOOTPROTO=static IPADDR=192.168.78.10
NETMASK=255.255.255.0 GATEWAY=192.168.78.2 DNS1=192.168.78.2[root@localhost ~]#service network reload
B创建脚本文件 netconfig.sh
1. #!/bin/bash
2. eth0=/etc/sysconfig/network-scripts/ifcfg-eth0
3. mac=`ifconfig -a |grep -o HWaddr.* |cut -c 8-24`
4. if [ "$1" = "" ]||[ "$mac" = "" ]; then exit 3; fi
5. sed -i 's/IPADDR=.*/IPADDR=192.168.78.1'$1'/g' $eth0
6. sed -i 's/HWADDR=.*/HWADDR='$mac'/g' $eth0
7. sed -i 's/UUID=.*/UUID='`uuidgen`'/g' $eth0
8. start_udev
第3行用于获取当前网卡的MAC地址;
第5~7行用于对eth0网卡配置文件中的IP地址、MAC地址和UUID(唯一识别码)执行文本替换。其中,IP地址的末尾数字通过参数传入,MAC地址替换为新MAC地址,UUID通过uuidgen命令自动生成;
第8行的start_dev命令用于更新设备,更新后eth0网卡将恢复可用;
保存文件后,执行“chmod +x netconfig.sh”命令为脚本添加可执行权限。
chmod +x netconfig.sh
克隆虚拟机1、6、7、9,并配置网卡
使用VMware基于0号服务器克隆出4台新虚拟机,分别作为1、6、7、9号服务器。在克隆后启动新虚拟机进行网卡配置,以6号服务器为例,执行如下命令进行配置。
#① 执行脚本,传入参数6(表示更改IP地址为192.168.78.16)
[root@localhost ~]# ./netconfig.sh 6
Starting udev: [ OK ]
② 查看更改后的网卡信息
[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:8F:15:2Binet addr:192.168.78.16 Bcast:192.168.78.255 Mask:255.255.255.0
从运行结果可以看出,执行脚本后,网卡的MAC地址和IP地址已经修改成功。按照同样的方式,再为1、7、9号服务器进行网卡配置即可
1号服务器部署Nginx环境
#① 安装依赖包
[root@localhost ~]# yum -y install gcc pcre-devel openssl-devel
注意:如果安装不了,请看按下面的操作
[root@localhost ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
下面两程方面选一种完成即可。
A. 从课件中下载CentOS-Base.repo 并将它放在/etc/yum.repos.d/ 下
B. (也可以自行到http://mirrors.aliyun.com/repo/Centos-6.repo 下载,并改名为:CentOS-Base.repo并将它放在/etc/yum.repos.d/ 下)
再执行 yum -y install gcc pcre-devel openssl-devel
C. 看我另一篇文章执行几行命令
② 解压文件
[root@localhost ~]# tar -vzxf nginx-1.16.1.tar.gz
[root@localhost ~]# cd nginx-1.16.1
#③ 编译安装Nginx,增加http_realip_module模块(后面会用到)
[root@localhost nginx-1.16.1]# ./configure --with-http_ssl_module --with-http_realip_module
[root@localhost nginx-1.16.1]# make && make install
④ 添加环境变量、创建服务脚本、设置开机启动
[root@localhost nginx-1.16.1]# cd /usr/local/nginx/sbin
[root@localhost sbin]# ln -s `pwd`/nginx /usr/local/sbin/nginx
[root@localhost sbin]# vim /etc/init.d/nginx # 脚本如下#!/bin/bash
#chkconfig:35 85 15
DAEMON=/usr/local/nginx/sbin/nginx
case "$1" instart )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[root@localhost sbin]# chmod +x /etc/init.d/nginx
[root@localhost ~]# chkconfig --add nginx #设置开机自启动
⑤ 创建用户“www”和站点目录“/data/www”
[root@localhost ~]# useradd -s /sbin/nologin -M www
[root@localhost ~]# mkdir -p /data/www
[root@localhost ~]# cd /usr/local/nginx
[root@localhost nginx]# cp html/* /data/www
[root@localhost nginx]# chown -R www:www /data/www
[root@localhost nginx]# vim conf/nginx.conf
user www www;
server {listen 80;server_name localhost;root /data/www;index index.html index.htm;}
[root@localhost nginx]# service nginx start
[root@localhost nginx]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
[root@localhost nginx]# service iptables save
克隆虚拟机 2,3
利用VMware基于1号服务器克隆出两台虚拟机,作为2、3号服务器使用。然后启动2、3号服务器,执行前面编写的netconfig.sh脚本进行网络配置,将IP地址分别设置为192.168.78.12和192.168.78.13。
编辑hosts文件
在本实验环境中,物理机将作为客户端访问服务器,因此需要在物理机中配置hosts文件解析域名。编辑C:\Windows\System32\drivers\etc\hosts文件。
192.168.78.11 itshop.test
192.168.78.11 www.itshop.test
192.168.78.12 file.itshop.test
192.168.78.13 upload.itshop.test
3、Nginx+PHP服务器搭建
编号为3、4、5的服务器需要安装PHP;
3号服务器用于提供文件上传服务,包括在客户端上传图片时,对图片进行压缩、生成缩略图、添加水印等处理,最后保存到6号的文件存储服务器中;
4、5号服务器是一个集群,用于执行网站的脚本程序。
1)在3号服务器中安装PHP,具体操作步骤如下
#① 安装依赖包
[root@localhost ~]# yum -y install gcc-c++ libxml2-devel curl-devel \
> libjpeg-devel libpng-devel freetype-devel
[root@localhost ~]# tar -zxvf libmcrypt-2.5.8.tar.gz
[root@localhost ~]# cd libmcrypt-2.5.8
[root@localhost libmcrypt-2.5.8]# ./configure && make && make install && cd ..
② 编译安装PHP
[root@localhost ~]# tar -zxvf php-5.6.27.tar.gz
[root@localhost ~]# cd php-5.6.27
[root@localhost php-5.6.27]# ./configure --prefix=/usr/local/php --enable-fpm \
--with-zlib --enable-zip --enable-mbstring --with-mcrypt --with-mysql \
--with-mysqli --with-pdo-mysql --with-gd --with-jpeg-dir --with-png-dir \
--with-freetype-dir --with-curl --with-openssl --with-mhash --enable-bcmath \
--enable-opcache && make && make install
2)部署Nginx+PHP环境
#① 复制php.ini配置文件
[root@localhost php-5.6.27]# cp php.ini-production /usr/local/php/lib/php.ini
配置时区为PRC
[root@localhost php-5.6.27]# vim /usr/local/php/lib/php.ini

② 创建服务脚本、设置开机启动
[root@localhost php-5.6.27]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@localhost php-5.6.27]# chmod +x /etc/init.d/php-fpm
[root@localhost php-5.6.27]# chkconfig --add php-fpm
③复制php-fpm配置文件、启动服务
[root@localhos
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
[root@localhost etc]# vim php-fpm.conf# 更改“[www]”下的配置user = www # 子进程工作用户
group = www # 子进程工作组
listen = /tmp/php-cgi.sock # 监听socket文件
listen.owner = www # socket文件的所有者
listen.group = www # socket文件的所属组
[root@localhost etc]# service php-fpm start
④ 在Nginx配置文件中加入PHP支持
[root@localhost etc]# vi /usr/local/nginx/conf/nginx.conf在server块中进行如下配置:server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;root /data/www;index index.html index.htm index.php;location ~ \.php$ {try_files $uri = 404;fastcgi_pass unix:/tmp/php-cgi.sock;include fastcgi.conf;}[root@localhost etc]#
以用phpinfo来检查环境是否正常
[root@localhost nginx]# vim /data/www/index.php
<?php
echo "phptest";
phpinfo();
?>
4、克隆4号和5号虚拟机
基于3号虚拟机克隆出4号和5号虚拟机,然后启动虚拟机,利用netconfig.sh脚本配置网络,将IP地址分别设置为192.168.78.14和192.168.78.15。(具体操作参考上面)
配置防火墙
由于4、5号服务器不需要直接被外部访问,因此可以更改防火墙规则,实现只允许1号负载均衡服务器的IP地址访问,具体操作如下。
① 查看原有80端口规则的序号(即输出结果中第1列的数字)
[root@localhost ~]# service iptables status | grep 80
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
② 修改序号为1的规则,利用选项“-s”指定来源IP地址为192.168.78.11
[root@localhost ~]# iptables -R INPUT 1 -s192.168.78.11 -ptcp --dport 80 -jACCEPT
③ 保存防火墙配置
[root@localhost ~]# service iptables save
完成上述配置后,在物理机中使用浏览器访问4、5号服务器进行测试。若无法访问成功,说明防火墙配置生效。
5、配置反向代理和负载均衡
经过前面的操作,编号为4、5的服务器只能由1号服务器进行访问;
接下来在1号服务器中实现反向代理和负载均衡;
编辑Nginx安装目录下的conf/nginx.conf文件,具体配置如下。
upstream web_server {server 192.168.78.14;server 192.168.78.15;keepalive 32; # 与后端服务器保持的长连接数}server {listen 80;server_name itshop.test www.itshop.test;location / {proxy_pass http://web_server;proxy_http_version 1.1; # 后端服务器使用HTTP 1.1proxy_set_header Connection ""; # 清空客户端Connection消息头proxy_set_header Host $host; # 传递请求中的Host消息头proxy_set_header X-Real-IP $remote_addr; # 传递真实客户端IP}}
上述配置利用X-Real-IP请求头传递了真实客户端IP;为了使后端4、5号服务器将来自1号服务器的X-Real-IP请求头识别为客户端IP,还需要在4、5号服务器的server块中添加以下配置。
real_ip_header X-Real-IP; # 从指定消息头获取真实客户端IP
set_real_ip_from 192.168.78.11; # 只从来自指定IP的请求中获取X-Real-IP
完成上述操作并重新加载配置文件后,可以在4、5号服务器中创建phpinfo文件;
然后使用浏览器访问1号服务器,反复刷新页面,查看phpinfo显示的服务器IP和客户端IP是否正确。
6、搭建NFS文件服务器
NFS(Network File System,网络文件系统):是一种用于在网络中共享文件的系统。
作用:通过使用NFS,用户可以用访问本地文件的操作方式来访问远程服务器中的文件。
在前面部署的服务器中
3号服务器用于将客户端上传的文件保存到6号服务器中存储
2号服务器需要将客户端访问的文件从6号服务器中取出来并进行缓存
为使2、3号服务器能同时访问6号服务器中的文件,就需利用NFS实现文件共享。
1) 安装和启动NFS服务
在6号服务器中安装nfs-utils软件包即可搭建NFS服务,具体命令下。
[root@localhost ~]# yum -y install nfs-utils
上述命令执行完成后,按照如下操作修改NFS的配置文件,配置固定端口号。
[root@localhost ~]# vim /etc/sysconfig/nfs
找到如下一行内容,取消注释
MOUNTD_PORT=892
在完成端口号的配置后,即可启动NFS服务。由于NFS服务依赖于rpcbind服务,需要在开启NFS服务前先开启rpcbind服务,具体操作如下。
① 开启rpcbind服务
[root@localhost ~]# service rpcbind start
Starting rpcbind: [ OK ]
② 开启nfs服务
[root@localhost ~]# service nfs start
Starting NFS services: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
③ 配置NFS服务开机自动启动
[root@localhost ~]# chkconfig nfs on
接下来配置iptables防火墙,允许远程计算机访问。NFS主要依赖的端口号如表所示。
端口号 服务 说明
111 portmapper 用于端口映射
892 rpc.mountd 用于管理NFS文件系统
2049 nfs NFS服务本身的端口号
在NFS服务器的防火墙中开放上述端口即可,具体操作如下。
[root@localhost ~]# iptables -I INPUT -p udp --dport 111 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p udp --dport 892 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp --dport 2049 -j ACCEPT
[root@localhost ~]# service iptables save
2)配置共享目录
利用NFS可以将某个指定目录配置为共享目录,允许外部计算机访问。
#① 创建用于共享的目录
[root@localhost ~]# mkdir /share
② 将目录权限设为777,从而允许远程客户端操作
[root@localhost ~]# chmod 777 /share
③ 配置/share为共享目录,语法是“路径 IP段(权限) ”,任意IP用“*”表示
[root@localhost ~]# echo '/share *(rw)' > /etc/exports
④ 重新加载NFS共享配置,使更改后的配置生效
[root@localhost ~]# service nfs reload
完成上述配置后,在2号服务器中挂载NFS共享目录,实现远程文件的读写操作。
若要挂载NFS共享目录,需要先安装NFS软件包;
mount命令用于挂载文件系统;
直接执行mount命令(无选项和参数)可以查看系统中所有的挂载情况;
执行“umount 路径”命令可以将指定路径取消挂载。
① 安装NFS软件包
[root@localhost ~]# yum -y install nfs-utils
#② 查看NFS服务器中的共享目录
[root@localhost var]# showmount -e 192.168.78.16
Export list for 192.168.78.16:
/share *
③ 将NFS服务器共享的“/share”目录挂载到本地目录“/data/share”(也可以是其他目录)
[root@localhost ~]# mkdir /data/share
[root@localhost ~]# mount 192.168.78.16:/share /data/share
④ 读写文件测试
[root@localhost ~]# cd /data/share
[root@localhost share]# echo Hello > test.txt
[root@localhost share]# cat test.txt
Hello
为了检查6号服务器是否保存了test.txt文件,可以在“/share”目录中查看。
[root@localhost ~]# cd /share
[root@localhost share]# ll test.txt
-rw-r--r--. 1 nfsnobody nfsnobody 6 May 24 00:24 test.txt
从上述结果可以看出,NFS服务器保存了来自客户端(即2号服务器)的text.txt文件,且该文件所属的用户和用户组都是nfsnobody。
nfsnobody是在安装NFS软件包后自动创建的用户,在/etc/passwd文件中可以查看该用户的详细信息,如下所示。
[root@localhost ~]# cat /etc/passwd | grep nfsnobody
nfsnobody❌65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
另外,由于mount命令只能临时挂载目录,重启后失效。为了使2号服务器开机后自动挂载共享目录,需要在系统的“/etc/fstab”文件中,配置开机时自动读取的文件系统信息。根据该文件的语法,通过如下命令新增一行配置,实现自动挂载NFS目录。
[root@localhost ~]# echo '192.168.78.16:/share /data/share nfs defaults 0 0' \
>> /etc/fstab
上面的第一个“0”:此处为1的话,表示要将整个里的内容备份;为0的话,表示不备份。现在很少用到dump这个工具,在这里一般选0。
上面的第二个“0”:这里用来指定如何使用fsck来检查硬盘。如果这里填0,则不检查;挂载点为 / 的(即根分区),必须在这里填写1,其他的都不能填写1。
7、配置文件缓存服务器
例如,一个电子商务网站需要存储大量的商品图片,这些图片是由网站后台的工作人员在编辑商品信息时上传的,每当客户浏览商品信息时就会将这些图片展示出来。当网站的规模和访问量越来越大时,对于经常访问的文件进行缓存就显得非常重要。
下面将在2号服务器中配置Nginx缓存功能,通过部署文件缓存服务器降低后端文件存储服务器的压力。
(1)配置Nginx缓存功能
打开Nginx的配置文件,在http块中添加如下配置,定义缓存的基本规则和保存目录。
proxy_temp_path proxy_temp;
proxy_cache_path proxy_cache levels=1:2 keys_zone=one:80m inactive=7d max_size=4g;
接下来在server块中添加具体的缓存配置,具体如下。
server {listen 80;server_name file.itshop.test;add_header X-Cache $upstream_cache_status;location / {proxy_pass http://web_server;proxy_http_version 1.1;proxy_set_header Connection "";proxy_cache one;proxy_cache_key $host$uri$is_args$args;proxy_cache_valid 200 304 2d;}
}
upstream web_server {server localhost:81;keepalive 32;
}
server {listen 81;server_name localhost;root /data/share;index index.html index.htm;
}
另外,当服务器更新了一些CSS、JS文件时,为了避免缓存导致无法即时生效,可以在链接中加上URL参数保存版本号,从而在版本更新时重新缓存。示例HTML代码如下。
<link rel="stylesheet" type="text/css" href="style.css?ver=1.0" />
<script type="text/javascript" src="common.js?ver=20161118"></script>
8、配置文件上传服务器
在完成文件下载服务器后,接下来将3号服务器配置为文件上传服务器,实现接收用户上传的文件保存到共享目录中。下面通过具体操作步骤进行讲解。
(1)挂载NFS共享目录
按照之前2号服务器的挂载方式,为3号服务器挂载共享目录,具体步骤如下。
① 安装NFS软件包
[root@localhost ~]# yum -y install nfs-utils
② 创建目录并进行挂载
[root@localhost ~]# mkdir /data/share
[root@localhost ~]# mount 192.168.78.16:/share /data/share
③ 实现开机自动挂载
[root@localhost ~]# echo '192.168.78.16:/share /data/share nfs defaults 0 0' \
>> /etc/fstab
(2)配置Nginx对请求数据量的限制
Nginx默认对客户端请求的数据限制为1M,超过指定大小将返回413错误。
指令:client_max_body_size指令可以更改这个限制;
范围:该指令可以用于http、server、location块中;
接下来,在Nginx配置文件的server块中将最大数据量提高到20M,具体配置如下。
client_max_body_size 20m;
另外,还需要注意php.ini中对于上传文件的限制,
将限制增加到10M。
[root@localhost ~]# vim /usr/local/php/lib/php.ini
post_max_size = 20M # 通过POST提交的最大限制
file_uploads = On # 是否允许文件上传
upload_max_filesize = 10M # 上传文件最大限制
;upload_tmp_dir = # 上传文件临时保存目录(默认使用/tmp目录)
完成上述配置的更改后,执行如下命令使配置生效。
[root@localhost ~]# service php-fpm reload
[root@localhost ~]# service nginx reload
(3)上传文件测试
在站点目录下编写一个uploadtest.php文件进行上传测试
[root@localhost ~]#vim /data/www/uploadtest.php<form method="post" enctype="multipart/form-data"><input type="file" name="up"><input type="submit">
</form>
<?php
if (isset($_FILES['up']) && $_FILES['up']['error'] == 0){$upFile=$_FILES['up'];
$filename=$_FILES['up']['name'];$savepath = 'uploads/'.$filename.'.dat'; if(move_uploaded_file($_FILES['up']['tmp_name'], "/data/share/$savepath")){echo "File: Download";}
}
为了确保PHP保存上传文件,需要预先创建uploads目录并设置777权限。
[root@localhost ~]#cd /data/share
[root@localhost ~]#mkdir -m 777 uploads
9、搭建MySQL数据库服务器
概念:MySQL数据库是一个开放源代码的关系型数据库管理系统;
特点:具有低成本、跨平台、高性能等特点,在Web应用领域广受欢迎。
(1)编译安装MySQL
将MySQL源码包下载到之前部署的7号服务器中,然后通过如下步骤进行安装。
① 安装依赖包
[root@localhost ~]# yum -y install gcc-c++ cmake ncurses-devel wget
② 解压文件,编译安装MySQL
[root@localhost ~]#wget https://cdn.mysql.com/archives/mysql-5.5/mysql-5.5.53.tar.gz
[root@localhost ~]# tar -zxvf mysql-5.5.53.tar.gz
[root@localhost ~]# cd mysql-5.5.53
[root@localhost mysql-5.5.53]# cmake -DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
[root@localhost mysql-5.5.53]# make && make install && cd ..
(2)配置MySQL
MySQL默认配置文件位于“/etc/my.cnf”,在MySQL安装后需要配置数据保存目录、sock文件保存目录和工作用户。具体操作如下。
① 编辑MySQL的配置文件
[root@localhost ~]# vim /etc/my.cnf
找到如下配置进行更改
datadir=/data/mysql # 数据保存目录
socket=/tmp/mysql.sock # sock文件保存目录
user=mysql # MySQL的工作用户
② 根据my.cnf中的配置,创建mysql用户
[root@localhost ~]# useradd -s /sbin/nologin -M mysql
(3)启动MySQL并添加到服务
在完成配置后,执行MySQL中的mysql_install_db程序初始化数据库,初始化后将会在数据保存目录中生成数据库文件。具体操作如下。
[root@localhost ~]# cd /usr/local/mysql
[root@localhost mysql]# ./scripts/mysql_install_db
完成MySQL的配置和数据库初始化后,即可启动MySQL服务。具体操作如下。
[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysql
[root@localhost mysql]# chkconfig --add mysql
[root@localhost mysql]# service mysql start
MySQL默认监听3306端口。启动MySQL后,可以用如下命令查看MySQL正在监听的端口。
[root@localhost ~]# netstat -tnlp | grep mysql
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 15919/mysqld
另外,为了允许集群中的其他服务器通过3306端口访问MySQL服务器,还需要配置防火墙规则,开放3306端口,具体操作如下。
[root@localhost ~]# iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
[root@localhost ~]# service iptables save
(4)配置MySQL中的用户
MySQL数据库管理系统通过用户身份机制来管理数据库。
在安装数据库后,MySQL提供了一个拥有最高权限的root用户,在默认情况下并没有登录密码,且允许匿名登录。
为了保护数据库的安全,接下来对MySQL中的用户进行配置。
① 启动MySQL客户端工具,登录数据库
[root@localhost ~]# cd /usr/local/mysql/bin
[root@localhost bin]# ./mysql
② 在MySQL客户端中依次输入如下SQL语句执行:
mysql> UPDATE mysql.user SET password=password('123456') WHERE user='root';
mysql> DELETE FROM mysql.user WHERE user='';
mysql> FLUSH PRIVILEGES;
mysql> EXIT
③ 完成上述操作后,输入用户名root和密码123456重新登录
[root@localhost bin]# ./mysql -uroot -p123456
mysql> EXIT
10、实现MySQL主从复制
对于LNMP环境,最简单的部署方案是将Linux、Nginx、MySQL、PHP全部安装在一台服务器中,但这样的方案只适合小型网站。当网站中的数据达到一定规模以后,数据库最容易产生瓶颈。为了在集群环境中减轻数据库方面的压力,可以部署多台MySQL服务器实现主从复制。
(1)克隆虚拟机
在7号服务器中完成MySQL的安装后,克隆出8号服务器。克隆后启动8号服务器,执行netconfig.sh脚本配置网络,将IP地址设置为192.168.78.18。
(2)主服务器开启bin日志
MySQL的bin日志(二进制日志)功能用于记录数据发生的改变,可以用于数据库的增量备份、数据库之间的复制等操作。
在7号服务器中执行“vim /etc/my.cnf”命令编辑MySQL的配置文件,在“[mysqld]”节中添加如下配置,开启主服务器的bin日志功能。
[root@localhost ~]# vim /etc/my.cnflog-bin=mysqlbin-log
server-id=17
上述配置中,第1行表示创建bin日志并将日志文件命名为mysqlbin-log,第2行表示服务器的唯一ID,此处用IP地址的最后一位作为ID(也可以用其他值)。
在更改配置文件后,执行“service mysql restart”重启MySQL服务,然后在MySQL的数据目录下即可查看bin日志文件,如下所示。
[root@localhost ~]# service mysql restart
[root@localhost ~]# cd /data/mysql
[root@localhost mysql]# ll | grep mysqlbin
-rw-rw----. 1 mysql mysql 107 Nov 16 15:39 mysqlbin-log.000001
-rw-rw----. 1 mysql mysql 22 Nov 16 15:39 mysqlbin-log.index
上述文件是数据库生成的操作日志,这些文件由MySQL自动管理。当需要和其他服务器数据同步时,会通过这些日志来读取数据库的更改记录。
(3)创建用于主从复制的用户
主从复制的过程
“从服务器”(8号)获取“主服务器”(7号)中的数据以实现数据同步;
“从服务器”在获取数据时必须要使用一个用户账号来登录“主服务器”
接下来在“主服务器”中创建一个专门用于“从服务器”登录的用户账户。
7号:
① 登录MySQL服务器
[root@localhost ~]# /usr/local/mysql/bin/mysql -uroot -p123456
② 执行如下SQL语句创建用户,分配权限
用户名slave,密码123456,仅客户端192.168.78.18可登录,“.”表示可操作所有的数据库和表
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.78.18' IDENTIFIED BY '123456';
(3)查看主服务器bin日志状态
MySQL客户端程序中执行“SHOW MASTER STATUS”语句查看当前bin日志的状态,用于指定“从服务器”为了同步数据而读取“主服务器”二进制日志的位置。
上述输出结果中,File字段表示日志文件的名称,Position字段表示当前记录的位置。配置主从同步时,需要在“从服务器”中指定这些信息来确定同步的日志文件和位置。
(4)配置从服务器
在8号服务器中编辑/etc/my.cnf配置文件,配置“从服务器”的唯一ID。
[root@localhost ~]# vim /etc/my.cnfserver-id=18
在完成配置后,执行“service mysql restart”命令使配置生效。
[root@localhost ~]# service mysql restart
Shutting down MySQL. SUCCESS!
Starting MySQL.. SUCCESS!
使用MySQL客户端工具登录“从服务器”,执行如下SQL语句实现“从服务器”自动同步“主服务器”。具体操作如下。
[root@localhost ~]# /usr/local/mysql/bin/mysql -uroot -p123456
mysql> CHANGE MASTER TO master_host='192.168.78.17', master_user='slave',
master_password='123456', master_log_file='mysqlbin-log.000001', master_log_pos=262;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS \G
若看到Slave_IO_Running和Slave_SQL_Running两项的结果为yes,则说明当前已经配置成功。
另外,若要停止“从服务器”的同步,可以执行“SLAVE STOP”语句。
(5)测试同步情况
由于这两台服务器用于实现读写分离,由“主服务器”负责写数据的操作,“从服务器”负责读数据的操作,因此不需要“主服务器”同步“从服务器”中的数据。接下来对两台服务器分别进行读写,测试同步情况。
① 在“主服务器”中写入数据
mysql> CREATE TABLE test.a (id INT, num INT);
mysql> INSERT INTO test.a VALUES(1, 2);
② 在“从服务器”中读取数据
mysql> SELECT * FROM test.a \G
id: 1
num: 2
③ 在“从服务器”中写入数据
mysql> INSERT INTO test.a VALUES(3, 4);
④ 在“主服务器”中读取数据
mysql> SELECT * FROM test.a \G
id: 1
num: 2
11、搭建Memcached缓存服务器
Memcached:是一个高性能的分布式内存对象缓存系统。
作用:利用内存缓存一些被频繁访问的数据,从而减少MySQL数据库查询次数。
与基于磁盘的缓存对比:内存缓存具有非常高的读写性能,但无法持久保存数据,因此Memcached适合保存一些经常访问但不重要的数据,即使数据丢失也不会对业务造成影响。
(1) 编译安装Memcached
在将Memcached下载到9号服务器后,按照如下操作步骤进行安装。
① 安装依赖包
[root@localhost ~]# yum -y install gcc libevent-devel wget
[root@localhost ~]# wget http://memcached.org/files/memcached-1.4.33.tar.gz
② 编译安装Memcached
[root@localhost ~]# tar -zxvf memcached-1.4.33.tar.gz
[root@localhost ~]# cd memcached-1.4.33
[root@localhost memcached-1.4.33]# ./configure
[root@localhost memcached-1.4.33]# make && make install
③ 添加到系统服务、配置开机自动启动
[root@localhost memcached-1.4.33]# cd scripts
[root@localhost scripts]# cp memcached-init /etc/init.d/memcached
[root@localhost scripts]# chkconfig --add memcached
④ 在memcached服务脚本中还调用了start-memcached脚本,需要复制该脚本文件到指定路径
[root@localhost scripts]# mkdir -p /usr/share/memcached/scripts
[root@localhost scripts]# cp start-memcached /usr/share/memcached/scripts/
[root@localhost scripts]# cd ~
⑤ 为start-memcached脚本中指定的路径创建链接
[root@localhost ~]# ln -s /usr/local/bin/memcached /usr/bin/memcached
完成以上操作后,目前还无法通过service命令启动memcached服务,
这是因为memcached中的脚本依赖于perl和start-stop-daemon,其中start-stop-daemon是Debain系列发行版Linux系统中提供的命令,CentOS系统需要单独下载安装才可以使用。
① 从debain镜像中获取dpgk(Debian Packager)
[root@localhost ~]# yum -y install gcc-c++ perl xz ncurses-devel
[root@localhost ~]# wget \
http://ftp.de.debian.org/debian/pool/main/d/dpkg/dpkg_1.17.27.tar.xz
#② 单独编译start-stop-daemon
[root@localhost ~]# tar -xvf dpkg_1.17.27.tar.xz
[root@localhost ~]# cd dpkg-1.17.27
[root@localhost dpkg-1.17.27]# ./configure --without-libselinux && make
③ 将编译后的start-stop-daemon程序复制到“/usr/local/sbin/”目录中使用
[root@localhost dpkg-1.17.27]# cp utils/start-stop-daemon /usr/local/sbin/
当系统中系统中安装过openssl-devel,会自动安装libselinux-devel。
因此,为了解决系统中安装libselinux-devel之后导致dpkg编译失败的问题,在dpkg的编译选项中添加“–without-libselinux”。
(2) 启动Memcached服务
在启动Memcached服务前,先执行“vim /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”命令启动memcached服务。另外,为使其他服务器能够访问Memcached,需要配置防火墙,开放11211端口。
[root@localhost ~]# service memcached start[root@localhost ~]# iptables -I INPUT -p tcp --dport 11211 -j ACCEPT
[root@localhost ~]# service iptables save
(3) PHP访问Memcached
为了使PHP能够访问Memcached,需要在PHP中安装相应的扩展
Memcached扩展下载地址网址为:http://pecl.php.net的PECL(The PHP Extension Community Library,PHP社区扩展库)网站中获取;
依赖包libmemcached的下载地址:http://libmemcached.org。
将PHP的Memcached扩展和libmemcached下载到3、4、5号服务器中,按照以下步骤进行安装。
① 安装依赖包
[root@localhost ~]# yum -y install cyrus-sasl-devel
② 编译安装libmemcached
[root@localhost ~]# tar -zxvf libmemcached-1.0.18.tar.gz
[root@localhost ~]# cd libmemcached-1.0.18
[root@localhost libmemcached-1.0.18]# ./configure && make && make install && cd ..
③ 为PHP的Memcached扩展生成configure文件
[root@localhost ~]# tar -zxvf memcached-2.2.0.tgz
[root@localhost ~]# cd memcached-2.2.0
[root@localhost memcached-2.2.0]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226
④ 编译安装PHP的Memcached扩展
[root@localhost memcached-2.2.0]# ./configure \
--with-php-config=/usr/local/php/bin/php-config
[root@localhost memcached-2.2.0]# make && make install && cd ..
⑤ 在PHP的配置文件php.ini中加载Memcached扩展
[root@localhost ~]# vim /usr/local/php/lib/php.ini
添加如下配置:
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/memcached.so
⑥ PHP-FPM重新加载配置
[root@localhost ~]# service php-fpm reload
通过phpinfo可以查看该扩展的详细信息。也可以通过编写如下代码测试PHP是否能够访问Memcached服务器。
[root@192 nginx]# vim /data/www/testmc.php
<?php连接Memcached服务器
$mem = new Memcached();
$mem->addServer('192.168.78.19', 11211);
# 保存数据(Key/Value形式,Key=UserName,Value=James)
$mem->set('UserName', 'James');
# 获取数据(根据Key=UserName,获得Value)输出结果:James
echo $mem->get('UserName');
?>
11、ThinkPHP项目部署
本节通过部署一个基于ThinkPHP框架开发的电子商务网站为例,讲解如何将项目部署到集群中。
一个MySQL服务器中可以管理多个数据库,并且MySQL将自身的一些配置、用户账号、运行信息等也保存在数据库中。
大多数Web项目在开发时都会遵循一个项目只访问一个数据库的习惯,因此可以在MySQL中创建一个数据库,并提供一个只能访问该数据库的用户。
(1) 创建MySQL独立数据库用户
7号创建数据库和用户
/usr/local/mysql/bin/mysql -uroot -p123456
CREATE DATABASE itshop;
GRANT USAGE ON *.* TO 'itshop'@'192.168.78.14' IDENTIFIED BY '123456';
GRANT USAGE ON *.* TO 'itshop'@'192.168.78.15' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON itshop.* TO 'itshop'@'192.168.78.14';
GRANT ALL PRIVILEGES ON itshop.* TO 'itshop'@'192.168.78.15';
FLUSH PRIVILEGES;
EXIT
完成上述操作后,即可在4、5号两台Nginx+PHP服务器中访问MySQL数据库。
从安全角度考虑,上述操作在分配权限时遵循了最小权限原则,即为用户只赋予其完成的操作所必需的权限,这样可以在发生意外时将风险降到最低。
(2) 上传项目文件到站点目录
一个基于ThinkPHP 3.2.3框架开发的电子商务网站项目。将项目的压缩包上传到3、4、5号服务器中,解压到站点目录下,然后查看目录结构。
3、4、5号部署项目
[root@localhost ~]# tar -zxvf itshop-1.0.tar.gz
[root@localhost ~]# rm -rf /data/www
[root@localhost ~]# mv itshop-1.0/* /data/www
[root@localhost ~]# chown -R www:www /data/www
[root@localhost ~]# ll /data/www
(3) 配置项目数据库
在项目的目录中,data.sql是用于导入数据库的SQL文件,该文件保存了项目所需要创建的各种数据表。
接下来将data.sql文件下载到7号服务器,然后向数据库中导入该文件
curl -o data.sql http://192.168.78.13/data.sql
[root@localhost ~]# curl -o data.sql http://192.168.78.13/data.sql
[root@localhost ~]# ll data.sql
[root@localhost ~]# /usr/local/mysql/bin/mysql -uroot -p123456
mysql> use itshop;
Database changed
mysql> source /root/data.sql;
Query OK, 0 rows affected (0.00 sec)Query OK, 1 row affected (0.01 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.01 sec)
在4、5号服务器中对项目进行配置,从而能够访问数据。ThinkPHP框架支持分布式数据库和读写分离,只需参考官方手册简单配置即可。
[root@localhost ~]# cd /data/www/
[root@localhost www]# rm -f data.sql
[root@localhost www]# vim Application/Common/Conf/config.php//数据库配置'DB_DEPLOY_TYPE' => 1,'DB_RW_SEPARATE' => TRUE, 'DB_TYPE' => 'MYSQL', //数据库类型'DB_HOST' => '192.168.78.17,192.168.78.18', //服务器地址'DB_NAME' => 'itshop', //数据库名'DB_USER' => 'itshop', //用户名'DB_PWD' => '123456', //密码'DB_PORT' => '3306', //端口'DB_PREFIX' => 'shop_', //数据库表前缀'DB_CHARSET' => 'utf8', //数据库编码
(4) 单一入口配置(报错没关系)
以下四种方式都可以访问admin模块login控制器index操作
① URL参数方式,指定文件名
http://www.itshop.test/index.php?m=admin&c=login&a=index
② URL参数方式,省略文件名
http://www.itshop.test/?m=admin&c=login&a=index
③ PATHINFO方式,指定文件名
http://www.itshop.test/index.php/Admin/Login/index
④ PATHINFO方式,伪静态
http://www.itshop.test/Admin/Login/index.html
上述示例中,模块、控制器和操作都是ThinkPHP框架设计的机制,用于告知index.php入口程序当前用户访问的具体页面或功能。
第1种方式对环境没有特殊要求;
第2种方式需要配置Nginx的index指令使index.php作为默认页面,并注意其与index.html、index.htm的优先级;
第3、4种方式需要对Nginx进行更深入的配置,将文件不存在的地址内部重定向到index.php。
为实现第3、4种URL地址的需求,可以利用Nginx的try_files和rewrite指令。
接下来在4、5号服务器中编辑Nginx配置文件,在server块中重新进行PHP相关的配置。
# 针对PATHINFO方式配置重写规则
rewrite ^/index.php/(.*) /index.php?s=$1 break;
# 将文件不存在的请求内部重定向到index.php
location / {try_files $uri $uri/ /index.php?s=$uri;
}
# 防止静态文件不存在的请求被内部重定向到index.php
location ~ \.(gif|jpg|jpeg|png|bmg|swf|xml|ico|css|js|map|txt)$ {expires 30d;
}
# 将“.php”文件交给PHP-FPM处理
location ~ \.php$ {try_files $uri =404;fastcgi_pass unix:/tmp/php-cgi.sock;include fastcgi.conf;
}
12、利用Memcached保存Session
Session:是一种会话技术;
功能:主要用于实现用户登录功能,使服务器能够区分每个请求所对应的用户。
PHP中的Session机制:基于Cookie,Cookie是浏览器和服务器之间来回发送的一段数据,服务器可以通过Set-Cookie响应头将数据发送给浏览器保存,而浏览器以后每次请求都会将该数据放入Cookie请求消息头中发送。
当服务器端PHP开启Session后
每收到一个新客户端浏览器的请求,就会为这个浏览器创建一个Session文件保存在服务器中,其文件名是一串自动生成的密钥(Session Key);
服务器利用Set-Cookie将密钥响应给浏览器,浏览器下次请求就会携带Cookie中的密钥进行发送;
由于服务器为不同浏览器生成的密钥不同,且难以伪造,因此就可以区分当前请求是哪一个浏览器发出的。
网站用户登录功能的原理:就是将用户ID保存到Session文件中,从而区分每个请求对应的用户。
如果通过浏览器提交的密钥找不到Session文件,就说明该用户没有登录。
在集群环境中,Nginx+PHP服务器有多个,功能都是相同的,但不同服务器保存的Session文件不同,这就导致服务器无法正确识别每个请求对应的用户。
为了解决这个问题,需要两台服务器能够共享Session数据,而利用Memcached保存Session就是一种非常高效的方案。
3、4、5号服务器中利用.user.ini配置文件针对项目开启Session转存Memcached。
#创建PHP分布式配置文件(可以用来修改php.ini中的一些非关键配置)
[root@localhost ~]# vim /data/www/.user.ini
# 编写内容具体如下:
session.save_handler = memcached
session.save_path = "192.168.78.19:11211"
完成上述操作后,可以执行“rm -f /tmp/sess_*”命令删除服务器中的Session文件
然后通过浏览器访问网站进行测试,多次刷新后,如果在/tmp目录下没有生成新的文件名以“sess_”开始的文件,则说明Session已经保存到Memcached中。
“.user.ini”文件中的配置可以自动生效,但可能会有延迟,为了避免影响测试结果,可以执行service php-fpm reload命令使配置立即生效。
13、文件上传下载分离
在项目中,Public目录用于存放网站的一些静态文件,Public中的Upload目录用于存放用户上传的图片文件。
在前面的环境搭建中,已经部署了2、3、6号服务器专门用于文件下载、上传和存储,接下来就将Public目录转移到6号服务器,并将网站中的静态文件链接替换为2号服务器的地址,然后将文件上传接口部署到3号服务器中。
2号上传项目静态文件
[root@localhost ~]# tar -zxvf itshop-1.0.tar.gz
[root@localhost ~]# cp -R itshop-1.0/Public /data/share
4、5号配置目录路径
[root@localhost ~]# vim /data/www/Application/Common/Conf/config.php
#修改信息如下
'TMPL_PARSE_STRING' => array('__PUiBLIC__' => '//file.itshop.test/Public',
'__UPLOAD_API__' => '//upload.itshop.test/upload.php',
),
3号链接上传目录,配置Nginx
[root@localhost ~]# cd /data/www
[root@localhost ~]# rm -rf data.sql Public/Uploads
[root@localhost ~]# ln -s /data/share/Public/Uploads Public/Uploads
##/data/share/Public/Uploads这个文件夹自己去创建,并给权限
[root@localhost ~]# chmod -R 777 Public/Uploads
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
location / {return 403; }
location /upload.php { #此行替换原来的“location ~ \.php$ {”try_files $uri =404;
add_header Access-Control-Allow-Origin *; #添加此行允许跨域请求fastcgi_pass unix:/tmp/php-cgi.sock;include fastcgi.conf;}[root@localhost ~]# service nginx reload
访问网站后台的添加商品页面http://www.itshop.test/Admin/Goods/add.html,在用于编写商品详情的在线编辑器中上传图片进行测试。
大工告成!!!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
