负载均衡实例

本文档所使用的项目:https://gitee.com/WenPinGao/mp

目前还没有把spring-boot  redis shiro-session共享的代码提交推送。

一、操作系统的安装

        用虚拟机软件VirtualBox安装centeOS7操作系统(co_7_64_57.3_1)。

        下载操作系统我们选择最小化安装,安装过程省略...

        VirtualBox配置网络主机

             

        用虚拟机软件VirtualBox安装,注意网卡选择桥接网卡和仅主机网络

              

                

        安装必要的软件和关闭防火墙

yum install vim
yum install wget
yum install git
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service

        在阿里源上下载的系统,还要关闭selinux

vi /etc/selinux/config 

        把文件中未注释的两行全部注释

        配置网卡--由于我们选择了桥接和仅主机网络,桥接网络我们不用管他,我们配置仅主机网络,用ip addr 命令查看哪块网卡是仅主机网络

[root@work ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:37:db:c0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.113/24 brd 192.168.0.255 scope global noprefixroute dynamic enp0s3
       valid_lft 5299sec preferred_lft 5299sec
    inet6 fe80::2ad2:7094:bc38:db21/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:4a:66:b9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.57.7/24 brd 192.168.57.255 scope global noprefixroute enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::6030:cb73:bc03:4583/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@work ~]# 

         我们看到网卡enp0s8是仅主机网络,打开该网卡的配置文件

vi /etc/sysconfig/network-scripts/ifcfg-enp0s8

        需要把dhcp改成static,在最后加上本机地址

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="enp0s8"
UUID="0f9cfaee-f4ee-4767-b654-da31046131ba"
DEVICE="enp0s8"
ONBOOT="yes"
IPADDR="192.168.57.7"

        关闭虚拟机:

shutdown now 

        根据需要复制我们刚建好的虚拟机 

        

        我们要建立负载均衡,所以我们要复制一台nginx服务器、一台redis数据库服务器、至少两台web服务器、一台mysql数据库服务器

        以上虚拟机复制出来,并参考上一步配置好网络

        配置如下:

        nginx服务器|192.168.57.4|co_7_64_57.4_2

        web服务器1|192.168.57.5|co_7_64_57.5_3

        web服务器2|192.168.57.6|co_7_64_57.6_4

        mysql服务器|192.168.57.7|co_7_64_57.7_5

        redis数据库服务器|192.168.57.8|co_7_64_57.8_6 

二、安装redis

        用ssh连接到我们的redis服务器

ssh root@192.168.57.8

        cd 到我们的安装目录

cd /usr/local/

        下载redis软件包

wget http://download.redis.io/releases/redis-4.0.6.tar.gz

        解压软件包

tar -zxvf redis-4.0.6.tar.gz

        安装gcc

 yum install gcc

        安装

cd redis-4.0.6
make MALLOC=libc
cd src/ && make install

        配置redis

cd /etc/
mkdir redis 
cd redis 
cp /usr/local/redis-4.0.1/redis.conf /etc/redis/
vi /etc/redis/redis.conf

        把redis的配置拷贝到/etc/redis/ 中

        修改:

69 #bind 127.0.0.1
500 requirepass 123456
136 daemonize yes

        需要修改以上三行:取消绑定本机;设置访问密码;让redis服务在后台运行。

        启动redis

 /usr/local/redis-4.0.6/src/redis-server /etc/redis/redis.conf 

        查看是否启动        

[root@work]~# ps -aux | grep redis
root       966  0.1  0.2 142416  2424 ?        Ssl  18:46   0:04 /usr/local/redis-4.0.6/src/redis-server *:6379
root      1262  0.0  0.0 112824   980 pts/0    S+   19:53   0:00 grep --color=auto redis
[root@work]~# 

        连接到redis

[root@work]~# /usr/local/redis-4.0.6/src/redis-cli -h 127.0.0.1 -a 123456
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> 

        开机自启动

        在/root/目录下创建auto_start.sh的文件

vim auto_start.sh 

        写入以下内容

#! /bin/sh
/usr/local/redis-4.0.6/src/redis-server /etc/redis/redis.conf

        给予执行权限        

chmod +x auto_start.sh 

        给予开机自启动文件的执行权限

chmod +x /etc/rc.d/rc.local 

        把我们定义的脚本写入上面的文件中        

vim /etc/rc.d/rc.local

/root/auto_start.sh

        重启,看是否生效

       检验:打开mp项目,把redis的地址指向我们刚才配置好的redis服务器

spring:
  redis:
    database: 0
    host: 192.168.57.8
    port: 6379
    password: 123456      # 密码(默认为空)
    timeout: 6000             # 连接超时时长(毫秒

        运行项目看是否运行得起来。

三、安装mysql

        用ssh连接到我们的mysql服务器   

ssh root@192.168.57.7

        下载更改源

wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm

        安装

yum -y install mysql-community-server

        启动配置

systemctl start  mysqld.service
systemctl status mysqld.service
systemctl enable mysqld.service

        查看更改密码

grep "password" /var/log/mysqld.log
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Password123!';

        重启mysql服务

systemctl restart mysqld

        设置远程访问

grant all privileges on *.* to 'root'@'%' identified by 'Password123!' with grant option;

flush privileges;

        测试

        用我们本地的数据库工具连接到mysql服务器中

 mycli -h192.168.57.7 -uroot -pPassword123!

        创建mp项目的数据库

mysql root@192.168.57.7:(none)> create database mp; 
mysql root@192.168.57.7:(none)> use mp 

        还原mp数据库

mysql root@192.168.57.7:mp> source /Users/wenpingao/Documents/Develop/Java/Project/mp/mp.sql 

        修改mp项目配置

spring:
  redis:
    database: 0
    host: 192.168.57.8
    port: 6379
    password: 123456      # 密码(默认为空)
    timeout: 6000             # 连接超时时长(毫秒
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://192.168.57.7:3306/mp?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
      username: root
      password: Passwrod123!
      filters: stat,wall,log4j,config
      max-active: 100
      initial-size: 1
      max-wait: 60000
      min-idle: 1
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      validation-query: select 'x'
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true
      max-open-prepared-statements: 50
      max-pool-prepared-statement-per-connection-size: 20

        运行项目

四、安装Nginx

        用ssh连接到我们的redis服务器

 ssh root@192.168.57.4

        按照以下命令步骤执行安装即可

cd /usr/local/
wget http://nginx.org/download/nginx-1.9.9.tar.gz
tar -zxvf  nginx-1.9.9.tar.gz
yum -y install gcc openssl openssl-devel pcre-devel zlib zlib-devel
cd nginx-1.9.9/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
make && make install
useradd -s /sbin/nologin -M nginx
id nginx
/usr/local/nginx/sbin/nginx
netstat -tlunp | grep nginx

        命令

        启动nginx:  /usr/local/nginx/sbin/nginx

        重新加载配置文件:/usr/local/nginx/sbin/nginx -s reload

        安全关闭:/usr/local/nginx/sbin/nginx -s quit

        暴力关闭:/usr/local/nginx/sbin/nginx -s stop

        参考redis配置开机自启动,auto_strat.sh文件中的内容

#! /bin/sh
/usr/local/nginx/sbin/nginx~

五、运行mp项目

       在服务器上安装jdk

ssh root@192.168.57.5 

        由于甲骨文的限制,下载jdk必须登陆

        所以我们在本地下载好

        再用scp上传到服务器上

 scp ~/Downloads/jdk-8u301-linux-x64.rpm root@192.163.57.5:/root/

        安装

rpm -i jdk-8u301-linux-x64.rpm

        验证

[root@work ~]# java -version
java version "1.8.0_301"
Java(TM) SE Runtime Environment (build 1.8.0_301-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.301-b09, mixed mode)
[root@work ~]#

        在本地打包mp项目

cd /Users/wenpingao/Documents/Develop/Java/Project/mp 
mvn package -Dmaven.test.skip=true 
scp target/mp-0.0.1-SNAPSHOT.jar root@192.168.57.5:/root/mp/mp.jar

        在服务器上运行上一步我们运行的jar包

cd mp/
nohup java -jar mp.jar --server.port=8080 > log-8080 &

        验证是否运行成功

        在我们本地访问192.168.57.5:8080,看是否能打开我们的mp管理系统

        开机自启动

        参考redis的开机自启动,auto_strat.sh文件中的内容

#! /bin/sh
cd /root/mp/
nohup java -jar mp.jar --server.port=8080 > log-8080 &

        192.168.57.6运行mp管理系统也同理

六、Nginx负载均衡配置

        由于mp项目已经采用redis共享session的方式来同步用户的状态,所以我们只需要配置nginx

        ssh 到192.168.57.4

        以下是负载均衡的配置

upstream mp{
        server 192.168.57.5:8080 weight=1 max_fails=3 fail_timeout=2s;
        server 192.168.57.6:8080 weight=1 max_fails=3 fail_timeout=2;
}
 server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #文件上传
        location /common/upload/ {
                proxy_pass      http://192.168.57.5:8080;
                proxy_connect_timeout   500ms;
        }
        location /upload/{
                proxy_pass      http://192.168.57.5:8080;
                proxy_connect_timeout   500ms;
        }


        location / {
            #root   html;
            #index  index.html index.htm;
            proxy_pass      http://mp;
            proxy_connect_timeout   500ms;
        }
}

        以上的第一个location和第二个location是为了解决文件上传及访问不同步的问题,提出的解决方案。

七、uni-app测试

        项目地址:https://gitee.com/WenPinGao/mp-uni-app

        没找到怎么把uniapp发布出来的h5项目部署到nginx上的方法

        部署到了两台安装有tomcat的机器上了,并在nginx服务器中配置了负载均衡。

        在打包uni-app h5项目之前要设置路径:

              

        nginx配置:

upstream h5 {
   ip_hash;
   server 192.168.57.5:8087 weight=1 max_fails=3 fail_timeout=2s;
   server 192.168.57.6:8087 weight=1 max_fails=3 fail_timeout=2s;
}
location /h5 {
    proxy_pass      http://h5;
    proxy_connect_timeout   500ms;
}

八、实现利用redis数据库实现session共享的tomcat8.5.38

        下载地址:https://alywp.net/19W2eX

        配置session指向redis数据库

vim conf/context.xml
<Context>
    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
    <Valve className="com.s.tomcat.redissessions.RedisSessionHandlerValve"/>
    <Manager className="com.s.tomcat.redissessions.RedisSessionManager"
      host="192.168.57.8"
      port="6379"
      database="0"
      password="123456"
      maxInactiveInterval="60" />
</Context>

        以上conf/context.xml文件中的Context节点下的Value和Manger下面的各项配置了redis数据库服务器的信息。

        以上参考了:https://github.com/cc-chen/tomcat8.5-redis-session-manager

九、一些小技巧

        从服务器上下载文件

scp username@servername:/path/filename /var/www/local_dir(本地目录)

        上传本地文件到服务器

scp /path/filename username@servername:/path

        从服务器下载整个目录

scp -r username@servername:/var/www/remote_dir/(远程目录) /var/www/local_dir(本地目录)

        上传目录到服务器

scp  -r local_dir username@servername:remote_dir

        ssh 免密登陆(用Mac登陆到centerOs上):

        在Mac上用终端登陆到center Os上(需要密码)
        在Mac的~/.ssh/目录下生成了登陆信息
        在终端中执行:ssh-keygen(一路enter)
        在~/.ssh/目录下生成了公钥和私钥
        再执行:ssh-copy-id root@wpg.co.wpg(用户:root,center Os:wpg.co.wpg)u将公钥上传到服务器
        就OK了

        利用别名登陆:

        在Mac上cd到~/.ssh/目录下,创建【config】文件 ,编辑config文件:

Host co4
        HostName        192.168.57.4
        User    root
        Port    22
Host co5
        HostName        192.168.57.5
        User    root
        Port    22
ssh co4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值