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;
    }
}
原文地址:https://www.cnblogs.com/caodan01/p/14742488.html