nginx 实现tcp负载均衡
2017-09-02 15:14
246 查看
nginx常用来做http的反向代理,它默认是不支持tcp的,因此要使用nginx来实现tcp的反向代理必须用源码编译安装,并且在编译时安装tcp的扩展模块。
首先安装下载nginx:点击打开链接,tcp扩展模块:点击打开链接
然后解压ngin和,nginx_tcp_proxy_module-master。
1 进入nginx目录 cd nginx-1.2.1/ 执行 patch -p1 < /path/to/nginx_tcp_proxy_module/tcp.patch,例:patch -p1 < ../nginx_tcp_proxy_module-master/tcp.patch 。注意nginx_tcp_proxy_module的路径由你的解压路径决定。
2 生成makefile文件./configure --add-module=/path/to/nginx_tcp_proxy_module,执行前请保证系统中openssl已安装好,建议通过系统的安装库来安装,cents:通过yum安装,ubuntu通过apt-get install,mac通过brew install,openssl需要很多依赖库一个一个装特别麻烦,还有可能出错。
在这里说一下我遇到的问题吧,我装好了openssl但是ngixn找不到openssl的库,这时候添加参数./configure --add-module=../nginx_tcp_proxy_module-master/ --with-openssl=<path>,--with-openssl等号后的是自己openssl的安装目录,例:./configure
--add-module=../nginx_tcp_proxy_module-master/ --with-openssl=/usr/local/opt/openssl,但是事与愿违执行次命令完成后,通过make编译时报错错误如下:
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f objs/Makefile
cd /usr/local/lib/ \
&& /Applications/Xcode.app/Contents/Developer/usr/bin/make clean \
&& ./config --prefix=/usr/local/lib//.openssl no-shared no-threads \
&& /Applications/Xcode.app/Contents/Developer/usr/bin/make \
&& /Applications/Xcode.app/Contents/Developer/usr/bin/make install LIBDIR=lib
make[2]: *** No rule to make target `clean'. Stop.
make[1]: *** [/usr/local/opt/openssl/.openssl/include/openssl/ssl.h] Error 2
make: *** [build] Error 2
提示找不到sll.h,到系统中找发现/usr/local/opt/openssl确实没有.openssl目录,好头疼搞了半天,怎么办呢需要我门手动修改nginx的编译选选项。进入nginx目录下的nginx-1.2.1/auto/lib/openssl打开conf文件,找到这么一段代码:
CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"
CORE_LIBS="$CORE_LIBS $NGX_LIBDL"
修改成以下代码:
CORE_INCS="$CORE_INCS $OPENSSL/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libcrypto.a"
CORE_LIBS="$CORE_LIBS $NGX_LIBDL"
然后执行export PKG_CONFIG_PATH=/usr/local/openssl/lib/pkgconfig
export LD_LIBRARY_PATH=/usr/local/openssl/lib
最后在此执行./configure --add-module=../nginx_tcp_proxy_module-master/ --with-openssl=/usr/local/opt/openssl,注意最后不要加斜杠,然后执行
make && make install安装nginx。
到这里终于安装成功了。
接下来进入nginx目录找到nginx.conf文件添加
tcp {
upstream server {
server localhost:9000;
server localhost:9001;
#check interval 健康:检查时间间隔,单位为毫秒
#rise 检查几次正常后,将server加入以负载列表中
#fall 检查几次失败后,从负载队列移除server
#timeout 检查超时时间,单位为毫秒
check interval=3000 rise=2 fall=5 timeout=1000;
}
server {
listen 8786;
proxy_pass server;
}
}
然后启动nginx。
接下来验证我门的tcp代理是否成功。先写一个tcp server和client,用golang写的,简单快捷。
server
client
接下来我门拷贝server修改端口为9001,然后启动两个server同时监听9000和9001两个端口(根据nginx配置决定),然后运行cient,go run server1.go,go run server2.go go run client.go,测试结果:
然后我门就回看到50个客户端分别被分发到两个server上,说明我们的nginx的tcp负载均衡正常工作了。
参考文章:点击打开链接,文章中讲解了nginx是如何实现tcp的负载均衡的,nginx tcp负载均衡更详细的参数配置和调整改变nginx tcp负载均衡策略等等
首先安装下载nginx:点击打开链接,tcp扩展模块:点击打开链接
然后解压ngin和,nginx_tcp_proxy_module-master。
1 进入nginx目录 cd nginx-1.2.1/ 执行 patch -p1 < /path/to/nginx_tcp_proxy_module/tcp.patch,例:patch -p1 < ../nginx_tcp_proxy_module-master/tcp.patch 。注意nginx_tcp_proxy_module的路径由你的解压路径决定。
2 生成makefile文件./configure --add-module=/path/to/nginx_tcp_proxy_module,执行前请保证系统中openssl已安装好,建议通过系统的安装库来安装,cents:通过yum安装,ubuntu通过apt-get install,mac通过brew install,openssl需要很多依赖库一个一个装特别麻烦,还有可能出错。
在这里说一下我遇到的问题吧,我装好了openssl但是ngixn找不到openssl的库,这时候添加参数./configure --add-module=../nginx_tcp_proxy_module-master/ --with-openssl=<path>,--with-openssl等号后的是自己openssl的安装目录,例:./configure
--add-module=../nginx_tcp_proxy_module-master/ --with-openssl=/usr/local/opt/openssl,但是事与愿违执行次命令完成后,通过make编译时报错错误如下:
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f objs/Makefile
cd /usr/local/lib/ \
&& /Applications/Xcode.app/Contents/Developer/usr/bin/make clean \
&& ./config --prefix=/usr/local/lib//.openssl no-shared no-threads \
&& /Applications/Xcode.app/Contents/Developer/usr/bin/make \
&& /Applications/Xcode.app/Contents/Developer/usr/bin/make install LIBDIR=lib
make[2]: *** No rule to make target `clean'. Stop.
make[1]: *** [/usr/local/opt/openssl/.openssl/include/openssl/ssl.h] Error 2
make: *** [build] Error 2
提示找不到sll.h,到系统中找发现/usr/local/opt/openssl确实没有.openssl目录,好头疼搞了半天,怎么办呢需要我门手动修改nginx的编译选选项。进入nginx目录下的nginx-1.2.1/auto/lib/openssl打开conf文件,找到这么一段代码:
CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"
CORE_LIBS="$CORE_LIBS $NGX_LIBDL"
修改成以下代码:
CORE_INCS="$CORE_INCS $OPENSSL/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libcrypto.a"
CORE_LIBS="$CORE_LIBS $NGX_LIBDL"
然后执行export PKG_CONFIG_PATH=/usr/local/openssl/lib/pkgconfig
export LD_LIBRARY_PATH=/usr/local/openssl/lib
最后在此执行./configure --add-module=../nginx_tcp_proxy_module-master/ --with-openssl=/usr/local/opt/openssl,注意最后不要加斜杠,然后执行
make && make install安装nginx。
到这里终于安装成功了。
接下来进入nginx目录找到nginx.conf文件添加
tcp {
upstream server {
server localhost:9000;
server localhost:9001;
#check interval 健康:检查时间间隔,单位为毫秒
#rise 检查几次正常后,将server加入以负载列表中
#fall 检查几次失败后,从负载队列移除server
#timeout 检查超时时间,单位为毫秒
check interval=3000 rise=2 fall=5 timeout=1000;
}
server {
listen 8786;
proxy_pass server;
}
}
然后启动nginx。
接下来验证我门的tcp代理是否成功。先写一个tcp server和client,用golang写的,简单快捷。
server
package main import ( "fmt" "net" ) const ( ip = "localhost" port = 9000 ) func main() { listen, err := net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP(ip), port, ""}) if err != nil { fmt.Println("Listen error:", err.Error()) return } fmt.Printf("Server start at %s:%d\n",ip,port) Server(listen) } func Server(listen *net.TCPListener) { for { conn, err := listen.AcceptTCP() if err != nil { fmt.Println("Accept error:", err.Error()) continue } defer conn.Close() go func() { data := make([]byte, 128) for { i, err := conn.Read(data) if err != nil { break } fmt.Printf("Recv from:%s,data:%s\n",conn.RemoteAddr().String(),string(data[0:i])) conn.Write([]byte{'O', 'k'}) } }() } }
client
package main import ( "fmt" "net" "time" "strconv" ) const ( addr = "127.0.0.1:8786" ) func main() { for i := 0;i < 50;i++ { go Client(i) time.Sleep(time.Millisecond * 100) } } func Client(i int) { conn, err := net.Dial("tcp", addr) if err != nil { fmt.Println("Conn error") } defer conn.Close() data := "I am client:" data += strconv.Itoa(i) sms := []byte(data) conn.Write(sms) buf := make([]byte, 128) c, err := conn.Read(buf) if err != nil { fmt.Println("Read error:", err.Error()) } fmt.Println(string(buf[0:c])) for { time.Sleep(time.Second * 1) } }
接下来我门拷贝server修改端口为9001,然后启动两个server同时监听9000和9001两个端口(根据nginx配置决定),然后运行cient,go run server1.go,go run server2.go go run client.go,测试结果:
然后我门就回看到50个客户端分别被分发到两个server上,说明我们的nginx的tcp负载均衡正常工作了。
参考文章:点击打开链接,文章中讲解了nginx是如何实现tcp的负载均衡的,nginx tcp负载均衡更详细的参数配置和调整改变nginx tcp负载均衡策略等等
相关文章推荐
- Nginx实现HTTP负载均衡和TCP负载均衡
- 【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)
- nginx 实现tcp负载均衡
- Nginx+tomcat+redis集群共享session实现负载均衡
- 负载均衡NGINX+redis实现SESSION共享
- Windows下Nginx实现负载均衡
- ecshop在nginx下实现负载均衡
- Nginx 服务器 之Nginx与tomcat实现负载均衡
- nginx负载均衡实现
- nginx(负载均衡)+keepalived(HA) 实现双备
- Nginx+Keepalived 实现双击热备及负载均衡
- 使用Nginx实现反向代理和负载均衡
- Nginx + Memcached 实现Session共享的负载均衡
- nginx+keepalived实现双主负载均衡
- Nginx之——针对URL实现负载均衡或者说接口定向分发
- 架构之路 之 Nginx实现负载均衡
- Nginx配置upstream实现负载均衡
- 告别LVS:使用keepalived+nginx实现负载均衡代理多个https
- Nginx和Tomcat负载均衡实现session共享(转)