强烈推荐阿里云镜像站

阿里巴巴构建的阿里云开发者社区真是懂程序员所想,这里有一切你想你要的。 主页: https://developer.aliyun.com 特别是它的阿里云镜像站,真是一个大宝藏啊 https://developer.aliyun.com/mirror/ 里面包含所有Linux版本的操作系统镜像 此外还有: DNS解析 https://developer.aliyun.com/mirror/DNS NTP服务器 https://developer.aliyun.com/mirror/NTP 各种语言的镜像: python pypi软件仓 https://developer.aliyun.com/mirror/pypi rubygems https://developer.aliyun.com/mirror/rubygems maven仓镜像 https://maven.aliyun.com/mvn/view npmjs https://developer.aliyun.com/mirror/NPM

2020年3月8日 · 1 分钟

赵岩的博客全站HTTPS改造

互联网安全和个人隐私越来越被人们关注,不仅仅是电商等交易网站都实现了全站https,现在微博、百度以及大大小小的博客都实现了全站https。如果你的网站不是https的,火狐、chrome、IE浏览器都会在地址栏前方提示用户 你当前访问的网站是不安全的。 为了跟风,赵岩的博客今天起全站使用https。 为了实现全站HTTPS。我主要做了以下工作: 第一、HTTPS证书 https使用SSL传输协议,SSL之所以安全,是因为加密传输的。初始公钥由服务器传递给浏览器,为了保证公钥安全的传输到浏览器,并被浏览器认可,我们需要一个由第三方权威机构签名的证书。详细参考《HTTPS到底是如何保证通信安全的》 普通的单域名证书一年需要1000多元,我们自然不会去花这个钱的。阿里云代理的赛门铁克提供个人免费域名证书。可以直接申请。阿里证书申请 申请的时候选择“Symantec ”、“免费型”、“一个域名”。阿里云会要求DNS或者文件验证,证明你是域名的拥有者。整个申请过程10几分钟可完成。 第二、升级Nginx Nginx需要使用–with-http_ssl_module参数编译,确保支持https。为此我趁机会升级了下Nginx的版本到最新版本。 把你的证书pem文件和私钥key文件上传到服务器。 配置nginx.conf,监听443端口并加载证书。 原来监听的80端口,301转向443端口 server { listen 80; server_name zhaoyanblog.com; include black_list; rewrite ^(.*) https://$server_name$1 permanent; } server { listen 443; server_name zhaoyanblog.com; ssl on; ssl_certificate cert/xxx.pem; ssl_certificate_key cert/xxxx.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ...... 第三、全站HTTPS 1、检查网站内有没有引用了别的网站的js。需要切成https地址。或者根据document.location.protocol自适应当前的访问协议。 比如:微博、百度统计、百度站长、百度联盟广告等等组件。 http://widget.weibo.com/weiboshow/index.php 改成 https://widget.weibo.com/weiboshow/index.php 2、检查是否直接使用了本站的http地址。改成相对路径。虽然已经配置了80端口301跳转。这样改会少一步对服务器的访问。 比如:/wp-content/uploads/2017/04/zhaoyanblog_2017-04-17_14-50-20.jpg 改成 /wp-content/uploads/2017/04/zhaoyanblog_2017-04-17_14-50-20.jpg 可以通过查看浏览器的调试信息,知道哪些访问的资源仍然是http的。 第四、通知百度进行HTTPS验证 在验证好全站已经使用https,并且访问http也可以301跳转到https。我们需要通知百度等搜索引擎进行https验证。因为搜索引擎在之前都是缓存我们的http地址。需要告知他我们切到https。避免导致收录的页面丢失。 直接登录百度站长,里面有个https验证页面,点击验证即可。 至此赵岩的博客已经实现全站https ...

2018年5月20日 · 1 分钟

SUSE配置SDK安装源

当你编译一个开源软件的时候,例如nginx、php,他可能需要依赖很多开源库,一种做法是去官方网站上下载,自己编译。 但是新的开源库,可能又依赖另外一个开源库,你会发现自己陷入一个二叉树。。。。 还是使用系统的应用管理软件去直接安装开发包,是最方便的,例如SUSE的zypper。编译的时候依赖哪个包就安装哪个包, zypper帮你自动下载安装它所依赖的其它库。 一个开源库,有两个jar包,一个普通的包,一个是开发包(会包含编译用的头文件)。举例zlib库。 一个是zlib包,一个zlib-devel包。系统的安装盘里,只有zlib包,zlib-devel包是在SDK盘里。 SUSE的SDK安装源是非常难找啊,但是还是被我找到一个: 如果你和我一样使用的SUSE 你所需要的安装源,可以在http://demeter.uni-regensburg.de这个网站找这个SDK盘的安装源。 比如,我用的是SLE11SP3,对应的SDK安装源就是http://demeter.uni-regensburg.de/SLE11SP3-SDK-x64/DVD1/ 现在做的就是配置到zypper里: vi /etc/zypp/repos.d/SLES11-SP3-SDK.repo 输入: [SLES11-SP3-SDK] name=SLES11-SP3-SDK enabled=1 autorefresh=1 baseurl=http://demeter.uni-regensburg.de/SLE11SP3-SDK-x64/DVD1/ path=/ type=yast2 keeppackages=0 这样你就可以安装zlib-devel等开发包了: zypper install zlib-devel 再去编译nginx、php等其它开源软件,就不会有少依赖库的问题了。

2016年1月9日 · 1 分钟

博客正式从apache迁移至nginx

从apache迁移到nginx,主要有以下几个方面的事情: 1、编译php和nginx 编译php的参数: ./configure –prefix=/usr/local/php5 -with-config-file-path=/usr/local/php5/etc –enable-fpm –enable-pcntl –enable-mysqlnd –enable-opcache –enable-sockets –enable-sysvmsg –enable-sysvsem –enable-sysvshm –enable-shmop –enable-zip –enable-ftp –enable-soap –enable-xml –enable-mbstring –disable-rpath –disable-debug –disable-fileinfo –with-mysql –with-mysqli –with-pdo-mysql –with-pcre-regex –with-iconv –with-zlib –with-mcrypt –with-gd –with-mhash –with-xmlrpc make make install 编译php关键的是要加–enable-fpm参数,因为nginx不像apache有php插件,可以直接调用php。nginx是通过fast-cgi连接php服务,php服务是通过fpm启动的,php的其它模块最好也编译进去,不知道wordpress会用到什么模块,否则又要重新编译。 编译nginx ./configure –prefix=/usr/local/nginx make make install nginx 没有什么选项要指定,直接编译就好了。 2、启动php-fpm cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf 编辑配置文件:/usr/local/php5/etc/php-fpm.conf 一个是用户和群组: user = zhaoyanblog group = users 一个是端口 listen = 127.0.0.1:9000 最后启动就可以了: /usr/local/php5/sbin/php-fpm 3、启动nginx 编辑配置文件:/usr/local/nginx/conf/nginx.conf 添加http选项,增加压缩选项: gzip on; #启动压缩的最小报文大小 gzip_min_length 1k; #压缩所使用的缓存 gzip_buffers 4 16k; #压缩等级1表示最快,9表示最好 gzip_comp_level 2; #压缩支持的content-Type类型 gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss application/javascript; 里server里配置: ...

2016年1月9日 · 1 分钟

HTTPS到底是如何保证通信安全的

一直对https有个模糊的概念,只是知道https安全,信息是加密的,但是对于细节一直是不明白,特别是为什么要买个证书。今天看图灵图书的《图解HTTP》一书,看到https这一章节,终于知道个大概是咋回事了。 第一:https的概念 https就是把http协议包裹在SSL协议里,再加上一些证书的东西,就称为https。https就是躲在SSL协议之后的http协议。 http是把http请求或者响应传给传输层,传输层把请求或者响应包装之后发给http通信的另外一端。 https是SSL协议先把通信的两端加密方式协商好,http再把请求和响应传给SSL协议层,SSL层把请求和响应加密之后,再传给传输层,传给通信的另外一端,另外一端也是先由SSL层解密,再交给http层。 第二:SSL协议 SSL协议是介于传输层(tcp协议)和应用层(http协议)之间的一个协议。 SSL协议之前是网景公司提出的,后来由另外一个标准制定组织接收了,又提出了基于SSL协议发展的TLS协议. SSL协议就是用于通信两端建立安全连接,完成加密传输,保证传输的完整性。 第三:https通信过程。 1、SSL协议层先握手建立连接,协商使用的加密算法。 2、服务器先把公钥发给客户端。 3、这样客户端可以使用公钥加密发给服务器,服务器用私钥解密,服务器可以通过私钥加密发给客户端,客户端用公钥加密。 4、后面就开始正式的http通信。 (备注;ssl协议不仅仅使用非对称加密,还会混合使用对称加密,因为非对称加密很耗CPU,性能不好,ssl在建立连接之后,后面会协商一个共享秘钥进行内容通信。) 通过加密传输的数据就是安全的。 第四:证书 上面的通信过程建立链接之后是安全的,但是有一个漏洞。 第一:就是黑客可以冒充服务器发送假的公钥,和客户端通信 第二:就是黑客可以冒充假的客户端和服务器通信 先说第一个问题: 客户端如何证实是真的服务器发过来的真的公钥呢?这就出现了服务端的证书。 方法是通过第三方权威机构颁发的证书,所谓证书,就是第三方权威机构用自己的私钥,对某服务器的公钥进行的数字签名。 服务器在把公钥发给客户端的时候,也要发送自己的证书(也就是第三方机构的数字签名)。 客户端用第三方机构的公钥对数字签名进行验证,验证通过,就认为这个公钥是合法的。因为第三方权威机构的私钥是很安全的(我们暂且这么认为),所以伪造不了。 这就解决了第一个问题。 第三方权威机构必须是有信用的公司,例如VeriSign公司是专门的证书颁发机构,当然如果这个公司靠不住,以上都不成立了。 有人会问,这个第三方机构的公钥也是假的呢? 这个第三方机构的公钥肯定要以一种更安全的方式传给客户端。 那就是各大浏览器在发布的时候,已经把一些权威机构的公钥预置进去了,除非你下载了盗版的浏览器。 再说第二个问题,服务端如何识别客户端是真的客户端呢? 最安全的方式就是客户端也使用证书,每个专门的用户一个证书,但是这个代价比较高,因为申请证书要收费的。 目前大部分互联网企业做法是只对服务器端进行证书认证,只要确保客户端能识别真的服务器就可以了。 至于对客户端的真伪,一般的做法是通过用户名密码,只要用户名密码对了,我就认为和服务器连得客户端就是那个我认为的客户端。 再安全一点的做法就是验证手机号,弄个不断变化的密令,宝令,usb密码狗之类的。 所以用户千万不能把你的密码告诉别人。 以上看来,https通信还是比较安全的,怪不得那么多互联网公司都在转向全网https,这是一个趋势。 对于https还有很多细节,我这里只是大概描述个https的概念,更专业的东西就让专业搞密码学的人去搞吧。

2015年8月9日 · 1 分钟

SSH命令做代理

有时候遇到这样的问题。 第一种情况: A可以访问B机器,B可以访问C机器。A不可以访问C机器。 B机器可以做一个端口代理,让A可以访问到C机器。 在B机器上执行 ssh -C -f -N -g -L 9022:C机器的ip:22 root@B机器的IP 回车后输入B机器root密码。 这样在A机器上访问B机器的9022端口,就是相当于访问C机器的22端口。 第二种情况: 有一个VPN代理,想让多个人代理上网。 找一台linux机器A执行 ssh -q -T -f -n -N -D A机器IP:17111 vpn账号@VPN地址 -p vpn端口 回车后输入vpn密码。 多个浏览器就可以通过A机器的17111代理上网了,代理类型是SOCKET类型。

2015年8月7日 · 1 分钟

如何对多个大文件进行排序去重

单个文件,对其内容进行排序,使用sort命令: sort a.txt 去重加-u选项 sort -u a.txt 输出到一个文件 sort -o a.txt_sort -u a.txt 如果是100个1G大小的文件呢?如何进行排序去重呢?使用sort命令也是可以实现的。 第一步:先对单个文件进行排序去重 sort -o a1.txt -u a1.txt sort -o a2.txt -u a2.txt sort -o a3.txt -u a3.txt sort -o a4.txt -u a4.txt 。。。。 sort -o a100.txt -u a100.txt 第二步:使用sort的合并排序 sort -o a.txt -u -m a*.txt -m选项 表示merge已经有序的文件,如果文件事先没有排好序,这个可能会出错。 在执行merge的时候,你可能会遇到空间不足,无法写/tmp/sortXXXX的错误。 因为是多个大文件的合并操作,内存不够用,肯定是要写临时文件的。默认sort是写到/tmp目录下。 还好sort命令想的周到,你可以通过-T 选项指定一个较大空间的磁盘目录作为sort的临时文件目录。 sort -o a.txt -T /disk/temp -u -m a*.txt 最后等结果吧。

2015年7月1日 · 1 分钟

快速系统的掌握正则表达式

第一部分:原子匹配,所有的可见的不可见的字符都可以直接书写用于匹配, 注意1:对于不可见的字符和正则表达式的使用的特殊字符使用反斜杠转义。 注意2:对于中文最好使用unicode编码 第二部分:原子筛选 1点:“|” 表示前后都匹配,或者 ab|bc ab和bc都可以匹配成功。 2点:[abc] 匹配其中任何一个。 (注:"-" 表示区间,例如a到z所有字母可以写成[a-z]) 3点:[^abc] 不包含任何一个。 第三部分:原子集合(类似于快捷键一样) 第1点:. 匹配换行符之外的所有字符 第2点:\d 匹配数字和[0-9]等价 \D是\d的补集,等价[^0-9] 第3点:\s 匹配不可见的字符和[\r\n\t\f\v]等价,\S是\s的补集 第4点:\w 匹配字母数字和下划线和[0-9a-zA-Z_]等价,\W是\w的补集 第四部分:量词(修饰匹配前面的原子的个数) 第1点:{n} 恰好出现n次 第2点:{n,} 大于等于n次 第3点:{n,m} 大于等于n次,小于等于m次 第4点:* 匹配0次 1次或者多次,相当于{0,} 第5点:+ 匹配1次或者多次,相当于{1,} 第6点:? 匹配0次或者1次,相当于{0,1} 第五部分:边界控制和模式单元 第1点:^表示以后面的原子作为开头,前面没有任何东西 第2点:$表示以前面的原子作为结尾,后面没有任何东西 第3点:() 括起来的内容作为一个原子例如(ab){2},就表示匹配2个ab,(aa|bb)cd, 就表示匹配aacd或者bbcd 第六部分:修正类型(为了消除正则表达式的歧义) 修正类型有好多种,我觉得最重要一个就是关于贪婪模式和懒惰模模式的修正,也是和第四部分相关的。 例如: 正则表达式是:(ab){2,3},匹配对象是:ababab 那匹配的结果是abab, 还是ababab呢,前面的就是懒惰模式,后面的就是贪婪模式。 为了消除这种歧义,你要指定你所使用的模式。不同的正则引擎,指定方式不一样: 例如: php的是在正则表达式后面加个U或者u,分别表示懒惰模式和贪婪模式 例如’/[0-9]*/U' java使用的正则引擎是支持在有歧义的量词后面加个?表示懒惰模式,默认是贪婪模式。 例如 [0-9]+? 就表示匹配到尽量少的内容就返回。 正则表达式还有一些其它内容和细节,但是我觉得掌握这些概念,在实际应用中可以构造任何想要的匹配形式了。

2015年4月6日 · 1 分钟

linux环境下根据统计数据生成柱状图文件

工作中有一项工作就是一个监视脚本,把数据的增量信息,每天以邮件的形式发送给相关人员,但是每天的增量信息并不能直观的带来可用信息,比较有用的是近一段时间数据的增长趋势。 如果描述近一段时间的增长趋势,比较直观的做法,就是生成图像,虽然email支持html,但是它毕竟不是在浏览器中浏览,没法使用一些画图js。最后想到的就是生成图片格式的文件。 根据数据生成图片文件,首先想到的是Graphviz,之前用过它的dot命令。可以生成流程图。仔细研究了下这个软件包,貌似它只局限于关系图的表达,并不擅长图表领域。 再继续找,便找到了大名鼎鼎的gnuplot。记得大学时候用的仿真软件RSOFT,都内带了这款画图软件,说明gnuplot在专业绘图领域还是很出名的。 简单的示例,生成一个柱状图。 数据文件 data.txt 1月 22 2月 23 3月 20 4月 26 5月 32 6月 13 7月 22 8月 23 9月 20 10月 26 11月 32 12月 42 再写个脚本文件:plot.sh #!/bin/bash echo " set terminal png truecolor set output \"my.png\" set grid set style data histograms set style fill solid 1.00 border -1 set xlabel \"date\" set ylabel \"num\" plot \"data.txt\" using 2:xtic(1) title \"my data\" " | gnuplot 你也可以把echo的内容输入到一个文件里,然后使用gnuplot命令执行这个文件。 执行之后,生成的my.png文件如下,很不幸,不支持中文,不过网上有解决的方法。 ...

2015年3月3日 · 1 分钟

tomcat配置gzip压缩compressionMinSize选项无效

配置tomcat的gzip压缩功能之后,配置有个compressionMinSize选项,表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩。但是有时候你会发现这个配置并不起作用,貌似只要客户端加了Accept-Encoding: gzip, deflate,响应就是压缩的,无论响应报文体有多大,这是怎么回事呢? 查看tomcat源码,关于压缩条件控制的地方:org.apache.coyote.http11.AbstractHttp11Processor类中: // Check if sufficient length to trigger the compression long contentLength = response.getContentLengthLong(); if ((contentLength == -1) || (contentLength > compressionMinSize)) { // Check for compatible MIME-TYPE if (compressableMimeTypes != null) { return (startsWithStringArray(compressableMimeTypes, response.getContentType())); } } 可以看到,tomcat判断是否压缩的的依据是根据你响应里的Content-length来的,如果没有Content-length或者Content-length大于compressionMinSize就进行压缩。如果你的报文小于compressionMinSize,却被压缩了,那就是你的响应报文中并不含有Content-length。 Content-length可以在往外写响应流之前手动设置,如果你不设置的话,在关闭响应流的时候,如果你的响应体没超过tomcat默认缓存区大小8*1024,它也会帮你设置Content-lenth,如果超过了缓存区大小,tomcat会以Transfer-Encoding: chunked的形式返回响应。 所以如果你的设置compressionMinSize的没有生效,很有可能是 你的设置的compressionMinSize超出了tomcat的缓冲区大小,响应默认是chunked的形式返回的,这种情况是肯定压缩的。这种情况,还是有部分响应<8k的响应是不压缩的。 如果你的响应无论什么大小都被压缩了,那很有可能就是你在代码中使用了OutputStream.flush(),或者PrintWriter.flush()。使用flush()的意思是响应开始往外写了,Content-length已经来不及写了,tomcat会默认使用Transfer-Encoding: chunked形式帮你返回消息,响应肯定是要被压缩的。

2015年2月9日 · 1 分钟

HTTP中的GZIP压缩实现

HTTP协议中关于压缩传输的规定 第一:客户端传输到服务器请求中带有:Accept-Encoding:gzip, deflate 字段,向服务器表示,客户端支持的压缩格式(gzip或者deflate),如果不发送改消息头,服务器是不会压缩的。 第二:服务端在收到请求之后,如果发现请求头中含有Accept-Encoding字段,并且支持该类型的压缩,就对响应报文压缩之后返回给客户端,并且携带Content-Encoding:gzip消息头,表示响应报文是根据该格式压缩过的。 第三:客户端接收到请求之后,先判断是否有Content-Encoding消息头,如果有,按该格式解压报文。否则按正常报文处理。 服务端实现报文压缩 一般http容器都有配置实现压缩的,不需要代码实现 [nginx实现压缩,在nginx.conf中配置] #开启缓存 gzip on; #启动压缩的最小报文大小 gzip_min_length 1k; #压缩所使用的缓存 gzip_buffers 4 16k; #压缩等级1表示最快,9表示最好 gzip_comp_level 2; #压缩支持的content-Type类型 gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss; [apache实现压缩,在httpd.conf中配置] #启动deflate模块 LoadModule deflate_module modules/mod_deflate.so #配置压缩等级和压缩类型 DeflateCompressionLevel 6 AddOutputFilterByType DEFLATE text/plain text/html text/css text/javascript application/x-javascript [tomcat配置压缩] 参考《Tomcat配置gzip提高js文件下载速度》 客户端实现报文解压缩 [浏览器] 浏览器在访问一个网站的时候,默认都是带着Accept-Encoding:gzip, deflate头信息的,当收到响应的时候,如果是压缩的格式,也会自然解压。这一般不需要我们关系的。 [JAVA代码实现] java中访问一个url,一般使用apache的HttpClient,加上它的连接池管理,参考《JAVA的那些池子》 获得一个HttpClient实现类对象: HttpClient httpClient = new DefaultHttpClient(connectionManager, params); 使用它去发送http请求。这个httpclient发出去的http请求是默认不带Accept-Encoding:gzip, deflate头信息的。自然返回的响应也不会是压缩的。如果你希望实现接收压缩,进行解压缩的功能,你可以使用org.apache.http.impl.client.DecompressingHttpClient,它只是对Httpclient进行了一个包装。构造方法如下 HttpClient httpClient = new DefaultHttpClient(connectionManager, params); httpClient = new DecompressingHttpClient(httpClient); 后面就和之前发http请求,一样使用这个httpClient了,对压缩解压缩的功能,对你写代码而言是完全透明的。

2015年2月3日 · 1 分钟

比较容易理解的bash多线程实现方式

一直在找一个bash实现的多线程,虽然这个方法看着不怎么高明,但是比那个fifo的写法,看着明白点。这里面也限制了最多线程数,类似于线程池,记录在此,以备后用。 #!/bin/bash MAX_THREAD_NUM=10; thread_pids=() #执行线程 function hello_thread(){ echo "print $1" sleep 5; } #检查是否有完成的线程,把pid剔除调 function check_current_thread(){ if [ ${#thread_pids[@]} -ne 0 ]; then for pid_idx in ${!thread_pids[*]}; do pid_val=${thread_pids[$pid_idx]} kill -s 0 $pid_val &>/dev/null || unset thread_pids[$pid_idx] done thread_pids=("${thread_pids[@]}") fi; } for i in {1..100}; do #如果当前执行的线程数少于10个,就加一个任务 if [ ${#thread_pids[@]} -lt $MAX_THREAD_NUM ]; then hello_thread $i & thread_pids=("${thread_pids[@]}" "$!"); else sleep 1; check_current_thread; fi done #等待最后的任务结束 while [ ${#thread_pids[@]} -ne 0 ]; do check_current_thread; sleep 1; done;

2015年1月8日 · 1 分钟

评估两个机器之间的传输性能

在工作中需要调查一处性能问题,初步怀疑是两个机器之间的网络传输性能有瓶颈,如何判断两个机器之间的传输性能呢,排除丢包等网络故障,那就剩下带宽了。 1、首先两个机器的网卡的网速限制: 如果你的是百兆网卡,即便机器之间用光缆链接,那最高带宽也就100M,查看网卡的网速: 执行ethtool eth0可以查看对应网卡的网速 Settings for eth0: Supported ports: [ FIBRE ] Supported link modes: 1000baseT/Full Supports auto-negotiation: Yes Advertised link modes: 1000baseT/Full Advertised auto-negotiation: Yes Speed: 1000Mb/s Duplex: Full Port: FIBRE PHYAD: 2 Transceiver: internal Auto-negotiation: on Supports Wake-on: d Wake-on: d Link detected: yes 第二:即便两台机器都配有千兆网卡,如果中间有一个百兆交换机相连,他们的网速也只有100M。但是两台机器之间的链路复杂,还是需要测量得到两台机器的真实带宽,多平台带宽测试软件iperf(官方网站:https://iperf.fr/) linux x64下,直接下载可执行文件即可: wget –no-check-certificate https://iperf.fr/download/iperf_2.0.5/iperf_2.0.5-2_amd64 chmod +x iperf_2.0.5-2_amd64 sudo mv iperf_2.0.5-2_amd64 /usr/bin/iperf 在一台机器(ip=192.168.1.101)上执行:iperf -s -i 1 -w 1M 在另外一台机器上执行:iperf -c 192.168.1.1 -i 1 -w 1M 立马可以得到真实带宽: iperf -c 192.168.1.101 -i 1 -w 1M Client connecting to 192.168.1.101, TCP port 5001 TCP window size: 512 KByte (WARNING: requested 1.00 MByte) [ 3] local 192.168.1.102 port 12702 connected with 192.168.1.101 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0- 1.0 sec 113 MBytes 945 Mbits/sec [ 3] 1.0- 2.0 sec 112 MBytes 942 Mbits/sec [ 3] 2.0- 3.0 sec 112 MBytes 942 Mbits/sec [ 3] 3.0- 4.0 sec 112 MBytes 941 Mbits/sec [ 3] 4.0- 5.0 sec 112 MBytes 942 Mbits/sec [ 3] 5.0- 6.0 sec 112 MBytes 941 Mbits/sec [ 3] 6.0- 7.0 sec 112 MBytes 942 Mbits/sec [ 3] 7.0- 8.0 sec 112 MBytes 941 Mbits/sec [ 3] 8.0- 9.0 sec 112 MBytes 943 Mbits/sec [ 3] 9.0-10.0 sec 112 MBytes 942 Mbits/sec [ 3] 0.0-10.0 sec 1.10 GBytes 942 Mbits/sec

2014年11月20日 · 1 分钟

iphone6发布,苹果时代即将落幕

9月10日凌晨1点,新一代iphone,iphone6发布,我觉得随着iphone6的发布,正是苹果时代落幕的开始。 iphone之所以被人们喜爱,一方面是它的系统人性化,另外一方面也是最重要的,就是对完美的追求,iphone在我们手上就是一款艺术品,它完美对称,平整均匀,没有任何残缺,它就是一个整体,以至于很少有人单独拿它的屏幕,CPU或者其它部件和其它的手机去对比。 然而新一代iphone6,不可否认它有很多技术参数的提升,但是它完全牺牲了对完美设计的追求,没了一体化机身,侧边竟然和之前发布的魅族MX4如出一辙,摄像头竟然是突出的,我相信如果乔老爷子在世绝不允许这样显而易见的瑕疵出现。 新iphone完全落入了俗套,追求大屏,超薄,NFC,高性能。如果iphone没有了完美外观,那它和其它普通安卓手机有啥区别? 库克从iphone5开始就开始毁掉苹果,先是加长屏幕,廉价iphone5c,五颜六色的后盖,iphone6又直接出了两款。这无疑告诉用户,我库克无能,无法做出一款让所有用户满意的产品,我做出来一些,你们自己选吧。 iphone5至少还承袭了乔布斯的一些影子,至于iphone6的发布,我想就标志着苹果时代的落幕开始。

2014年9月9日 · 1 分钟

如何屏蔽恶意访问IP

最近一段时间发现我的博客隔三差五的就有一个访问高峰,在同一时刻近百个IP访问我的网站,并且只是访问首页而已,停留几秒遍离开了,这是一种不正常的访问。我想我的小博客没什么名气,和别的网站也没有什么利益冲突。应该不会有人对我进行DDOS攻击吧。但是我的博客是使用的廉价虚拟机,无论是不是恶意攻击,这样的短时间内的高强度访问,对我们的博客都是一定的冲击。 我首先分析了访问我博客这些IP的特征,发现全部是来自北京、浙江、山东三个地区的。IP段分别是:27.221.37.* 115.239.212.* 111.13.102.* 我首先想到的方法是屏蔽IP,到底在哪一层屏蔽IP呢? 我首先想到的是最外边的DNS层,如果这些IP访问我的网站,我不给它域名解析了,它的请求就到不了我的服务器,问题也解决了。我的域名解析使用了DNSPod,登陆上去查看了控制面板的所有功能,貌似没有提供这样的服务。那就只能在服务器上做屏蔽了,只要是这些ip来的请求,我返回一个403错误,问题也解决了,然而在西部数码的控制面板上也好像没找到这样的功能。 我遍寻百度,看到网站上关于使用apache的.htaccess文件来屏蔽ip访问的方法。而我的网站的根目录下确实是有这么一个文件。恶补了一下htaccess文件的来历和用途,发现确实是可以实现这样的功能的。然后我按网站上介绍的方法,在根目录的.htaccess文件中加入下面的语句: Order Allow,Deny Allow from all Deny from 115.239.212 111.13.102 27.221.37 我首先屏蔽了自己的IP,发现该功能并未起效,自己照样可以访问自己的博客,无奈我只好咨询了西部数码的工作人员,欣喜的是他们给了正确的操作方法,在htacess文件中加入下面的语句即可: <IfModule mod_rewrite.c> RewriteEngine On ##Block ip RewriteCond %{http:X-Forwarded-For}&%{REMOTE_ADDR} (27.221.37|115.239.212|111.13.102) [NC] RewriteRule (.*) - [F] </IfModule> 最终问题解决了,希望不再有恶意的攻击。

2014年6月3日 · 1 分钟