论详细日志的重要性

最近使用git遇到了问题,让我感觉到详细的日志是多么的重要。

我的pc装的是windows 10操作系统,git的版本是2.19.2,在拉取code的时候总是报500错误。如下图:

这个错误一度让我以为是服务端的错误,花了好多时间在服务寻找问题的根源。但是发现一个现象,在linux server里可以顺利的拉取代码,查看其git的版本是2.7.4。

于是乎,我把pc上的git版本换成2.7.4,再去拉代码,还是不行,但是提示错误就不一样了。如下图:

错误提示里说,连不上localhost的80端口。这让马上我联想到git是不是启用了代理。结果发现,还真的是启用了代理。

可见详细的日志是多么的重要。

 

 

发表在 IT | 标签为 | 留下评论

修改ubuntu18.04主机名

1.修改/etc/hostsname

ubuntu-node1

2.修改/etc/hosts文件

127.0.0.1       ubuntu-node1

3.修改/etc/cloud/cloud.cfg

把preserve_hostname配置设置为true

preserve_hostname: true

 

 

发表在 IT | 标签为 | 留下评论

R7000原厂固件不支持不同网段转发数据

R7000原厂固件不支持不通网段转发数据

The problem is that the R7000 will only NAT its own subnet. 
 It won't NAT traffic from other subnets.

来自:https://community.netgear.com/t5/Nighthawk-WiFi-Routers/R7000-Static-routing-not-able-to-reach-internet/td-p/1122475?cid=PSarlogoogleps10.26BG-PetMonitoring

I heard from another poster that Netgear quietly removed support for NATing traffic from other local subnets. 
I think the reason they gave him was something like it was too complicated for users?!?

来自:https://community.netgear.com/t5/Nighthawk-WiFi-Routers/NAT-for-different-subnet/td-p/1018525

 

 

发表在 IT | 标签为 , | 留下评论

win10激活

“以管理员身份”打开cmd

1. slmgr.vbs /upk

2.slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX

3.slmgr /skms zh.us.to

4.slmgr /ato

发表在 IT | 标签为 , , | 留下评论

shadowsocks优化

1.操作系统要支持BBR

2./etc/sysctl.conf

# max open files
fs.file-max = 1024000
# max read buffer
net.core.rmem_max = 67108864
# max write buffer
net.core.wmem_max = 67108864
# default read buffer
net.core.rmem_default = 65536
# default write buffer
net.core.wmem_default = 65536
# max processor input queue
net.core.netdev_max_backlog = 4096
# max backlog
net.core.somaxconn = 4096

# resist SYN flood attacks
net.ipv4.tcp_syncookies = 1
# reuse timewait sockets when safe
net.ipv4.tcp_tw_reuse = 1
# turn off fast timewait sockets recycling
net.ipv4.tcp_tw_recycle = 0
# short FIN timeout
net.ipv4.tcp_fin_timeout = 30
# short keepalive time
net.ipv4.tcp_keepalive_time = 1200
# outbound port range
net.ipv4.ip_local_port_range = 10000 65000
# max SYN backlog
net.ipv4.tcp_max_syn_backlog = 4096
# max timewait sockets held by system simultaneously
net.ipv4.tcp_max_tw_buckets = 5000
# TCP receive buffer
net.ipv4.tcp_rmem = 4096 87380 67108864
# TCP write buffer
net.ipv4.tcp_wmem = 4096 65536 67108864
# turn on path MTU discovery
net.ipv4.tcp_mtu_probing = 1

# for high-latency network
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq

# forward ipv4
net.ipv4.ip_forward = 1

net.ipv4.tcp_fastopen = 3

3.修改vi /etc/security/limits.conf文件,加入

*               soft    nofile           512000
*               hard    nofile          1024000

4.shadowsocks服务器、客户端开启TCP Fast Open

发表在 IT | 标签为 , , | 留下评论

RxJava2.0的Flow Control(流量控制的方法)

Flow Control(流量控制的方法):背压(Backpressure)、节流(Throttling)、打包处理、调用栈阻塞(Callstack Blocking)

1.Backpressure:也称为ReactivePull,就是下游需要多少(具体是通过下游的request请求指定需要多少),上游就发送多少。这有点类似于TCP里的流量控制,接收方根据自己的接收窗口的情况来控制接收速率,并通过反向的ACK包来控制发送方的发送速率。

2.Throttling:说白了就是丢弃。消费不过来,就处理其中一部分,剩下的丢弃。还是举音视频直播的例子,在下游处理不过来的时候,就需要丢弃数据包。具体策略:sample(也叫throttleLast)、throttleFirst、debounce (也叫throttleWithTimeout)

Sample(throttleLast):sample,采样。类比一下音频采样,8kHz的音频就是每125微秒采一个值。sample可以配置成,比如每100毫秒采样一个值,但100毫秒内上游可能过来很多值,选哪个值呢,就是选最后那个值。所以它也叫throttleLast。

ThrottleFirst:跟sample类似,比如还是每100毫秒采样一个值,但选这100毫秒内的第一个值。在Android开发中有时候可以把throttleFirst用作点击事件的防抖动处理,就是因为它可以在指定的一段时间内处理第一个点击事件(即采样第一个值),但丢弃后面的点击事件。

Debounce:也叫throttleWithTimeout,名字里就包含一个例子。比如,一个网络程序维护一个TCP连接,不停地收发数据,但中间没数据可以收发的时候,就有间歇。这段间歇的时间,可以称为idle time。当idle time超过一个预设值的时候,就算超时了(timeout),这个时候可能就需要把连接断开了。实际上一些做server端的网络程序就是这么工作的。每收发一个数据包之后,启动一个计时器,等待一个idle time。如果计时器到时之前,又有收发数据包的行为,那么计时器重置,等待一个新的idle time;而如果计时器时间到了,就超时了(time out),这个连接就可以关闭了。debounce的行为,跟这个非常类似,可以用它来找到那些连续的收发事件之后的idle time超时事件。换句话说,debounce可以把连续发生的事件之间的较大的间歇找出来。

3.打包处理:打包就是把上游来的小包裹打成大包裹,分发到下游。这样下游需要处理的包裹的个数就减少了。RxJava中提供了两类这样的机制:buffer和window。buffer和window的功能基本一样,只是输出格式不太一样:buffer打包后的包裹用一个List表示,而window打包后的包裹又是一个Observable。

4.调用栈阻塞(CallstackBlocking):这种方式只适用于整个调用链都在一个线程上同步执行的情况,这要求中间的各个operator都不能启动新的线程。在平常使用中这种应该是比较少见的,因为我们经常使用subscribeOn或observeOn来切换执行线程,而且有些复杂的operator本身也会在内部启动新的线程来处理。

 

在RxJava2.x中,Observable不再支持Backpressure,而是改用Flowable来专门支持Backpressure。上面提到的四种operator的前三种分别对应Flowable的三种Backpressure策略:
BackpressureStrategy.BUFFER,

BackpressureStrategy.DROP,

BackpressureStrategy.LATEST

BackpressureStrategy.BUFFER是不丢弃数据的处理方式。把上游收到的全部缓存下来,等下游来请求再发给下游。相当于一个水库。但上游太快,水库(buffer)就会溢出。

BackpressureStrategy.DROP和BackpressureStrategy.LATEST比较类似,都会丢弃数据。这两种策略相当于一种令牌机制(或者配额机制),下游通过request请求产生令牌(配额)给上游,上游接到多少令牌,就给下游发送多少数据。当令牌数消耗到0的时候,上游开始丢弃数据。但这两种策略在令牌数为0的时候有一点微妙的区别:onBackpressureDrop直接丢弃数据,不缓存任何数据;而onBackpressureLatest则缓存最新的一条数据,这样当上游接到新令牌的时候,它就先把缓存的上一条“最新”数据发送给下游。

发表在 IT | 标签为 , | 留下评论

client_max_body_size和client_body_buffer_size

最近发现给家里的nas上传大文件总是失败。于是看了nginx的日志发现:

2018/09/27 03:35:52 [error] 8#8: *14739 client intended to send too large body: 9247821 bytes, client: 115.214.xxx.xxx, server: 192.168.188.64, request: "POST /cgi-bin/filemanager/utilRequest.cgi?func=upload&type=standard&sid=ke3nzp1z&dest_path=%2Fhome%2FCamera%20Uploads%2FCamera&overwrite=0&progress=-home-Camera%20Uploads-Camera-IMG_20180922_143956.jpg HTTP/1.1", host: "www.xxxxx.com:81"

看到“too large body”就知道是http的请求体太小。然后就在nginx里增加配置,把请求体的最大大小设置为100M:

client_max_body_size 100m;

重启nginx后,在error.log里又看到下面的警告:

2018/09/27 05:33:37 [warn] 8#8: *364 a client request body is buffered to a temporary file /var/cache/nginx/client_temp/0000000049, client: 115.214.xxx.xxx, server: 192.168.188.64, request: "POST /cgi-bin/filemanager/utilRequest.cgi?func=chunked_upload&sid=d8cqr8yi&upload_id=tmpqEaIWu&settime=1&mtime=1533434732&offset=0&dest_path=%2Fhome%2FCamera%20Uploads%2FCamera&overwrite=0&filesize=6596195&upload_root_dir=%2Fhome HTTP/1.1", host: "www.xxxxxx.com:81"

这个错误的意思是每个请求的请求体缓存太小了,缓存(内存)放不下上传的文件,就写到文件系统里。不调整这个缓存大小也不会影响功能。但是每次上传一张较大的照片,nginx就要写一次文件系统。在批量上传照片的场景,nginx的io太多了。

我把这个缓存设置为20M,对于手机拍的照片,20M足够。大于20M的问题就,就够就写到文件系统里呗。

nginx配置:

client_body_buffer_size 20m;

 

 

发表在 IT | 标签为 , , | 留下评论

非中国IP模式下的shadowsocks如何挂pt

背景:

自从把路由的shadowsocks代理模式设置为非中国IP,导致PT只能下载不能上传

原因:

由于自己使用的pt的tracker服务器(tracker.hdtime.org,tracker.ccfbits.org)都是在海外。虽然通过shadowsocks代理可以连接到tracker服务器,但是tracker服务器看到的客户端ip是shadowsocks代理服务器的ip,而非pt客户端的ip。所以会导致其他pt客户端去下载自己本地的资源时,访问的是shadowsocks服务器ip。

解决方案:

ping出tracker服务器的ip,然后把这个ip放入china ipset里。具体实现如下:

pt_ip_update.sh

#! /bin/sh

ping_domain(){
        ip=`ping -c 2 $1 | awk -F'[ \:]' 'NR==3{print $4}'`
        echo $ip
}

check_ip(){
        count=`echo $1 | grep -c -e'^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$'`
        return $count
}

add_ip_to_china_set(){
        #echo "ping $1"
        check_ip $1
        result=`echo $?`
        #echo "check $1 result: $result"
        if [ $result -eq 1 ]; then
                ipset add china $1
        fi
}

ccfbits_ip=`ping_domain 'tracker.ccfbits.org'`
hdtime_ip=`ping_domain 'tracker.hdtime.org'`

add_ip_to_china_set $ccfbits_ip
add_ip_to_china_set $hdtime_ip

最后在crontab里,设置定时执行任务。

发表在 IT | 标签为 , , , , | 留下评论

shadowsocks中基于gfwlist自动代理和非中国IP代理的区别

shadowsocks其实有三种代理方式,分别是全局代理、基于gfwlist自动代理、非中国IP代理。

全局代理:

对所有ip的访问,都走代理

基于gfwlist自动代理:

基于一个被墙域名的列表(比如:https://github.com/gfwlist/gfwlist),再配合dnsmasq,把域名解析后的ip放在ipset的china-banned里。访问在列表中的域名,都走代理。

iptable的配置:

非中国IP代理:

基于一个中国ip的列表,把这个列表写入ipset的china里。访问不在这个列表里的ip,都走代理。这个模式效果很好,但是费流量,错杀一些没有被墙的ip。

 

 

 

发表在 IT | 标签为 , , , | 留下评论

动态屏蔽恶意ip地址

背景

网站运行时间久了,总有恶意的人来攻击网站。前不久,自己维护的一个论坛被攻击了。

这里分享一个屏蔽恶意ip的方法。

原理

1.定时监控nginx的access.log,把高频率访问的ip解析出来

2.定时监控nginx的access.log,通过关键字把恶意访问的ip过滤出来

3.把上面两个步骤解析出来的ip,写入的ipset

4.通过配置iptables,拒绝属于ipset的ip的访问

实现

1.监控脚本auto_ip_blacklist.sh

#!/bin/bash
# 日志文件列表,空格隔开
FILES="/home/wwwlogs/1.log /home/wwwlogs/access.log  /home/wwwlogs/2.log"
# 关键词,敏感词
sensitive="mysql|phpmyadmin|masscan|Shinka|id_rsa|id_ecdsa|winscp|ZmEu|myadmin2|myadmin"
threshold=1000

ip_file="/tmp/ip_file"
sensitive_file="/tmp/sensitive_file"
DATE=`date -d '1 minutes ago' +%Y:%H:%M`

grep -H ${DATE} ${FILES} | awk -F'[: ]' '{print $2}' | sort | uniq -c | sort -n | tail -n 1 > ${ip_file}
grep -H ${DATE} ${FILES} | egrep -i ${sensitive} | awk -F'[: ]' '{print $2}' | sort -n | uniq > ${sensitive_file}

ip_file_number=`awk '{print $1}' ${ip_file}`
ip_file_ip=`awk '{print $2}' ${ip_file}`

if [[ $ip_file_number -gt $threshold ]];then
    /usr/sbin/ipset add blacklist ${ip_file_ip} timeout 86400
fi

if [ -s ${sensitive_file} ];then
    for sensitive_ip in `cat ${sensitive_file}`
    do
        /usr/sbin/ipset add blacklist ${sensitive_ip}
    done
fi

2.加入crontab,定时运行脚本

*/3 * * * * /root/auto_ip_balcklist.sh

3.配置iptables

iptables -I INPUT -m set --match-set blacklist src -j DROP

 

 

 

发表在 IT | 标签为 , , | 留下评论