美文网首页
haproxy、nginx、memcache

haproxy、nginx、memcache

作者: haoxi2018 | 来源:发表于2019-03-24 22:31 被阅读0次

    (第十九周作业)
    1、运用haproxy实现nginx服务负载均衡
    需要三台虚拟机做实验:
    A机:安装haproxy,实现后端BC机上的nginx负载,IP地址为:192.168.184.100
    B机、C机:安装Nginx服务器,监听80端口。(Nginx简单安装即可,这里不再描述)   IP地址为192.168.184.101 、192.168.184.102
    1)A机安装haproxy
    先安装依赖软件包
    # yum -y install make gcc gcc-c++ openssl-devel
    下载haproxy,假如软件包为haproxy-1.7.9.tar.gz,并上传到A机
    # tar -zxf haproxy-1.7.9.tar.gz
    # cd /root/haproxy-1.7.9
    查看安装帮助文件,得知要先查看一下系统的内核版本
    # uname -r  
    根据上面的查看结果,到帮助文件中找到以下安装命令中TARGET参数合适的值,PREFIX是安装目录
    # make     TARGET=linux2628    PREFIX=/usr/local/haproxy  
    # make install
    2)A机编写配置文件
    # mkdir /usr/local/haproxy/etc
    # vim /usr/local/haproxy/etc/haproxy.cfg    

    global
        log 127.0.0.1  local0
        maxconn 4096
        chroot    /usr/local/haproxy
        uid 99#使用nobody用户的uid
        gid 99 #使用nobody用户的  用户组
        daemon #以守护进程形式运行haproxy
        nbproc 1 #启动1个haproxy实例。设置成和CPU核心数一样
        pidfile  /usr/local/haproxy/run/haproxy.pid    #进程ID
    defaults
        log    global
        log    127.0.0.1      local3        #日志文件的输出定向。产生的日志级别为local3. 系统中local1-7
        mode    http           #工作模式默认采用http模式,Nginx服务要采用这种方式
        option  httplog       #日志类别,记载http日志
        option  httpclose      #每次请求完毕后主动关闭http通道,
        option  dontlognull    #不记录空连接的日志
        option  forwardfor     #使后端服务器可获得客户端真实ip
        option  redispatch     #当serverid对应的服务器挂掉后,强制定向到其他健康服务器
        retries 2              #2次连接失败就认为服务器不可用
        maxconn 2000           #最大连接数
        balance roundrobin      #负载均衡算法轮询方式
        stats  uri    /haproxy-stats          #haproxy 监控页面的访问地址
        timeout connect      5000             #连接超时时间。 单位毫秒
        timeout client       50000            #客户端连接超时时间
        timeout server      50000             #服务器端连接超时时间
        option  httpchk GET /hb.html     #健康检查页面
    frontend nginx #前端名称
        bind 0.0.0.0:80 #监听80端口,请求会被转发到后端
        default_backend nginx_back #后端名称
    backend nginx_back #后端名称,给上文引用
        server s1 192.168.184.101:80 weight 3 check #后端的主机 IP 通过weight设置权重
        server s2 192.168.184.102:80 weight 3 check 

    3)启动haproxy
    #  /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg
    给B机和C机的Nginx添加一个hb.hmtl页面,内容为文本行“OK!"
    给B机和C机添加一个index.html页面,内容不相同,以示区别
    然后启动B机和C机的nginx服务
    访问:http://192.168.184.100查看对应的index.html页面,多次刷新可以查看页面显示内容如何变化。

    2、搭建haproxy实现mysql负载均衡

    这里的haproxy安装过程与前一题差不多,这里只是说明一个配置文件的内容
    # vim /usr/local/haproxy/etc/haproxy.cfg    

    global
           daemon
            nbproc 1
            pidfile  /usr/local/haproxy/run/haproxy.pid
    defaults
            mode tcp                #对于mysql的负载均衡,这里要采用tcp(4层)。
            retries 3              #3次连接失败就认为是服务器不可用
            option redispatch      #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
            option abortonclose    #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
            maxconn 4096            #默认的最大连接数
            timeout connect 5000    #连接超时 ms
            timeout client 30000    #客户端超时
            timeout server 30000    #服务器超时
            timeout check 2000      #=心跳检测超时
            log 127.0.0.1 local0 err #日志输出级别
    listen configMysql
            bind 127.0.0.1:3306    #监听3306端口
            mode tcp
            maxconn 4096
            server s1 192.168.184.110:3306   #后端的两台数据库服务器
            server s2 192.168.184.111:3306

    3、搭建tomcat服务器,并通过nginx反向代理访问
    需两台虚拟机进行实验:
    A机:安装tomcat+java  ,IP地址:192.168.184.137
    B机:安装nginx设置反向代理   IP地址:192.168.184.138
    1)A机安装java
    上传jdk-8u151-linux-x64.rpm到A机的/root目录下,安装包是多官网下载的。
    # rpm -ivh  jdk-8u151-linux-x64.rpm
    设置PATH环境变量
    #  vi  ~/.bash_profile
    最后增加两行:

    export  JAVA_HOME=/usr/java/jdk1.8.0_151
    export PATH=$JAVA_HOME/bin:$PATH

    保存后再执行一下
    # source  ~/.bash_profile
    验证java 版本
    #java  -version
    2)A机安装tomcat
    上传apache-tomcat-8.0.47.0.tar到/root
    # cd /root
    #  tar -xf apache-tomcat-8.0.47.0.tar
    #  mv apache-tomcat-8.0.47.0 tomcat
    3)启动tomcat并验证
       启动tomcat服务
    # /root/tomcat/bin/startup.sh
    查看日志
    # tail -f /root/tomcat/logs/catlina.out
    等出现Started UP表示启动完成
    关闭防火墙
    # service firewalld stop
    从宿主机打开浏览器来访问http://192.168.184.137:8080,可以看到tomcat的首页
    4)B机安装nginx
    # rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
    # yum install -y nginx
    5)配置nginx
    vi  /etc/nginx/nginx.conf

    #后端tomcat服务器
    upstream apachetomcat  {
        #这里可以配置多台服务器和端口号
        server 192.168.184.137:8080;
    }

    server {
        listen 80;
        server_name  192.168.184.138;
        #定义日志位置
        access_log  logs/tomcat.access.log  main;
        error_log  logs/tomcat.error.log;
         #配置站点根目录会根据完整的URI请求来映射
        root  html;
        #默认页面
        index  index.html index.htm index.jsp;
        #url映射
        location / {
            proxy_pass  http://apachetomcat;    #proxy_pass配置为:http:// + upstream名称       
            proxy_redirect    off;   #禁止所有的proxy_redirect指令 
            proxy_set_header  Host            $host;    #允许重新定义或添加字段传递给代理服务器的请求头。
            #将$remote_addr(客户端IP)的值放进变量请求头  X-Real-IP中 
            proxy_set_header  X-Real-IP        $remote_addr;  
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;   # 显示出客户端原始ip
            #当其中一台返回错误码404,500...等错误时,可以分配到下一台服务器程序继续处理,提高平台访问成功率,多可运用于前台程序负载,       
           proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_max_temp_file_size 0;    #一次访问能写入的临时文件的大小
            proxy_connect_timeout      90;   #后端服务器连接的超时时间_发起握手等候响应超时时间 
            proxy_send_timeout        90; #后端服务器数据回传时间 
            proxy_read_timeout        90;  #连接成功后_等候后端服务器响应时间 
            proxy_buffer_size          4k;    #当中的设置单个缓冲区的大小。 
            proxy_buffers              4 32k;    #由缓冲区数量和缓冲区大小组成的 
            #nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;   #一次访问能写入的临时文件的大小 
       }
    }

    6)重启nginx服务
    #systemctl start nginx.service
    7)访问测试:http://192.168.184.138

    4、搭建Tomcat,并基于memcached实现会话共享

    需要两台虚拟机:
    A机:192.168.184.70 ,安装Nginx(80端口做反向代理),tomcat(8080端口)  主机名:nodeA
    B机:192.168.184.71 安装tomcat(8080端口),memcache(11211端口)   主机名: nodeB
    1)A机安装Nginx
    安装依赖包:yum  -y  install  gcc  gcc-c++   libgcc
    下载Nginx和pcre安装包  nginx-1.14.2.tar.gz 和 pcre-8.37.tar.gz
    创建用户和用户组
    groupadd  web
    useradd  -s /sbin/nologin web
    安装pcre
    tar -zxvf pcre-8.37.tar.gz
    cd pcre-8.37
    ./configure
    make  &&  make install
    安装nginx
    tar -zxvf nginx-1.14.2.tar.gz
    cd nginx-1.14.2
    ./configure --prefix=/usr/local/nginx --user=web --group=web --conf-path=/etc/nginx/nginx.conf --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_flv_module --with-pcre=/usr/local/src/pcre-8.37
    make  &&  make install
    启动nginx   
    /usr/local/nginx/sbin/nginx       
    2)A机Nginx配置反向代理
    vi /etc/nginx/nginx.conf

    user  web web  #运行用户
    worker_processes  1;  #启动进程,通常设置成和cpu的数量相等
    #全局错误日志及PID文件
    error_log  /var/log/nginx/error.log;
    pid        /var/run/nginx.pid;
    events {
        #单个后台worker process进程的最大并发链接数
        worker_connections  1024;
    }
    http {
        include      mime.types;  #设定mime类型,类型由mime.type文件定义
        default_type  application/octet-stream;
        sendfile        on;  #普通应用设置为on
        keepalive_timeout  65;  #连接超时时间
        upstream webtomcat{  #设定负载均衡的服务器列表
             server  192.168.184.70:8080;     
             server  192.168.184.71:8080;
        }
        server {
            listen      80;  #侦听80端口
            server_name  192.168.184.70;
            location  / {                          #代理配置
                   proxy_pass  http://webtomcat; #反向代理到webtomcat定义的服务器列表
                   #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
                   proxy_set_header  Host            $host;
                   proxy_set_header  X-Real-IP        $remote_addr;
                   proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
            }
           #定义错误提示页面
            error_page  500 502 503 504  /50x.html;
                location = /50x.html {
                root  html;
            }
        }
    }

    重新加载nginx配置文件
    /usr/local/nginx/sbin/nginx  -s reload
    3)A机和B机都安装jdk和tomcat
    (安装步骤参考第3题的第(1)(2)(3)步操作)
    4)B机安装memcache
    下载相关的软件包: libevent-1.4.13-stable.tar.gz   memcached-1.4.4.tar.gz
    安装libevent
    tar zxf libevent-1.4.13-stable.tar.gz
    cd libevent-1.4.13-stable
    ./configure --prefix=/usr
    make && make install
    安装Memcached
    tar zxf memcached-1.4.4.tar.gz
    cd memcached-1.4.4
    ./configure --prefix=/usr/local/memcached --with-libevent=/usr
    make && make install
    启动Memcached
    /usr/local/memcached/bin/memcached -d -m 64 -u root -l 192.168.184.71 -p 11211 -c 256 -P /tmp/memcached.pid
    -d daemon后台进程
    -m 指定最大使用内存大小
    -u 绑定指定用户用于运行进程
    -c 最大同时连接数
    5)A机和B机在tomcat上进行连接 memcache  session 会话共享
    vi /root/tomcat/conf/context.xml

    ……
    <Context .....>
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
            memcachedNodes="nodeB:192.168.184.71:11211"
            requestUriIgnorePattern=".*/.(png|gif|jpg|css|js)$"
            sticky="false"
            storageKeyPrefix="context"
            lockingMode="uriPattern:/path1|/path2"
            sessionBackupAsync="false"
            sessionBackupTimeout="100"                                                                                   
    ranscoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>
    </Context>
    ……

    requestUriIgnorePattern 设置忽略会话同步的请求的 URI 地址的正则表达式
    sticky  粘性会话需要保证每个用户的请求都路由到同一台 Tomcat 服务器中
    lockingMode  用于非粘性会话
    sessionBackupAsync  设置 session 会话中的数据是否异步同步到 memcached 中,默认为 true。
    sessionBackupTimeout 备份 session 会话数据所需时间如果大于该值,将导致 session 会话数据同步失败
    transcoderFactoryClass  配置序列化和反序列化 session 会话中的数据到 memcached 中的编码转换器的工厂类名
    6)验证:
    编写测试页面(A机和B机都要写,B机要把下文中的NodeA改为NodeB):

    <%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
    SessionID:<%=session.getId()%>
    SessionIP:<%=request.getServerName()%>
    SessionPort:<%=request.getServerPort()%>
    <%
          out.println("This is Tomcat Server NodeA");
    %>

    相关文章

      网友评论

          本文标题:haproxy、nginx、memcache

          本文链接:https://www.haomeiwen.com/subject/sqfimqtx.html