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浮动ip和B共有 |
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浮动ip和B共有 |
C | Windows XP Jdk1.5+ Java测试程序 | 私有IP: PRI_IP_C | C服务器是测试机器,C能访问A和B的私有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