-
首先下载nginx,注意1.9.0之前的版本没有自带nginx代理,需要编译时指定。
http://nginx.org/en/download.html
-
修改conf/nginx.conf
......
stream {
upstream backend {
hash $remote_addr consistent;
# 代理以下3台机器
server 127.0.0.1:9997 max_fails=3 fail_timeout=1000s;
server 127.0.0.1:9998 max_fails=3 fail_timeout=1000s;
server 127.0.0.1:9999 max_fails=3 fail_timeout=1000s;
}
server {
统一端口监听为9010
listen 9010;
proxy_connect_timeout 1000s;
proxy_timeout 1000s;
proxy_pass backend;
}
}
.....
- 启动测试
使用golang开启3个tcp端口
package main
import (
"fmt"
"net"
"strings"
)
// 读取数据
func handleConnection(conn net.Conn) {
for {
buf := make([]byte, 1024)
if _,err := conn.Read(buf);err == nil {
result := strings.Replace(string(buf),"\n","",1)
fmt.Println(result)
}else{
fmt.Println(err)
}
}
}
func main() {
/*
Listen: 返回在一个本地网络地址laddr上监听的Listener。网络类型参数net必须是面向流的网络: "tcp"、"tcp4"、"tcp6"、"unix"或"unixpacket"。
*/
listener, err := net.Listen("tcp", "localhost:9999")
if err != nil {
fmt.Println("listen error:", err)
return
}
//todo 限速算法
fmt.Println("server listen success")
for {
//等待客户端接入
conn, err := listener.Accept()
if err != nil {
fmt.Println("accept error:", err)
break
}
// 使用协程
go handleConnection(conn)
}
}
建立连接,收到请求,我们与Nginx建立连接后,Nginx将会把请求转发给我们真实的服务器。