一、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;
}
}