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、机器的安装与克隆

  1. 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,在用于编写商品详情的在线编辑器中上传图片进行测试。

大工告成!!!

在这里插入图片描述
在这里插入图片描述


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

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部