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