14 Nginx的会话保持、动静分离、资源分离

Nginx负载均衡会话保持

我们在访问网站的时候,进行登陆以后,服务器上会生成一个session然后服务器会带着session_id返回一个给浏览器记录的cookie值,当第二次访问的时候,cookie会来服务器上与session进行对比,如果对比成功,则不需要重新登陆。

在nginx访问的时候会遇到一个会话保持的问题,可以通过下面的方式进行解决:
1、使用nginx的ip_hash,根据客户端的IP,将请求分配到对于的ip
2、基于服务端的session会话共享(NFS,MySQL、memcache、redis、file)

session共享的方法

1、把多台后端服务器session文件目录挂载到NFS同一目录
2、通过程序将session存储到数据库
3、通过程序将session存储到redis(缓存数据库,速度比数据库快)

搭建phpmyadmin(web01)

[root@web01 www]# wget https://files.phpmyadmin.net/phpMyAdmin/5.1.0/phpMyAdmin-5.1.0-all-languages.zip

[root@web01 www]# unzip phpMyAdmin-5.1.0-all-languages.zip 
drwxr-xr-x 12 www www     4096 Feb 24 01:05 phpMyAdmin-5.1.0-all-languages
-rw-r--r--  1 www www 15054188 May  6 02:39 phpMyAdmin-5.1.0-all-languages.zip

[root@web01 nginx]# mkdir -pv /var/lib/php/session
[root@web01 nginx]# chown -R www.www /var/lib/php	#web端都需要创建

[root@web01 phpMyAdmin-5.1.0-all-languages]# vim config.inc.php
$cfg['Servers'][$i]['host'] = '172.16.1.51';

# phpmyadmin虽然不在报错,但是仍然无法登录。

方法一:挂载目录获得共同的session文件

1、将会话保持目录共享
# 在nfs目录中添加挂载点
[root@nfs nfs]# vim /etc/exports
/nfs/session  172.16.1.0/20(rw,sync,all_squash,anonuid=1000,anongid=1000)

# 绑定各个服务器
[root@web03 session]# mount -t nfs 172.16.1.31:/nfs/session /var/lib/php/session/

方法二:通过redis实现

# 安装一个redis
[root@db01 ~]# yum install redis -y

# 修改配置文件
[root@db01 ~]# vim /etc/redis.conf
bind 172.16.1.51

# 启动redis
[root@db01 ~]# systemctl enable --now redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.

# php安装redis插件
yum install php71w-pecl-redis -y

# 修改配置文件,使php使用redis做会话保持介质
[root@web01 ~]# vim /etc/php.ini 
session.save_path = "tcp://172.16.1.51:6379"
session.save_handler = redis

[root@web01 ~]# vim /etc/php-fpm.d/www.conf 
;php_value[session.save_handler] = files
;php_value[session.save_path]    = "/tmp"

#查看
[root@db01 ~]# redis-cli -h 172.16.1.51
172.16.1.51:6379> keys *
1) "PHPREDIS_SESSION:64cc7005a38bb25845cd795a29bbf51b" 

四层负载均衡

1、四层+七层来做负载均衡,四层可以保证七层的负载均衡的高可用性;如:nginx就无法保证自己的服务高可用,需要依赖LVS或者keepalive。

2、tcp协议的负载均衡,有些请求是TCP协议的(mysql、ssh),或者说这些请求只需要使用四层进行端口的转发就可以了,所以使用四层负载均衡。

3.四层可以做:
	mysql读从库的负载均衡
	跳板机的端口映射

四层负载均衡总结

1、四层负载均衡仅能转发TCP/IP协议、UDP协议、通常用来转发端口,如:tcp/22、udp/53;

2、四层负载均衡可以用来解决七层负载均衡端口限制问题;(七层负载均衡最大使用65535个端口号)

3、四层负载均衡可以解决七层负载均衡高可用问题;(多台后端七层负载均衡能同事的使用)

4、四层的转发效率比七层的高得多,但仅支持tcp/ip协议,不支持http和https协议;

5、通常大并发场景通常会选择使用在七层负载前面增加四层负载均衡。

Nginx四层负载均衡配置

查看四层负载均衡语法

#四层负载均衡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;
    }
}

配置四层负载均衡

# nginx必须启用--with-stream

## 编写nginx配置
mkdir /etc/nginx/stream.d

## 编写配置文件
[root@lb01 stream.d]# cat mysql.conf 
stream {
    log_format  main  '$remote_addr $remote_port - [$time_local] $status $protocol '
               '"$upstream_addr" "$upstream_bytes_sent" "$upstream_connect_time"' ;	#增加日志功能
    upstream mysql_conn {
        server 172.16.1.51:3306;
    }
    server {
        listen 33060;
        proxy_pass mysql_conn;
     }
}

## 重启nginx
[root@lb01 stream.d]# systemctl restart nginx

## 利用nginx转发连接MySQL
[root@db01 ~]# mysql -uyangge -pyangge -h172.16.1.5 -P 33060
#如果重启报错
[root@lb4 nginx]# rm -rf /etc/nginx/conf.d/*

配置hosts访问测试

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

动静分离

动静分离,通过中间件将动静分离和静态请求进行分离;
通过中间件将动态请求和静态请求分离,可以建上不必要的请求消耗,同时能减少请求的延时。
通过中间件将动态请求和静态请求分离,逻辑图如下:

配置动静分离

单台机器的动静分离

[root@web01 conf.d]# vim blog.conf 
server {
    listen 80;
    server_name blog.linux.com;

    location / {
        root /code/wordpress;
        index index.php;
    }

	#如果请求的是以 .jpg结尾的静态文件 就去/code/images 目录下访问
    location ~* \.jpg$ {
        root /code/images;
    }

    location ~* \.php$ {
        root /code/wordpress;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

#创建目录
[root@web01 conf.d]# mkdir /code/images/

#实现动静分离
方式一:把文件挪到/code/images/
	cp -r /code/wordpress/wp-content /code/images/
方式二:做软连接
	cd /code
	ln -s wordpress images

多台机器动静分离

环境准备

主机 作用 服务 地址
lb01 负载均衡 nginx proxy 172.16.1.5
web01 静态资源 nginx static 172.16.1.7
web02 动态资源 tomcat server 172.16.1.8

配置web01的静态内容

#配置nginx
[root@web01 conf.d]# vim jt.conf
server {
    listen 80;
    server_name dj.linux.com;

    location ~* \.(jpg|png|gif)${
        root /code/picture;
    }
}

#重启nginx
[root@web01 conf.d]# systemctl restart nginx

#上传图片
[root@web01 conf.d]# mkdir /code/picture
[root@web01 conf.d]# cd /code/picture/
[root@web01 picture]# rz 1.jpg

#配置hosts ,访问图片

在web02上配置动态资源

#安装tomcat
[root@web02 code]# yum install -y tomcat

#配置动态内容
[root@web02 code]# cd /usr/share/tomcat/webapps/
[root@web02 webapps]# mkdir ROOT
[root@web02 webapps]# vim ROOT/java_test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<HTML>
    <HEAD>
        <TITLE>JSP Page</TITLE>
    </HEAD>
    <BODY>
        <%
            Random rand = new Random();
            out.println("<h1>随机数:<h1>");
            out.println(rand.nextInt(99)+100);
        %>
    </BODY>
</HTML>

#启动tomcat
[root@web02 webapps]# systemctl start tomcat

#访问页面
http://10.0.0.8:8080/java_test.jsp

在负载均衡上配置页面

#配置负载均衡的nginx
[root@lb01 conf.d]# vim dj.linux.com.conf
upstream jt {
        server 172.16.1.7:80;
}
upstream dt {
        server 172.16.1.9:8080;
}

server {
    listen 80;
    server_name dj.linux.com;

    location / {
        root /code/dj;
        index index.html;
    }

    location ~* \.(jpg|gif|png)$ {
        proxy_pass http://jt;
        proxy_set_header HOST $http_host;
    }

    location ~ \.jsp$ {
        proxy_pass http://dt;
        proxy_set_header HOST $http_host;
    }
}


#重启nginx
[root@lb01 conf.d]# systemctl restart nginx

#配置host,访问页面
http://dj.linux.com/java_test.jsp
http://dj.linux.com/1.jpg

整合静态内容和动态内容代码

[root@lb01 conf.d]# mkdir /code/dj -p
[root@lb01 conf.d]# vim /code/dj/index.html
<html lang="en">
<head>
        <meta charset="UTF-8" />
        <title>测试ajax和跨域访问</title>
        <script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
</head>
<script type="text/javascript">
$(document).ready(function(){
        $.ajax({
        type: "GET",
        url: "http://dj.linux.com/java_test.jsp",
        success: function(data){
                $("#get_data").html(data)
        },
        error: function() {
                alert("哎呦喂,失败了,回去检查你服务去~");
        }
        });
});
</script>
        <body>
                <h1>测试动静分离</h1>
                <img src="http://dj.linux.com/1.gif">
                <div id="get_data"></div>
        </body>
</html>

#授权站点目录
[root@lb01 conf.d]# chown -R nginx.nginx /code/

#访问域名,测试,静态内容和动态内容关闭其一,互不影响

Nginx资源分离

资源分离

Nginx通过负载均衡实现手机与PC调度至不通的后端节点应用案例
使用pc访问时跳转到pc配置的页面,使用手机访问时可以跳转不同的页面

配置资源分离场景

环境准备

主机 主机作用 外网ip 内网ip 端口
Lb01 负载均衡 192.168.15.4 172.16.1.4 80
web01 提供Android手机页面 192.168.15.7 172.16.1.7 80
web02 提供Iphone手机页面 192.168.15.8 172.16.1.8 80
web03 提供电脑访问 192.168.15.9 172.16.1.9 80

配置服务器

[root@web01 conf.d]# vim sj.linux.com.conf
server {
    listen 8081;
    server_name sj.linux.com;

    location / {
        root /code/android;
        index index.html;
    }
}

server {
    listen 8082;
    server_name sj.linux.com;

    location / {
        root /code/iphone;
        index index.html;
    }
}

server {
    listen 8083;
    server_name sj.linux.com;

    location / {
        root /code/pc;
        index index.html;
    }
}

#重启nginx

配置站点

[root@web01 conf.d]# mkdir /code/{android,pc,iphone}
[root@web01 conf.d]# echo "我是Android" > /code/android/index.html
[root@web01 conf.d]# echo "我是Iphone" > /code/iphone/index.html
[root@web01 conf.d]# echo "我是computer" > /code/pc/index.html

配置负载均衡

[root@lb01 conf.d]# vim sj.linux.com.conf
upstream anzhuo {
	server 172.16.1.7:8081;
}
upstream iphone {
	server 172.16.1.7:8082;
}
upstream pc {
	server 172.16.1.7:8083;
}
server {
    listen 80;
    server_name sj.linux.com;

    location / {
        if ($http_user_agent ~* "Android") {
            proxy_pass http://anzhuo;
        }

        if ($http_user_agent ~* "iPhone") {
            proxy_pass http://iphone;
        }

	   if ($http_user_agent ~* "Chrome") {
            return 403;
        }
        
        proxy_pass http://pc;
    }
}

#重启nginx
[root@lb01 conf.d]# systemctl restart nginx

配置hosts访问页面测试

posted @ 2021-05-07 10:04  BaiM0  阅读(483)  评论(0编辑  收藏  举报