windows 下 nginx tcp 代理和负载均衡配置

           Nginx 是一个高性能的 HTTP 和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

      目前最新版本是nginx-1.9.1 ,自1.9.0之后,增加了tcp代理和负载均衡功能,以前的版本不支持tcp代理,但是由国人开发的补丁可以实现 tcp 代理,但是也仅仅基于linux系统的早期nginx版本。

 

    1、场景描述

    通过 nginx 实现tcp 代理和负载均衡,实现两台数据库sql server的轮流访问,数据库服务器A,数据库服务器B,均有相同的浮动IP,不同的私有ip。A和B 的数据库服务均侦听在本机所有IP的1433端口上。目前想通过外界直接访问A和B的共有浮动ip访问数据库。

    2、前提条件

     必须是 nginx-1.9.0 以上版本(包括1.9.0)。该版本之后,增加了  stream module,可以实现该功能。
下载地址:http://nginx.org/en/download.html

   3、服务器软件清单及IP配置


服务器

软件及操作系统

IP配置

说明

A

Windows Server 2003

SQL Server 2000

nginx-1.9.0

私有IP

   PRI_IP_A

浮动IP

   FLT_IP_A

   FLT_IP_COMMON

A服务器是windows server 2003,装有数据库sql server 2000

有一个私有ip,两个浮动ip,其中FLT_IP_COMMON浮动ipB共有

B

Windows Server 2003

SQL Server 2000

nginx-1.9.0

私有IP

   PRI_IP_B

浮动IP

   FLT_IP_B

   FLT_IP_COMMON

B服务器是windows server 2003,装有数据库sql server 2000

有一个私有ip,两个浮动ip,其中FLT_IP_COMMON浮动ipB共有

C

Windows XP

Jdk1.5+

Java测试程序

私有IP

   PRI_IP_C

C服务器是测试机器,C能访问AB的私有IP和浮动IP



    4、配置步骤

      1)、分别在A和B上,将nginx-1.9.0 下载的windows版本解压到c:/目录下
      2)、修改nginx-1.9.0解压安装目录下conf/下的nginx.conf 文件。增加如下配置:

stream {
	upstream backend {
		#hash $remote_addr consistent;
		server FLT_IP_A:1433;
		server FLT_IP_B:1433;
	}
	server {
		listen *:14330;
		proxy_pass backend;
	}
}
 

    其中:
          FLT_IP_A    服务器A的浮动IP
          FLT_IP_B    服务器B的浮动IP
    具体见上表。

  3)分别在A 和B上,打开cmd ,cd c:/nginx-1.9.0目录,运行 nginx.exe 命令。

 

   5、测试

      在A 和 B Sql Server 的 pubs数据中中建立 test 表,该表有一个字段host,分别在A和B上,增加一条记录,在A上,test表的 host字段的值为 120,在B上该表的host字段为121。test表的记录不同,以区别打印访问到的是哪个服务器的 test 表。
       在C机器上,运行java jdbc测试程序,通过共有浮动IP  FLT_IP_COMMON 的1433 端口访问数据库 。Java代码如下:

public class Test1 {
	public static void main(String[] srg) {  
        //加载JDBC驱动
		String driverName = "net.sourceforge.jtds.jdbc.Driver";    
		//连接服务器和数据库sample
        String dbURL = "jdbc:jtds:sqlserver://xxx.xx.xxx.xxx:14330/pubs";     
		String userName = "sa";   //默认用户名  
		String userPwd = "sa";   //密码  
		Connection dbConn;  
		try {
		   Class.forName(driverName);  
		   dbConn = DriverManager.getConnection(dbURL, userName, userPwd);  
		   java.sql.ResultSet rs=dbConn.createStatement().executeQuery("select name from test");
		   while(rs.next())
		   {
			   System.out.println(rs.getString(1));
		   }
           //如果连接成功 控制台输出Connection Successful!
		   System.out.println("Connection Successful!");    
		 } catch (Exception e) {  
		    e.printStackTrace();  
		 }
	}
}

 

     不断运行该程序,发现每次打印结果都和上一次不同,交替打印:

120
Connection Successful!
121
Connection Successful!
120
Connection Successful!
121
Connection Successful!
.......

 说明每次访问都和上次访问到的数据库不一样,测试证明nginx tcp代理和负载均衡成功。

 

     6、附nginx参数说明

     nginx.conf 配置,有很多实用的参数。
     默认情况下,连接通过权重的round-robin 方式转发到各服务器上。可以通过weight 参数进行配置:

 

upstream backend {
    server backend1.example.com:12345 weight=5;
    server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;
    server backend3.example.com:12345 ;
    server backup1.example.com:12345  backup;
}

 

其中:

weight=number   //权重数, 默认是1

max_fails=number //最大失败连接次数,默认是1

fail_timeout=time //超时时间,多长时间无法连上任务服务器不可用。默认是10秒。

backup //表示备份服务器,当主服务器不能用时,将会转发到备份服务器。

max_conns=number //设置服务器最大连接数,默认是0,表示被代理服务器没有连接数限制

上面例子中,每7个连接请求,有5个连接会转发到backend1.example.com:12345 上,1个连接会转发到第二和第三个服务器上。如果连接一个服务器发生异常,这个连接将会被转发到另外一个服务器上,直到所有服务器都被试过。如果连接所有服务器失败,这个连接将会被关闭。

还有其他灵活的好用的参数,有些是要商业subscription ,不一一列举,详细参考官方文档:

http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html

Nginx 官方商业plus:

http://nginx.com/products/?_ga=1.59191149.112802551.1432635936

 

 

展开阅读全文

没有更多推荐了,返回首页