Nginx实现udp负载均衡(部署+测试)
·
- 下载:wget http://nginx.org/download/nginx-1.16.1.tar.gz
本地下载(内含部署文档): 点击下载 nginx-1.16.1 - 安装依赖
apt-get install gcc gcc-c++ autoconf automake apt-get install zlib1g-dev openssl libssl-dev libpcre3 libpcre3-dev - 安装
tar xvf nginx-1.16.1.tar.gz cd nginx-1.16.1 ./configure --with-stream make make install ldconfig - nginx配置udp转发
vi /usr/local/nginx/conf/nginx.conf 修改如下: #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } stream { upstream dns_servers{ least_conn; server 192.168.2.125:20001 ; server 192.168.2.125:20002 ; } server { listen 20000 udp; proxy_pass dns_servers; proxy_buffer_size 16k; proxy_timeout 10s; } } ``` - 启动
vi /usr/lib/systemd/system/nginx.service [Unit] Description=nginx - high performance web server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop [Install] WantedBy=multi-user.target systemctl daemon-reload //重新加载服务 systemctl start nginx //启动 systemctl stop nginx //停止 systemctl reload nginx //重启 可以不用停止nginx服务,使修改的配置生效 systemctl restart nginx //重启 systemctl enable nginx //设置开机启动 systemctl disable nginx //禁用开机启动 systemctl status nginx //查看服务状态 - 测试代码
- server.py 启动两台服务端
# coding=utf-8
import time, threading
import random
import gevent
import signal
from gevent import socket
import sys, os
remote = (("192.168.2.125", 20001), ("192.168.2.125", 20002))
ncli = range(0, len(remote))
threads = []
def serverThread(arg, val):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(remote[arg])
print "[%d]Thread: Bind %s" % (arg, remote[arg])
while True:
try:
recv_data, addr = sock.recvfrom(1024)
print '[%d]Thread: Recv from %s:%s' % (arg, addr, recv_data)
send_data = '[%s]Hello, %s!' % (remote[arg], recv_data)
sock.sendto(send_data, addr)
except Exception as e:
print e
sock.close()
def Process():
try:
for i in ncli:
t = threading.Thread(target=serverThread, args=(i,0))
t.setDaemon(True)
threads.append(t)
for i in ncli:
threads[i].start()
except KeyboardInterrupt:
print 'end'
def signal_handler(signum, frame):
print 'PID:[%d] exit!' % os.getpid()
os.kill(os.getpid(),signal.SIGKILL)
def CtrlSignalExit():
signal.signal(signal.SIGINT, signal_handler)
if __name__ == '__main__':
CtrlSignalExit()
Process()
while True:
alive = False
for i in ncli:
alive = alive or threads[i].isAlive()
time.sleep(0.01)
if not alive:
break
- client.py 启动多台客户端
# coding=utf-8
import time, threading
import random
import gevent
import signal
from gevent import socket
import sys, os
thread_num = 5 #open thread num
is_exit = True
time_out_count = 0
start_time = 0
thread_count = range(0,thread_num)
def clientThread(arg,val):
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
socket.setdefaulttimeout(3)
remote = ("192.168.2.125", 20000)
count = 0
while is_exit:
try:
count += 1
global thread_count
thread_count[arg] = count
send_data = '[%d]Client: Test:%d' % (arg, count)
sock.sendto(send_data,remote)
recv_data,address = sock.recvfrom(1024)
print recv_data
except socket.timeout as e:
global time_out_count
time_out_count += 1
print 'time out'
if is_exit == False:
break
time.sleep(1)
sock.close()
ncli = range(0,thread_num)
threads = []
def press_test():
try:
for i in ncli:
t = threading.Thread(target=clientThread, args=(i,0))
t.setDaemon(True)
threads.append(t)
for i in ncli:
threads[i].start()
except KeyboardInterrupt:
print 'end'
def signal_handler(signum, frame):
tatol_count = 0
time_count = int(time.time() - start_time)
global is_exit
is_exit = False
time.sleep(1)
print '\n**********Press Result*********'
for i,val in enumerate(thread_count):
tatol_count += val
print 'index:%d count:%d' % (i,val)
print 'Press test end time out:%d' % (time_out_count)
print 'Press test time:%ds' % (time_count)
print 'Press test tatol count:%d' % (tatol_count)
if time_count > 0:
print 'Press test average second num:%d' % (tatol_count/time_count)
def CtrlSignalExit():
signal.signal(signal.SIGINT, signal_handler)
if __name__ == '__main__':
global start_time
start_time = time.time()
CtrlSignalExit()
press_test()
while True:
alive = False
for i in ncli:
alive = alive or threads[i].isAlive()
time.sleep(0.01)
if not alive:
break
- 测试结果
- 服务端
[0]Thread: Bind ('192.168.2.125', 20001)
[1]Thread: Bind ('192.168.2.125', 20002)
[0]Thread: Recv from ('192.168.2.125', 38190):[0]Client: Test:1
[1]Thread: Recv from ('192.168.2.125', 59498):[1]Client: Test:1
[1]Thread: Recv from ('192.168.2.125', 60757):[2]Client: Test:1
[0]Thread: Recv from ('192.168.2.125', 50820):[3]Client: Test:1
[0]Thread: Recv from ('192.168.2.125', 56942):[4]Client: Test:1
[1]Thread: Recv from ('192.168.2.125', 60757):[2]Client: Test:2
[0]Thread: Recv from ('192.168.2.125', 38190):[0]Client: Test:2
[1]Thread: Recv from ('192.168.2.125', 59498):[1]Client: Test:2
[0]Thread: Recv from ('192.168.2.125', 56942):[4]Client: Test:2
[0]Thread: Recv from ('192.168.2.125', 50820):[3]Client: Test:2
[1]Thread: Recv from ('192.168.2.125', 60757):[2]Client: Test:3
[0]Thread: Recv from ('192.168.2.125', 38190):[0]Client: Test:3
[0]Thread: Recv from ('192.168.2.125', 50820):[3]Client: Test:3
[1]Thread: Recv from ('192.168.2.125', 59498):[1]Client: Test:3
[0]Thread: Recv from ('192.168.2.125', 56942):[4]Client: Test:3
- 客户端
[('192.168.2.125', 20002)]Hello, [2]Client: Test:1!
[('192.168.2.125', 20001)]Hello, [0]Client: Test:1!
[('192.168.2.125', 20002)]Hello, [1]Client: Test:1!
[('192.168.2.125', 20001)]Hello, [3]Client: Test:1!
[('192.168.2.125', 20001)]Hello, [4]Client: Test:1!
[('192.168.2.125', 20002)]Hello, [2]Client: Test:2!
[('192.168.2.125', 20002)]Hello, [1]Client: Test:2!
[('192.168.2.125', 20001)]Hello, [4]Client: Test:2!
[('192.168.2.125', 20001)]Hello, [0]Client: Test:2!
[('192.168.2.125', 20001)]Hello, [3]Client: Test:2!
[('192.168.2.125', 20001)]Hello, [3]Client: Test:3!
[('192.168.2.125', 20001)]Hello, [0]Client: Test:3!
[('192.168.2.125', 20002)]Hello, [2]Client: Test:3!
[('192.168.2.125', 20002)]Hello, [1]Client: Test:3!
[('192.168.2.125', 20001)]Hello, [4]Client: Test:3!
更多推荐



所有评论(0)