nginx七层负载均衡

负载均衡

  • 注意:代理不能做负载均衡,但是负载均衡需要用到代理模块

负载均衡基本概述

# 为什么要使用负载均衡
当我们的Web服务器直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台Web服务器组成集群,前端使用Nginx负载均衡,将请求分散的打到我们的后端服务器集群中,实现负载的分发。那么会大大提升系统的吞吐率、请求性能、高容灾

# 代理和负载均衡的区别
Nginx负载均衡与Nginx代理不同地方在于,Nginx的一个location仅能代理一台服务器,而Nginx负载均衡则是将客户端请求代理转发至一组upstream虚拟服务池.

# 负载均衡的分类
· 七层负载:七层负载均衡它是在应用层,那么它可以完成很多应用方面的协议请求,比如我们说的http应用的负载均衡,它可以实现http信息的改写、头信息的改写、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等等的规则,所以在应用层的服务里面,我们可以做的内容就更多,那么Nginx则是一个典型的七层负载均衡SLB

· 四层负载:所谓四层负载均衡指的是OSI七层模型中的传输层,那么传输层Nginx已经能支持TCP/IP的控制,所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载均衡,那么它的好处是性能非常快、只需要底层进行应用处理,而不需要进行一些复杂的逻辑。

# 负载均衡产品
· nginx
· LVS
· HAproxy

# 四层负载和七层负载的区别
四层负载均衡数据包在底层就进行了分发,而七层负载均衡数据包则是在最顶层进行分发、由此可以看出,七层负载均衡效率没有四负载均衡高。
但七层负载均衡更贴近于服务,如:http协议就是七层协议,我们可以用Nginx可以作会话保持,URL路径规则匹配、head头改写等等,这些是四层负载均衡无法实现的。
注意:四层负载均衡不识别域名,七层负载均衡识别域名

负载均衡模块

# 语法规则
Syntax: upstream name { ... }
Default: -
Context: http
 
#upstream例
upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;
    server backup1.example.com:8080   backup;
}
server {
    location / {
        proxy_pass http://backend;
    }
}

# 故障检测模块,一般负载均衡中,只要一台web处于down机状态,自动切换到另一台web,如出现web正常,但web连接的后端服务如php,或nginx连接失败,返回错误码,如500 504 502等错误时,也同样分配到下一台服务器程序处理,提高平台访问成功率。用于location中
        proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
  

Nginx调度算法

调度算法 概述 简称
轮询 按时间顺序逐一分配到不同的后端服务器(默认) round-robin(RR)
加权轮询 加权轮询,weight值越大,分配到的访问几率越高 weight-round-robin(WRR)
ip_hash 每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器 ip_hash
url_hash 按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器 url_hash
最小连接数 最少链接数,那个机器链接数少就分发 least_conn
  • 轮询配置
upstream load_pass {
    server 10.0.0.7:80;
    server 10.0.0.8:80;
}

  • 加权轮询
upstream load_pass {
    server 10.0.0.7:80 weight=5;				
    server 10.0.0.8:80;
}
  • ip_hash
# 为什么做ip_hash
用户会话保持,当用户输入账号密码连接服务器一次之后,在一定时间内,用户再次访问服务器是无需输入账号密码,但用户能实现此效果仅因为开发对服务代码的书写,但代码中未曾做会话保持,就需使用ip_hash调度算法,将同一个ip的访问请求发送给同一台服务器进行处理,这样用户再次访问,会将该请求通过哈希算法,自动定位到该服务器,这样服务器中照样有用户信息,实现了会话保持功能,但这样做存在弊端,比如一个公司几千人使用同一个ip,这样会将几千人的访问全都发送到同一台web进行处理。

#如果客户端都走相同代理, 会导致某一台服务器连接过多
upstream load_pass {
    ip_hash;
    server 10.0.0.7:80 weight=5;
    server 10.0.0.8:80;
}

面试相关问题:
你们公司的会话保持(session共享)怎么做的?
· 开发做的会话保持,将用户登录信息存储在redis中
· 开发没有做会话保持,我们通过运维的方式做会话保持,nginx的upstream模块中的ip_hash调度算法,保证用户请求一直发送到同一台机器,不过这么做有弊端...负载不均衡,所以我们公司,先让运维做会话保持,后面开发会写
  • url_hash和最小连接数不常用,不做演示

nginx负载均衡后端状态

状态 概述
down 当前的server暂时不参与负载均衡
backup 预留的备份服务器
max_fails 允许请求失败的次数
fail_timeout 经过max_fails失败后, 服务暂停时间
max_conns 限制最大的接收连接数

状态配置示例

--------------------------------------各状态配置均写在upstream中-------------------
# down状态配置(此状态一般用于停机维护,等同于用#注释内容)
upstream tcy_lb {
        server 172.16.1.7 down;
        server 172.16.1.8;
}

# backup状态配置 (应用此状态服务器,必须在其他服务器无法使用方可生效,否则一直处于备用状态)
upstream tcy_lb {
        server 172.16.1.7;
        server 172.16.1.8 bakcup;
}

# max_fails状态配置,允许请求失败次数两次并且是在10秒内,下次第三次请求需在10秒后 (必须配合fail_timeout一起使用)

upstream tcy_lb {
	# 需配合proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_404 http_403
    server 172.16.1.7;
    server 172.16.1.8 bakcup; max_fails=2 fail_timeout=10s;
}

# max_conns状态配置 (最大TCP连接数,这里设置为1,其他TCP连接均不受理)
upstream tcy_lb {
        server 172.16.1.7 max_conns=1;
        server 172.16.1.8;
}

nignx负载均衡会话保持

cookie和session原理

# 了解前提:
· 无状态http协议:
是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。但是HTTP协议是无状态的协议。 一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。

· 会话(Session)跟踪:
  会话,指用户登录网站后的一系列动作,比如浏览商品添加到购物车并购买。会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术
是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

# 什么叫做cookie
Cookie类型为“小型文本文件”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。 客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。 当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
简述:cookie是后端服务器传给浏览器的一段字符串,作用是记录用户登录的状态,和数据库中的user id结合,可以保证知道是哪个用户登录。仅存储在浏览器中。

# 会话cookie和持久cookie
  若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在浏览器的不同进程间共享。这种称为持久Cookie。 

# cookie缺陷
· Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
· 由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题,除非用HTTPS。
· Cookie的大小限制在4KB左右,对于复杂的存储需求来说是不够用的。

# 什么叫做seesion
session和cookie的作用有点类似,都是为了存储用户相关的信息。Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。用户与服务器建立连接的同时,服务器会自动为其分配一个Session ID。凭借Session ID,服务器为session标识各自的用户。(通过加密的方式保护cookie,防止其他用户通过user id随意登录别人的账号,存储在服务器端)

# session的创建
当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了sessionId,如果已包含则说明以前已经为此客户端创建过session,服务
器就按照sessionId把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含sessionId,则为此客户端创建一个session并且生成一个与此session相关
联的sessionId,sessionId的值是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionId将被在本次响应中返回给客户端保存。

# cookie和session的关系
浏览器端存的是cookie每次浏览器发请求到服务端时,报文头是会自动添加cookie信息的。
服务端会查询用户的cookie作为key去存储里找对应的value(session)
同意域名下的网站的cookie都是一样的,所以无论几台服务器,无论请求分配到哪一台服务器上同一用户的cookie是不变的。也就是说cookie对应的session也是唯一的。所以,这里只要保证多台业务服务器访问同一个共享存储服务器(NFS,MySQL,memcache,redis,file)就行了。

# 应用场景
案例一:
· 登录网站,今输入用户名密码登录了,第二天再打开很多情况下就直接打开了。这个时候用到的一个机制就是cookie。
· session一个场景是购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要存储一些信息就用到了session。
案例二:
你去游乐场,假设没有门票,你有事先出去了。再进的时候,保安死都不让你进,因为不能证明你买过票。假设此时有一张门票(cookie),你去游乐场的时候就买好了(服务器返回给客户端cookie)即使你突然出去(请求结束断开连接),下一次进去,依然可以凭票入内。

# 总结
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

会话保持实验实验

  • 需求
phpmyadmin搭建后,使用lb负载轮询访问后端web,但轮询方式是将请求均匀发送到后端两台web中,用户登录信息只会保存到其中一台web中,当用户继续访问服务器,可能会因为请求更改到未曾保存的session的服务器中,这样一来定会影响用户体验。于是需要实现redis的session共享
  • 环境准备

    主机名 内网ip 外网ip
    web01 172.16.1.7 10.0.0.7
    web02 172.16.1.8 10.0.0.8
    lb01 172.16.1.5 10.0.0.5
    redis/mariadb 172.16.1.51 10.0.0.5
  • 操作步骤

web01和web02配置

----------------------------lnmp、nfs、mariadb搭建过程略-----------------------------------
# 在web01和web02中为搭建phpmyadmin修改配置文件
[root@web01 /etc/nginx/conf.d]# vim www.myadmin.com.conf
server {
        listen 80;
        server_name www.myadmin.com;
        root /code/myadmin/phpMyAdmin-4.9.0.1-all-languages;
        index index.php index.html;

        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;

        }
}

# 根据配置文件创建对应目录
[root@web01 /code]# mkdir myadmin

# 将phpmyadmin压缩包拉取到站点目录并解压
[root@web01 /code/myadmin]# unzip phpMyAdmin-4.9.0.1-all-languages_\(1\).zip 

# 配置phpmyadmin连接远程的数据库
[root@web01 /code/myadmin/phpMyAdmin-4.9.0.1-all-languages]# cp config.sample.inc.php config.inc.php
[root@web01 /code/myadmin]# vim config.inc.php 				# 配置phpmyadmin连接数据库地址
$cfg['Servers'][$i]['host'] = '10.0.0.51';					# 记得写外网ip

# 将站点目录下所有文件全部scp到web02
[root@web01 /code/myadmin]# scp -r ./* root@10.0.0.8:/code/myadmin

# 启动服务并修改站点目录及session目录权限
[root@web01 /code/myadmin/phpMyAdmin-4.9.0.1-all-languages]# systemctl restart nginx
[root@web01 /code/myadmin/phpMyAdmin-4.9.0.1-all-languages]# systemctl restart php-fpm
[root@web01 /code/myadmin]# chown -R www.www /code/myadmin
[root@web01 /code/myadmin]# chown -R www.www /var/lib/php
[root@web02 /var/lib/php]# mkdir session
[root@web02 /var/lib/php]# chmod 777 session/


- 浏览器访问(图一)

负载均衡配置

# 配置lb配置文件
[root@lb01 /etc/nginx/conf.d]# vim myadmin.conf
upstream myadmin {
        server 172.16.1.7:80
        server 172.16.1.8:80
}
server {
        listen 80;
        server_name www.myadmin.com;

        location / {
                proxy_pass http://myadmin;
                include proxy_params;
        }
}

# 重启服务
[root@lb01 /etc/nginx/conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 /etc/nginx/conf.d]# systemctl restart nginx

# 浏览器访问 (图二)
使用负载均衡发现无法访问,原因:使用负载均衡的时候,第一次请求phpMyAdmin主页的时候web01进行处理,页面返回的cookie存放在web01上.填写用户名密码提交之后,是web02进行处理的,此时给页面的cookie不是web01上的cookie,所以会报错,于是我们需要做redis的共享存储session信息
  • 图一

  • 图二

使用redis共享保存session信息

# 节省机器,直接在mysql中安装redies,虽然同为数据库
[root@db01 ~]# yum install -y redis

# 配置redis监听本地网段
[root@db01 ~]# sed  -i '/^bind/c bind 127.0.0.1 172.16.1.51' /etc/redis.conf

# 启动服务
[root@db01 ~]# systemctl start redis

#修改/etc/php.ini文件(web01操作)
[root@web ~]# vim /etc/php.ini
session.save_handler = redis
session.save_path = "tcp://172.16.1.51:6379"
;session.save_path = "tcp://172.16.1.51:6379?auth=123" #如果redis存在密码,则使用该方式
session.auto_start = 1

#注释php-fpm.d/www.conf里面的两条内容,否则session内容会一直写入/var/lib/php/session目录中(web01操作)
;php_value[session.save_handler] = files
;php_value[session.save_path]    = /var/lib/php/session

# 重启php
[root@web01 /]# systemctl restart php-fpm

# 将web01中方才的修改文件cp到web02
[root@web01 /]# scp /etc/php-fpm.d/www.conf root@172.16.1.8:/etc/php-fpm.d/www.conf 
root@172.16.1.8's password: 
www.conf  
[root@web01 /]# scp /etc/php.ini root@172.16.1.8:/etc/php.ini

# 同样重启web02的服务
[root@web02 /code/myadmin/phpMyAdmin-4.9.0.1-all-languages]# systemctl restart php-fpm

# 再次用负载访问页面(图三)不会出现之前无法登陆问题

# 查看结果(redis中查看是否存在session会话)
[root@db01 ~]# redis-cli
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION:32624c7d76f994818caef2c503988b79"
2) "PHPREDIS_SESSION:5deff0787742807fe48e7e707127a0d5"

  • 图三

配置实操

要求

· 基于lnmp环境,使用lb轮询方式将用户请求均匀分配到后端web服务器,后端服务器图片信息存储到nfs文件服务器中,数据信息存储到myslq中。
环境:
	一台lb	
	两台web
	一台nfs
	一台mysql
1 .两台web服务安装配置
# web01和web02安装nginx
· 本地已经存在各种安装包,所以直接本地安装
[root@web01 /tmp]# yum localinstall -y nginx-1.18.0-1.el7.ngx.x86_64.rpm 
[root@web02 /tmp]#  yum localinstall -y nginx-1.18.0-1.el7.ngx.x86_64.rpm 

# web01和web02安装php
[root@web01 /tmp]# yum localinstall -y php*
[root@web02 /tmp]# yum localinstall -y php*

# 创建用户组,统一用户
[root@web01 /tmp]# groupadd www -g 666
[root@web01 /tmp]# useradd www -u 666 -g 666 -s /sbin/nologin -M
[root@web02 /tmp]# groupadd www -g 666
[root@web02 /tmp]# useradd www -u 666 -g 666 -s /sbin/nologin -M

# 修改nginx配置文件统一用户
[root@web01 /tmp]# vim /etc/nginx/nginx.conf 
user  www;
[root@web02 /tmp]# vim /etc/nginx/nginx.conf 
user  www;

# 修改php配置文件统一用户
[root@web01 /tmp]# vim /etc/php-fpm.d/www.conf 
user = www
group = www
[root@web02 /tmp]# vim /etc/php-fpm.d/www.conf 
user = www
group = www

# 启动服务加入开启自启(web01和web02相同)
[root@web01 /tmp]# systemctl start nginx
[root@web01 /tmp]# systemctl enable nginx
[root@web01 /tmp]# systemctl start php-fpm
[root@web01 /tmp]# systemctl enable php-fpm

# 查看端口是否开启
[root@web01 /tmp]# netstat -lntup|grep -E '80|9000'
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      7212/php-fpm: maste 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7187/nginx: master  

# 书写nginx配置文件与php建立连接,以下为wordpress配置 
[root@web01 /]# vim /etc/nginx/conf.d/www.wp.com.conf
server {
        listen 80;
        server_name www.wp.com;
        root /code/wp;
        index index.php index.html;

        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;

        }
}

# 书写nginx配置文件与php建立连接,以下为知乎搭建配置
[root@web01 /etc/nginx/conf.d]# vim www.zh.com.conf 
server {
        listen 80;
        server_name www.zh.com;
        root /code/zh;
        index index.php index.html;

        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;

        }
}

# 将如上两份配置文件scp到web02中
[root@web01 /etc/nginx/conf.d]# scp www.wp.com.conf www.zh.com.conf root@10.0.0.8:/etc/nginx/conf.d/

# 根据配置文件内容创建对应两个目录(web01和web02都需操作)
[root@web01 /]# mkdir /code/wp /code/zh -p

# 更改权限(web01和web02都需操作)
[root@web01 ~]# chown -R www.www /code/wp
[root@web01 ~]# chown -R www.www /code/zh

# 测试nginx和php是否建立连接(web02可测可不测)
[root@web01 /code/wp]# vim wp.php
<?php
        phpinfo();
?>

[root@web01 /code/zh]# vim /code/zh/zh.php
<?php
        phpinfo();
?>

# 重启nginx服务
[root@web01 /code/zh]# systemctl reload nginx


# 页面访问结果(图一)


  • 图一

2. 数据库安装配置
# 数据库安装
[root@db01 ~]# yum install -y mariadb-server

# 启动数据库
[root@db01 ~]# systemctl start mariadb

# 对数据库登录配置密码
[root@db01 ~]# mysqladmin -uroot password '123'

# 登录数据库
[root@db01 ~]# mysql -uroot -p123

# 登录后创建wordpress和知乎对应库
MariaDB [(none)]> create database wp;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create database zh;
Query OK, 1 row affected (0.00 sec)

# 创建wordpress和知乎连接数据库用户
MariaDB [(none)]> grant all on *.* to wp_user@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on *.* to zh_user@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)

# 退出数据库
quit
3. nfs搭建及配置
# nfs服务端安装
[root@nfs ~]# yum install -y nfs-utils

# nfs客户端安装(即web01和web02)
[root@web01 ~]# yum install -y nfs-utils
[root@web02 ~]# yum install -y nfs-utils

# 修改nfs配置文件
[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(sync,rw,all_squash,anonuid=666,anongid=666)

# 根据配置文件创建对应目录及用户
[root@nfs ~]# groupadd www -g 666
[root@nfs ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
[root@nfs ~]# mkdir /data
[root@nfs ~]# chown -R www.www /data

# 启动服务并加入开机自启动
[root@nfs ~]# systemctl start nfs-server
[root@nfs ~]# systemctl enable nfs-server

# 客户端检测结果
[root@web01 /code/wp]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
4.wordpress搭建
# 将安装包上传至站点目录下
[root@web01 /code/wp]# ll
total 10844
-rw-r--r-- 1 root root 11098483 May 20 14:38 wordpress-5.0.3-zh_CN.tar.gz

# 安装包解压
[root@web01 /code/wp]# tar -xf wordpress-5.0.3-zh_CN.tar.gz 

# 将解压目录里面的文件移动到站点目录底下
[root@web01 /code/wp]# mv wordpress/* ./

# 页面访问web01,和数据库建立连接(图二、图三、图四、图五所示)

# 将web01注册连接服务器的各种信息全部scp到web02的站点目录(web02即不用登陆连接操作)
[root@web01 /code/wp]# scp /code/wp/* root@10.0.0.8:/code/wp/

# 修改权限(两台web都需操作)
[root@web01 /code/wp]# chown -R www.www /code/wp
[root@web02 /code/wp]# chown -R www.www /code/wp


# 连接进入wordpress中(图六)

# 书写博客,上传图片,让web01产生对应upload目录(图七)

# 查看对应目录下是否产生upload目录
[root@web01 /code/wp/wp-content]# ll
total 8
-rw-r--r-- 1 www www   28 Jan  9  2012 index.php
drwxr-xr-x 4 www www 4096 Jan 11  2019 languages
drwxr-xr-x 3 www www   55 Jan 11  2019 plugins
drwxr-xr-x 5 www www   89 Jan 11  2019 themes
drwxr-xr-x 3 www www   18 May 22 00:23 uploads

# 因挂载后原本文件内容会消失,需要首先将内容scp到nfs共享存储目录下,再进行挂载
[root@web01 /code/wp/wp-content/uploads]# scp -r 2020/ root@10.0.0.31:/data

# 将站点目录共享存储到nfs
[root@web01 /code/wp/wp-content/uploads]# mount -t nfs 172.16.1.31:/data /code/wp/wp-content/uploads/
[root@web01 /code/wp/wp-content/uploads]# df -h
Filesystem         Size  Used Avail Use% Mounted on
/dev/sda3           19G  1.5G   18G   8% /
devtmpfs           476M     0  476M   0% /dev
tmpfs              487M     0  487M   0% /dev/shm
tmpfs              487M  7.7M  479M   2% /run
tmpfs              487M     0  487M   0% /sys/fs/cgroup
/dev/sda1          497M  120M  378M  25% /boot
tmpfs               98M     0   98M   0% /run/user/0
172.16.1.31:/data   19G  1.3G   18G   7% /code/wp/wp-content/uploads

# web02创建目录并且挂载
[root@web02 ~]# mkdir /code/wp/wp-content/uploads/ -p
[root@web02 ~]# mount -t nfs 172.16.1.31:/data /code/wp/wp-content/uploads/

# 测试用web02登录(图八)

  • 访问web01进行第一次连接配置(图二)

  • 填写数据库中创建库名,wordpress连接数据库用户和密码(图三)

  • 开始安装(图四)

  • 安装成功(图五)

  • 图六

  • 图七

  • web02登录结果(图八)

5.知乎搭建
# 上传知乎包
[root@web01 /code/zh]# ll
total 8256
-rw-r--r-- 1 root root 8451194 May 21 16:52 WeCenter_3-2-1.zip

# 解压
[root@web01 /code/zh]# unzip WeCenter_3-2-1.zip 

# 将解压目录下包含index文件内容全部移动到站点目录下
[root@web01 /code/zh]# mv WeCenter_3-2-1/* ./

# 权限配置
[root@web01 ~]#  chown -R www.www /code/zh

# 网页访问,直接选择下一步(图九)

# 根据数据库中创建,填写对应信息,(图十)

# 创建登录用户(图十一)

# 进入知乎,上传图片到web中,产生upload目录 (图十二)
[root@web01 /code/wp/wp-content]# ll
total 8
-rw-r--r-- 1 www www   28 Jan  9  2012 index.php
drwxr-xr-x 4 www www 4096 Jan 11  2019 languages
drwxr-xr-x 3 www www   55 Jan 11  2019 plugins
drwxr-xr-x 5 www www   89 Jan 11  2019 themes
drwxr-xr-x 3 www www   18 May 22 00:35 uploads

# 将web01的站点目录下内容全部scp到web02站点目录下,并修改权限
[root@web01 /code/wp]# scp -r ./* root@10.0.0.8:/code/zh/
[root@web02 ~]#  chown -R www.www /code/zh

# 修改配置文件(nfs中操作)
[root@nfs /data]# vim /etc/exports
/data 172.16.1.0/24(sync,rw,all_squash,anonuid=666,anongid=666)
/nfs 172.16.1.0/24(sync,rw,all_squash,anonuid=666,anongid=666)

# 建立新的共享存储目录(nfs中操作)
[root@nfs /data]# mkdir /nfs
[root@nfs /data]# chown -R www.www /nfs
[root@nfs /data]# systemctl restart nfs-server

# 将web01中的数据scp到nfs中,然后挂载
[root@web01 /code/zh/uploads]# scp -r ./* root@10.0.0.31:/nfs
[root@web01 /code/zh/uploads]# mount -t nfs 172.16.1.31:/nfs /code/zh/uploads/
[root@web01 /code/zh/uploads]# df -h
Filesystem         Size  Used Avail Use% Mounted on
/dev/sda3           19G  1.6G   17G   9% /
devtmpfs           476M     0  476M   0% /dev
tmpfs              487M     0  487M   0% /dev/shm
tmpfs              487M  7.7M  479M   2% /run
tmpfs              487M     0  487M   0% /sys/fs/cgroup
/dev/sda1          497M  120M  378M  25% /boot
tmpfs               98M     0   98M   0% /run/user/0
172.16.1.31:/data   19G  1.3G   18G   7% /code/wp/wp-content/uploads
172.16.1.31:/nfs    19G  1.3G   18G   7% /code/zh/uploads
                       

# web02挂载
[root@web02 /code/zh/install]# mount -t nfs 172.16.1.31:/nfs /code/zh/uploads/

# 页面测试,结果为图十三和十四对比图
  • 图九

  • 图十

  • 图十一

  • 图十二

  • 图十三

  • 图十四

6.负载均衡配置
# 下载nginx
[root@lb01 ~]# yum install -y nginx

# 优化模块直接放入/etc/nginx/目录下命名为proxy_params(优化模块也可直接写入负载配置文件中)
[root@web01 /etc/nginx]# vim proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
 
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

# 编辑主配置文件,添加内容,让nginx读取proxy_params文件
[root@lb01 /etc/nginx/conf.d]# vim ../nginx.conf 
 include /etc/nginx/*_params;


# 编写nginx配置文件,将lb中收到的请求轮询发送到两台web服务器中
[root@lb01 /etc/nginx/conf.d]# vim wp.lb.conf
upstream tcy_lb {
        server 172.16.1.7;							# 轮询方式发送请求
        server 172.16.1.8;
}

server {
        listen 80;									# 代理端口
        server_name www.wp.com;						 # 代理域名

        location / {
                proxy_pass http://tcy_lb;			# tcy_lb为upstream中命名
                include proxy_params;				# 包含文件为/etc/nginx/目录下文件,自定义
 # 当
 proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
        }
}

# 重启服务
[root@lb01 /etc/nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 /etc/nginx]# systemctl restart nginx

# 测试
· ① hosts文件修改域名对应ip为lb服务器对外网卡ip 
· ② 浏览器访问wordpress网页(图一)
· ③ 查看日志文件,用户请求如何发送到后端web中(图二)
  • 浏览器访问,由lb服务器返回(图一)

  • 查看用户请求 ,共8个请求,均匀分布到web01和web02中(图二)

posted @ 2020-05-25 20:10  元气少女郭德纲!!  阅读(465)  评论(0编辑  收藏  举报