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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM