tcp反向代理默認(rèn)不在nginx的模塊里,想要nginx實(shí)現(xiàn)反向代理tcp請(qǐng)求,需要自己編譯tcp模塊到nginx中。
步驟如下:
- 下載、解壓縮nginx 源碼
wget '[http://nginx.org/download/nginx-1.2.1.tar.gz](http://nginx.org/download/nginx-1.2.1.tar.gz)'
tar -zxvf nginx-1.2.1.tar.gz
- 下載tcp模塊源碼
git clone https://github.com/yaoweibin/nginx_tcp_proxy_module.git
- 給nginx源碼打patch
cd nginx-1.2.1
patch -p1 < ../nginx_tcp_proxy_module/tcp.patch
- 編譯、安裝nginx
./configure --add-module=../nginx_tcp_proxy_module --prefix=/opt/nginx
make && sudo make install
- 配置nginx.conf
tcp模塊是不屬于HTTP框架內(nèi)的,所以和HTTP{}同級(jí)別,配置如下,則會(huì)監(jiān)聽8080端口的tcp連接,反向代理到2000、3000端口
tcp{
upstream cluster {
server localhost:2000;
server localhost:3000;
}
server{
listen 8080;
proxy_pass cluster;
}
}
6.測(cè)試
服務(wù)器端代碼
require 'socket' # 獲取socket標(biāo)準(zhǔn)庫(kù)
server = TCPServer.open(2000) # Socket 監(jiān)聽端口為 2000
loop { # 永久運(yùn)行服務(wù)
Thread.start(server.accept) do |client|
client.puts(Time.now.ctime) # 發(fā)送時(shí)間到客戶端
client.close
end
}
客戶端代碼
require 'socket'
socket = TCPSocket.open('localhost',8080)
puts socket.gets
socket.close
程序運(yùn)行后,會(huì)打印出當(dāng)前時(shí)間,表明nginx已可以反向代理tcp請(qǐng)求了。