- 下载: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 //查看服务状态
- 测试代码
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
import time, threading
import random
import gevent
import signal
from gevent import socket
import sys, os
thread_num = 5
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!