小樱 发表于 2017/8/12 03:33

一个linux vps中用C做的开源和免费的高性能BitTorrent Tracker通讯服务器 (OpenTracker中文教程)

(https://erdgeist.org/arts/software/opentracker/)
=======

-------
That should leave you with an exectuable called opentracker and one debug version opentracker.debug.

Some variables in opentracker's Makefile control features and behaviour of opentracker. Here they are:

-DWANT_V6 makes opentracker an IPv6-only tracker. More in the v6-section below.
opentracker can deliver gzip compressed full scrapes. Enable this with -DWANT_COMPRESSION_GZIP option.
Normally opentracker tracks any torrent announced to it. You can change that behaviour by enabling ONE of -DWANT_ACCESSLIST_BLACK or-DWANT_ACCESSLIST_WHITE. Note, that you have to provide a whitelist file in order to make opentracker do anything in the latter case. More in the closed mode section below.
opentracker can run in a cluster. Enable this behaviour by enabling -DWANT_SYNC_LIVE. Note, that you have to configure your cluster before you can use opentracker when this option is on.
Some statistics opentracker can provide are sensitive. You can restrict access to these statistics by enabling -DWANT_RESTRICT_STATS. See section statistics for more details.
Fullscrapes is bittorrent's way to query a tracker for all tracked torrents. Since it's in the standard, it is enabled by default. Disable it by commenting out -DWANT_FULLSCRAPE.
By default opentracker will only allow the connecting endpoint's IP address to be announced. Bittorrent standard allows clients to provide an IP address in its query string. You can make opentracker use this IP address by enabling -DWANT_IP_FROM_QUERY_STRING.
Some experimental or older, deprecated features can be enabled by the -DWANT_LOG_NETWORKS, -DWANT_SYNC_SCRAPE or -DWANT_IP_FROM_PROXY switch.
Currently there is some packages for some linux distributions and OpenBSD around, but some of them patch Makefile and default config to make opentracker closed by default. I explicitly don't endorse those packages and will not give support for problems stemming from these missconfigurations.


-------
Invocation
opentracker can be run by just typing ./opentracker. This will make opentracker bind to 0.0.0.0:6969 and happily serve all torrents presented to it. If ran as root, opentracker will immediately chroot to . (or any directory given with the -d option) and drop all priviliges after binding to whatever tcp or udp ports it is requested.

When options were few, opentracker used to accept all of them from command line. While this still is possible for most options, using them is quite unhandy: an example invocation would look like ./opentracker -i 23.23.23.7 -p 80 -P 80 -p 6969 -i 23.23.23.8 -p 80 -r http://www.mytorrentsite.com/ -d /usr/local/etc/opentracker -w mytorrents.list -A 127.0.0.1.

opentracker now uses a config file that you can provide with the -f switch.


-------
Config file
opentracker's config file is very straight forward and a very well documented example config can be found in the file opentracker.conf.sample.


-------
Closed mode
While personally I like my tracker to be open, I can see that there's people that want to control what torrents to track – or not to track. If you've compiled opentracker with one of the accesslist-options (see Build instructions above), you can control which torrents are tracked by providing a file that contains a list of human readable info_hashes. An example whitelist file would look like

0123456789abcdef0123456789abcdef01234567
890123456789abcdef0123456789abcdef012345
To make opentracker reload it's white/blacklist, send a SIGHUP unix signal.


-------
Statistics
Given its very network centric approach, talking to opentracker via http comes very naturally. Besides the /announce and /scrape paths, there is a third path you can access the tracker by: /stats. This request takes parameters, for a quick overview just inquire /stats?mode=everything`.

Statistics have grown over time and are currently not very tidied up. Most modes were written to dump legacy-SNMP-style blocks that can easily be monitored by MRTG. These modes are: peer, conn, scrp, udp4, tcp4, busy, torr, fscr, completed, syncs. I'm not going to explain these here.

The statedump mode dumps non-recreatable states of the tracker so you can later reconstruct an opentracker session with the -l option. This is beta and wildly undocumented.

You can inquire opentracker's version (i.e. CVS versions of all its objects) using the version mode.


下面中文的,方便讲解使用
Centos 6.9 x64位安装说明
yum -y install unzip wget gcc zlib-devel make
wget https://github.com/1265578519/OpenTracker/archive/master.zip -O /root/OpenTracker.zip
unzip OpenTracker.zip
mv OpenTracker-master /home
cd /home
cd OpenTracker-master
cd libowfat
make
cd /home/OpenTracker-master
cd opentracker
make



运行程序,并且监听tcp和udp端口的8080,并且自动后台工作
./opentracker -f opentracker.conf.sample -p 8080 -P 8080 &

推荐使用8080端口,基本上免备案不会扫描,而且CloudFlare也支持使用CDN隐藏IP来使用。

多端口可以加多个即可
./opentracker -f opentracker.conf.sample -p 8080 -P 8080 -p 6961 -P 6961 -p 2710 -P 2710 &

添加开机启动,执行一次即可,否则会启动多个进程。。。可以搭配下方的计划任务自动重启进程,如果centos 7未有killall命令可以用 yum -y install psmisc 安装,centos7要赋予开机启动文件执行权限 chmod +x /etc/rc.d/rc.local;ll /etc/rc.d/rc.local
echo "cd /home/OpenTracker-master;cd opentracker;./opentracker -f opentracker.conf.sample -p 8080 -P 8080 -p 6961 -P 6961 -p 2710 -P 2710 &" >> /etc/rc.d/rc.local

输入下方命令可以查看是否在工作中
top -b -n 1 |grep opentracker

查看进程当前并发连接数
netstat -apn|grep opentracker |wc -l

查看系统当前网络情况
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S}'

通过浏览器访问程序的统计功能
http://ip:8080/stats
http://ip:8080/stats?mode=everything
http://ip:8080/stats?mode=top100
http://ip:8080/scrape

服务器里面可以
curl http://localhost:8080/stats

运行crontab -e
可以根据需要使用计划任务自动重启进程,下方意思,每天0点、6点、12点、18点整,自动重启进程。
0 0,6,12,18 * * * killall -9 opentracker;sleep 3;cd /home/OpenTracker-master;cd opentracker;./opentracker -f opentracker.conf.sample -p 8080 -P 8080 -p 6961 -P 6961 -p 2710 -P 2710 &

方法二
使用计划任务自动监控进程是否存在然后重启恢复,不进行定时重启
* * * * * /sbin/pidof opentracker||{ cd /home/OpenTracker-master;cd opentracker;./opentracker -f opentracker.conf.sample -p 8080 -P 8080 -p 6961 -P 6961 -p 2710 -P 2710 &}

方式三,推荐替换二,可以代替之前的pidof判断oom杀进程,毕竟触发oom的之前几分钟因为内存不足都无法新建tcp连接,ssh都上不去(控制512M内存的75%是125000,1G内存的75%是250000,避免超过80%)
* * * * * [ $(awk '/MemFree/ {free=$2} /Buffers/ {buffers=$2} /^Cached/ {cached=$2} END {print free + buffers + cached}' /proc/meminfo) -lt 125000 ] && { killall -9 opentracker;sleep 3;cd /home/OpenTracker-master;cd opentracker;./opentracker -f opentracker.conf.sample -p 8080 -P 8080 -p 6961 -P 6961 -p 2710 -P 2710 &}

软件的自带帮助说明
Usage: ./opentracker [-i ip] [-p port] [-P port] [-r redirect] [-d dir] [-u user] [-A ip] [-f config] [-s livesyncport]
        -f config include and execute the config file
        -i ip   specify ip to bind to (default: *, you may specify more than one)
        -p port   specify tcp port to bind to (default: 6969, you may specify more than one)
        -P port   specify udp port to bind to (default: 6969, you may specify more than one)
        -r redirecturlspecify url where / should be redirected to (default none)
        -d dir    specify directory to try to chroot to (default: ".")
        -u user   specify user under whose priviliges opentracker should run (default: "nobody")
        -A ip   bless an ip address as admin address (e.g. to allow syncs from this address)

Example:   ./opentracker -i 127.0.0.1 -p 6969 -P 6969 -f ./opentracker.conf -i 10.1.1.23 -p 2710 -p 80


间隔可以在编译前进行修改,默认我改成了2小时,以便降低服务器宽带开销
trackerlogic.h:#define OT_CLIENT_TIMEOUT_SEND (60*15)#(60*30),客户端最小间隔请求时间,客户端可能不会遵守
trackerlogic.h:#define OT_CLIENT_REQUEST_INTERVAL (60*30)#(60*120),客户端默认间隔请求时间
trackerlogic.h:#define OT_CLIENT_REQUEST_VARIATION (60*6),服务端下发随机客户端间隔请求时间调整,提高性能,默认允许误差随机6分钟内,保持默认无修改
trackerlogic.h:#define OT_PEER_TIMEOUT 45#180,服务端删除peer时间,单位分钟


utorrent中制作种子过程tracker写
http://服务器ip:8080/announce

udp://服务器ip:8080/announce


我用这个在线八千多万用户还算很稳定
间隔2h,内存占用也才60多M。




-------
程序来自官网
https://erdgeist.org/arts/software/opentracker/
mail:erdgeist@erdgeist.org


已知BUG,开机后占用满一个核心99CPU,需要killall杀死进程重新启用进程即可,不知道什么原理所以建议计划任务一下。
而且这也是个单线程软件,,没办法利用多CPU,同时Fullscrape有BUG会产生内存泄漏,本贴教程已优化默认关闭此功能。
https://bbs.itzmx.com/thread-101068-1-1.html

有人可能会同时做种上千个任务 同一ip一瞬间的高请求是正常的,opentracker会返回下次随机间隔6分钟时间,客户端持续运行的时候,会把请求错开,主要高峰就是在启动全部任务的时候。基本很多人都是挂上千个任务的,所以一秒20次是很正常的啦
scrape作用不大,在连接tracekr之前查询服务器状态,目前只有几个少数客户端支持,而且产生full scrape时候会产生较大的内存,小机器内存不建议提供full scrape,甚至可以阻断整个scrape页面,关闭scrape不会影响tracker的正常运行,关闭full scrape需要源码重新编译
关于上面说的,主要就是这个Fullscrape,要关掉,不然消耗内存


推荐Tracker服务器购买优惠注册地址:
https://www.vultr.com/?ref=6813695
https://justhost.ru/services/vps/tariffs/13?ref=75001

注:2024年2月27日更新一次版本代码改动
centos6仅支持libowfat 0.31,centos7仅支持libowfat 0.32,请使用对应系统的版本编译opentracker,上方提供的安装代码当前版本为libowfat0.32
centos6在使用 cd libowfat 进入目录的上方插入并且运行这段代码
rm -rf libowfat;mv libowfat-0.31 libowfat

2024年3月6日
已知stats页面会导致空指针bug引起进程崩溃,并且这个stats页面访问时占用cpu也比较高,不带参数访问可能卡出BUG输出top的内容
可以考虑启用DWANT_RESTRICT_STATS 来关闭stats功能,正在尝试修复源代码,等会看看崩不崩溃吧

2024年3月16日
访问stats页面导致触发的崩溃问题已修复,原因是idx的问题,同时修复了stats_top_txt函数导致高cpu占用
总结:问题是有人拿top100的链接当tracker用,导致每分钟触发访问几十次top100页面,然后崩溃,崩溃问题修复了,现在也禁止这类异常访问用

2024年4月7日
完美版,修复崩溃(这里的崩溃指的是bep15 beta版本中clean代码发生的崩溃),支持bep15,udp实现ipv4与ipv6分离,使用bt协议规范开发避免udp响应错误ip地址(先用ipv6请求然后在用ipv4请求会响应3倍的错误数据包引起的bug,现已使用bep15修复),http保持原样,支持组合同时响应列表

2024年4月11日
这次是真的完美版,udp返回ipv4+ipv6所有数据显示,peer依旧按照bep15分别不同列表返回,修复stats?mode=everything触发8192字节崩溃,OT_STATS_TMPSIZE 8KB限制引发的崩溃改成智能化检测 OT_PEER_TIMEOUT


有关Linux内核优化参数
只需要调整打开文件数,和禁用系统防火墙避免lsmod加载nf模块引起高CPU占用和触发丢包,其它的参数就微乎其微了
1.打开文件数
ulimit -n 1048576
echo "* soft nofile 1048576" >> /etc/security/limits.conf
echo "* hard nofile 1048576" >> /etc/security/limits.conf
2.ksoftirqd内核进程占用高CPU的优化,禁用防火墙和确认lsmod中不存在加载nf驱动模块
centos7关闭防火墙并且禁用nf驱动模块,对于其它系统的关闭方法请使用搜索引擎
yum -y install iptables-services;service ip6tables stop;chkconfig ip6tables off;service iptables stop;chkconfig iptables off;systemctl stop firewalld;systemctl disable firewalld
关闭防火墙后,通过 lsmod 指令确认驱动模块加载情况,不能有包含"nf"开头的模块
3.如果使用ipv6网络,需要设置最大连接数,默认值4096,改为最大值不限制
echo "net.ipv6.route.max_size = 2147483647" >> /etc/sysctl.conf
然后执行 /sbin/sysctl -p 让参数生效
4.给予更多的socket端口号,默认值4096,1G内存设置为100000,这个对访问影响不大一般来说可以保持默认值
echo "net.ipv4.tcp_max_orphans = 100000" >> /etc/sysctl.conf
然后执行 /sbin/sysctl -p 让参数生效
以上优化中打开文件和防火墙关闭禁用nf驱动模块最为重要,对于防火墙给予了lsmod查看办法,下面这是确认打开文件设置成功的查看办法
根据软件的pid进行排序显示
yum -y install lsof
lsof -n | awk '{ print $2; }' | uniq -c | sort -rn | head
查看单个pid进程的限制打开文件大小最大数量,可以查看修改系统打开文件数量后是否生效了
cat /proc/28492/limits | grep files
虽然实际上ulimit限制显示是1024,但是Linux应该是用4字节作为计算,也就是4124达到阈值,修改打开文件后就可以突破4124,修改成功后两个数值都会显示为1048576

如果你用的是其他操作系统,Debian系统设置limits打开文件
https://bbs.itzmx.com/thread-110212-1-1.html

一个可选内存优化,禁用AnonHugePages释放更多可用内存给予进程
https://bbs.itzmx.com/thread-110231-1-1.html

同时禁用swap虚拟内存,在/etc/fstab中找到它并且删除swap挂载

小樱 发表于 2018/1/22 03:31

A max number of peer user.
can be add to limit the memory usage of the process.

1500w peer, process 2GB memory. I want to limit no more than 300w peer. Reduce memory usage.



100w peer大约进程占用85MB内存
一个用户90字节左右呢,算他0.1KB一个用户,1G内存根本不够的

小樱 发表于 2019/4/18 02:51

如何返回所有peer不受客户端numwant控制
You cant. You have to disable in ot_http.c:446
      if( numwant < 0 ) numwant = 50;
      if( numwant > 200 ) numwant = 200;

so that all larger values of numwant are allowed.

比如改成
      if( numwant < 0 ) numwant = 1200;
      if( numwant > 0 ) numwant = 1200;

同时还有411行不包含参数时候的默认返回值,numwant = 50;


ot_udp.c的话同理,但是对于numwant赋予设置值不要超过1200,超过运行软件会进程崩溃。
if (numwant > 200) numwant = 200;

改成
if (numwant > 0) numwant = 1200;

如果安装软件同时开启ipv4和ipv6时,本软件极限承受能力则不应该大于400(程序最大支持8KB输出,400*18=7.2KB)

注,启用ipv6编译会导致服务器宽带消耗三倍,如果不需要请在 Makefile 文件中编辑加#注释掉
#FEATURES+=-DWANT_V6

ipv4模式时,单用户6字节
ipv4与ipv6模式时,单用户18字节

zhuqiy 发表于 2024/8/5 22:28

按照此教程在乌班图和Debian下编译时会报错

小樱 发表于 2024/8/6 00:06

zhuqiy 发表于 2024/8/5 22:28
按照此教程在乌班图和Debian下编译时会报错

报错是什么错误信息?建议在centos下运行,性能最好,单核心vps就能带千万用户

zhuqiy 发表于 2024/8/6 09:40

小樱 发表于 2024/8/6 00:06
报错是什么错误信息?建议在centos下运行,性能最好,单核心vps就能带千万用户

其实是我太唐了,没有改Makefile文件里libowfat目录导致编译时报错。

小樱 发表于 2024/8/6 19:06

zhuqiy 发表于 2024/8/6 09:40
其实是我太唐了,没有改Makefile文件里libowfat目录导致编译时报错。

从帖子里下载的都是改好了的呀,你是自己去官方仓库下的源码?

zhuqiy 发表于 2024/8/6 20:04

小樱 发表于 2024/8/6 19:06
从帖子里下载的都是改好了的呀,你是自己去官方仓库下的源码?

在编译libowfat这一步时会报错,然后我就用apt装了。

小樱 发表于 2024/8/6 20:25

zhuqiy 发表于 2024/8/6 20:04
在编译libowfat这一步时会报错,然后我就用apt装了。

libowfat这个是和系统版本挂钩的,不同版本的系统只能使用对应的版本,所以会报错了,比如你的系统可能只能编译使用0.34,帖子上也有说明centos6和centos7要用不同版本

zhuqiy 发表于 2024/8/8 12:18

问一下,你这是使用的哪家的VPS,能带这么多客户端。

小樱 发表于 2024/8/8 18:41

zhuqiy 发表于 2024/8/8 12:18
问一下,你这是使用的哪家的VPS,能带这么多客户端。

千万级别的用户量用5刀的1G内存机器就行,超过1000w用户在线需要2G内存,作为tracker服务器时千万不要设置开启swap虚拟内存,一定要把swap禁用,如果运行过程中被系统内核OOM可以配合帖子上的定时重启和监控进程两个计划任务
帖子上介绍的vultr就可以
https://www.vultr.com/?ref=6813695
如果用户量不高的话,不超过300w用户在线可以使用512M内存,70卢布,1.16美元的10Mbps特价机
https://justhost.ru/services/vps/tariffs/13?ref=75001

zhuqiy 发表于 2024/8/8 18:56

小樱 发表于 2024/8/8 18:41
千万级别的用户量用5刀的1G内存机器就行,超过1000w用户在线需要2G内存,作为tracker服务器时千万不要 ...

好的

小樱 发表于 2024/8/15 00:55

zhuqiy 发表于 2024/8/8 18:56
好的

这是opentracker的性能,是业界顶尖水准,每秒轻松处理1w3千请求量,主要卡在tcp单核心上,不然多线程应该可以做的并发性能更高
Concurrency Level:      100
Time taken for tests:   7.310 seconds
Complete requests:      100000
Failed requests:      0
Write errors:         0
Total transferred:      17200000 bytes
HTML transferred:       10600000 bytes
Requests per second:    13680.35 [#/sec] (mean)
Time per request:       7.310 (mean)
Time per request:       0.073 (mean, across all concurrent requests)
Transfer rate:          2297.87 received

zhuqiy 发表于 2024/8/16 12:10

套cloudflare的话需要调整这个选项吗?https://www.dgj055.icu/2024-08-16T04-07-10.916Z.png

小樱 发表于 2024/8/16 18:38

zhuqiy 发表于 2024/8/16 12:10
套cloudflare的话需要调整这个选项吗?

要改成关闭,不然cf的防火墙可能会拦截,具体在cf的安全日志里面看是否有触发

zhuqiy 发表于 2024/8/16 19:37

小樱 发表于 2024/8/16 18:38
要改成关闭,不然cf的防火墙可能会拦截,具体在cf的安全日志里面看是否有触发

有几个ip会频繁触发,改成本质上为关就少多了,基本上只有Tor了。

小樱 发表于 2024/8/16 20:45

zhuqiy 发表于 2024/8/16 19:37
有几个ip会频繁触发,改成本质上为关就少多了,基本上只有Tor了。

有些人服务器会挂几百上千个种子做种上传分流,某些ip连接数比较高是很正常的
tor是国家地区的三位缩写代码,如果还出现错误拦截可以看日志里面的规则ID,是什么规则触发的,找到关闭拦截即可

用cdn注意有没有传递真实ip,如果是帖子里下载的源码默认是打开选项支持cf cdn,官方或者其它地方下载的源代码则需要修改一下并且重新编译
https://bbs.itzmx.com/thread-102765-1-1.html

zhuqiy 发表于 2024/8/16 21:47

小樱 发表于 2024/8/16 20:45
有些人服务器会挂几百上千个种子做种上传分流,某些ip连接数比较高是很正常的
tor是国家地区的三位缩写 ...

好的,感谢。
页: [1]
查看完整版本: 一个linux vps中用C做的开源和免费的高性能BitTorrent Tracker通讯服务器 (OpenTracker中文教程)