My studying notes for Java,Ruby,Ajax and other any interesting things.

星期六, 七月 19, 2008

Linux内核优化 sysctl.conf



linux内核优化
来源: ChinaUnix博客   作者: 发布时间:2007-01-01


sysctl.conf 优化
The sysctl.conf of a server is something that is seldom optimized for
performance. You can get a tremendous boost in throughput by adjusting
these settings. This configuration has been written by Steve from
Rack911. I have applied this configuration to servers ranging from
Celeron 1.7Ghz to Dual Xeon 2.8Ghz servers, and on the whole, the load
on each lowered after making the changes.
First make a backup of your old /etc/sysctl.conf file by running the following command, logged in as root:
cp /etc/sysctl.conf /etc/sysctl.conf.bak
Now enter:
pico /etc/sysctl.conf
and replace the contents of the file with the following:
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
# sysctl.conf(5) for more details.
# Disables packet forwarding
net.ipv4.ip_forward=0
# Disables IP source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Enable IP spoofing protection, turn on source route verification
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Disable ICMP Redirect Acceptance
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# Enable Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 0
net.ipv4.conf.lo.log_martians = 0
net.ipv4.conf.eth0.log_martians = 0
# Disables the magic-sysrq key
kernel.sysrq = 0
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 15
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800
# Turn off the tcp_window_scaling
net.ipv4.tcp_window_scaling = 0
# Turn off the tcp_sack
net.ipv4.tcp_sack = 0
# Turn off the tcp_timestamps
net.ipv4.tcp_timestamps = 0
# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1
# Enable ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Enable bad error message Protection
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 1
# Increases the size of the socket queue (effectively, q0).
net.ipv4.tcp_max_syn_backlog = 1024
# Increase the tcp-time-wait buckets pool size
net.ipv4.tcp_max_tw_buckets = 1440000
# Allowed local port range
net.ipv4.ip_local_port_range = 16384 65536
CTRL + X to exit and save the file
To make your changes take effect immediately, type this command:
/sbin/sysctl -p
引用自:FreeBSD下构建安全的Web服务器
作者:heiyeluren http://www.unixsky.net
编辑 /etc/sysctl.conf 文档,在里面加入如下内容:(有注释)
#最大的待发送TCP数据缓冲区空间
net.inet.tcp.sendspace=65536
#最大的接受TCP缓冲区空间
net.inet.tcp.recvspace=65536
#最大的接受UDP缓冲区大小
net.inet.udp.sendspace=65535
#最大的发送UDP数据缓冲区大小
net.inet.udp.maxdgram=65535
#本地套接字连接的数据发送空间
net.local.stream.sendspace=65535
#加快网络性能的协议
net.inet.tcp.rfc1323=1
net.inet.tcp.rfc1644=1
net.inet.tcp.rfc3042=1
net.inet.tcp.rfc3390=1
#最大的套接字缓冲区
kern.ipc.maxsockbuf=2097152
#系统中允许的最多文档数量
kern.maxfiles=65536
#每个进程能够同时打开的最大文档数量
kern.maxfilesperproc=32768
#当一台电脑发起TCP连接请求时,系统会回应ACK应答数据包。该选项配置是否延迟ACK应答数据包,把他和包含数据的数据包一起发送,在高速网络和低负载的情况下会略微提高性能,但在网络连接较差的时候,对方电脑得不到应答会持续发起连接请求,反而会降低性能。
net.inet.tcp.delayed_ack=0
#屏蔽ICMP重定向功能
net.inet.icmp.drop_redirect=1
net.inet.icmp.log_redirect=1
net.inet.ip.redirect=0
net.inet6.ip6.redirect=0
#防止ICMP广播风暴
net.inet.icmp.bmcastecho=0
net.inet.icmp.maskrepl=0
#限制系统发送ICMP速率
net.inet.icmp.icmplim=100
#安全参数,编译内核的时候加了options TCP_DROP_SYNFIN才能够用
net.inet.icmp.icmplim_output=0
net.inet.tcp.drop_synfin=1
#配置为1会帮助系统清除没有正常断开的TCP连接,这增加了一些网络带宽的使用,但是一些死掉的连接最终能被识别并清除。死的TCP连接是被拨号用户存取的系统的一个特别的问题,因为用户经常断开modem而不正确的关闭活动的连接
net.inet.tcp.always_keepalive=1
#若看到net.inet.ip.intr_queue_drops这个在增加,就要调大net.inet.ip.intr_queue_maxlen,为0最好
net.inet.ip.intr_queue_maxlen=1000
#防止DOS攻击,默认为30000
net.inet.tcp.msl=7500
#接收到一个已关闭的端口发来的任何包,直接drop,假如配置为1则是只针对TCP包
net.inet.tcp.blackhole=2
#接收到一个已关闭的端口发来的任何UDP包直接drop
net.inet.udp.blackhole=1
#为网络数据连接时提供缓冲
net.inet.tcp.inflight.enable=1
#假如打开的话每个目标地址一次转发成功以后他的数据都将被记录进路由表和arp数据表,节约路由的计算时间,但会需要大量的内核内存空间来保存路由表
net.inet.ip.fastforwarding=0
#kernel编译打开options POLLING功能,高负载情况下使用低负载不推荐SMP不能和polling一起用
#kern.polling.enable=1
#并发连接数,默认为128,推荐在1024-4096之间,数字越大占用内存也越大
kern.ipc.somaxconn=32768
#禁止用户查看其他用户的进程
security.bsd.see_other_uids=0
#配置kernel安全级别
kern.securelevel=0
#记录下任何TCP连接
net.inet.tcp.log_in_vain=1
#记录下任何UDP连接
net.inet.udp.log_in_vain=1
#防止不正确的udp包的攻击
net.inet.udp.checksum=1
#防止DOS攻击
net.inet.tcp.syncookies=1
#仅为线程提供物理内存支持,需要256兆以上内存
kern.ipc.shm_use_phys=1
# 线程可使用的最大共享内存
kern.ipc.shmmax=67108864
# 最大线程数量
kern.ipc.shmall=32768
# 程式崩溃时不记录
kern.coredump=0
# lo本地数据流接收和发送空间
net.local.stream.recvspace=65536
net.local.dgram.maxdgram=16384
net.local.dgram.recvspace=65536
# 数据包数据段大小,ADSL为1452。
net.inet.tcp.mssdflt=1460
# 为网络数据连接时提供缓冲
net.inet.tcp.inflight_enable=1
# 数据包数据段最小值,ADSL为1452
net.inet.tcp.minmss=1460
# 本地数据最大数量
net.inet.raw.maxdgram=65536
# 本地数据流接收空间
net.inet.raw.recvspace=65536
#ipfw防火墙动态规则数量,默认为4096,增大该值能够防止某些病毒发送大量TCP连接,导致不能建立正常连接
net.inet.ip.fw.dyn_max=65535
#配置ipf防火墙TCP连接空闲保留时间,默认8640000(120小时)
net.inet.ipf.fr_tcpidletimeout=864000

CENTOS使用setup工具



setup工具是redhat系列的linux中的一个很强的工具,可以在其中配置防火墙规则、认证方式、服务器状态、IP地址等。但是如果你的linux语言环境是中文环境或者非ascii环境的时候就会出现乱码,解决办法:
#lang="en_US"
#setup
就可以了。

星期五, 七月 18, 2008

linux vsfftpd链接失败解决办法



故障现象:
linux vsftp ftp服务器连接失败 cannot change directory:/home/***
2008-01-07 23:10cannot change directory:/home/***
ftp服务器连接失败,错误提示:
500 OOPS: cannot change directory:/home/*******
500 OOPS: child died

解决方法:
在终端输入命令:
setsebool ftpd_disable_trans 1
service vsftpd restart
就OK了!

vsftpd登录失败can not change directory:/home/xxx的解决办法



故障现象:
linux vsftp ftp服务器连接失败 cannot change directory:/home/***
2008-01-07 23:10cannot change directory:/home/***
ftp服务器连接失败,错误提示:
500 OOPS: cannot change directory:/home/*******
500 OOPS: child died

解决方法:
在终端输入命令:
setsebool ftpd_disable_trans 1
service vsftpd restart
就OK了!

星期四, 七月 17, 2008

Apache 启动报错



错误提示如下:
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
解决方法:
1.修改httpd.conf这个文件
ServerName 127.0.0.1:80

2.修改httpd.conf这个文件
找到ServerName
写上你的服务器的IP地址和端口号
ServerName 12.34.56.78:80

此外,可以讲ServerName写成hostname:port。但是这样需要与实际的hostname保持一致,否则容易出现:
httpd: apr_sockaddr_info_get() failed for linux(在BSD上是apr_sockaddr_info_get() failed for freebsdla)
当然,出现这个错误的话就直接修改httpd.conf里面的ServiceName就可以了

星期二, 七月 08, 2008

2007开发语言回顾



2007没怎么注意就过去了。

本来觉得2007,在IT界索然无味。但一回顾就吓了我一跳。这种技术的繁荣,不亚于2002年。

2002年的COM+、EJB、设计模式、ORM、MVC、软件工程、UML、自动测试、BUG跟踪、发布配置、项目管理,讨论了好大一堆企业级开发技术和企业级开发过程管理。

2007年,发现技术遍地开

ROR,首先打了JAVA一枪。谁说企业级非要重型武器。从MVC、ORM、AJAX、自动化测试、日志、REST URL,浑然一体,简单的实现了JAVA一直想实现的完美企业解决方案。虽然ROR现在仅仅在自由的开源和穷人的WEB2.0世界中混,但它已经引起了企业级开发的大讨论大关注。即使ROR无法闯入企业级开发,那么JAVA也必然会出现这样的框架。JRUBY就是一个例子。

IDE工具的大战,borland一声叹息,在WIN32、.NET、JAVA均失利。SUN不是干IDE的料,居然NETBEANS做的有模有样,而且我用了最近的NETBEANS6.0,感叹大超eclipse。江山辈有新人出啊。谁说SUN做不好IDE,谁说做IDE没有空间和利益了。看来这世界规则不能老路径依赖。

年底,google发布了android,USB、蓝牙、红外、GPRS、投影仪接口、GPS,能接的都接上。地图、搜索、邮件、OFFICE应有尽有。工业设计不逊apple,代工也找的很牛。芯片设计也找的很牛,运营商也找的很牛,连中国移动都榜上有名。而且采用linux+JAVA这两大世界最大开源技术,又发动了1000万美金的社区编程大赛,整个产业链都有合作,想不火都难。所以MOTO要卖掉自己的手机部门,诺基亚要转型成为互联网企业,微软一直想在手机行业讨便宜都没有讨着。让我想起一句话:历史的车轮总会带走属于历史的东西。看看微软,在游戏机市场,在手机市场,在互联网市场均没有得到好处。微软辛辛苦苦建立起来的门槛壁垒和技术开发团队和软件开发过程管理模式,具体在新的未来面前毫无用处。真是,一个革命,就使多年营建的壁垒一下成了马其顿防线。

开发管理方法,过去追究工程化。现在讲究的是XP。但是,XP也过时了。从现在的发展趋势来看,虚公司将会产生。没有办公地点,不需要聚集在一起。互联网上的产品,互联网上的开发协作。我们需要音频会议、视频会议来加强沟通。邮件、IM、BBS、圈子、WIKI、BLOG这些沟通协作工具已经成熟。

Facebook的火,从运营上来说是校友录和大学生引起的火。但是从技术上来讲,Facebook代表了真正的web2.0。为什么这么说呢?邮件注册,是Facebook的ID认证和联系工具。邀请加入而非烂注册,是真实身份的基础保证。博客、视频、图片是内容产生工具。推荐好友是SNS的串联。Open API是应用开花的插件平台,是迎合未来WebOS,个人门户、聚合信息、SAAS的重要特征,是FaceBook巨型扩张的重要起飞。而搜索技术和故意拒绝google这样的搜索引擎,使真实信息搜索和私人性得到保证,免除了商业性故意关系营销的骚扰。所以说,FaceBook是google害怕的。google虽然有gmail\gtalk\goffice\gcode\gbbs\gblog\gearth等各种应用和社区,但google这种黑洞式聚合信息的优势,在真实性的呼声中变成了劣势。

FLEX是我2007年关注的技术。AJAX引爆了2006、2007。但AJAX是WEB时代的顶峰表现。我们经常会开发一套B/S版,也会开发一套C/S版,两版其实是两套代码,可能表现和使用上和功能上都不一样,维护也各维护各的,BUG也出现在不同地方,有了新需求就需要分别开发。实在成本无法下降,反应速度无法跟的上现实。所以如何开发一套,即是B/S又是C/S,这是我所关注的。而且不管过去开发C/S和B/S,业务层和表现层不管怎么分离都还有些代码混合在一起。ROR能强制解决这个问题,但ROR还是WEB开发框架。FLEX不一样了,它是B/S和C/S混合技术,而且只有表现技术,没有数据存取技术。这就也强制实现了业务只能实现成纯业务的WebService。而且这样实现出来的WebService,也是很好的SOA架构,在整合和聚合上面,表现了很好的Open API特性。

微软的D语言。听说微软又出了一个D语言,反复搜索信息很少。但它是面向业务专家的。这就让我很有兴趣。如何协同业务、页面表现、数据库设计、代码、测试、项目经理、文案。这是软件工程极其重要的问题。我们研究了大量的流程和工具来解决之间的理解鸿沟。前一段时间,炎黄盈动发布了一款流程描述软件,但可惜是面向eclipse的,不知道是谁用的?如果是给业务专家用的,建议简单再简单的安装和启动。

lua语言。游戏的火热,热了这门语言。但我并没有把它定位成一个游戏语言。我在N年前就在做业务平台,研究了大量元数据,反射的技术核心,希望能简单开发和编程。当时也尝试了PascalScript。我前一段时间还用了用安装软件InnoSetup,也是脚本驱动。这都是很好的引擎。未来在业务专家和架构师和开发人员之间存在的一种脚本,必定是这个趋势。

JAVASCRIPT语言。刚才说完了Lua。Lua是连接EXE软件的脚本。而JAVASCRIPT是连接WEB软件的脚本。现在的WEB开发技术,asp\asp.net\python\php\ror\jsp,层出不群。如何粘合这些不同的WEB语言,并且控制WEB元素,唯javascript莫属。

PHP语言。PHP语言在web2.0时代,LAMP组合大火。使oracle应用在大型应用,MSSQL应用在中小应用,MYSQL应用在小企业应用中,三者割据。

很多初入道的程序员都问我,现在技术这么多,该学什么才有前途?我说,你能应聘的企业是面向什么规模的客户,你就会用到相应的技术。我一般都是这么点拨的。

虽然看起来PHP因为没有框架和Mix代码,让人感觉它是ASP时代的产物。但是PHP的跨平台性、PHP的积极演化,现在的模板技术,已经能实现MVC和多语言和多风格。现在也模仿ROR进行了ORM、REST URL技术、WebService技术,跟得上时代的脚步。笔者用过ASP、asp.net、jsp,上手使用php,感觉非常顺手,很符合常规思路

webServcie与REST。记得当年使用COM+的时候,要整合个PB系统,要整合个CORBA,要整合个WebLogic,要包装成WEB应用,真是难死人,技术不稳定的N死。.NET技术的WebService,让我眼前一亮。ASP.net并没有让我感到开发web的爽(反而是asp和PHP),但是.Net的WebService是我用起来最顺心的。最近几年,微软是思想快,但步子慢。WPF、WCF都是非常好的技术,但都出师不利。代表未来的未来,但不代表未来。未来还在ROR和FLEX和WebService的手中。

3D互联网,google发布了google earth,也发布了3D建模工具。第二人生也发布了SDK,但都没有引起风暴。FaceBook走入了SAAS、Open API的时代,这算是web2.5技术了 。

看来,我们不要走的太快,只需要比现在前进一点,就有一个机会窗口。

[fwd]开发网站选择什么样的开发语言



作为一个全新的互联网项目,有时候会面临一个选择什么样的开发语言的问题。

我说的这个有时候,其实是指现有的团队中,没有技术开发的成员的情况。如果已经有了一个或者多个技术开发人员,当然是选择现有成员最熟悉和最擅长的语言了。

那么对于一个还没有技术成员的团队,应该选择什么样的开发语言呢?回答这个问题,首先应该搞清楚选择开发语言的时候应该从哪些方面考虑?

我认为作为一个项目选择开发语言应该考虑几个方面:

1、成本
一个互联网的项目,开发往往是前期投入的大头,而大多数创业团队前期的资金都不是很充裕,如何控制开发成本,就成为一个需要考虑的问题。开发成本又包括开发人员成本以及开发资源成本(开发设备、服务器带宽资源等等);

2、效率
现在的互联网发展,时间是最大的成本,是否能够快速的开发出可上线的产品,往往成为项目是否能够获得成功的一个重要因素;

3、可扩展性
很多项目都是分阶段实施的,如果一个项目的开发语言的可扩展性不强,可能会对项目后期的实施带来巨大的麻烦。

4、可移植性
作为服务器平台,早期用WINDOWS是比较方便、快速、“省钱”(主要是维护成本)的,但是当一个项目上升到一定阶段的时候,是否会需要换到Linux、Unix等平台呢?

5、性能
项目要搞大,一定要上规模,对于一个项目未来可能达到的规模需要有一个“预估”。如果一个语言不能支撑你未来项目的规模,那么肯定选择的时候就需要很慎重了。

最近遇到一个项目的项目语言选择的评估,按照以上几条分别进行考虑:

项目需求:1、需要尽量节省成本;2、对效率需求很大;3、有扩展性需求;4、需要考虑可移植性;5、属于用互联网的项目,性能方面不会要过高的要求。

太新、太偏的语言人力成本一般都较高,太新了,开发人员熟悉程度不高,影响效率。太偏了,可扩展性不高。所以,只选择主流语言:ASP、.Net、Java、PHP这类的语言。

ASP、.Net 属于微软的“个性”产品,可移植性不够,否掉。

Java语言,太“高端”,开发人员成本相对较高,而开发效率稍差一些,最终选择了PHP语言。

PHP语言,出现时间比较长,语言相对比较成熟。开发人员比JAVA成本略低一些,开发效率比JAVA快。

PHP与平台无关可移植性比较好,代码几乎可以不用修改的在WINDOWS、LINUX上通用。

PHP的性能比JAVA略差,但是从这个项目对性能的需求来看,在可预期的时间内,还足够应付。

最终选择: PHP!

星期四, 七月 03, 2008

关于Document.execCommand("BackgroundImageCache")

Pixy方法受到IE的cache bug影响会闪烁。其实并没有说清楚这个问题,但其实该bug是有条件的,即IE的cache设置为Every visit to the page,而不是默认的Automatically。基本上,只有开发者才会把cache设置为每次访问检查更新,所以这个bug其实不会影响真正的用户 (根据在winxpsp2的ie6下测试,虽然可能仍然调用了一次网络存取的api,但是并没有发生实际的请求,症状就是鼠标有极短时间的抖动,但是图像 不会闪烁)。此外有人发现了一个未公开的方法来让IE对背景图进行缓存: 
document.execCommand("BackgroundImageCache",false,true)

用这种方法甚至避免了api调用,貌似是直接缓存在IE内存中。 

IE6下设置背景图片是不会被真正cache住的,就算服务器做了cache,如果想cache住只能~~~

做过UI设计和开发的人一定知道,IE(不包括IE7)会经常从服务器端重新载入背景图片,好端端的UI界面在IE(不包括IE7)中就这样被折腾着......

Erik发现了一个简单的解决办法(针对IE7以下的IE有效,其实在IE7中已经修复了这个Bug)

 程序代码

document.execCommand("BackgroundImageCache", false, true);


/**
* update@2007-04-02
*/
今天阅读Ext的源码时发现Jack Slocum已经考虑到了这一点,在Ext.js中给出了他的实现,在其它Ajax框架中应该还没有这种类似的代码,从这一个细节上就能看出Ext的全面~

 程序代码

var isIE = ua.indexOf("msie") > -1, isIE7 = ua.indexOf("msie 7") > -1;
// remove css image flicker
if(isIE && !isIE7){
  try{
  document.execCommand("BackgroundImageCache", false, true);
  }catch(e){}
}


/**
* update@2007-04-10
*/
今 天阅读幻宇的dreamplayer播放器源码时发现幻宇也针对IE的背景缓存进行了修复,只是他并没考虑到IE7中已经不存在这个现象了,这是 evml.js中的一段相关代码~(顺便嘀咕两句:这家伙,写JS从来不加分号的,以前是这样,现在还是这样,这样的话怎么进行压缩呀,汗~下面的代码按 照我的习惯都已加上分号,哪怕只有两三句而已~)

 程序代码

window.isIE=navigator.appName.indexOf("Microsoft")==0;
if(isIE){
  document.documentElement.addBehavior("#default#userdata");
  document.execCommand("BackgroundImageCache",false,true);
}


/**
* 相关原文
* by eriK @2007-02-26
*/
A while back a lot of people where covering how to work around the bug that IE always
reloads background images from the server, leading to your UI flickering.
Dean wrote one and lots of others wrote the same thing. Today, I saw this simple workaround
(from a fellow Googler who worked at Microsoft before):

document.execCommand("BackgroundImageCache", false, true)

Much simpler but makes me wonder why this is not the default setting?

/**
* 相关回复
* by Nicholas C. Zakas @2007-02-26
*/
I've actually wondered about this "bug" for a while.
I'm sure somewhere along the line this decision was made for a logical reason…
maybe they didn't anticipate how much background images would be used, or maybe they thought
there was some use case under which it would be desirable not to cache the background image.
I'm generally not big on overriding things that seem to be design decisions (which this seems to be).
I've never really thought this was a "bug"…bugs don't usually have switches that say "turn off bug".

traceback:http://hi.baidu.com/pplboy/blog/item/af40442604a193128b82a12a.html