zoukankan      html  css  js  c++  java
  • nginx负载均衡会话保持;四层负载均衡;端口转发

    一、Nginx负载均衡会话保持

    当用户访问页面登录后,会在服务器上生成一个session文件,并且返回给浏览器一个session_id内容的cookie,cookie会存在浏览器中,下一次访问cookie会携带session_id来到服务器验证,没有变化则说明是登录状态,不需要重新登录
    在使用负载均衡的时候会遇到会话保持的问题,可通过如下方式进行解决。
    1.使用nginx的ip_hash,根据客户端的IP,将请求分配到对应的IP上 
    2.基于服务端的session会话共享(NFS,MySQL,memcache,redis,file)
    

    1.seesion共享的方法

    1.把seesion文件保存在本地的nfs挂载目录
    2.通过程序将seesion写入数据库
    3.通过程序将seesion存入redis缓存
    

    2.搭建phpmyadmin

    1)上传代码包

    [root@web01 ~]# cd /code/
    [root@web01 code]# rz phpMyAdmin-4.9.0.1-all-languages.zip
    

    2)解压代码包

    [root@web01 code]# unzip phpMyAdmin-4.9.0.1-all-languages.zip
    [root@web01 code]# mv phpMyAdmin-4.9.0.1-all-languages phpmyadmin
    [root@web01 code]# chown -R www.www /code/
    

    3)配置连接数据库代码

    [root@web01 code]# cp /code/php/{config.sample.inc.php,config.inc.php}
    [root@web01 code]# vim /code/php/config.inc.php
    $cfg['Servers'][$i]['host'] = '172.16.1.51';  #改成db数据库的内网ip
    

    4)配置nginx配置文件

    [root@web01 code]# cd /etc/nginx/conf.d/
    [root@web01 conf.d]# vim phpmyadmin.conf
    server {
    	listen 80;
    	server_name php.linux.com;
    
    	location / {
    		root /code/phpmyadmin;
    		index index.php;
    	}
    
    	location ~ .php$ {
    		root /code/phpmyadmin;
    		fastcgi_pass 127.0.0.1:9000;
    		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    		include fastcgi_params;
    	}
    }
    [root@web01 conf.d]# systemctl restart nginx
    

    5)配置hosts,访问页面

    #配置hosts 192.168.15.7 linux.php.com
    #页面如果报错,要授权
    [root@web01 conf.d]# chown -R www.www /var/lib/php/session
    

    6)如果登录有问题,数据库授权

    [root@db02 ~]# mysql -uroot -p123456
    
    MariaDB [(none)]> grant all on *.* to root@'172.16.1.%' identified by '123456';
    
    MariaDB [(none)]> select user,host from mysql.user;
    

    7)把代码和站点目录推送至web02

    [root@web01 conf.d]# scp -r /code/phpmyadmin 172.16.1.8:/code/
    [root@web01 conf.d]# scp /etc/nginx/conf.d/phpmyadmin.conf 172.16.1.8:/etc/nginx/conf.d/
    
    #web02重启服务和授权
    [root@web02 ~]# systemctl restart nginx
    [root@web02 ~]# chown -R www.www /code/phpmyadmin/
    [root@web02 ~]# chown -R www.www /var/lib/php/session
    

    8)配置hosts访问web02

    9)配置负载均衡

    [root@lb01 ~]# cd /etc/nginx/conf.d/
    [root@lb01 conf.d]# vim phpmyadmin_proxy.conf
    upstream phpmyadmin {
        server 172.16.1.7;
        server 172.16.1.8;
    }
    
    server {
        listen 80;
        server_name php.linux.com;
    
        location / {
            proxy_pass http://phpmyadmin;
            include proxy_params;
        }
    }
    

    10)配置hosts访问

    3.使用redis实现session共享

    1)安装redis

    [root@db01 ~]# yum install -y redis
    

    2)配置redis

    [root@db01 ~]# vim /etc/redis.conf
    bind 127.0.0.1 172.16.1.51
    

    3)启动redis

    [root@db01 ~]# systemctl start redis
    

    4)配置php服务将session存到redis

    [root@web01 conf.d]# vim /etc/php.ini
    #原内容 session.save_handler = files
    session.save_handler = redis
    #原内容 ;session.save_path = "/tmp"
    session.save_path = "tcp://172.16.1.51:6379"
    
    [root@web01 conf.d]# vim /etc/php-fpm.d/www.conf
    #注释原内容 
    ;php_value[session.save_handler] = files
    ;php_value[session.save_path]    = /var/lib/php/session
    

    5)同步配置至web02

    [root@web01 conf.d]# scp /etc/php.ini 172.16.1.8:/etc/
    root@172.16.1.8's password: 
    php.ini                                                                                              100%   61KB   1.2MB/s   00:00    
    [root@web01 conf.d]# scp /etc/php-fpm.d/www.conf 172.16.1.8:/etc/php-fpm.d/
    

    6)重启php

    [root@web01 conf.d]# systemctl restart php-fpm
    [root@web02 conf.d]# systemctl restart php-fpm
    

    7)访问页面测试

    8)redi验证session

    1.连接进入redis 
    [root@db01 ~]# redis-cli -h 172.16.1.51 
    
    2.查看所有key 
    172.16.1.51:6379> keys * 
    
    3.查看session的生存时间 
    172.16.1.51:6379> TTL 
    PHPREDIS_SESSION:43948cd72f7589982cc3758f9d5c2b8d (integer) 1265 
    
    4.退出 172.16.1.51:6379> quit
    

    二、四层负载均衡

    1.简介

    所谓四层负载均衡,也就是主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择 的内部服务器。 以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN 请求时,选择一个最佳的服务器,并对报文中目标IP地 址进行修改(改为后端服务器IP),直接转发给该服务器。TCP的连接建立,即三次握手是客户端和服务器直接建立的,负载 均衡设备只是起到一个类似路由器的转发动作。在某些部署情况下,为保证服务器回包可以正确返回给负载均衡设备,在转 发报文的同时可能还会对报文原来的源地址进行修改。
    

    2.应用场景

    1.四层+七层来做负载均衡,四层可以保证七层的负载均衡的高可用性;
    2.负载均衡可以做端口转发 
    3.数据库读写分离
    

    3.四层负载均衡特点

    1.四层负载均衡仅能转发TCP/IP协议、UDP协议、通常用来转发端口,如:tcp/22、udp/53;
    2.四层负载均衡可以用来解决七层负载均衡端口限制问题;(七层负载均衡最大使用65535个端口号);
    3.四层负载均衡可以解决七层负载均衡高可用问题;(多台后端七层负载均衡能同时的使用);
    4.四层的转发效率比七层的高得多,但仅支持tcp/ip协议,不支持http和https协议;
    5.通常大并发场景通常会选择使用在七层负载前面增加四层负载均衡。
    

    三、Nginx四层负载均衡配置实践

    1.环境准备

    2.在lb02和lb4上面安装nginx

    1.安装nginx
    2.配置nginx
    3.创建用户
    4.启动nginx
    

    3.把lb01之前的配置推送(同步)至lb02

    [root@lb01 ~]# scp -r /etc/nginx/conf.d 172.16.1.5:/etc/nginx/
    [root@lb01 ~]# scp /etc/nginx/proxy_params 172.16.1.5:/etc/nginx/
    
    #启动lb02的nginx
    [root@lb02 ~]# systemctl start nginx
    

    4.配置hosts访问lb02负载页面测试

    5.配置四层负载均衡

    1)查看四层负载均衡语法

    Syntax: stream { ... }
    Default: — 
    Context: main
    
    #四层负载均衡stream模块跟http模块同级别,不能配置在http里面
    stream {
        upstream backend {
            server backend1.example.com:12345 weight=5;
            server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;
        }
    
        server {
            listen 12345;
            proxy_connect_timeout 1s;
            proxy_timeout 3s;
            proxy_pass backend;
        }
    }
    

    2)配置nginx主配置文件

    [root@lb4 ~]# vim /etc/nginx/nginx.conf 
    #注释http层所有内容 
    user www; 
    worker_processes auth; 
    error_log /var/log/nginx/error.log warn;
    pid /var/run/nginx.pid; 
    events { 
    	worker_connections 1024; 
    }
    #添加一个包含文件 
    include /etc/nginx/conf.c/*.conf;
    #http { 
    # 	include /etc/nginx/mime.types;
    # 	default_type application/octet-stream;
    # 	log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status    	$body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; 
    # access_log /var/log/nginx/access.log main;
    # sendfile on; # #tcp_nopush on; # keepalive_timeout 65; # #gzip on; # include /etc/nginx/conf.d/*.conf;
    #}
    

    3) 配置四层负载均衡

    #创建四层负载配置的目录
    [root@lb4 ~]# mkdir /etc/nginx/conf.c
    
    #配置四层负载
    [root@lb4 ~]# vim /etc/nginx/conf.c/lb_proxy.conf
    stream {
        upstream lbserver {
            server 172.16.1.4:8080;
            server 172.16.1.5:80;
        }
    
        server {
            listen 80;
            proxy_connect_timeout 1s;
            proxy_timeout 3s;
            proxy_pass lbserver;
        }
    }
    #重启nginx
    [root@lb4 ~]# nginx -t    #检查
    [root@lb4 ~]# systemctl restart nginx
    #如果重启报错
    [root@lb4 ~]# rm -rf /etc/nginx/conf.d/*
    

    4)配置hosts访问测试

    5)配置四层负载均衡日志

    #四层负载均衡是没有access的日志的,因为在nginx.conf的配置中,access的日志格式是配置在http下的,而四层负载 均衡配置是在http以外的;
    #如果需要日志则需要配置在stream下面
    [root@lb4 ~]# vim /etc/nginx/conf.c/lb_proxy.conf
    stream {
        log_format  main  '$remote_addr $remote_port - [$time_local] $status $protocol '
                   '"$upstream_addr" "$upstream_bytes_sent" "$upstream_connect_time"' ;
    
        access_log  /var/log/nginx/lb4_access.log  main;
    
        upstream lbserver {
            server 172.16.1.4:80;
            server 172.16.1.5:80;
        }
    
        server {
            listen 80;
            proxy_connect_timeout 1s;
            proxy_timeout 3s;
            proxy_pass lbserver;
        }
    }
    '$remote_addr #客户端ip
    $remote_port  # 远程的windows的随机端口
    [$time_local] #本地时间
    $status       #状态码
    $protocol '  #协议
    $upstream_addr"   #七层负载均衡的地址,代表它把连接分配到那台机器上
    "$upstream_bytes_sent" #返回的内容、字节大小
    "$upstream_connect_time"' ; #连接的时间
    
    #查看所有web服务器日志 
    [root@web01 ~]# tail -f /var/log/nginx/access.log [root@web02 ~]# tail -f /var/log/nginx/access.log
    

    四、nginx的TCP负载均衡(端口转发)

    1.请求负载均衡的5555端口,跳转至172.16.1.7的22端口

    stream {
    	#转发ssh的22端口
        upstream ssh_7 {
            server 172.16.1.7:22;
        }
    
        server {
            listen 5555;
            proxy_pass ssh_7;
        }
    }
    

    2.请求负载均衡的6666端口,跳转至172.16.1.51的3306端口(数据库从库的负载均衡)

    stream {
    	#转发mysql的3306端口
        upstream mysql_51 {
            server 172.16.1.51:3306;
            server 172.16.1.52:3306;
            server 172.16.1.53:3306;
            server 172.16.1.54:3306;
            server 172.16.1.55:3306;
            server 172.16.1.56:3306;
            server 172.16.1.57:3306;
        }
    
        server {
            listen 6666;
            proxy_pass mysql_51;
        }
    }
    
  • 相关阅读:
    自定义View绘制字符串
    自定义View实现图片的绘制、旋转、缩放
    Android圆形图片--ImageView
    laravel安装excel功能
    jQuery修改css属性
    cssText
    MySQL 启动、关闭、选择数据库等命令
    MySQL数据文件的导入、导出
    datepicker的使用
    laravel无法显示路由界面
  • 原文地址:https://www.cnblogs.com/caodan01/p/14742488.html
Copyright © 2011-2022 走看看