I wrote before a guide Howto install Nginx/PHP-FPM on Fedora 16/15, CentOS/RHEL 6.1/6/5.7, but this guide is just installation guide and many cases Nginx and PHP-FPM basic configuration is good enough, but if you want to squeeze all the juice out of your VPS or web server / servers and do your maintenance work little bit easier, then this guide might be useful. These tips are based entirely on my own experience, so they may not be an absolute truth, and in some situations, a completely different configuration may work better. It’s also good to remember leave resources for another services also if you run example, MySQL, PostgreSQL, MongoDB, Mail server, Name server and/or SSH server on same machine.
And yes here we go…

Nginx Configuration and Optimizing Tips and Tricks


http://www.if-not-true-then-false.com/2011/nginx-and-php-fpm-configuration-and-optimizing-tips-and-tricks/

[转]知名网站的技术实现

[不指定 2012/06/14 14:15 | by ipaddr ]

网站需要具有良好的可伸缩性,来应对不断增长的访问量和数据量。《程序员》杂志5月刊的《可伸缩性的10年探索:知名网站的技术发展历程》一文中介绍了一些Alexa排名较前的网站的技术发展历程,本文将结合提及的Google、Facebook、Twitter等网站的技术发展历程,总结它们在可伸缩性、可用性、高性能以及低成本四点上通常采用的技术。

可伸缩

可伸缩分为垂直伸缩和水平伸缩两类,垂直伸缩通过升级机器的硬件来解决问题,水平伸缩通过增加机器来解决问题。不同网站在可伸缩上采用了不同的策略。例如,Google完全依赖水平伸缩来解决问题,而其他网站多数是依赖垂直伸缩来解决数据存储问题。

垂直伸缩要求软件要能在硬件升级时,发挥出硬件的能力,例如可配置的并行数、内存等。硬件的发展速度非常迅猛,网站的机器配置自然也是每年都在升级,因此软件时刻都在被检验是否能垂直伸缩。

水平伸缩主要解决的是如何仅通过增加机器就能解决问题,一般通过应用层和存储层两个层次来解决。

在应用层做到水平伸缩,通常采用的策略是Share Nothing/Stateless,将状态信息放入客户端或存储层(例如用户的会话信息放入Cookie,或放入服务器端的缓存系统)。此时,在访问量上涨后增加机器即可。在应用系统由单台增加到多台组成集群时,需要引入负载均衡,可能是硬件的也可能是软件的。

我们发现,就应用层的结构演变而言,前面提到的Google、Facebook、Twitter等网站在应用层上最后形成的结构几乎完全一样,均为前端Web系统集群 + Services集群。通常到了一定阶段后,前端Web系统和Services又会按照一定的规则来进行拆分,如按业务领域等。可见,其实SOA在大网站中已经落地,而不像企业领域中宣传的那么虚。

存储层实现水平伸缩,难度就比应用层大多了。从Google、Facebook、Twitter等几家网站的发展历程也可看出,解决存储层问题需要花费大量的时间和精力,而且由于业务发展的压力较大,很多网站开始会采用垂直伸缩方式来解决存储层的问题。

实现存储层的可伸缩性,通常采用的方案是单点写(指在某个粒度的单点,对HBase而言,单行数据一定在同一台机器上进行写操作),但读可能是多点。读多点,主要需要考虑不一致的问题。无论读是单点还是多点,数据都会在软件层面做到写多份,策略主要有同步写多份、投票写多份、异步复制最终一致等(例如HDFS、Cassandra、ZooKeeper),采用自动分裂方法来实现数据量增长时的自动伸缩,采用一致性Hash或根据某种规则的自动均衡策略等来实现机器增减时的相应处理,同时也需要有感知机器增减的方法(例如采用ZooKeeper)。

可以看出,要在存储层上实现可伸缩,技术上的难点很多。这也是为什么大规模网站都不在数据库上做复杂的运算,而只是把其当做一种存储信息的方式来使用。存储过程等基本不会出现,以降低数据库的压力。

除了应用层和存储层需要做到可伸缩外,在设计系统时硬件层面的可伸缩也是需要考虑的。例如,硬件负载设备只能支撑到一定流量,同样也要考虑如何让其能够可伸缩。

除了尽可能做到系统可伸缩外,减少对系统的压力也是缓解系统的可伸缩所面临挑战的方法,例如批量提交、最终一致、YouTube提到的“欺骗”、适当的正确性等策略。

可伸缩性是网站从小到大要经历的第一关挑战,同时随着网站的不断发展,还要不断地做技术改造才能保证网站在每个阶段(如同机房阶段、同城多机房阶段、异地多机房阶段)都具备优秀的可伸缩性。不过,幸运的是不同阶段的可伸缩性方案都已经比较成熟了。

可用性

可伸缩性能保证网站在访问量和数据量不断增长的情况下生存下来,同时也从某种程度上保证了网站的可用性。但除此之外,要保障系统的可用性,还需付出很多努力。

设计高可用性系统时,避免单点是其中最重要的一点,一般采用主备或集群等方法来避免单点。例如,负载均衡设备、MySQL等通常采用主备方式。在BigTable里采取了一种比较特殊的方法来避免Tablet Server的单点,即通过Chubby来感知Tablet Server的健康状况,如发现Tablet Server挂掉了,则由Master将此Tablet Server负责的Tablet迁移到其他的Tablet Server上。

除了避免单点外,降低耦合也是设计高可用性系统时应考虑的重点。通常采取异步化来降低耦合,将非关键逻辑和关键逻辑隔离开。例如,打开天猫的商品详情时,都会有相关商品的推荐。如果这个推荐系统出问题的话,就会导致商品详情也看不到了,因此这里可以异步载推荐系统,通常采用AJAX带超时的方式来实现。

Google、Facebook等网站在总结多年的可用性系统设计经验时,列入了同一条设计原则,即保持简单。简单的方案一般比较容易掌控,而复杂的方案一方面实现难度大,另一方面出现问题时很难排查。

可控性也是各网站强调的重点,可控性意味着一切代码都在掌控之下,并且最好是每个使用到的部分都由专业人员负责(对可用性要求越高,在这点上要求也就越高)。这样在出现问题时才能清楚是哪个地方造成的,并且可以自行排查和解决。如不可控,则意味着一旦出现问题,就得依赖第三方来排查,时间上非常不可控。这也是网站不愿意采用商用软件的重要原因。

编写高质量软件是保障系统高可用性的重要一环,可控性是其基础。Google、Facebook等网站在总结保障高可用的经验中均提到了监控/报警、容错、自我保护等策略。

监控/报警是软件自身能够保障高可用的重要策略,就像是汽车的仪表盘一样,可以告诉你油还剩多少、速度是多少、胎压是否正常等重要信息。对于软件而言,同样需要让外部获取到其运行的状况。例如,Google的软件都会提供一个HTML页面供使用者或开发人员访问(用过Hadoop的人也会发现这个特征)。在这个页面上可通过key/value的方式来获取系统的一些运行指标。对于RPC系统而言,Google会采集所有的正常请求、错误请求以及其消耗时间的分布状况(>0.05s、>0.1s等)。除了监控系统的运行状况外,也提供了其他一些方式以便外部能简单判断系统运行是否正常,例如cURL某页面等。对于不正常的现象,要及时报警,尽可能做到在故障尚未影响到用户时解决掉。

软件的正常运行需要依赖很多外部因素,例如机房、硬件、数据库、服务等,而所有依赖的部分都有可能出现故障(要坚信这点,互联网的特色是所有小概率事件都会发生)。在设计软件时需要考虑当依赖方出问题时,如何保障软件的可用性,因此一定要做一些容错处理。为了避免机房故障,各网站通常会租用或建设多机房。例如,Google采用IDE硬盘来存储文件,不做RAID,于是采用复制三份的策略来避免硬盘故障导致数据丢失。

软件一般会提供多种功能,有的重要、有的不重要的。而由不重要的功能异常导致重要的功能出现问题,显然不合算,因此在设计软件时需要充分考虑异常隔离,不互相影响。例如在Google的系统设计中会采用Prioritized Request等策略。

James Hamilton的那篇著名的论文《On Designing and Deploying Internet-Scale Services》中提到的Graceful Degradation,即为优雅降级。通常采用的方法是在故障将要出现或出现后,关闭系统的某些功能来降低故障产生的影响。例如,网站上有些操作可能特别耗资源,而这些资源的消耗又可能影响到核心功能,因此一旦出现影响,就可以关闭这些功能保障核心功能可用。降级可以帮助系统临时绕开故障,而产生故障的原因需要在事后排查。

交付具有高可用特征的软件是开发人员的重要职责。而对一个网站而言,软件不是一次性交付的,也不是好几年才升级一次,需要频繁交付,因此维护软件是保障高可用的重要环节。

多数情况下,系统的不可用是由变更造成的,因此如何降低变更对系统可用性造成的影响成为了各网站都关注的重点。Google在发布新产品时通常采取“滚木移石”方法,而Facebook则通常采用Dark Launch方法,降低变更带来的影响。

人工处理系统变更是故障产生的隐患,因此各网站基本都会推荐多种工具来实现系统变更的自动化,例如采用Puppet来实现自动化部署。

除了发布这个重要环节外,处理故障也是维护方面的重要工作。系统总有出现故障时,如何快速处理故障以降低对故障可用性的影响也成为网站一直关注的重点。前面已经讲述了可控性对解决故障的帮助。除可控性外,各网站也在研究其他方法。Facebook采用FBAR来自动处理部分故障,这显然可从某种程度上降低故障产生的影响。

性能

前面提到的可控性同样也是保证性能的重点,只有明确知道调用的每个API及所依赖环境(包括软硬件)的细节原理,才能编写出高性能软件。

从系统结构上来看,为了保障高性能,各大网站都采用了类似的方法。首先是前端Web系统这块,都采用了可编译为机器码的方式,即便Facebook采用的是PHP,其仍然研发了一个可自动转化为C++代码的产品来提升运行效率。

设计系统时,应考虑将没有前后依赖的逻辑并行化处理,或者将大的请求进行拆分。例如,Google会先将所搜索的内容进行分词,然后并行进行索引查询,从而提高响应速度。

基本上各大网站都极度依赖缓存,原因在于,内存的访问速度远快于磁盘。在依赖缓存的场景中,最需要做到的是数据一致性的合理保障。一个典型的场景是数据更新时保障缓存一致性的策略。要将缓存的更新和数据的更新做成一个事务显然有不小的难度,此时网站常采用一个简单的策略来保障,就是先失效缓存,再更新数据,等到下次系统去访问此数据时,才更新到内存。

除了缓存外,可以看到各大网站都采用了CDN,CDN可以让静态文件更靠近用户,便于用户快速获取。而除了让静态文件更靠近用户外,多IDC的建设除了提升可用性外,还可以让动态数据更靠近用户。当然,这在技术上的实现难度会比CDN高很多。

除了结构上的这几点外,技术创新是提升系统性能的重要方法。例如,Google提高了TCP的初始拥塞窗口值等。而要做到技术创新,显然可控性是基础。

成本

随着网站规模的不断扩大,系统的运行和维护成本将会成为公司中支出的重要部分。例如,有数据表明,腾讯每年支付给运营商的费用在总支出中占比排行第二(2010年为208亿)。网站规模越大,成本控制就越重要(潜台词是在网站规模不是很大时,也许支撑业务快速发展更重要)。例如,性价比是Google设计系统时重要考量的指标。有些网站会采用x元/每千次PV来计算成本。

有些性能优化需要增加成本(如缓存和CDN),而有些性能优化是可以降低成本的(如Google对索引结构的优化),因此性能优化通常也是降低成本的一种方法。网站规模大了以后,规模效应可以让有些性能优化带来的成本降低非常明显。

硬件不断升级,而软件系统层面上又更多的是靠集群来支撑,因此通常很难完全消耗硬件资源,虚拟化就成为一种不错的降低成本的方法。虚拟化具备很好的隔离机制,避免了应用间的互相影响,因此落地的难度不大。

除了依靠虚拟化来降低成本之外,Google采用了自行实现的一种Shared Environment方法来降低成本。Shared Environment可根据不同类型的资源消耗,动态组合(例如分时)部署到同一台机器上,充分利用资源。

如前所述,网站主要是靠可伸缩性存活下来的,因此随着规模的扩大,必然会有大量的机器。比如,Google有上百万台机器,Facebook有几十万台机器。在这么大规模下,自行根据应用特征设计机器,会带来很大的成本下降,因此Google、Facebook都自行设计机器和数据中心。从PUE上可以看出,Google、Facebook自行设计数据中心带来的成本降低非常可观。

各网站的情况不同,应对以上四点挑战所采用的方法不同,每个阶段都有自己适用的解决方案。例如,Google成立初期的主要业务是搜索,主要竞争的是技术,功能次之,而Facebook、eBay等网站的竞争压力主要在业务功能上,因此在成立之初必然会有不同的侧重点。不用想着一开始就把网站做成Google、Facebook等现在的结构,适合自己的就是好的。

很多开发人员在加入规模较大的网站后,会觉得系统结构已经稳定了,没有发展的空间,但从上面各网站的发展历程来看,可以看出网站对技术的要求是在不断演变的。通过观察大网站的发展历程,并结合公司的业务背景、知识结构等来判断其下一步的发展,对个人成长是有很大帮助的。同时可以借此储备一些技术,以把握技术演变时的机会,获得更大的成长。如果开发人员加入了规模尚小的网站,且自身技术储备不错的话,就有机会亲身经历网站从小到大的演变了。但这要看个人如何把握。

图1 发展到一定规模后的网站结构

围绕可伸缩性、可用性、性能和成本这四个方向,在网站发展到一定规模后,通常会演变成如图1所示的结构。

除了在可伸缩性、可用性、性能和成本这四方面的技术挑战外,网站还面临其他很多方面的挑战,例如海量数据分析和挖掘、网站安全、业务发展的灵活性支撑、人员增长后庞大的软件管理等,因此构建一个支撑大访问量、长期发展、低成本运行的网站是需要有坚实的技术背景作为支撑的。

作者林昊,目前就职于淘宝,2007-2010年负责设计和实现淘宝的服务框架,此服务框架在淘宝大面积使用,每天承担了150亿+的请求;2011年开始负责HBase在淘宝的落地,目前淘宝已有20个以上的在线项目在使用HBase。

Jpegoptim是一个google建议的很好的JPG,JPEG图像压缩工具,目前支持系统有Linux,Solaris,Darwin/OSX

软件安装需求:

Independent JPEG Group’s jpeg library version 6a or later

安装方法:

下载附件jpegoptim-1.2.3.tar.gz,当然官方地址:http://freshmeat.net/projects/jpegoptim/

tar zxvf jpegoptim-1.2.3.tar.gz
cd jpegoptim-1.2.3
./configure
make
make strip
make install

(依赖于libjpeg-devel包)

使用方法:


jpegoptim --strip-com --strip-exif --strip-iptc tomzhou.jpg

更多用法,可使用jpegoptim --help查看

注:使用 jpegoptim 最常见的问题是,颜色会失真,比如浅蓝色总会变成淡紫色。解决这个的办法是,不要清除掉图片的 ICC 标记(实际上,图片的ICC标记也不大,清除它获得的尺寸减小很有限),即,不要使用 --strip-all ,也不要使用 --strip-icc。



最近发现一个奇怪的问题,Chrome在Ajax请求某个cgi时失败,直接请求的话,返回正常。IE,FF下工作正常。

环境是前端是nginx做反向代理,请求后端Apache,Nginx开启了Gzip。

经过抓包发现:
1.  JS中使用HEAD方法请求了 www.eit.name/time.html来获取服务器时间
2.  Js异步加载 www.eit.name/cgi-bin/test/view来获取数据
3.  Nginx在处理time.html时,返回了 HTTP Header + Body(upstream返回的空Body 并进行gzip)
4.  Chrome在收到HTTP Header后,根据HTTP协议标准,认定HEAD请求后没有Body,所以直接在同一个HTTP连接里面,发起了/cgi-bin/test/view的请求
5.  Chrome将 time.html gzip body + view body做为view的body进行解析, 解析失败,所以请求view失败。
6.  IE,FF也是同样的请求逻辑,但在第5步时进行了容错处理,所以工作正常。

解决此问题的方法,需要针对HEAD方法特别配置:

if ( $request_method = HEAD ) {
    return 200;
}

[转]杂谈Nginx与HTTP协议

[不指定 2012/05/10 09:54 | by ipaddr ]

在项目中遇到一个问题,需要详细了解下HTTP协议及其Nginx中对HTTP协议的支持程度。今天一天收集了一些资料,也梳理出最终方案。记录到博客上,方便后续查阅。重点关注以下几个方面:1、Http交互中如何判定内容的长度及其HTTP协议中关于Content-Length的解读。2、Chunk和Gzip在Nginx中的实现及原理。3、Upstream如何和Chunked结合。

Http协议中关于Content-Length的解读

在HTTP协议中,有Content-Length的详细解读。Content-Length用于描述HTTP消息实体的传输长度the transfer-length of the message-body。在HTTP协议中,消息实体长度和消息实体的传输长度是有区别,比如说gzip压缩下,消息实体长度是压缩前的长度,消息实体的传输长度是gzip压缩后的长度。

在具体的HTTP交互中,客户端是如何获取消息长度的呢,主要基于以下几个规则:

  • 响应为1xx,204,304相应或者head请求,则直接忽视掉消息实体内容。
  • 如果有Transfer-Encoding,则优先采用Transfer-Encoding里面的方法来找到对应的长度。比如说Chunked模式。
  • “如果head中有Content-Length,那么这个Content-Length既表示实体长度,又表示传输长度。如果实体长度和传输长度不相等(比如说设置了Transfer-Encoding),那么则不能设置Content-Length。如果设置了Transfer-Encoding,那么Content-Length将被忽视”。这句话翻译的优点饶,其实关键就一点:有了Transfer-Encoding,则不能有Content-Length。
  • Range传输。不关注,没详细看了:)
  • 通过服务器关闭连接能确定消息的传输长度。(请求端不能通过关闭连接来指明请求消息体的结束,因为这样可以让服务器没有机会继续给予响应)。这种情况主要对应为短连接,即非keep-alive模式。
  • HTTP1.1必须支持chunk模式。因为当不确定消息长度的时候,可以通过chunk机制来处理这种情况。
  • 在包含消息内容的header中,如果有content-length字段,那么该字段对应的值必须完全和消息主题里面的长度匹配。
    “The entity-length of a message is the length of the message-body before any transfer-codings have been applied”
    也就是有chunk就不能有content-length 。

其实后面几条几乎可以忽视,简单总结后如下:

1、Content-Length如果存在并且有效的话,则必须和消息内容的传输长度完全一致。(经过测试,如果过短则会截断,过长则会导致超时。)

2、如果存在Transfer-Encoding(重点是chunked),则在header中不能有Content-Length,有也会被忽视。

3、如果采用短连接,则直接可以通过服务器关闭连接来确定消息的传输长度。(这个很容易懂)

结合HTTP协议其他的特点,比如说Http1.1之前的不支持keep alive。那么可以得出以下结论:

1、在Http 1.0及之前版本中,content-length字段可有可无。

2、在http1.1及之后版本。如果是keep alive,则content-length和chunk必然是二选一。若是非keep alive,则和http1.0一样。content-length可有可无。

Nginx在Http协议方面的处理

第一、Nginx的chunk模块

Nginx的Chunk模块是一个典型的Filter模块,它本身是内置必选的Nginx模块。在0.7.66版本之后,有一个配置项chunked_transfer_encoding可以开启或者关闭chunk模式,默认是开启的。

首先,先简单了解下在HTTP协议中Chunked相关的知识点。Chunked一种transfer coding方式,在HTTP1.0之前(包含http1.0)的版本是不支持的。在HTTP协议中定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Chunked-Body   = *chunk
                 last-chunk
                 trailer
                 CRLF
 
chunk          = chunk-size [ chunk-extension ] CRLF
                 chunk-data CRLF
chunk-size     = 1*HEX
last-chunk     = 1*("0") [ chunk-extension ] CRLF
 
chunk-extension= *( ";" chunk-ext-name [ "=" chunk-ext-val ] )
chunk-ext-name = token
chunk-ext-val  = token | quoted-string
chunk-data     = chunk-size(OCTET)
trailer        = *(entity-header CRLF)

其中可以看到,每一个chunk都是可以大小自描述的。

在Nginx的Chunked模块中,header filter函数的流程如下:

1
2
3
4
5
6
7
8
9
10
11
12
//如果没有content或者是head请求,则直接跳过。
if (r->headers_out.content_length_n == -1) {
       if (http版本 < http 1.1) {
            r->keepalive = 0;//关闭keep alive
       } else {
            if (开启chunk) {
                 r->chunked = 1;
            } else {
                 r->keepalive = 0;//也就是,如果关闭了chunk,则也关闭了keep alive。
            }
       }
  }

对应的body filter的流程,则更加简单,直接对当前输出的buf chain进行一个chunk封装。

第二、Nginx中Gzip模块和r->headers_out.content_length_n

r->headers_out.content_length_n :这个在Nginx内部用于表述请求返回内容的长度。但注意这不是完全相等的,只有在 r->headers_out.content_length_n >=0的时候,才有意义。比如说,通常后端的upstream(比如说PHP),如果没有在脚本中强制header输出content-length,则默认在nginx中 r->headers_out.content_length_n = -1。

Gzip模块也是一个典型的Filter模块。这里简单介绍下,后续可以详细描述。在header filter中会直接清空 r->headers_out.content_length_n和header中输出的content_length。为什么要清空呢?主要是因为gzip要对内容模块进行压缩处理,而在header filter的时候,gzip模块不可能计算出压缩后的内容长度(原因是在nginx中,header 输出和body的输出是完全两个不同的阶段),所以最好的办法就是在清空header中的content-length。这样结合之前的介绍的chunked模块,可以看出:在nginx中,如果采用gzip,如果是keep alive,则必然是chunked模式。

Upsteam如何和chunked结合

在前面介绍的Nginx Chunked模式实现中提到,Chunked模块的body filter是对当前处理的buf chain进行封装成一个Chunk。那么在Nginx中是如何实现多个Chunk的呢?这里要从 ngx_event_pipe_write_to_downstream这个函数说起,该函数是upstream处理中非常关键的一个函数,用于把upstream返回的数据直接进行输出。

分析该函数的伪代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
for()
{
     if (p->downstream_error) {
            return ngx_event_pipe_drain_chains(p);//出错了
     }
     if (p->upstream_eof || p->upstream_error || p->upstream_done) {
          //是最后一个节点,或者已经读取upstream数据完毕
          //分类比的flush输出,这里面一般都含有bodyfilter比如
          rc = p->output_filter(p->output_ctx, p->in);
          //并且结束循环
          p->downstream_done = 1;
          break;
     }
     /*计算当前BUF的size*/
     if (bsize >= (size_t) p->busy_size) {
          /*超过大小则刷数据*/
          go flush;
     }
     for ( ;; ) {
          //循环拼装输出buf,如果超过busy_size同样进行flush
     }
flush:
     //flush输出
     rc = p->output_filter(p->output_ctx, out);
}

可以看到,有一个关键点,就是busy_size,它决定了一个chunk的大小。这个对应一个配置,追查后如下:在不同的upstream中有不同的定义,比如说proxy模式下,有proxy_busy_buffers_size,该值默认是proxy buffer size * 2 。(proxy buffer size根据操作系统,可以是4K或者8k)。fastcgi模式下,buffer_size默认是ngx_pagesize。配置项是fastcgi_busy_buffers_size。默认情况下是fastcgi的buffer size的2倍。(buffer size个是可配置的,buffer 个个数也是可以配置的,个数不能小于2)。


What is PacketShader?

PacketShader is a high-performance PC-based software router platform that accelerates the core packet processing with Graphics Processing Units (GPUs). Based on our observation that the CPU is the typical performance bottleneck in high-speed sofware routers, we scale the computing power in a cost-effective manner with massively-parallel GPU. PacketShader offloads computation and memory-intensive router applications to GPUs while optimizing the packet reception and transmission path on Linux. With extensive batch processing and pipelining, PacketShader achieves an unprecedented IP packet forwarding performance of 40 Gbps on an eight-core Nehalem server even for 64-byte packet size.

http://shader.kaist.edu/packetshader/

http://www.b2bweb.fr/molokoloco/best-must-know-ressources-for-building-the-new-web-%E2%98%85/

Here the dump of my ultimate collection of online Web development resources and directory, oriented for the Front-End user Interface (UI).

HTML5 and all related open standards are moving fast, but for now, building a whole Website/WebApp on top of that can be very inconsistent, especially across various browsers experiences.

 

So… how to embrace new awesome web technologies ?

Now, as Web Developers and Designers, we have to build on top of more stable framework. It’s here that come JavaScript jQuery, acting like interface into browser’s implementations. That how we can expect more stability and consistency.

There is not only JS, building a state-of-the-art webSite. That now like making a big movie, with hundred specialized tasks and jobs…

From A to Z, this is huge ! Even if i think we don’t need to be an expert for all… (Thus we try) ^^

Best things in life are free, time to learn !

 

LEARNING HTML 5, CODING AND DESIGN

  • Awesome HTML5 Dashboard by Mozilla
  • WhatWG Developers, A clear technical specification of HTML5 for Web developers
  • StackOverflow : Welcome to Q&A for professional and enthusiast programmers
  • Addyosmani, jQuery & JavaScript articles and tutorials for the community
  • Sohtanaka, jQuery & JavaScript articles and tutorials for the community
  • Nettuts+ is a site aimed at web developers and designers offering tutorials and articles on technologies, skills and techniques to improve how you design and build websites. We cover HTML, CSS, Javascript, CMS’s, PHP and Ruby on Rails.
  • Codrops, tutorials and web resources
  • WebAppers, best Open Source Resources for Web Developers
  • Tutorialzine – PHP MySQL jQuery CSS Tutorials, Resources and Freebies
  • Mozilla JavaScript guide for developers
  • WebDev and jQuery wiki codes snippets, compiled by myself ;)

 

SERVER SIDE SOFTWARES

  • Node.js is a server-side JavaScript environment that uses an asynchronous event-driven model. This allows Node.js to get excellent performance based on the architectures of many Internet applications. Sources and live demo.
  • PhantomJS is a server-side headless WebKit with JavaScript API. It has fast and native support for various web standards : DOM handling, CSS selector, JSON, Canvas, and SVG
  • Lighttpd is a lightweight open-source web server. News, documentation, benchmarks, bugs, and download. Lighttpd powers several popular Web 2.0 sites like YouTube, wikipedia and meebo.
  • NGinx, high performance and lightweight web server as well as a reverse proxy and e-mail platform
  • The Apache HTTP Server Project is an effort to develop and maintain an open-source HTTP server for modern operating systems
  • PHP :  Hypertext Preprocessor. Server-side HTML embedded scripting language. It provides web developers with a full suite of tools for building dynamic websites
  • FFmpeg – Tools to record, convert, stream and play multimedia content including libavcodec and libavformat, two libraries used by many other open source projects
  • And… Ruby, Python, Erlang, Perl, Java, .NET, Android, C++, Go, Fantom, CoffeeScript, D, …

 

PHP FRAMEWORKS AND TOOLS

  • WordPress is web software you can use to create a beautiful website or blog
  • Drupal is an open source content management platform (CMS).
    Come for the software, stay for the community
  • Centurion is a new open-source CMS delivered as a flexible PHP5 Content Management Framework. We simplify the use of Zend Framework, which is ZF extended. Our components are generic, simple, clear and reusable.
  • phpBB is a free flat-forum bulletin board software solution
  • SimplePie : Super-fast, easy-to-use, RSS and Atom feed parsing in PHP
  • PHPthumb, PHP image manipulation library
  • PHPMailer is a fully featured email transfer class for PHP
  • A simple, open, server-to-server web-hook-based pubsub (publish/subscribe) protocol as an extension to Atom and RSS. Parties (servers) speaking the PubSubHubbub protocol can get near-instant notifications

 

DATABASE MANAGEMENT

  • Apache CouchDB provides a RESTful JSON API than can be accessed from any environment that allows HTTP requests and allow document-oriented database that can be queried and indexed in a MapReduce fashion using JavaScript. CouchDB also offers incremental replication with bi-directional conflict detection and resolution. Sources.
  • MonoQL is an AJAX web application to manage MySQL databases. MonoQL will provide all major features of phpMyAdmin for MySQL, including database & table design, data browsing & editing, advanced querying & more
  • MariaDB is a community-developed branch of the MySQL database, under GPL status, as opposed to any uncertainty of MySQL license status under its current ownership by Oracle.
  • SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine.
  • SQL online designer editor

 

API AND ONLINE DATA

  • ProgrammableWeb, Most Popular Web Services and API Directory
  • The following Google services provide APIs that implement the Google Data Protocol. Each API has its own set of guides and resources, including information about using client libraries
  • Yahoo! Developer Network – APIs & Tools
  • Yahoo! Pipes An interactive feed aggregator and manipulator
  • ★ The Yahoo! Query Language is an expressive SQL-like language that lets you query, filter, and join data across Web services

 

ONLINE CODE AND MEDIA EDITING

  • CodeRun Studio is a cross-platform Integrated Development Environment (IDE), designed for the cloud. It enables you to easily develop, debug and deploy web applications using your browser.
  • Cloud9 IDE – by javascripter for javascripters
  • jsFiddle – Simple and powerfull online editor for the Web (JavaScript, MooTools, jQuery, Prototype, YUI, Glow and Dojo, HTML, CSS)
  • Akshell, a server-side JavaScript development and hosting. Create web apps in JavaScript right from your browser
  • JSONeditor, easy editing of json strings
  • TinyMCE is a powerful WYSIWYG editor control for web browsers such as MSIE or Mozilla that enables the user to edit HTML content in a more user friendly way
  • Ext Designer is a desktop application that helps you create interfaces faster than ever in an easy-to-use, drag-and-drop environment.
  • ★ Wireframes / UI Design  From static wireframes to rapid prototypes, web developers can do it all with LucidChart. Collaborate with your client and design team in real-time to cut down on iterations.
  • Balsamiq Mockups, online sketch helping you in your design
  • Color Scheme Designer 3
  • Pixlr, Photoshop like image editing direct in your browser
  • Aviary, free online photo editor. Plus Aviary API for developers
  • Favicon Generator

 

CODE RESOURCES AND VERSION CONTROL

  • GitHub is the best way to collaborate with others. Fork, send pull requests and manage all your public and private git repositories.
  • Git is an extremely fast, efficient, distributed version Source Code Management tool ideal for the collaborative development of software.
  • Google Code est destiné aux développement relatif à Google. L’entreprise y diffuse des codes sous licence libre ainsi que la liste des API utilisables
  • The Google Libraries API is a content distribution network (CDN) and loading architecture for the most popular, open-source JavaScript libraries
  • Code Snippets, Snipplr Social Snippet Repository

 

JAVASCRIPT FRAMEWORKS FOR DESKTOP

  • jQuery is a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. Sources, API, API Browser, Fancy Doc.
  • ★ The official jQuery User Interface (UI) library (Demos and Doc). Sources, Themes Roller, Download.
  • YUI 2 — Yahoo! User Interface Library
  • Mootools, a super lightweight web2.0 JavaScript framework
  • Prototype provides class-style Object Oriented and AJAX
  • Dojo unbeatable JavaScript Tools – The Dojo Toolkit
  • EXT4, the industry’s most advanced JavaScript framework for building the next generation of cross-platform web apps.
  • PHP.js, PHP functions implemented client-side in JavaScript

 

JAVASCRIPT FRAMEWORKS FOR MOBILE AND TOUCH

  • jQuery Mobile : Touch-Optimized Web Framework for Smartphones & Tablets
    A unified user interface system across all popular mobile device platforms, built on the rock-solid jQuery and jQuery UI foundation. Sources.
  • Zepto.js is a minimalist inlinable framework for mobile WebKit browsers, with a jQuery-like chaining syntax. Sources.
  • MicroJS : Fantastic Micro-Frameworks and Micro-Libraries for Fun and Profit !
  • PhoneGap : Embed your code and access core functions on Android, iPhone and Blackberry using JavaScript. Sources.
  • Sencha Touch allows you to develop mobile web apps that look and feel native on iPhone, Android, and BlackBerry touch devices
  • JQtouch, a jQuery plugin for mobile web development on the iPhone, Android, iPod Touch, and other forward-thinking devices. Sources.
  • DHTMLX Touch is an HTML5-based JavaScript library for building mobile web applications. It’s not just a set of UI widgets, but a complete framework that allows you to create eye-catching, cross-platform web applications for mobile and touchscreen devices

 

JQUERY PLUGINS

  • jQuery Waypoints is a small jQuery plugin that makes it easy to execute a function whenever you scroll to an element with or without infinite scrolling enabled
  • This jQuery plugin is an on-demand plugin loader, also known as a Lazy loader
  • TweenJS : A simple but powerful tweening / animation library for Javascript
  • Css3-like Easings for jQuery animations
  • Spritely is a jQuery plugin for creating dynamic character and background animation (Pan, Scroll, Sprite)
  • jQuery File Upload User Interface Plugin 4.4.1
  • JQuery Slideshow/Carousel Plugin. Sources.
  • Supersized – Full Screen Background/Slideshow jQuery Plugin
  • jQuery Masonry is a layout plugin for jQuery that arranges elements vertically then horizontally according to a grid, minimizing gaps. Sources.
  • jQuery simple Layout Demo that manage slidable and resizable, multi-pane
  • Flexigrid – jQuery datagrid plugin
  • Isotope, an exquisite jQuery plugin for magical layouts Reveal & hide items with filtering Re–order items with sorting Dynamic, intelligent layouts
  • The Super Gestures jQuery plugin records gestures made by the user’s mouse. This is great for touch interface web applications
  • jQuery MouseWheel is a plugin that adds cross-browser mouse wheel support
  • AutoSuggest jQuery Plugin, add some auto-completing functionality
  • qTip is an advanced tooltip plugin it provides you with tonnes of features like rounded corners and speech bubble tips
  • jQuery Charts and graphic tool
  • jQuery Tools – The missing UI library for the Web

 

OTHER JQUERY RESOURCES

 

 

HTML5 VIDEO PLAYERS

  • Popcorn.js is an event system for HTML5 Video, with strong syntactic sugar for chaining < video > methods and adding events to the timeline. (From Mozilla)
  • LeanBack Player HTML5 Video Player with Subtitle-Support (From Google)
  • A single URL for your video. Vid.ly keep up to date with the thousands of smart phones, features phones, and tablets on the market and which type of video they support. When a mobile device visits your vid.ly url we deliver up the correct video format

 

JAVASCRIPT AUDIO PROCESSING AND VISUALISATION

  • ★ Using HTML5 and Flash, SoundManager V2 provides reliable, simple and advanced, cross-platform audio under a single API
  • DSP, sound Digital Signal Processing for JavaScript
  • The Radiolab Hyper Audio Player v1, brought to you by WNYC Radiolab, SoundCloud and Mozilla Drumbeat
  • jPlayer, a jQuery HTML5 Audio / Video Library with comprehensive API

 

JAVASCRIPT GRAPHICS AND 3D

  • Processing.js makes your data visualizations, digital art, interactive animations, educational graphs, video games, etc. work using web standards and without any plug-ins
  • ★ Javascript 3D Engine : ThreeJS by Mr Doob
    The aim of the project is to create a lightweight 3D engine with a very low level of complexity — in other words, for dummies. The engine can render using <canvas>, <svg> and WebGL.
  • Shader Toy, online shaders visualizer and editor (2D/3D)
  • PhiloGL, a WebGL Framework for Data Visualization, Creative Coding and Game Development
  • What Firebug and Developer Tools are to HTML/JS, WebGL Inspector is to WebGL
  • WebGL frameworks listed by the Khronos Group
  • EaselJS, a JavaScript library for working with the html5 canvas element. Sources.
  • Free JavaScript Game Frameworks To Create A Web-Based Fun
  • Raphaël is a small JavaScript library that should simplify your work with vector graphics on the web (SVG). If you want to create your own specific chart or image crop and rotate widget, for example, you can achieve it simply and easily with this library.
  • jQuery SVG plugin that lets you interact with an SVG canvas
  • Display live data on your site Google chart tools are powerful, simple to use and free. Try out our rich gallery of interactive charts and data tools.
  • Arbor.js, a graph visualization library exploring nodes and relations and using web workers and jQuery

 

JAVASCRIPT BROWSERS INTERFACES (HTML5)

  • Modernizr – Feature detect HTML5 and CSS3 features, with handy css and javascript hooks so you can progressively enhance to your heart’s content. Sources. Useful list of cross-browser Polyfills
  • HTML5Shiv : The latest HTML5 JavaScript shim for IE to recognise and style the HTML5 elements
  • Polyfills : A way of getting the browser to behave and support the latest specifications. This is a collection of code snippets that support different native features of browsers using JavaScript (and if required, Flash in some cases).
  • YepNopeJS : An Asynchronous Conditional Resource Loader helping detecting browser missing features. Sources.
  • jQuery CSS3 Finalise : Tired of adding prefix for each browser when it comes to the new CSS3 attributes ?
  • Amplify.js : Store, request and pub/sub. Amplify API  goal is to simplify all forms of data handling by providing a unified API for various data sources. Amplify’s store component handles persistent client-side storage, using standards like localStorage and sessionStorage, but falling back on non-standard implementations for older browsers. Sources.
  • History.js gracefully supports the HTML5 History/State APIs
  • Socket.IO aims to make realtime apps possible in every browser and mobile device

 

JAVASCRIPT TOOLS

  • ★ Minimal templating with {{mustaches}} in JavaScript
  • json:select(), CSS-like selectors for JSON
  • HeadJS, Asynchronus JavaScript loading. The only script in your <HEAD>
  • JsDoc Toolkit is an application, written in JavaScript, for automatically generating template-formatted, multi-page HTML (or XML, JSON, or any other text-based) documentation from commented JavaScript source code.
  • Responsive image, an Experiment with Mobile-First Images that Scale Responsively & Responsibly
  • UglifyJS JavaScript API, to compress JavaScript code
  • Dhteumeuleu, interactive DOM scripting and DHTML open-source demos, powered with native JavaScript
  • Backbone give your JS App some Models, Views, Collections, and Events
    Backbone supplies structure to JavaScript-heavy applications by providing models key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing application over a RESTful JSON interface.

 

CLIENT SIDE AND EMULATING

 

CSS3 and FONTS

  • CSS3 Maker and generator
  • Create amazing WebKit CSS3 animations with ease.  Sencha Animator is a desktop app to create CSS3 animations for WebKit browsers and touchscreen mobile devices. Create rich experiences for today’s most popular devices.
  • CSSwarp – CSS Text to Path Generator
  • Gradient Editor, a powerful Photoshop-like CSS gradient editor from ColorZilla
  • Google Web Fonts lets you browse all the fonts available via the Google Web Fonts API (open source license)
  • @font-face Kit Generator, convert fonts for the Web
  • Typetester, compare fonts for the screen
  • Media Queries. a collection of responsive web designs
  • Pattern TAP, Users Interface (UI) components

 

WEBSITE (FULL) TEMPLATES

  • HTML5 Boilerplate A rock-solid base HTML/CSS/JS template for HTML5 awesome, for a fast, robust and future-proof site.
    After more than three years in iterative development, you get the best of the best practices baked in : cross-browser normalization, performance optimizations, even optional features like cross-domain Ajax and Flash. A starter apache .htaccess config file hooks you the eff up with caching rules and preps your site to serve HTML5 video, use @font-face, and get your gzip zipple on. Sources.
  • HTML5 starter pack is a clean & ordered directory structure that fit for most projects, a few of the most common files (html, css, js), as well as a basic Photoshop web design template, again with an groups structure fit for most projects.
  • Initializr is an HTML5 templates generator to help you getting started with an HTML5 project, in 15 seconds !
  • Animated Portfolio Gallery with jQuery
  • Making a Slick MobileApp Website with jQuery & CSS
  • How to Build an RSS Reader with jQuery Mobile
  • ★ Building Single Page Applications With jQuery’s Best Friends (Backbone, Underscore, …)
  • Google TV Optimized Templates, to make website optimization for TV easier, we are providing templates – 2 in HTML5 and 2 in Flash – that developers can download and modify with their own content and style. The HTML5 version of these templates are utilizing the Google TV UI library, jQuery based and Closure based. The UI library can be used independent of the templates.

 

 

I know this is a monkey list ! Keep calm, you don’t have to read all… at least if you click on all starred links, it’s cool ;)

 

PS : Come take a look to my browser start page portal, giving WebDev an efficient access to Web resources… And don’t forget #TAG searches in this site :)

PS2 : Thanks a lot to #FOWD providing me wifi connection and inspiration ;)

戏说一下社区电子商务运营的策略问题:

1、网络经济是人气经济,没有人气不要谈什么模式。要想做大,首先要有人气。

2、社区人气的三大推动力:SEO、事件、人。每位网友都是你争取的对象,每位参与互动的网友都是意见领袖,每一次事件都不要放过。

3、用户上你的网站,必然是寻找某种价值。网站产品设计的核心,一是提供价值服务,一是网络营销的原则。

4、依赖用户创造UGC,很不靠谱。不过,你自己可以创造UGC.

5、(网络)产品创造价值?这是扯淡!三分产品七分推广,或者说,三分产品七分运营。运营真正造就价值。

6、内容与市场,产品与运营,永远是网站发展过程的矛盾体。对立统一,二轮驱动促使网站向前发展。

7、内容像一把筛子,筛选出精准的客户。内容加互动是网络媒体的特有属性,是精准营销的基础。而广告业主只青睐精确的广告投放。

8、互动提高10倍广告效率,互动决定于主动的营销服务。

9、专业创造价值,对行业价值挖掘有多深取决于你对行业挖掘有多深。做好一个行业,比做几个行业更重要。

10、首先分析行业,然后再分析行业链。“男怕入错行”,网站更是这样。

11、正确的价值链设计在于利益均衡,电子商务平台的渠道价值、平台运营商的盈利能力、平台的社会价值。而平台运营策略,往往是三个价值之间的一种博弈。

12、社区电子商务萌芽于社区,但是必须超越社区。否则永远只是萌芽。

13、平台的商家,准确的说叫做平台服务商,是可贵的资源。

14、重视中小企业的成长,平台运营商有多“慈悲”,平台就会有多大。

15、社区碎片化,电子商务中心化。

16、在电子商务平台交易,在社区传播口碑。

17、活动是推动社区发展的手段而不是目的。

18、网络渠道有3个:品牌渠道、产品渠道。需求渠道。品牌渠道是什么?就是“感谢CCTV”。

19、诚信机制是电子商务设计的核心难题。

20、客户不是不想上网,是不懂网络为何物。因此,推广的首要任务就是授人以渔。

21、中心化的内容,去中心化的关系。

22、新经济的模式起源于“荒谬”。(文/宁哲网络 周宁)

当今从纯网站技术上来说,因为开源模式的发展,现在建一个小网站已经很简单也很便宜,所以很多人都把创业方向定位在互联网应用。这些人里大多数不是很懂技术,或者不是那么精通,而网站开发维护方面的知识又很分散,学习成本太高,所以这篇文章将这些知识点结合起来,系统的来说,一个从日几千访问的小小网站,到日访问一两百万的小网站,中间可能会产生什么问题,以及怎么才能在一开始做足工作尽量避免这些问题。

对于不同的初期投资成本,技术路线的选择是不同的。这里假设网站刚刚只是一个构想,计划第一年服务器硬件带宽投入5万左右。对于这个资金额度,有很多种方案可选择,例如租用虚拟主机、租用单独服务器,或者流行的私有云,或者托管服务器。前两种选择,网站发展到一定规模时需迁移,那时再重做规划显然影响更大。服务器托管因为配置自主、能完全掌握控制权,所以有一定规模的网站基本都是这种模式。采用自己托管服务器的网站,一开始要注意以下几点。


一、开发语言


一般来说,技术人员(程序员)都是根据自己技术背景选择自己最熟悉的语言,不过不可能永远是一个人写程序,所以在语言的选择上还要是要费些心思。首先明确一点,无论用什么语言,最终代码质量是看管理,因此我们从前期开发成本分析。现在国内流行的适用于网站的语言,大概有java、php、.net、 python、ruby这五大阵营。python和ruby因为在国内流行的比较晚,现在人员还是相对难招一些。.net平台的人相对多,但是到后期需要解决性能问题时,对人员技能的要求比较高。剩余的java、php用人可以说是最多的。java和php无法从语言层面做比较,但对于初期,应用几乎都是靠前端支撑的网站来说,php入门简单、编写快速,优势相对大一点。至于后端例如行为分析、银行接口、异步消息处理等,等真正需要时,就要根据不同业务需求来选择不同语言了。

二、代码版本管理


稍微有点规模的网站就需要使用代码版本管理了。代码版本管理两点最大的好处,一是方便协同工作,二是有历史记录可查询比较。代码版本管理软件有很多,vss/cvs/svn/hg等,目前国内都比较流行,其中svn的普及度还是很高的。


向服务器部署代码,可以手工部署也可以自动部署。手工部署相对简单,一般可直接在服务器上svn update,或者找个新目录svn checkout,再把web root给ln -s过去。应用越复杂,部署越复杂,没有什么统一标准,只是别再用ftp上传那种形式,一是上传时文件引用不一致错误率增加,二是很容易出现开发人员的版本跟线上版本不一致,导致本来想改个错字结果变成回滚。如果有多台服务器还是建议自动部署,更换代码的机器从当前服务池中临时撤出,更新完毕后再重新加入。

三、服务器硬件


在各个机房里,靠一台服务器孤独支撑的网站数不清,但如果资金稍微充足,建议至少三台的标准配置,分别用作web处理、数据库、备份。web服务器至少要8G内存,双sata raid1,如果经济稍微宽松,或静态文件或图片多,则15k sas raid10。数据库至少16G内存,15k sas raid 10。备份服务器最好跟数据库服务器同等配置。硬件可以上整套品牌,也可以兼容机,也可以半品牌半组装,取决于经济能力。当然,这是典型的搭配,有些类型应用的性能瓶颈首先出现在web上,那种情况就要单独分析了。


web服务器可以既跑程序又当内存缓存,数据库服务器则只跑主数据库(假如是MySQL的话),备份服务器所承担就相对多一些,web配置、缓存配置、数据库配置都要跟前两台一致,这样WEB和数据库任意一台出问题,很容易就可以将备份服务器切换过去临时顶替,直到解决完问题。要注意,硬件是随时可能坏掉的,特别是硬盘,所以宁可WEB服务器跟数据库服务器放在一起,也一定不能省掉备份,备份一定要异机,并且有异步,电力故障、误操作都可能导致一台机器上的所有数据丢失。很多的开源备份方案可选择,最简单的就是rsync,写crontab里,定时同步。备份和切换,建议多做测试,选最安全最适合业务的,并且尽可能异地备份。

四、机房


三种机房尽量不要选:联通访问特别慢的电信机房、电信访问特别慢的联通机房、电信联通访问特别慢的移动或铁通机房。机房要尽可能多的实地参观,多测试,找个网络质量好,管理严格的机房。机房可以说是非常重要,直接关系到网站访问速度,网站访问速度直接关系到用户体验,访问速度很慢的网站,很难获得用户青睐。

五、架构


在大方向上,被熟知的架构是web负载均衡+数据库主从+缓存+分布式存储+队列。在一开始,按照可扩展的原则设计和编程就可以。只是要多考虑缓存失效时的雪崩效应、主从同步的数据一致性和时间差、队列的稳定性和失败后的重试策略、文件存储的效率和备份方式等等意外情况。缓存失效、数据库复制中断、队列写入错误、电源损坏,在实际运维中经常发生,如果不注意这些,出现问题时恢复期可能会超出预期很长时间。

六、服务器软件


操作系统Linux很流行。在没有专业运维人员的情况下,应倾向于择使用的人多、社区活跃、配置方便、升级方便的发行版,例如RH系列、 debian、ubuntu server等,硬件和操作系统要一起选择,看是否有适合的驱动,如果确定用某种商业软件或解决方案,也要提前知晓其对哪种操作系统支持最佳。web服务器方面,apache、nginx、lighttpd三大系列中,apache占有量还是最大,但是想把性能调教好还是需要很专业的,nginx和 lighttpd在不需要太多调整的情况下可以达到一个比较不错的性能。无论选择什么软件,除非改过这些软件或你的程序真的不兼容新版本,否则尽量版本越新越好,版本新,意味着新特性增多、BUG减少、性能增加。一个典型的php网站,基本上大多数人都没改过任何服务器软件源代码,绝大多数情况是能平稳的升级到新版本的。类似于jdk5到 jdk6,python2到python3这类变动比较大的升级还是比较少见的。看看ChangeLog,看看升级说明,结合自己情况评估测试一下,越早升级越好,升级的越晚,所花费的成本越高。对于软件包,尽量使用发行版内置的包管理工具,没有特殊要求时不建议自己编译,那样对将来运维不利。

七、数据库


几乎所有操作最后都要落到数据库身上,它又最难扩展(存储也挺难)。数据库常见的扩展方法有复制、分片,设计时要考虑到每种应用的数据如何复制、分片,当然这种考虑一般会推迟到技术设计时期。在初期进行数据库结构设计时,要根据不同的业务类型和增长量预期来考虑是否要分库、分区,并且尽量不要使用联合查询、不使用自增ID以方便分片。复制延时问题、主从数据库数据一致性问题,可以自己写或者用已有的运维工具进行检测。


用存储过程是比较难扩展的,这种情形多发生于传统C/S,特别是OA系统转换过来的开发人员。低成本网站不是一两台小型机跑一个数据库处理所有业务的模式,是机海作战。方便水平扩展比那点预分析时间和网络传输流量要重要的多的多。


另外,现在流行一种概念叫NoSQL,可以理解为非传统关系型数据库。实际应用中,网站有着越来越多的密集写操作、上亿的简单关系数据读取、热备等,这都不是传统关系数据库所擅长的,于是就产生了很多非关系型数据库,比如Redis/TC&TT/MongoDB/Memcachedb等,在测试中,这些几乎都达到了每秒至少一万次的写操作,内存型的甚至5万以上。在设计时,可根据业务特点和性能要求来选择是否使用这类数据库。例如 MongoDB,几句配置就可以组建一个复制+自动分片+failover的环境,文档化的存储也简化了传统设计库结构再开发的模式。但是当你决定采用一项技术时,一定要真正了解其优劣,例如可能你所选择的技术并不能支持你所需要的事务和数据一致性要求。

八、文件存储


存储的分布几乎跟数据库扩展一样困难,不过只有百万的PV的情况下,磁盘IO方面一般不会成大问题,一两台采用SATA做条带RAID的机器可以应付,反而是自己做异步备份比较复杂,因为小文件多。如果只有一台机器做存储,可以做简单的优化,例如放最小缩略图的分区和放中等缩略图的分区,根据平均大小调整一下块大小。存储要规划好目录结构,否则文件增多后维护起来复杂,也不利于扩展。同时还要考虑将来扩容,例如采用LVM,或者把文件根据不同规则散列到不同机器。磁盘IO繁重的情况下更容易出现故障,所以要做好备份,若发现有盘坏掉,要马上行动更换,很多人的硬盘都是坏了一块之后,接二连三的坏下去。


为了将来图片走cdn做准备,一开始最好就将图片的域名分开,且不用主域名。因为很多网站都将cookie设置到了.domain.ltd,如果图片也在这个域名下,很可能因为cookie而造成缓存失效,并且占多余流量,还可能因为浏览器并发线程限制造成访问缓慢。

九、程序


一定硬件条件下,应用能承载多少访问量,很大一部分也取决于程序如何写。程序写的不好,可能一万的访问都承载不了,写的好,可能一两台机器就能承担几百万PV。越是复杂、数据实时性要求越高的应用,优化起来越难,但对普通网站有一个统一的思路,就是尽量向前端优化、减少数据库操作、减少磁盘IO。向前端优化指的是,在不影响功能和体验的情况下,能在浏览器执行的不要在服务端执行,能在缓存服务器上直接返回的不要到应用服务器,程序能直接取得的结果不要到外部取得,本机内能取得的数据不要到远程取,内存能取到的不要到磁盘取,缓存中有的不要去数据库查询。减少数据库操作指减少更新次数、缓存结果减少查询次数、将数据库执行的操作尽可能的让你的程序完成(例如join查询),减少磁盘IO指尽量不使用文件系统作为缓存、减少读写文件次数等。程序优化永远要优化慢的部分,换语法是无法“优化”的。


然而编程时不应该把重点放在优化上,应该关注扩展性。当今的WEB应用,需求变化非常之快,适应多种需求的架构是不存在的,我们的扩展性就要把要点放在跟底层交互的架构上,例如持久化数据的存取规则、缓存的存取规则等,还有一些共用服务,例如用户信息等。先把不变的部分做完善,剩下的部分就很容易将精力放在业务逻辑上面了。


关于作者


刘志一,从1999年做个人网站开始一直专注于互联网,目前就职于一家垂直行业C2C网站,做产品和开发方面工作。

原文链接:http://www.infoq.com/cn/articles ... hnical-preparations

dnsstuff.com 收费后的选择

[不指定 2010/11/11 09:56 | by ipaddr ]

互联网服务当有一定知名度后应否收费呢? 这是一个有趣问题。 Dnsstuff.com 是一个很受 email administrator 喜爱的网站。不明白为何它要转为收费形容:
1. 它的服务提供没有独特性。如果你用心使用 dig, nslookup 的工具,也可以有齐所有结果。
2. 基本上所有查询都是全自动,不经人手。不似其他 Free website, free webmail, free storage 等网站愈人多就要投资更多。但 dnsstuf.com 的 marginal cost 非常低。这类网站的最佳收入是增大会员数目,用广告支持。

无论如何,当你收费后,人家就会找替代品:

http://www.intodns.com/

http://www.thednsreport.com/

这两个「抄」得最似,接近一样。

其他还有:

http://www.squish.net/dnscheck/

http://www.iptools.com/

http://www.netsystools.com/

http://www.freednsinfo.com/

http://www.diggip.com/

分页: 3/20 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]