@orangleliu
2016-09-22T12:29:55.000000Z
字数 3080
阅读 12298
nginx
Nginx1.9
版本以后增加 stream模块,可以对tcp,udp请求进行代理和负载均衡了,今天来感受一下。
nginx streaming 文档地址
nginx streaming ssl 配置
--with-stream --with-stream_ssl_module
)nginx对应版本1.9.3+以上,编译安装对于高版本nginx基本就是三板斧,所以掠过。
都在一个机器上, nginx监听30003端口,然后开两个窗口,用nc监听 7773,7774端口。
nginx配置
/ nc -l 7773
telnet--> nginx(30003) -->
\ nc -l 7774
配置
stream {
upstream backend {
server 127.0.0.1:7773;
server 127.0.0.1:7774;
}
server {
listen 127.0.0.1:30003;
proxy_timeout 20s;
proxy_pass backend;
}
}
测试
telnet 127.0.0.1 30003
第一次会代理到 7773端口,第二次会到7774端口,挺好用。
下面是一个ssl 然后ip hash方式的负载均衡(tcp也支持几种负载均衡方式 round-robin, least_conn least_time, hash等)
stream {
upstream backend {
hash $remote_addr;
server 192.168.59.3:9344;
server 192.168.59.3:9345;
}
server {
listen 9344 ssl;
ssl_certificate /data/keys/CAcert.pem;
ssl_certificate_key /data/keys/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 2h;
proxy_timeout 20s;
proxy_pass backend;
}
}
测试失败
测试的场景:测试的主机是一台国外的VPS,代号host1。另外还有两个其他人的SS代理,用户名密码,以及加密方式都相同。 然后用host1代理host2, host3的ss服务,负载均衡使用轮训策略。 修改ss本地客户端配置,浏览器访问墙外的网站。
/ host2(ss)
client --> host1(nginx)
\ host3(ss)
host3 23.83.123.88
host1 配置nginx, stream部分, 和 http块同级
http {...}
stream {
upstream backend {
server 45.76.39.146:9999;
server 23.83.123.88:9999;
}
server {
listen 63.221.100.34:9000;
proxy_timeout 20s;
proxy_pass backend;
}
}
配置完成重启nginx
本地ss 客户端指向host1的地址和端口
错误如下,可以推断nginx能代理 TCP 请求,可是应用无法正常响应,怀疑proxy 方式来访问ss不好用。通过在host
1上抓包发现,host1可以往host2, host3发送请求。后来想一想nginx并不能完整的区分client的一个http请求,如果host2, host3只拿到http请求的部分tcp包,那么也无法正常代理(负载均衡的思路可以去掉了,后来想了下应该可以用ip hash来解决这个事)
2016/08/23 23:25:25 [error] 27384#27384: *266 connect() failed (111: Connection refused) while connecting to upstream, client: 182.18.73.162, server: 63.221.100.34:9000, upstream: "45.76.39.146:9999", bytes from/to client:0/0, bytes from/to upstream:0/0
2016/08/23 23:26:15 [notice] 27388#27388: signal process started
2016/08/23 23:28:33 [error] 27389#27389: *768 recv() failed (104: Connection reset by peer) while proxying connection, client: 182.18.73.162, server: 63.221.100.34:9000, upstream: "23.83.123.88:9999", bytes from/to client:239/0, bytes from/to upstream:0/239
现在不做负载均衡,只是配置一个backend来做tcp代理,于是注释掉host3.
upstream backend {
server 45.76.39.146:9999;
#server 23.83.123.88:9999; # 后来掉一个backend
}
在进行测试, 这次 打开host2上ss代理的 -v
模式
root@fendou liuzhizhi]# ss-server -c /etc/shadowsocks.json -v
2016-08-24 02:18:39 INFO: initializing ciphers... aes-256-cfb
2016-08-24 02:18:39 INFO: port reuse enabled
2016-08-24 02:18:39 INFO: listening at 45.76.39.146:9999
2016-08-24 02:18:40 INFO: accept a connection
2016-08-24 02:18:40 INFO: connect to [7759:5fcd:7e17:aaef:2602:7373:56ec:d45e]:58426
2016-08-24 02:18:40 INFO: accept a connection
2016-08-24 02:18:40 ERROR: authentication error from 63.221.100.34
2016-08-24 02:18:40 INFO: current server connection: 1
2016-08-24 02:18:41 INFO: accept a connection
2016-08-24 02:18:41 ERROR: authentication error from 63.221.100.34
2016-08-24 02:18:41 INFO: current server connection: 1
2016-08-24 02:18:41 INFO: accept a connection
2016-08-24 02:18:41 ERROR: authentication error from 63.221.100.34
浏览器测试还是不能正常代理,页面都无法打开。(具体原因还需查查)
nginx tcp proxy 安装,配置都比较简单,非常好。