从零开始的Nginx [ 3 ] --- 负载均衡算法、Nginx七层负载、TCP四层负载


nginx Proxy 代理

知识点

1 YUM

  • 主线- 开发版本

  • 稳定版本 - 生产环境的版本

2 虚拟主机

server {
    
    
	listen  80;
	server_name  www.xxx.com;

	# http://www.xxx.com/a/b.jpg

	# http://www.xxx.com  # --> url /  (根路由)

    location  / {
    
    
       root /html;
       index  index.html;
    }	
    location  /a/ {
    
    
        root /static/;
    }
}

http://www.xxx.com/a/b.jpg   ==> /static/a/b.jpg
------------
<img src="/a/b.jpg" >

3 反向代理

http{
    
    
  server{
    
    
    location / {
    
    
      proxy_pass   http://真实服务器的地址:端口号;
    }
  }
}

4 负载均衡

http {
    
    
	upstream 服务器组名称{
    
    

		# 这里写上提供相同网络资源的服务器,一行一个

		server  11.1.1.10:80;
	    server  11.1.1.20:8020;
	}

	server {
    
    
		location / {
    
    
	        proxy_pass http://服务器组名称;
		}
	}

}

一、负载均衡算法

upstream 支持4种负载均衡调度算法
A、轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器;
B、ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
C、url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。
D、fair:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块。

二、配置实例[七层]

1、热备:

如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB…

upstream myweb {
    
     
      server 172.17.14.2:8080; 
      server 172.17.14.3:8080 backup;  #热备     
    }

2、轮询:

nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB…

upstream myweb {
    
     
      server 172.17.14.2:8080; 
      server 172.17.14.3:8080;      
    }

3、加权轮询:

跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB…

upstream myweb {
    
     
      server 172.17.14.2:8080 weight=1;
      server 172.17.14.3:8080 weight=2;
}

4、ip_hash:

nginx会让相同的客户端ip请求相同的服务器。

upstream myweb {
    
     
      server 172.17.14.2:8080; 
      server 172.17.14.3:8080;
      ip_hash;
    }

5、nginx负载均衡配置状态参数

  • down,表示当前的server暂时不参与负载均衡。
  • backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
  • max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
  • fail_timeout,在经历了max_fails次失败后,暂停服务的时间单位秒。max_fails可以和fail_timeout一起使用。
 upstream myweb {
    
     
      server 172.17.14.2:8080 weight=2 max_fails=2 fail_timeout=2;
      server 172.17.14.3:8080 weight=1 max_fails=2 fail_timeout=1;    
    }

如果你想跟多更深入的了解 nginx 的负载均衡算法,
nginx官方< http://www.nginx.org.>提供一些插件大家可以了解下。

6、配置负载均衡参数

[root@localhost ~]# vim /etc/nginx/conf.d/default.conf
upstream testapp {
    
    
      server 192.168.116.155:80  max_fails=2 fail_timeout=2;
      server 192.168.116.156:80  max_fails=2 fail_timeout=2;
}

7、确保web端打开nginx服务

a 检测状态

[root@localhost ~]# curl 192.168.116.157
234566
[root@localhost ~]# curl 192.168.116.157
hahaha  1234 

为了方便,写了脚本进行测试

[root@localhost ~]# cat 负载均衡.sh 
#!/usr/bin/bash
while :
do
  curl 192.168.116.157
  sleep 1
done

测试效果

[root@localhost ~]# sh 负载均衡.sh 
234566
 hahaha  1234 
234566
 hahaha  1234 

b 关闭一台web服务器

[root@localhost ~]# /usr/local/nginx/sbin/nginx -s stop

c 清空nginx日志文件

[root@localhost ~]# > /var/log/nginx/access.log 
[root@localhost ~]# > /var/log/nginx/error.log 

测试结果

[root@localhost ~]# sh 负载均衡.sh 
234566
234566
234566
234566 

三、四层tcp负载

1 备份数据

[root@localhost nginx]# cp /etc/nginx/nginx.conf{,.bak}

2 修改监听端口

[root@localhost nginx]# vim /etc/nginx/nginx.conf
user  nginx;
worker_processes 1;

error_log /var/log/nginx/error.log;
pid       /var/log/nginx.dir;

events {
    worker_connections 1024;
}
stream {
    upstream testapp {
        server 192.168.116.155:80  max_fails=2 fail_timeout=2;
        server 192.168.116.156:80  max_fails=2 fail_timeout=1;
        }
server {
    listen       82;
    proxy_pass http://testapp;
    }
}

测试结果

[root@localhost nginx]# curl 192.168.116.157:82
 hahaha  1234 
[root@localhost nginx]# curl 192.168.116.157:82
234566
[root@localhost nginx]# curl 192.168.116.157:82
 hahaha  1234 

查询mysql初始密码

grep ' password'/var/log/mysqld. log

修改密码

mysqladmin -uroot  -p'4A0hMZD6kT!g' password Neko@123

3 负载均衡实现代理MySQL [四层负载]

创建新的数据库数据[库1]

mysql -uroot -pQianFeng@123 -e "create database db1;"
mysql -uroot -pQianFeng@123 -e "create table db1.t1(id int);"
mysql -uroot -pQianFeng@123 -e "insert into db1.t1 values(1);"

创建新的数据库数据[库2]

mysql -uroot -pQianFeng@123 -e "create database db1;"
mysql -uroot -pQianFeng@123 -e "create table db1.t1(id int);"
mysql -uroot -pQianFeng@123 -e "insert into db1.t1 values(1);"
mysql -uroot -pQianFeng@123 -e "insert into db1.t1 values(2);"

查询表格

mysql -uroot -pQianFeng@123 -A -e "select id from db1.t1;"
mysql -uroot -pQianFeng@123 -AB -e "select id from db1.t1;"

进入数据库1 添加新用户 并授权(root用户不会被远程登录)

mysql> use db1;
mysql> grant all on db1.* to Neko@'%' identified by 'Neko@123';

在另一个数据库2 上登录数据库1 的Neko账户

[root@localhost ~]# mysql -uNeko -pNeko@123 -h192.168.116.158

然后库2 也创建同样的用户及密码

[root@localhost nginx]# vim /etc/nginx/nginx.conf
user  nginx;
worker_processes 1;

error_log /var/log/nginx/error.log;
pid       /var/run/nginx.pid;

events {
    
    
    worker_connections 1024;
}
stream {
    
    
    include /etc/nginx/conf.d/*.conf;
    upstream mysql {
    
    
        server 192.168.116.155:3306;
        server 192.168.116.156:3306;
        }
server {
    
    
    listen       3306;
    proxy_pass mysql;
    }
}

七层负载需要在主配置文件内添加 http{} 在里面也添加 include

[root@localhost ~]# cat /etc/nginx/conf.d/default.conf
upstream testapp {
    
    
      server 192.168.116.158:80;
      server 192.168.116.159:80;
}

server {
    
    
    listen       82;
    proxy_pass testapp;
    } 

代理机拷贝任意一个数据库文件

scp [email protected]:/usr/bin/mysql /usr/bin/mysql

刷新数据

nginx -s reload

查询库1的数据库文件
mysql -u用户 -p密码 -h地址 -A -e " 命令 "

[root@localhost tmp]# mysql -uNeko -pNeko@123 -h192.168.116.158 -A -e "select id from db1.t1;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+
| id   |
+------+
|    1 |
+------+

查询库2

[root@localhost tmp]# mysql -uNeko -pNeko@123 -h192.168.116.159 -A -e "select id from db1.t1;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+
| id   |
+------+
|    1 |
|    2 |
+------+

查询端口

ss -natl

以只读方式查看文件内容

less /etc/nginx/nginx.conf

猜你喜欢

转载自blog.csdn.net/Houaki/article/details/111342270