<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>julyboxer 算法  股票 java,Ajax,Spring,Hibernate,Ejb3</title>
    <description></description>
    <link>http://julyboxer.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Lighttpd+Squid+Apache搭建高效率Web服务器</title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/227425" style="color:red;">http://julyboxer.javaeye.com/blog/227425</a>&nbsp;
          发表时间: 2008年08月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2> 架构原理 </h2>
<p><a href="http://www.apache.org/"> Apache</a>
通常是开源界的首选Web服务器，因为它的强大和可靠，已经具有了品牌效应，可以适用于绝大部分的应用场合。但是它的强大有时候却显得笨重，配置文件得让人望而生畏，高并发情况下效率不太高。而轻量级的Web服务器<a href="http://lighttpd.net/">Lighttpd</a>
却
是后起之秀，其静态文件的响应能力远高于Apache，据说是Apache的2-3倍。Lighttpd的高性能和易用性，足以打动我们，在它能够胜任的
领域，尽量用它。Lighttpd对PHP的支持也很好，还可以通过Fastcgi方式支持其他的语言，比如Python。</p>
<p>
毕竟Lighttpd是轻量级的服务器，功能上不能跟Apache比，某些应用无法胜任。比如Lighttpd还不支持缓存，而现在的绝大部分站点都是用
程序生成动态内容，没有缓存的话即使程序的效率再高也很难满足大访问量的需求，而且让程序不停的去做同一件事情也实在没有意义。首先，Web程序是需要做
缓存处理的，即把反复使用的数据做缓存。即使这样也还不够，单单是启动Web处理程序的代价就不少，缓存最后生成的静态页面是必不可少的。而做这个是 <a href="http://www.squid-cache.org/">Squid</a>
的强项，它本是做代理的，支持高效的缓存，可以用来给站点做反向代理加速。把Squid放在Apache或者Lighttpd的前端来缓存 Web服务器生成的动态内容，而Web应用程序只需要适当地设置页面实效时间即可。</p>
<p>
即使是大部分内容动态生成的网站，仍免不了会有一些静态元素，比如图片、JS脚本、CSS等等，将Squid放在Apache或者Lighttp前端后，
反而会使性能下降，毕竟处理HTTP请求是Web服务器的强项。而且已经存在于文件系统中的静态内容再在Squid中缓存一下，浪费内存和硬盘空间。因此
可以考虑将Lighttpd再放在Squid的前面，构成
Lighttpd+Squid+Apache的一条处理链，Lighttpd在最前面，专门用来处理静态内容的请求，把动态内容请求通过proxy模块转
发给Squid，如果Squid中有该请求的内容且没有过期，则直接返回给Lighttpd。新请求或者过期的页面请求交由Apache中Web程序来处
理。经过Lighttpd和Squid的两级过滤，Apache需要处理的请求将大大减少，减少了Web应用程序的压力。同时这样的构架，便于把不同的处
理分散到多台计算机上进行，由Lighttpd在前面统一把关。</p>
<p> 在这种架构下，每一级都是可以进行单独优化的，比如Lighttpd可以采用异步IO方式，Squid可以启用内存来缓存，Apache可以启用MPM 等，并且每一级都可以使用多台机器来均衡负载，伸缩性很好。</p>
<h2> 实例讲解 </h2>
<p> 下面以daviesliu.net和rainbud.net域下面的几个站点为例来介绍一下此方案的具体做法。daviesliu.net域下有几个用 <a href="http://www.modpython.org/">mod_python</a>
实现的<a href="http://blog.daviesliu.net/">blog站点</a>
，几个php的站点，一个<a href="http://share.daviesliu.net/">mod_python的小程序</a>
，以后可能还会架设几个PHP和<a href="http://www.djangoproject.com/">Django</a>
的站点。而服务器非常弱，CPU为Celeron 500，内存为PC 100 384M，因此比较关注Web服务器的效率。这几个站点都是采用虚拟主机方式，开在同一台机器的同一个端口上。</p>
<p> Lighttpd服务于80端口，Squid运行在3128端口，Apache运行在81端口。</p>
<h3> Lighttpd的配置 </h3>
<p> 多个域名采用/var/www/domain/subdomain 的目录结构，用evhost模块配置document-root如下：</p>
<blockquote>evhost.path-pattern&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = &nbsp;var.basedir + &quot;/%0/%3/&quot;&nbsp;<br />
 </blockquote>
<p> FtpSearch中有Perl脚本，需要启用CGI支持，它是用来做ftp站内搜索的，缓存的意义不大，直接由lighttpd的mod_cgi处理： </p>
<blockquote>$HTTP[&quot;url&quot;] =~ &quot;^/cgi-bin/&quot; { # only allow cgi's in this directory<br />
 &nbsp;&nbsp;&nbsp; dir-listing.activate = &quot;disable&quot;&nbsp;&nbsp;&nbsp; # disable directory listings<br />
 &nbsp;&nbsp;&nbsp; cgi.assign = ( &quot;.pl&quot;&nbsp;&nbsp; =&gt;&nbsp; &quot;/usr/bin/perl&quot;, &quot;.cgi&quot;&nbsp; =&gt;&nbsp; &quot;/usr/bin/perl&quot; )<br />
 }<br />
 </blockquote>
<p> bbs使用的是phpBB，访问量不大，可以放在lighttpd(fastcgi)或者apache(mod_php)下，暂时使用 lighttpd，设置所有.php的页面请求有fastcgi处理：</p>
<blockquote>fastcgi.server
= ( &quot;.php&quot; =&gt;&nbsp; ( (&nbsp; &quot;host&quot;&nbsp; =&gt; &quot;127.0.0.1&quot;, &quot;port&quot;=&gt; 1026,&nbsp;
&quot;bin-path&quot;&nbsp; =&gt;&nbsp; &quot;/usr/bin/php-cgi&quot;&nbsp; )&nbsp; ) )<br />
 </blockquote>
<p>
blog.daviesliu.net 和 blog.rainbud.net
是用mod_python编写的blogxp程序，所有静态内容都有扩展名，而动态内容没有扩展名。blogxp是用python程序生成XML格式的数
据再交由mod_xslt转换成HTML页面，只能放在Apache下运行。该站点采用典型Lighttpd+Squid+Apache方式处理： </p>
<blockquote>$HTTP[&quot;host&quot;] =~ &quot;^blog&quot; {&nbsp;<br />
 &nbsp;&nbsp;&nbsp; $HTTP[&quot;url&quot;] !~ &quot;\.&quot; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy.server = ( &quot;&quot; =&gt; ( &quot;localhost&quot; =&gt; ( &quot;host&quot;=&gt; &quot;127.0.0.1&quot;, &quot;port&quot;=&gt; 3128 ) ) )&nbsp; #3128端口为<br />
 &nbsp;&nbsp;&nbsp; }<br />
 }<br />
 </blockquote>
<p>share中有静态页面，也有用mod_python处理的请求，在/cgi/下：</p>
<blockquote>$HTTP[&quot;host&quot;] =~ &quot;^share&quot; {<br />
 &nbsp;&nbsp;&nbsp; proxy.server = (<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;/cgi&quot; =&gt; ( &quot;localhost&quot; =&gt; ( &quot;host&quot;=&gt; &quot;127.0.0.1&quot;, &quot;port&quot;=&gt; 3128 )&nbsp; )&nbsp;&nbsp;<br />
 &nbsp;&nbsp;&nbsp; )<br />
 }<br />
 </blockquote>
<h3> Squid的配置 </h3>
<p> 只允许本地访问：</p>
<blockquote>http_port&nbsp;&nbsp; 3128<br />
 http_access allow localhost<br />
 http_access deny all<br />
 </blockquote>
<p>启用反向代理：</p>
<blockquote>&nbsp;httpd_accel_host 127.0.0.1<br />
 &nbsp;httpd_accel_port 81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #apache的端口<br />
 &nbsp;httpd_accel_single_host on<br />
 &nbsp;httpd_accel_with_proxy on&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #启用缓存<br />
 &nbsp;httpd_accel_uses_host_header on #启用虚拟主机支持<br />
 </blockquote>
<p> 此方向代理支持该主机上的所有域名。</p>
<h3> Apache的配置 </h3>
<p> 配置/etc/conf.d/apache2，让其加载mod_python、mod_xslt、mod_php模块：</p>
<blockquote>APACHE2_OPTS=&quot;-D PYTHON -D XSLT -D PHP5&quot;<br />
 </blockquote>
<p>所有网站的根目录：</p>
<blockquote>&lt;Directory &quot;/var/www&quot;&gt;<br />
 &nbsp;&nbsp;&nbsp;AllowOverride All&nbsp;&nbsp;&nbsp;&nbsp; #允许.htaccess覆盖<br />
 &nbsp;&nbsp;&nbsp; Order allow,deny<br />
 &nbsp;&nbsp;&nbsp; Allow from all<br />
 &lt;/Directory&gt;<br />
 </blockquote>
<p> 基于域名的虚拟主机：</p>
<blockquote>&lt;VirtualHost *:81&gt;<br />
 ServerName blog.daviesliu.net<br />
 DocumentRoot /var/www/daviesliu.net/blog<br />
 &lt;/VirtualHost&gt;<br />
 </blockquote>
<p>这里明显没有lighttpd的evhost配置方便。</p>
<p> blog.daviesliu.net下的.htaccess设置(便于开发，不用重启Apache):</p>
<blockquote>SetHandler mod_python<br />
 PythonHandler blogxp.publisher<br />
 PythonDebug On<br />
 PythonAutoReload On<br />
 <br />
 &lt;FilesMatch &quot;\.&quot;&gt;<br />
 &nbsp;&nbsp;&nbsp; SetHandler None&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #静态文件直接由Apache处理<br />
 &lt;/FilesMatch&gt;<br />
 <br />
 &lt;IfModule mod_xslt.c&gt;<br />
 &nbsp;&nbsp;&nbsp; AddType text/xsl .xsl&nbsp; #防止对xsl文件进行转化<br />
 &nbsp;&nbsp;&nbsp; AddOutputFilterByType mod_xslt text/xml<br />
 &nbsp;&nbsp;&nbsp; XSLTCache off<br />
 &nbsp;&nbsp;&nbsp; XSLTProcess on<br />
 &lt;/IfModule&gt;<br />
 Header set Pragma &quot;cache&quot;<br />
 Header set Cache-Control &quot;cache&quot;<br />
 </blockquote>
<p>在blogxp.publisher里面，还需要设置返回的文档类型和过期时间：</p>
<blockquote>&nbsp;&nbsp;&nbsp; req.content_type = &quot;text/xml&quot;<br />
 &nbsp;&nbsp;&nbsp; req.headers_out['Expires'] = formatdate( time.time() + 60 * 5 )<br />
 </blockquote>
<p>经过这样的配置，所有站点都可以通过80、3128、81三个端口进行正常访问，80端口用作对外的访问，以减少负荷。81端口可以用作开发时的调试，没有缓存的困扰。</p>
<h2>  性能测试 </h2>
<p> 由于时间和精力有限，下面只用ab2做一个并不规范的性能对比测试(每项都测多次取平均)，评价指标为每秒钟的请求数。<br />
 测试命令,以测试lighttpd上并发10个请求 scripts/prototype.js 为例：</p>
<blockquote>ab2 -n 1000 -c 10 http://blog.daviesliu.net:80/scripts/prototype.js<br />
 </blockquote>
<p>静态内容：prototype.js (27kB)</p>
<div>  
<table cellspacing="3" border="1" cellpadding="3">
<tbody>
<tr>
<td width="25%">  Con<br />
  </td>
<td width="25%">  Lighttpd(:80)<br />
  </td>
<td width="25%">  Squid(:3128)<br />
  </td>
<td width="25%">  Apache(:81)<br />
  </td>
</tr>
<tr>
<td width="25%">  1<br />
  </td>
<td width="25%">  380<br />
  </td>
<td width="25%">  210<br />
  </td>
<td width="25%">  240<br />
  </td>
</tr>
<tr>
<td width="25%">  10<br />
  </td>
<td width="25%">  410<br />
  </td>
<td width="25%">  215<br />
  </td>
<td width="25%">  240<br />
  </td>
</tr>
<tr>
<td width="25%">  100<br />
  </td>
<td width="25%">  380<br />
  </td>
<td align="center" valign="middle" width="25%">  160<br />
  </td>
<td align="center" valign="middle" width="25%">  230<br />
  </td>
</tr>
</tbody>
</table>
<br />
  可见在静态内容上，Lighttpd表现强劲，而Squid在没有配内存缓存的情况下比另两个Web服务器的性能要差些。<br />
  <br />
  动态页面：/rss (31kB)<br />
 </div>
<div>  
<table cellspacing="3" border="1" cellpadding="5">
<tbody>
<tr>
<td width="25%">  Con<br />
  </td>
<td width="25%">  Lighttpd(:80)<br />
  </td>
<td width="25%">  Squid(:3128)<br />
  </td>
<td width="25%">  Apache(:81)<br />
  </td>
</tr>
<tr>
<td width="25%">  1<br />
  </td>
<td width="25%">  103<br />
  </td>
<td width="25%">  210<br />
  </td>
<td width="25%">  6.17<br />
  </td>
</tr>
<tr>
<td width="25%">  10<br />
  </td>
<td width="25%">  110<br />
  </td>
<td width="25%">  200<br />
  </td>
<td width="25%">  6.04<br />
  </td>
</tr>
<tr>
<td>  100<br />
  </td>
<td width="25%">  100<br />
  </td>
<td width="25%">  100<br />
  </td>
<td width="25%">  6.24<br />
  </td>
</tr>
</tbody>
</table>
<br />
 </div>
<p> 在动态内容上，Squid的作用非常明显，而Lighttpd受限于Squid的效率，并且还要低一大截。如果是有多台Squid来做均衡的话，Lighttpd的功效才能发挥出来。<br />
 在单机且静态内容很少的情况下，可以不用Lighttpd而将Squid置于最前面</p>
          <br/>
          <span style="color:red;">
            <a href="http://julyboxer.javaeye.com/blog/227425#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 13 Aug 2008 00:18:10 +0800</pubDate>
        <link>http://julyboxer.javaeye.com/blog/227425</link>
        <guid>http://julyboxer.javaeye.com/blog/227425</guid>
      </item>
      <item>
        <title>使用 Nginx 提升网站访问速度</title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/226167" style="color:red;">http://julyboxer.javaeye.com/blog/226167</a>&nbsp;
          发表时间: 2008年08月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <blockquote>http://bbs.chinaunix.net/thread-1233430-1-1.html<br />
</blockquote>
<blockquote><br />
</blockquote>
<blockquote>本文主要介绍如何在 Linux 系统上安装高性能的 HTTP 服务器 &mdash;&mdash; Nginx、并在不改变原有网站结构的条件下用 Nginx 来提升网站的访问速度。</blockquote>
<p>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Nginx 简介<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <strong>Nginx</strong>
(&quot;engine
x&quot;) 是一个高性能的 HTTP 和 反向代理 服务器，也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx是由 Igor
Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的，它已经在该站点运行超过两年半了。 Igor 将源代码以类BSD
许可证的形式发布。尽管还是测试版，但是，Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;根据最新一期（08 年 6 月份）的 NetCraft 调查报告显示，已经有超过两百万的主机使用了
Nginx，这个数字超过了另外一个轻量级的 HTTP 服务器 lighttpd， 排名第四，并且发展迅速。下面是这份报告的前几名的报表：</p>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
<table class="t_table" cellspacing="0" border="0" align="center">
<tbody>
<tr>
<td>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<strong>产品</strong>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</td>
<td>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<strong>网站数</strong>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</td>
</tr>
<tr>
<td>Apache </td>
<td>84,309,103 </td>
</tr>
<tr>
<td>IIS </td>
<td>60,987,087 </td>
</tr>
<tr>
<td>Google GFE </td>
<td>10,465,178 </td>
</tr>
<tr>
<td>Unknown </td>
<td>4,903,174 </td>
</tr>
<tr>
<td>nginx </td>
<td>2,125,160 </td>
</tr>
<tr>
<td>Oversee </td>
<td>1,953,848 </td>
</tr>
<tr>
<td>lighttpd </td>
<td>1,532,952 </td>
</tr>
</tbody>
</table>
<p>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;关于这期调查报告的更详细信息请看下面链接：<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <a href="http://survey.netcraft.com/Reports/200806/" target="_blank">http://survey.netcraft.com/Reports/200806/</a>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;下图是最近几个月使用 Nginx 和 lighttpd 的网站数比较<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <br />
<strong>图 1. 最近几个月使用 Nginx 和 lighttpd 的网站数比较</strong>
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <img src="http://www.ibm.com/developerworks/cn/web/wa-lo-nginx/image001.png" border="0" height="171" alt="" width="257" />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;使用 Nginx 前必须了解的事项</p>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
<ul type="1">
<li>目前官方 Nginx 并不支持 Windows，您只能在包括 Linux、UNIX、BSD 系统下安装和使用；</li>
<li>Nginx 本身只是一个 HTTP 和反向代理服务器，它无法像 Apache 一样通过安装各种模块来支持不同的页面脚本，例如 PHP、CGI 等；</li>
<li>Nginx 支持简单的负载均衡和容错；</li>
<li>支持作为基本 HTTP 服务器的功能，例如日志、压缩、Byte ranges、Chunked responses、SSL、虚拟主机等等，应有尽有。</li>
</ul>
<p>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;在 Linux 下安装 Nginx<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;为了确保能在 Nginx 中使用正则表达式进行更灵活的配置，安装之前需要确定系统是否安装有 PCRE（Perl Compatible Regular Expressions）包。您可以到 <a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/" target="_blank">ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/</a>
 下载最新的 PCRE 源码包，使用下面命令下载编译和安装 PCRE 包：</p>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
<table class="t_table" cellspacing="0" border="0" align="center" width="98%">
<tbody>
<tr>
<td># wget <a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.tar.gz" target="_blank">ftp://ftp.csx.cam.ac.uk/pub/soft ... cre/pcre-7.7.tar.gz</a>
<br />
# tar zxvf pcre-7.7.tar.gz<br />
# cd pcre-7.7<br />
# ./configure<br />
# make<br />
# make install<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
</tr>
</tbody>
</table>
<p><br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;接下来安装 Nginx，Nginx 一般有两个版本，分别是稳定版和开发版，您可以根据您的目的来选择这两个版本的其中一个，下面是把 Nginx 安装到 /opt/nginx 目录下的详细步骤：</p>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
<table class="t_table" cellspacing="0" border="0" align="center" width="98%">
<tbody>
<tr>
<td># wget <a href="http://sysoev.ru/nginx/nginx-0.6.31.tar.gz" target="_blank">http://sysoev.ru/nginx/nginx-0.6.31.tar.gz</a>
<br />
# tar zxvf nginx-0.6.31.tar.gz<br />
# cd nginx-0.6.31<br />
# ./configure --with-http_stub_status_module &ndash;prefix=/opt/nginx<br />
# make<br />
# make install<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
</tr>
</tbody>
</table>
<p><br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;其中参数 --with-http_stub_status_module 是为了启用 nginx 的 NginxStatus 功能，用来监控 Nginx 的当前状态。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;安装成功后 /opt/nginx 目录下有四个子目录分别是：conf、html、logs、sbin 。其中 Nginx
的配置文件存放于conf/nginx.conf，Nginx 只有一个程序文件位于 sbin 目录下的 nginx 文件。确保系统的
80端口没被其他程序占用，运行 sbin/nginx 命令来启动 Nginx，打开浏览器访问此机器的 IP，如果浏览器出现 Welcome
tonginx! 则表示 Nginx 已经安装并运行成功。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;常用的 Nginx 参数和控制<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;程序运行参数<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Nginx 安装后只有一个程序文件，本身并不提供各种管理程序，它是使用参数和系统信号机制对 Nginx 进程本身进行控制的。 Nginx 的参数包括有如下几个：<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <strong>-c</strong>
 &lt;path_to_config&gt;：使用指定的配置文件而不是 conf 目录下的 nginx.conf 。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <strong>-t</strong>
：测试配置文件是否正确，在运行时需要重新加载配置的时候，此命令非常重要，用来检测所修改的配置文件是否有语法错误。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <strong>-v</strong>
：显示 nginx 版本号。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <strong>-V</strong>
：显示 nginx 的版本号以及编译环境信息以及编译时的参数。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;例如我们要测试某个配置文件是否书写正确，我们可以使用以下命令</p>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
<table class="t_table" cellspacing="0" border="0" align="center" width="98%">
<tbody>
<tr>
<td>sbin/nginx &ndash; t &ndash; c conf/nginx2.conf</td>
</tr>
</tbody>
</table>
<p><br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;通过信号对 Nginx 进行控制<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Nginx 支持下表中的信号：</p>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
<table class="t_table" cellspacing="0" border="0" align="center">
<tbody>
<tr>
<td>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<strong>信号名</strong>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</td>
<td>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<strong>作用描述</strong>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</td>
</tr>
<tr>
<td> TERM, INT </td>
<td>快速关闭程序，中止当前正在处理的请求</td>
</tr>
<tr>
<td> QUIT </td>
<td>处理完当前请求后，关闭程序</td>
</tr>
<tr>
<td> HUP </td>
<td>重新加载配置，并开启新的工作进程，关闭就的进程，此操作不会中断请求</td>
</tr>
<tr>
<td> USR1 </td>
<td>重新打开日志文件，用于切换日志，例如每天生成一个新的日志文件</td>
</tr>
<tr>
<td> USR2 </td>
<td>平滑升级可执行程序</td>
</tr>
<tr>
<td> WINCH </td>
<td>从容关闭工作进程</td>
</tr>
</tbody>
</table>
<p>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;有两种方式来通过这些信号去控制 Nginx，第一是通过 logs 目录下的 nginx.pid 查看当前运行的
Nginx 的进程 ID，通过 kill &ndash; XXX &lt;pid&gt; 来控制 Nginx，其中 XXX
就是上表中列出的信号名。如果您的系统中只有一个 Nginx 进程，那您也可以通过 killall 命令来完成，例如运行 killall &ndash; s
HUP nginx 来让 Nginx 重新加载配置。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;配置 Nginx<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;先来看一个实际的配置文件：</p>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
<table class="t_table" cellspacing="0" border="0" align="center" width="98%">
<tbody>
<tr>
<td> user&nbsp;&nbsp;nobody;# 工作进程的属主<br />
 worker_processes&nbsp;&nbsp;4;# 工作进程数，一般与 CPU 核数等同<br />
<br />
 #error_log&nbsp;&nbsp;logs/error.log; <br />
 #error_log&nbsp;&nbsp;logs/error.log&nbsp;&nbsp;notice; <br />
 #error_log&nbsp;&nbsp;logs/error.log&nbsp;&nbsp;info; <br />
<br />
 #pid&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;logs/nginx.pid; <br />
<br />
 events { <br />
&nbsp; &nbsp; use epoll;#Linux 下性能最好的 event 模式<br />
&nbsp; &nbsp; worker_connections&nbsp;&nbsp;2048;# 每个工作进程允许最大的同时连接数<br />
 } <br />
<br />
 http { <br />
&nbsp; &nbsp; include&nbsp; &nbsp;&nbsp; &nbsp; mime.types; <br />
&nbsp; &nbsp; default_type&nbsp;&nbsp;application/octet-stream; <br />
<br />
&nbsp; &nbsp; #log_format&nbsp;&nbsp;main&nbsp;&nbsp;'$remote_addr - $remote_user [$time_local] $request ' <br />
&nbsp; &nbsp; #&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;'&quot;$status&quot; $body_bytes_sent &quot;$http_referer&quot; ' <br />
&nbsp; &nbsp; #&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;'&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;'; <br />
<br />
&nbsp; &nbsp; #access_log&nbsp;&nbsp;off; <br />
&nbsp; &nbsp; access_log&nbsp;&nbsp;logs/access.log;# 日志文件名<br />
<br />
&nbsp; &nbsp; sendfile&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;on; <br />
&nbsp; &nbsp; #tcp_nopush&nbsp; &nbsp;&nbsp;&nbsp;on; <br />
&nbsp; &nbsp; tcp_nodelay&nbsp; &nbsp;&nbsp;&nbsp;on; <br />
<br />
&nbsp; &nbsp; keepalive_timeout&nbsp;&nbsp;65; <br />
<br />
&nbsp; &nbsp; include &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;gzip.conf; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; # 集群中的所有后台服务器的配置信息<br />
&nbsp; &nbsp; upstream tomcats { <br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;server 192.168.0.11:8080 weight=10; <br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;server 192.168.0.11:8081 weight=10; <br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;server 192.168.0.12:8080 weight=10; <br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;server 192.168.0.12:8081 weight=10; <br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;server 192.168.0.13:8080 weight=10; <br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;server 192.168.0.13:8081 weight=10; <br />
&nbsp; &nbsp; } <br />
<br />
&nbsp; &nbsp; server { <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;listen&nbsp; &nbsp;&nbsp; &nbsp; 80;#HTTP 的端口<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;server_name&nbsp;&nbsp;localhost; <br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;charset utf-8; <br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#access_log&nbsp;&nbsp;logs/host.access.log&nbsp;&nbsp;main; <br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;location ~ ^/NginxStatus/ { <br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;stub_status on; #Nginx 状态监控配置<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;access_log off; <br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;} <br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;location ~ ^/(WEB-INF)/ { <br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;deny all; <br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;} <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;location ~ \.(htm|html|asp|php|gif|jpg|jpeg|png|bmp|ico|rar|css|js|<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;zip|java|jar|txt|flv|swf|mid|doc|ppt|xls|pdf|txt|mp3|wma)$ { <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; root /opt/webapp; <br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;expires 24h; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} <br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;location / { <br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;proxy_pass http://tomcats;# 反向代理<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;include proxy.conf; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} <br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;error_page 404 /html/404.html; <br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;# redirect server error pages to the static page /50x.html <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;# <br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;error_page 502 503 /html/502.html; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;error_page 500 504 /50x.html; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;location = /50x.html { <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;root&nbsp; &nbsp;html; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} <br />
&nbsp; &nbsp; } <br />
 } <br />
</td>
</tr>
</tbody>
</table>
<p><br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Nginx 监控<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;上面是一个实际网站的配置实例，其中灰色文字为配置说明。上述配置中，首先我们定义了一个 location
~^/NginxStatus/，这样通过 http://localhost/NginxStatus/ 就可以监控到
Nginx的运行信息，显示的内容如下：</p>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
<table class="t_table" cellspacing="0" border="0" align="center" width="98%">
<tbody>
<tr>
<td>Active connections: 70 <br />
server accepts handled requests<br />
 14553819 14553819 19239266 <br />
Reading: 0 Writing: 3 Waiting: 67 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
</tr>
</tbody>
</table>
<p><br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;NginxStatus 显示的内容意思如下：</p>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
<ul>
<li>active connections &ndash; 当前 Nginx 正处理的活动连接数。</li>
<li>serveraccepts
handled requests -- 总共处理了 14553819 个连接 , 成功创建 14553819 次握手 (证明中间没有失败的
), 总共处理了 19239266 个请求 ( 平均每次握手处理了 1.3 个数据请求 )。</li>
<li>reading -- nginx 读取到客户端的 Header 信息数。</li>
<li>writing -- nginx 返回给客户端的 Header 信息数。</li>
<li>waiting -- 开启 keep-alive 的情况下，这个值等于 active - (reading + writing)，意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。</li>
</ul>
<p>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;静态文件处理<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;通过正则表达式，我们可让 Nginx 识别出各种静态文件，例如 images 路径下的所有请求可以写为：</p>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
<table class="t_table" cellspacing="0" border="0" align="center" width="98%">
<tbody>
<tr>
<td>location ~ ^/images/ {<br />
&nbsp; &nbsp; root /opt/webapp/images;<br />
}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
</tr>
</tbody>
</table>
<p><br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;而下面的配置则定义了几种文件类型的请求处理方式。</p>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
<table class="t_table" cellspacing="0" border="0" align="center" width="98%">
<tbody>
<tr>
<td>location ~ \.(htm|html|gif|jpg|jpeg|png|bmp|ico|css|js|txt)$ {<br />
&nbsp; &nbsp; root /opt/webapp;<br />
&nbsp; &nbsp; expires 24h;<br />
}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
</tr>
</tbody>
</table>
<p><br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;对于例如图片、静态 HTML 文件、js 脚本文件和 css 样式文件等，我们希望 Nginx
直接处理并返回给浏览器，这样可以大大的加快网页浏览时的速度。因此对于这类文件我们需要通过 root
指令来指定文件的存放路径，同时因为这类文件并不常修改，通过 expires 指令来控制其在浏览器的缓存，以减少不必要的请求。 expires
指令可以控制 HTTP 应答中的&ldquo; Expires &rdquo;和&ldquo; Cache-Control
&rdquo;的头标（起到控制页面缓存的作用）。您可以使用例如以下的格式来书写 Expires：</p>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
<table class="t_table" cellspacing="0" border="0" align="center" width="98%">
<tbody>
<tr>
<td>expires 1 January, 1970, 00:00:01 GMT;<br />
expires 60s;<br />
expires 30m;<br />
expires 24h;<br />
expires 1d;<br />
expires max;<br />
expires off;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
</tr>
</tbody>
</table>
<p><br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;动态页面请求处理<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Nginx本身并不支持现在流行的 JSP、ASP、PHP、PERL
等动态页面，但是它可以通过反向代理将请求发送到后端的服务器，例如Tomcat、Apache、IIS
等来完成动态页面的请求处理。前面的配置示例中，我们首先定义了由 Nginx直接处理的一些静态文件请求后，其他所有的请求通过
proxy_pass 指令传送给后端的服务器（在上述例子中是 Tomcat）。最简单的 proxy_pass 用法如下：</p>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
<table class="t_table" cellspacing="0" border="0" align="center" width="98%">
<tbody>
<tr>
<td>location / {<br />
&nbsp; &nbsp; proxy_pass&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;http://localhost:8080;<br />
&nbsp; &nbsp; proxy_set_header&nbsp;&nbsp;X-Real-IP&nbsp;&nbsp;$remote_addr;<br />
}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
</tr>
</tbody>
</table>
<p><br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;这里我们没有使用到集群，而是将请求直接送到运行在 8080 端口的 Tomcat 服务上来完成类似 JSP 和 Servlet 的请求处理。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;当页面的访问量非常大的时候，往往需要多个应用服务器来共同承担动态页面的执行操作，这时我们就需要使用集群的架构。
Nginx 通过 upstream 指令来定义一个服务器的集群，最前面那个完整的例子中我们定义了一个名为 tomcats
的集群，这个集群中包括了三台服务器共 6 个 Tomcat 服务。而 proxy_pass 指令的写法变成了：</p>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
<table class="t_table" cellspacing="0" border="0" align="center" width="98%">
<tbody>
<tr>
<td>location / {<br />
&nbsp; &nbsp; proxy_pass&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;http://tomcats;<br />
&nbsp; &nbsp; proxy_set_header&nbsp;&nbsp;X-Real-IP&nbsp;&nbsp;$remote_addr;<br />
}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
</tr>
</tbody>
</table>
<p><br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;在 Nginx 的集群配置中，Nginx 使用最简单的平均分配规则给集群中的每个节点分配请求。一旦某个节点失效时，或者重新起效时，Nginx 都会非常及时的处理状态的变化，以保证不会影响到用户的访问。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;总结<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;尽管整个程序包只有五百多 K，但麻雀虽小、五脏俱全。
Nginx官方提供的各种功能模块应有尽有，结合这些模块可以完整各种各样的配置要求，例如：压缩、防盗链、集群、FastCGI、流媒体服务器、
Memcached 支持、URL 重写等等，更关键的是 Nginx 拥有 Apache 和其他
HTTP服务器无法比拟的高性能。您甚至可以在不改变原有网站的架构上，通过在前端引入 Nginx 来提升网站的访问速度。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;本文只是简单介绍了 Nginx 的安装以及常见的基本的配置和使用，更多关于 Nginx 的信息请阅读文章后面的参考资源。在这里要非常感谢我的朋友&mdash;&mdash;陈磊（<a href="mailto:chanix@msn.com">chanix@msn.com</a>
），他一直在做 Nginx 的中文 WIKI（<a href="http://wiki.codemongers.com/NginxChs" target="_blank">http://wiki.codemongers.com/NginxChs</a>
），同时也是他介绍给我这么好的一款软件。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;如果您的网站是运行在 Linux 下，如果您并没有使用一些非常复杂的而且确定 Nginx 无法完成的功能，那您应该试试 Nginx 。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
<br />
参考资料 <br />
<strong>学习</strong></p>
<ul>
<li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 查阅 <a href="http://www.nginx.net/" target="_blank">Nginx 英文站点</a>
。</li>
<li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 查阅 <a href="http://wiki.codemongers.com/NginxChs" target="_blank">Nginx 中文 WIKI</a>
。</li>
<li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 查阅 <a href="http://wiki.codemongers.com/Main" target="_blank">Nginx 英文 WIKI</a>
。</li>
<li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 另外一个轻量级 HTTP 服务器 <a href="http://www.lighttpd.net/" target="_blank">lighttpd</a>
。</li>
</ul>
<p><br />
<strong>获得产品和技术</strong></p>
<ul>
<li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 下载 <a href="http://sysoev.ru/nginx/nginx-0.6.31.tar.gz" target="_blank">最新版本的 Nginx</a>
。</li>
<li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 下载 <a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/" target="_blank">PCRE</a>
。</li>
</ul>
          <br/>
          <span style="color:red;">
            <a href="http://julyboxer.javaeye.com/blog/226167#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 09 Aug 2008 13:21:16 +0800</pubDate>
        <link>http://julyboxer.javaeye.com/blog/226167</link>
        <guid>http://julyboxer.javaeye.com/blog/226167</guid>
      </item>
      <item>
        <title>Craigslist 的数据库架构</title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/226157" style="color:red;">http://julyboxer.javaeye.com/blog/226157</a>&nbsp;
          发表时间: 2008年08月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://www.craigslist.com/">Craigslist</a>
 绝对是互联网的一个传奇公司。根据以前的一则报道：</p>
<blockquote>每月超过 1000 万人使用该站服务，月浏览量超过 30 亿次，(Craigslist每月新增的帖子近 10 亿条??)网站的网页数量在以每年近百倍的速度增长。Craigslist 至今却只有 18 名员工(现在可能会多一些了)。</blockquote>
<p><a href="http://www.oreillynet.com/pub/au/27">Tim O'reilly</a>
 采访了 Craigslist 的 Eric Scheide ，于是通过这篇 <a href="http://radar.oreilly.com/archives/2006/04/database_war_stories_5_craigsl.html">Database War Stories #5: craigslist</a>
 我们能了解一下 Craigslist 的数据库架构以及数据量信息。</p>
<p>数据库软件使用 MySQL 。为充分发挥 MySQL 的能力，数据库都使用 64 位 Linux 服务器, 14 块 本地磁盘(72*14=1T ?), 16G 内存。</p>
<p>不同的服务使用不同方式的数据库集群。</p>
<h3>论坛</h3>
<p>
1 主(master) 1 从(slave)。Slave 大多用于备份. myIsam 表. 索引达到 17G。最大的表接近 4200 万行。
</p>
<h3>分类信息</h3>
<p>
1 主 12 从。 Slave 各有个的用途. 当前数据包括索引有 114 G , 最大表有 5600 万行(该表数据会定期归档)。 使用
myIsam。分类信息量有多大? &quot;Craigslist每月新增的帖子近 10 亿条&quot;，这句话似乎似乎有些夸张，Eric Scheide
说昨日就超过 330000 条数据，如果这样估计的话，每个月的新帖子信息大约在 1 亿多一些。
</p>
<h3>归档数据库</h3>
<p>
1 主 1 从. 放置所有超过 3 个月的帖子。与分类信息库结构相似但是更大， 数据有 238G， 最大表有 9600 万行。大量使用 Merge 表，便于管理。 
</p>
<h3>搜索数据库</h3>
<p>
4 个 集群用了 16 台服务器。活动的帖子根据 地区/种类划分，并使用 myIsam 全文索引，每个只包含一个子集数据。该索引方案目前还能撑住，未来几年恐怕就不成了。
</p>
<h3>Authdb</h3>
<p>
1 主 1 从，很小。
</p>
<p>目前 Craigslist 在 Alexa 上的排名是 30，上面的数据只是反映采访当时(April 28, 2006)的情况，毕竟，Craigslist 数据量还在每年 200% 的速度增长。</p>
<p>Craigslist 采用的数据解决方案从软硬件上来看还是低成本的。优秀的 MySQL 数据库管理员对于 Web 2.0 项目是一个关键因素。</p>
          <br/>
          <span style="color:red;">
            <a href="http://julyboxer.javaeye.com/blog/226157#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 09 Aug 2008 12:13:31 +0800</pubDate>
        <link>http://julyboxer.javaeye.com/blog/226157</link>
        <guid>http://julyboxer.javaeye.com/blog/226157</guid>
      </item>
      <item>
        <title>Yupoo! 的网站技术架构</title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/226155" style="color:red;">http://julyboxer.javaeye.com/blog/226155</a>&nbsp;
          发表时间: 2008年08月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h1 class="asset-name"><a href="http://www.dbanotes.net/arch/yupoo_arch.html">Yupoo! 的网站技术架构</a>
</h1>
<p><a href="http://www.dbanotes.net/arch/yupoo_arch.html" target="_blank">http://www.dbanotes.net/arch/yupoo_arch.html</a></p>
<div class="asset-content">
<div class="asset-body">
<p>又有机会爆料国内 Web 2.0 网站的架构了。这次是 Yupoo! 。非正式的采访了一下 <a href="http://www.yupoo.com/">Yupoo!</a>
(又拍网) 的创建人之一的 <a href="http://ahua.yupoo.com/">阿华</a>
（沈志华）同学，了解了一些小道消息。</p>
<p>作为国内最大的图片服务提供商之一，Yupoo! 的 Alexa 排名大约在 5300 左右。同时收集到的一些数据如下：</p>
<p>带宽：4000M/S (<a href="http://blog.yupoo.com/?p=231">参考</a>
)<br />
服务器数量：60 台左右<br />
Web服务器：Lighttpd, Apache, nginx<br />
应用服务器：Tomcat<br />
其他：Python, Java, MogileFS 、ImageMagick 等</p>
<p>首先看一下网站的架构图：</p>
<span class="mt-enclosure mt-enclosure-image"><a href="http://www.yupoo.com/photos/view?id=ff80808117800c890117b5c8119728c2"><img class="mt-image-center" src="http://www.dbanotes.net/Images/Yupoo_Arch-thumb-400x493.jpg" height="493" alt="Yupoo_Arch.jpg" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" />
</a>
</span>
<p>该架构图给出了很好的概览(点击可以查看在 Yupoo！ 上的<a href="http://www.yupoo.com/photos/view?id=ff80808117800c890117b5c8119728c2">大图和原图</a>
，请注意该图版权信息)。</p>
<h4>关于 Squid 与 Tomcat</h4>
<p>Squid 与 Tomcat 似乎在 Web 2.0 站点的架构中较少看到。我首先是对 Squid
有点疑问，对此阿华的解释是&quot;目前暂时还没找到效率比 Squid 高的缓存系统，原来命中率的确很差，后来在 Squid 前又装了层
Lighttpd, 基于 url 做 hash, 同一个图片始终会到同一台 squid 去，所以命中率彻底提高了&quot;</p>
<p>对于应用服务器层的 Tomcat，现在 Yupoo! 技术人员也在逐渐用其他轻量级的东西替代，而 YPWS/YPFS 现在已经用 Python 进行开发了。</p>
<p>名次解释：</p>
<ul>
<li>YPWS--Yupoo Web Server YPWS 是用 Python开发的一个小型 Web 服务器，提供基本的 Web 服务外，可以增加针对用户、图片、外链网站显示的逻辑判断，可以安装于任何有空闲资源的服务器中，遇到性能瓶颈时方便横向扩展。</li>
<li>YPFS--Yupoo File System 与 YPWS 类似，YPFS 也是基于这个 Web 服务器上开发的图片上传服务器。</li>
</ul>
<br />
【Updated: 有网友留言质疑 Python 的效率，Yupoo 老大刘平阳在 del.icio.us 上写到 &quot;YPWS用Python自己写的，每台机器每秒可以处理294个请求, 现在压力几乎都在10％以下&quot;】
<h4>图片处理层</h4>
<p>接下来的 Image Process Server 负责处理用户上传的图片。使用的软件包也是
ImageMagick，在上次存储升级的同时，对于锐化的比率也调整过了(我个人感觉，效果的确好了很多)。&rdquo;Magickd&ldquo;
是图像处理的一个远程接口服务，可以安装在任何有空闲 CPU资源的机器上，类似 Memcached的服务方式。</p>
<p>我们知道 Flickr 的缩略图功能原来是用 ImageMagick 软件包的，后来被雅虎收购后出于版权原因而<a href="http://www.flickr.com/help/forum/8280/#reply41220">不用</a>
了（?）；EXIF 与 IPTC Flicke 是用 <acronym title="Practical Extraction and Report Language">Perl</acronym>
 抽取的，我是非常建议 Yupoo! 针对 EXIF 做些文章，这也是潜在产生受益的一个重点。</p>
<h4>图片存储层</h4>
<p>原来 Yupoo! 的存储采用了磁盘阵列柜，基于 <acronym title="Network File System">NFS</acronym>
方式的，随着数据量的增大，&rdquo;Yupoo! 开发部从07年6月份就开始着手研究一套大容量的、能满足 Yupoo!
今后发展需要的、安全可靠的存储系统&ldquo;，看来 Yupoo! 系统比较有信心，也是满怀期待的，毕竟这要支撑以 TB
计算的海量图片的存储和管理。我们知道，一张图片除了原图外，还有不同尺寸的，这些图片统一存储在 MogileFS 中。</p>
<p>对于其他部分，常见的 Web 2.0 网站必须软件都能看到，如 MySQL、Memcached 、Lighttpd 等。Yupoo!
一方面采用不少相对比较成熟的开源软件，一方面也在自行开发定制适合自己的架构组件。这也是一个 Web 2.0 公司所必需要走的一个途径。</p>
<p>非常感谢一下 Yupoo! 阿华对于技术信息的分享，技术是共通的。下一个能爆料是哪家? </p>
<p>--EOF--</p>
</div>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://julyboxer.javaeye.com/blog/226155#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 09 Aug 2008 12:07:18 +0800</pubDate>
        <link>http://julyboxer.javaeye.com/blog/226155</link>
        <guid>http://julyboxer.javaeye.com/blog/226155</guid>
      </item>
      <item>
        <title>博奕算法</title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/221674" style="color:red;">http://julyboxer.javaeye.com/blog/221674</a>&nbsp;
          发表时间: 2008年07月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://yucs.org/~gnivasch/cgames/spraguegrundy/index.html" target="_blank">http://yucs.org/~gnivasch/cgames/spraguegrundy/index.html</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://julyboxer.javaeye.com/blog/221674#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 Jul 2008 19:14:23 +0800</pubDate>
        <link>http://julyboxer.javaeye.com/blog/221674</link>
        <guid>http://julyboxer.javaeye.com/blog/221674</guid>
      </item>
      <item>
        <title>可伸缩性原则</title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/220896" style="color:red;">http://julyboxer.javaeye.com/blog/220896</a>&nbsp;
          发表时间: 2008年07月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://www.infoq.com/cn/articles/scalability-principles" target="_blank">http://www.infoq.com/cn/articles/scalability-principles</a></p>
<p>从最简单的水平来看，<a href="http://www.infoq.com/news/2007/10/whatisscalability">可伸缩性就是做更多的事情</a>
。更多的事情可以是响应更多的用户请求，执行更多的工作，或处理更多的数据。设计软件这件事本身是复杂的，而让软件做更多的工作也有其特有的问题。这篇文章针对构建可伸缩软件系统提出了一些原则和方针。</p>
<div class="vendor-content-box-float">
<h3>相关<span class="vendor">厂商</span>
内容</h3>
<p class="entrypdf">
			<a href="http://www.infoq.com/cn/vendorcontent/show.action?vcr=303">
				SOY Framework：Java富客户端快速开发框架
			</a>
		</p>
<p class="entrypdf">
			<a href="http://www.infoq.com/cn/vendorcontent/show.action?vcr=359">
				QClub：OpenSocial规范、实现现状与展望（8.3 北京）  
			</a>
		</p>
</div>
<h3>1. 减少处理时间</h3>
<p>增加应用所做工作数量的一个方法就是减少完成单项工作所花费的时间。举例来说，减少处理一个用户请求所需的时间意味着你能在同样长的时间内处理更多的用户请求。这里有一些本原则适用的例子和一些可能的实现策略。</p>
<ul>
<li><strong>并置（Collocation）：</strong>
通过并置数据和代码，减少因获取所需数据而产生的必要开销。</li>
<li><strong>缓存：</strong>
如果数据和代码不能并置，就缓存数据，以减少反复取数据的开销。 </li>
<li><strong>池化：</strong>
通过池化昂贵的资源，减少与其使用相关的开销。 </li>
<li><strong>并行化：</strong>
通过分解问题、并行化独立的步骤，减少完成一个工作单元所需的时间。 </li>
<li><strong>分区处理：</strong>
通过分割处理代码、并置相关的分区，尽可能将相关的处理过程集中在一起。 </li>
<li><strong>远程处理：</strong>
减少访问远程服务所花费的时间，比如可以通过更粗粒度地划分接口。远程还是本地是明确的设计决策，不能随意来回更动，这一点应当牢记。还要考虑分布式计算的第一准则&mdash;&mdash;不要分布你的对象。</li>
</ul>
<p>软件开发人员总爱在不需要的地方引入抽象和层。是的，这些概念对软件组件之间的解耦来说是很好的工具，但它们可能会增加复杂性、影响性能，尤其是在
每层的数据表示之间都需要转换的情况下。因此，减少处理时间还要注意保证抽象不要过于抽象化，并且没有过多的分层。另外，对于我们视为理所当然的运行时服
务，有必要理解其成本，因为除非它们提供了特定的服务水平协议，否则很有可能最终会成为应用中的瓶颈。 </p>
<h3>2. 分区</h3>
<p>减少单个工作单元的处理时间能达到不错的效果，但当你达到单进程方案的极限，最终还是需要对系统作水平伸缩。在典型的Web应用中，水平伸缩可能很
简单，只要加入更多的Web服务器来处理用户请求，再给它们加上负载均衡就行了。但是，你可能会发现总体架构的某些部分会成为资源争用的焦点，因为一切东
西都会在同一时间变得忙碌起来。一个很好的例子就是所有Web服务器后端的单一数据库服务器。当这个单一的数据库服务器变成瓶颈时，你必须改变方法，其中
一种方式就是采用分区策略。简而言之，这涉及到将架构的单个部分分解成更小、更容易管理的部分。将单个的元素分割成更小的部分能实现水平伸缩，这恰恰也是
eBay这样的大型网站采用、以此来确保它们的架构可伸缩的技术。分区是一个很好的解决办法，尽管你可能会发现<a href="http://www.infoq.com/articles/pritchett-latency">牺牲了一致性</a>
。</p>
<p>至于如何分割你的系统，那要看情形而定。真正无状态的组件能简单地作水平伸缩，将工作负载分散到所有实例上，让组件的所有实例都能有效地运行。另一
方面，如果需要维护某状态，你需要找到一种工作量分割策略能允许有状态组件的多重实例，让每个实例负责工作和/或数据的一个独特的子集。</p>
<h3>3. 可伸缩性在于并发</h3>
<p>可伸缩性天生就和并发联系在一起；毕竟，它就是要在同样的时间内做更多的工作。像EJB早期版本这样的技术试图提供一种简化的编程模型，鼓励我们编
写单线程的组件。遗憾的是，组件往往要依赖于其它组件，还是导致了并发问题。如果没有考虑并发，系统中的数据会很容易被损坏。另一方面，围绕并发做了太多
的保护会导致系统实质上变成串行的，限制了伸缩的能力。并发编程不是很难做到，在构建可伸缩系统的时候，有一些简单的原则会有所帮助。</p>
<ul>
<li>如果你确实需要持有锁（比如本地对象、数据库对象等），试着尽可能短地持有它们。</li>
<li>设法减少对共享资源的争用，并尽可能是争用避开关键处理路径（比如通过异步调度工作）。</li>
<li>任何针对并发的设计都需要预先完成，以便能被充分地理解哪些资源可以被安全共享、哪里可能会是潜在的可伸缩性瓶颈。</li>
</ul>
<h3>4. 必须知道需求</h3>
<p>为了构建一个成功的软件系统，你需要知道你的目标是什么、你针对什么去做。尽管功能性需求往往是明确的，但常常会<a href="http://www.codingthearchitecture.com/2007/09/06/engaging_without_non_functional_requirements.html">缺少</a>
非功能性需求（或系统质量需求）。如果你真是需要构建一套高可伸缩的软件，那你首先需要调查清楚关键组件/工作流的以下特质：</p>
<ul>
<li>目标平均性能和峰值性能（即响应时间、延迟等）。</li>
<li>目标平均负荷和峰值负荷（即并发用户、信息量等）。</li>
<li>性能和可伸缩性可接受的极限。</li>
</ul>
<p>性能也许不是最紧要的方面，但你必须尽早知道这个信息，因为处理可伸缩性的方法会由性能需求决定。</p>
<h3>5. 持续测试</h3>
<p>理解了需求就可以开始设计和构建解决方案。我们提出的设计、编写的代码实际上都是静态的，所以你在执行之前不能完全断定它会怎样运转。此外，所有关
于性能和可伸缩性的决策应该由证据支持的原因也在于此，而且应当从项目一开始就收集和审核这些证据，此后也要一直继续。换句话说，就是设立贯穿系统的可度
量目标，证实并度量实际的性能，并在项目的各个阶段考虑性能。</p>
<p>最常犯的错误之一是，我们对系统性能和可伸缩性的见解会被我们自己的经验或道听途说所混淆。你可能要审核对工程做出的其它决策，这样做的原因之一是
要满足系统的非功能性特性。比如说，非功能性需求可能会影响你选择不使用标准，改用非主流/流行的一些东西。非功能性需求可能会打破僵化的教条，证据胜过
教条。</p>
<h3>6. 架构先行</h3>
<p>或许对构建可伸缩的系统来说最重要的原则是，如果你需要使系统具备这样的性质，就必须预先设计出这样的性质。很多人（包括我自己）陷入的陷阱，就是
以为可以构建一个应用，它会自动地垂直伸缩（scale up）或水平伸缩（scale
out），尤其是在J2EE刚出现的时候。设计为可水平伸缩的应用几乎总能垂直伸缩，但是设计为垂直伸缩的应用几乎不可能水平伸缩。大多数应用能通过在更
加强大的硬件上运行来垂直伸缩，但水平伸缩却是一个更为复杂的问题。比如说，你怎么确保数据在应用实例之间保持一致性？你如何使你的单例和同步代码块跨线
程工作？</p>
<p>当然，预先思考这件事情不一定等同于做一个瀑布式的、<a href="http://en.wikipedia.org/wiki/Big_Design_Up_Front">预先的大设计</a>
。迭代和敏捷过程都是助力，它们能提供一个框架帮助我们可以做出<a href="http://www.codingthearchitecture.com/2008/01/18/how_much_software_design_detail_in_your_architecture_document.html">刚好够用的</a>
设计来解决问题。要务实。哦，不管我们自认为是多么擅长于设计可伸缩的应用，不要相信自己、尽早地编写/测试代码才是最好的举动。</p>
<h3>7. 着眼于全局</h3>
<p>最后，记着要着眼于全局&mdash;&mdash;看到树木之前先看看森林。对我们来说，在细粒度代码级别调整组件确实很容易，但最终需要优化的却是作为一个整体的系统。
关注每一个环节的性能和可伸缩性，必要时牺牲局部的优化。如果你需要使用性能分析工具确定瓶颈，不妨去做，但在对全局的性能有所认识之前先不要急于动手。
由于性能与整个系统所有等待时间的集合成反比，任何等待时间增加得比负载还快的操作都会成为问题。尽管说了这么多，但我还想指出，如果你发现满足性能和可
伸缩性目标很困难，那就有必要怀疑一下是否选择了正确的架构。还是那句话，着眼于全局，确保有人在承担<a href="http://www.codingthearchitecture.com/2008/02/11/the_key_difference_between_developer_and_architect_roles.html">架构师的责任</a>
。</p>
<h3>总结</h3>
<p>这篇文章针对构建可伸缩应用提出了一些原则和方针，覆盖了软件开发过程中许多不同的方面。无论谁要构建可伸缩的系统，我能给他的最好建议就是你需要
明确地考虑并设计你的系统。可伸缩性不是魔术，它也不会无偿获得。最后一点，更快的硬件也许能救你于一时，但还是不要依赖它为妙！</p>
<h3>关于本文</h3>
<p>2005年年底，英国伦敦举办了针对架构师的非官方峰会，本文中的大多数原则就来源于其中一场可伸缩性讨论的一些笔记。该峰会由Alexis
Richardson、Floyd Marinescu、Rod Johnson、John Davies、Steve
Ross-Talbot组织。题为&ldquo;<a href="http://www.infoq.com/presentations/jp-rangaswami-open-source">JP Rangaswami谈企业中的开源与信息前景</a>
&rdquo;的视频也来源于此峰会。 </p>
<h3>关于作者</h3>
<p>Simon是一名注重实践的软件架构师，他在<a href="http://www.detica.com/">Detica</a>
'的全球金融
市场集团工作。Simon专心参与的项目有桌面客户端和Web应用，也有高度可伸缩的分布式系统和面向服务的体系架构（SOA）。他的专攻技术是
Java，作为一名注重实践的权威，他被要求建议并设计解决方案；定义、交付并保证所选择的架构适合于目的，能满足非功能性需求。Simon已经编写或与
他人合著过很多Java EE Web技术相关的书籍，在数次会议上发表过演讲，并创建了<a href="http://www.codingthearchitecture.com/">Coding the Architecture</a>
&mdash;&mdash;一个介绍关于软件架构实用和务实观点的网站。 </p>
          <br/>
          <span style="color:red;">
            <a href="http://julyboxer.javaeye.com/blog/220896#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Jul 2008 09:33:14 +0800</pubDate>
        <link>http://julyboxer.javaeye.com/blog/220896</link>
        <guid>http://julyboxer.javaeye.com/blog/220896</guid>
      </item>
      <item>
        <title>年内学习计划</title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/215558" style="color:red;">http://julyboxer.javaeye.com/blog/215558</a>&nbsp;
          发表时间: 2008年07月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>读书计划</p>
<p>1.代码大全(复习)</p>
<p>2.心理学与生活</p>
<p>3.社会心理学</p>
<p>4.算法导论</p>
<p>5.深入Oracle体系结构</p>
<p>6.Linux核心编程</p>
<p>7.经济学原理</p>
<p>8.深入java虚拟机</p>
<p>9.spring2.5源代码研究</p>
<p>&nbsp;</p>
<p>一年大概读一下这几本书。。记录一下。。以便提醒自己</p>
          <br/>
          <span style="color:red;">
            <a href="http://julyboxer.javaeye.com/blog/215558#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Jul 2008 20:49:22 +0800</pubDate>
        <link>http://julyboxer.javaeye.com/blog/215558</link>
        <guid>http://julyboxer.javaeye.com/blog/215558</guid>
      </item>
      <item>
        <title>weblogic 9 远程调试</title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/214013" style="color:red;">http://julyboxer.javaeye.com/blog/214013</a>&nbsp;
          发表时间: 2008年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在startWebLogic.cmd中加入</p>
<p>set JAVA_OPTIONS=%JAVA_OPTIONS% -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=<strong><span style="color: #ff0000;">7777</span>
</strong>
,server=y,suspend=n</p>
<dl class="standard"><dt><strong><samp>-Xdebug</samp>
</strong>
 
</dt>
<dd>激活调试。 
</dd>
<dt><strong><samp>-Xnoagent</samp>
</strong>
 
</dt>
<dd>Sun 典型的 VM，它既支持老的 <samp>sun.tools.debug</samp>
 接口，又支持 Java Platform Debugging Architecture（JPDA）；<samp>-Xdebug</samp>
 选项启用两者，但是在缺省情况下运行 <samp>sun.tools.debug</samp>
 代理程序。<samp>-Xnoagent</samp>
 选项会关闭此代理程序，以便使用 JPDA。 
</dd>
<dt><strong><samp>-Djava.compiler=NONE</samp>
</strong>
 
</dt>
<dd>禁用 JIT 编译器。调试典型的 VM 需要禁用其 JIT 编译器。 
</dd>
<dt><strong><samp>-Xrunjdwp</samp>
</strong>
 
</dt>
<dd>装载进程内（in-process）调试库，并且指定要进行的连接的类别。<samp>transport=dt_socket</samp>
 选项告知调试程序要使用哪一种传输机制。指定 <samp>dt_socket</samp>
 选项使调试程序能够监听传入客户机连接。其他的可能值是 <samp>dt_shmem</samp>
，当调试程序和应用程序服务器两者安装在相同的主机上时，就要应用这个值。 
</dd>
<dt><strong><samp>address=7777</samp>
</strong>
 
</dt>
<dd>您想要调试通信使用的 TCP 端口号。它应该与您在远程服务器配置中指定的端口号相同。 
</dd>
<dt><strong><samp>server=y</samp>
</strong>
 
</dt>
<dd>指示 JVM 正在调试模式下运行。 
</dd>
<dt><strong><samp>suspend=n</samp>
</strong>
 
</dt>
<dd>指示在建立调试程序连接之前服务器不保持等待。如果使用 <samp>suspend=y</samp>
 选项，则在执行开始时，应用程序服务器将暂停并且保持等待，直到调试程序连接到它为止。 </dd>
</dl>
          <br/>
          <span style="color:red;">
            <a href="http://julyboxer.javaeye.com/blog/214013#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Jul 2008 17:22:42 +0800</pubDate>
        <link>http://julyboxer.javaeye.com/blog/214013</link>
        <guid>http://julyboxer.javaeye.com/blog/214013</guid>
      </item>
      <item>
        <title>励志口号能否帮助人养成好习惯？ </title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/213244" style="color:red;">http://julyboxer.javaeye.com/blog/213244</a>&nbsp;
          发表时间: 2008年07月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>好习惯能够改变人的命运。这点大家都同意。
<br />
如何能够养成好习惯呢？这需要日积月累的心理暗示和习以为常。
<br />
<br />
励志口号能否帮助人养成好习惯？
<br />
答案是否定的。
<br />
<br />
励志口号只能够带来非常微小的心理暗示作用。
<br />
更多的情况下是适得其反。比如，那传说中的《羊皮卷》。
<br />
人们总有各种可能违背自己的励志口号或者誓言，如果总是不能遵守这种口号，最终会变得沮丧，带来挫折感。
<br />
本来不是因此带来的失败，也会怪到自己没有意志力，没有毅力方面。完全陷入一种唯心主义。
<br />
仿佛成功主要是由一个人的主观特质决定的，而忽略了对事物的主观努力方面。
<br />
其实口号这玩意儿，就是一种催眠曲，平时念叨念叨就可以了，千万不要当真。这不是红宝书火红年代了。
<br />
口号这东西都是用来哄人的，开始用来催眠暗示自己，最终会变得用来哄别人。
<br />
<br />
成功就是要对事不对人。把一件件关键的事情做好了，成功之路就铺好了。这不是机会主义，而是脚踏实地。
<br />
学会做人才会做事，这是在混入高层搞政治的时候，才需要多加考虑的事情。还是个小人物的时候，就考虑这些，就是有野心，不安心本职，越权。
<br />
<br />
实际上来说，好习惯的养成，基本上是一种正反馈。而不是一种负反馈。负反馈几乎不能养成好习惯。
<br />
<br />
负反馈的意思是，想要克服自己的（想象中的）弱点，然后努力去做，坚持不久发现没有效果（因为根本就是走错了路，不努力做事，而去改善自己想象中
的人性弱点，这不是缘木求鱼吗？），于是无法坚持，于是沮丧，于是挫折，于是认为自己活该，于是认为拥有成功特质很难，于是认为自己很失败，从起点（性
格，意志等方面）就开始失败。
<br />
<br />
正反馈的意思是，发挥自己的优点，获得效果，尝到甜头，于是自以为高明，于是开始把小聪明当作智慧，于是开始把自己当人物，碰到一群人还真吃这一套，还真就成了人物。林子大了，什么鸟都有。机会总是光顾自尊自爱的人。
<br />
<br />
人不是机器人，人的天性是人的优点。
<br />
人的好奇心，人的多变，人的穷则思变，人的不知足，人的自我欺骗，等等，都是人区别于机器的重要特点。
<br />
一定要抹杀这些特点，作为个人，追求什么长性，立长志，一百年不动摇，这不就是抹杀人的天性吗？
<br />
不就是&ldquo;存天理，灭人性&rdquo;吗？
</p>
          <br/>
          <span style="color:red;">
            <a href="http://julyboxer.javaeye.com/blog/213244#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Jul 2008 22:41:35 +0800</pubDate>
        <link>http://julyboxer.javaeye.com/blog/213244</link>
        <guid>http://julyboxer.javaeye.com/blog/213244</guid>
      </item>
      <item>
        <title>JVM调优总结</title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/213217" style="color:red;">http://julyboxer.javaeye.com/blog/213217</a>&nbsp;
          发表时间: 2008年07月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://pengjiaheng.spaces.live.com/blog/cns" target="_blank">http://pengjiaheng.spaces.live.com/blog/cns</a>!2DAA368B386E6AEA!770.entry</p>
          <br/>
          <span style="color:red;">
            <a href="http://julyboxer.javaeye.com/blog/213217#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Jul 2008 19:55:46 +0800</pubDate>
        <link>http://julyboxer.javaeye.com/blog/213217</link>
        <guid>http://julyboxer.javaeye.com/blog/213217</guid>
      </item>
      <item>
        <title> 六大信条</title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/212873" style="color:red;">http://julyboxer.javaeye.com/blog/212873</a>&nbsp;
          发表时间: 2008年07月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span class="font12">很多朋友只知道辛辛苦苦的赚钱，一旦钱到手了就不再珍惜，这是朋友的天性使然，是跟钱过不去的常见表现。究其原因，你会发现，&ldquo;懒&rdquo;才是罪魁祸首。 </span>
</p>
<p><span class="font12">　　有朋友懒得把工资卡里的活期储蓄转化为定期或其他高收益的投资，每年无端损失几百元甚至几千元；:忙整整一年才能赚几万元钱，却因为懒得花几天，甚至几个小时关心一下自己已经拥有的财富，从而让辛辛苦苦赚来的金钱从身边悄悄的溜走，是不是很可惜。</span>
</p>
<p><span class="font12">　　理财是很专业的事，是需要时间和心力，更需要智慧的，如果你能找到简单的理财方式，掌握以下驾驭&ldquo;钱&rdquo;途的六大法则，你就可以放心去懒了。 </span>
</p>
<p><span class="font12">　　第一招：乱世佳人法 </span>
</p>
<p><span class="font12">　　此法对指导单身女性理财很有用。</span>
</p>
<p><span class="font12">　　此法因电影《乱世佳人》中郝思嘉把家里的窗帘拉下来做了一条漂亮的绿裙子，然后去见白瑞德这个场景而得名。被专家评为女性成功投资的典范。</span>
</p>
<p><span class="font12">　　身边实例：两年前有位未婚白领问我，她有两万元结余，该投资什么。我明白她是想问我该投资什么股
票。但我给她的建议是：投资自己！嫁个有钱朋友。并介绍她去&ldquo;现代淑女魔鬼训练营&rdquo;训练了一年，费用正好两万。(几天前在外滩三号见到她时，她已被同来的
&ldquo;金龟婿&rdquo;称为上海滩最后一个淑女了不把钱投入到最值得投入的地方，是跟钱过不去的常见表现。</span>
</p>
<p><span class="font12">　　第二招：书中采金法 </span>
</p>
<p><span class="font12">　　此法对自称没有时间读书看书的朋友有奇效。</span>
</p>
<p><span class="font12">　　顾名思义，此法因书中自有黄金屋一说而得名。</span>
</p>
<p><span class="font12">　　身边实例：书中采金的例子实在太多，&ldquo;知识经济&rdquo;自不必说。我认识的一位成功人士对此感触颇深，深谙&ldquo;读书看书的财富哲学&rdquo;。认为读书看书是最容易长控和实现的，亦是成本最低生财手段之一。</span>
</p>
<p><span class="font12">　　读书看书是随时随地可以进行的。知识的积累能大大提高朋友的判断能力和行事效率，判断力可以为行动赢得时间，而&ldquo;时间就是金钱&rdquo;。 
</span>
<a href="http://elab.icxo.com/" target="_blank"><span style="color: #ffffff;">el</span>
</a>
</p>
<p>&nbsp;</p>
<p>第三招：规则生财法 </p>
<p>　　对规则改变的准确预期是真正的生财之道。</p>
<p>　　生财原理：规则的改变必然带来财富的重新分配，大到朝代更替，小到报纸上的一个头条新闻，均是规则改变的表现形式。只要有心，自然可以发现其中的发财机会。</p>
<p>　　成功概率：三年，在我们身边改变的大小规则何止300个，而成就百万富翁的规则改变只需要一个。假如成为百万富翁的概率是1/300，那你三年成为百万富翁的概率就是100％。</p>
<p>　　身边实例</p>
<p>　　90年代初企业融资规则的改变，沪深股市的出现成就了一大批百万富翁；</p>
<p>　　90年代末朋友类交流方式的重大改变，网络的出现成就了一大批百万富翁；</p>
<p>　　本世纪初由于福利分房规则的改变，房价暴涨成就了无数百万富翁；</p>
<p>　　2003年内地资金突破区域规则进入香港H股市场，造就了很多的百万富翁。</p>
<p>　　有朋友言必称西方、美国，世界创业实验室(<a href="http://elab.icxo.com/">http://elab.icxo.com</a>
)消息:其实是对国内一些&ldquo;规则&rdquo;改变方向的预期，因此而发财的朋友举不胜举。最典型的是温州朋友，研究认为温州朋友的成功在于它拥有遍布世界各地的温州帮，信息的灵通让他们对国内规则演变的理解最透彻。</p>
<p>　　这就是规则改变带来的价值，现在很多朋友都在说证券业不合理的地方太多，但越不合理的规则，改变的可能性越大。</p>
<p>　　中国作为发展中的国家，需要改变的规则何止千万。</p>
<p>　　数一数你身边还有多少不合理的规则，把她变成你的财富吧。</p>
<p>　　第四招：眼大生财法 </p>
<p>　　生财原理：证券投资者喜欢牛市，据说是因为牛角朝上的缘故。我考证的结果是缘自&ldquo;眼大生财&rdquo;，牛眼很大，而且能把看见的物体放大，这与见朋友就追的呆头鹅相反。眼大的结果给了朋友无穷的努力动力(象牛一样劳作的心态)，努力的结果自然是财富的积累。<br />
　　证券市场自然希望投资者用牛眼看市，把股价放大，把价值放大。</p>
<p>　　&ldquo;眼大&rdquo;是成就事业的保证，朋友做每一件事情之前，习惯性的先考虑利益有多大，利益大自然干劲高。有朋友把价值5万的事看成了50万，于是很重
视，很努力的去争取，最后成功了，赚了5万；有朋友把价值5万的事看成了1万，认为不值得很努力最后一分钱也没赚到。&mdash;&mdash;这其实是傻朋友傻福的一种解释，
亦是阳光心态的一种具体体现。</p>
<p>　　成语为证：两份汗水，一份收获(付出永远大于回报)</p>
<p>　　第五招：宏观生财法 </p>
<p>　　宏观一点，再宏观一点<br />
　　别以为这不是个朋友的事，只要你不和钱过不去，就与你个朋友有关。</p>
<p>　　非典的出现，不用脑朋友也想到了预防非典的物品价格将上涨；宏观一点，有朋友想到了物价将可能全面上涨；再宏观一点，有朋友想到了股市将在一年后下跌。非典事件至少蕴含了三次成为百万富翁的机会。</p>
<p>　　非典造成了我国千千万万家工厂(号称世界工厂)的停工，工厂的停工自然造成供应短缺(世界性的)，供不应求的结果就是物价上涨，库存减少；物价上涨，囤积中间体、原材料，很简单的发财方式(所谓奇货可居)。</p>
<p>　　物价上涨，通货紧缩转变成了通货膨胀；通货膨胀，意味着经济过热；经济过热，意味着政府要考虑宏观调控。宏观调控的结果是股市将失去上涨动力，抛出股票，见好就收就成了智者的生财之道。如果可以做空，那又是另一次生财机会了。</p>
<p>　　第六招：比较生财法 </p>
<p>　　&ldquo;房产&rdquo;是最没有可比性的商品。因为它是&ldquo;不动产&rdquo;。</p>
<p>　　可偏偏有朋友喜欢把房产价格拿来比较，这就给市场提供了大量的&ldquo;比较生财&rdquo;机会。</p>
<p>　　有朋友喜欢拿北京的房价和上海的房价比，有朋友喜欢拿上海的房价与香港乃至伦敦的房价比，有朋友喜欢拿杭州的房价与贵阳的房价比，亦有朋友喜欢拿城东的房价与城西的房价比，这和股市是何等的相像，机构一直在利用大众喜好&ldquo;比较&rdquo;而生财呢。</p>
          <br/>
          <span style="color:red;">
            <a href="http://julyboxer.javaeye.com/blog/212873#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Jul 2008 22:25:53 +0800</pubDate>
        <link>http://julyboxer.javaeye.com/blog/212873</link>
        <guid>http://julyboxer.javaeye.com/blog/212873</guid>
      </item>
      <item>
        <title>无题。。。。。。。</title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/212495" style="color:red;">http://julyboxer.javaeye.com/blog/212495</a>&nbsp;
          发表时间: 2008年07月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>一切都过去了。。。告诉自己还有父母的期待！！！</p>
          <br/>
          <span style="color:red;">
            <a href="http://julyboxer.javaeye.com/blog/212495#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 Jul 2008 21:48:20 +0800</pubDate>
        <link>http://julyboxer.javaeye.com/blog/212495</link>
        <guid>http://julyboxer.javaeye.com/blog/212495</guid>
      </item>
      <item>
        <title>webogic9.1 JMS部署</title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/210108" style="color:red;">http://julyboxer.javaeye.com/blog/210108</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://blog.csdn.net/yuanfen127/archive/2007/12/20/1956370.aspx" target="_blank">http://blog.csdn.net/yuanfen127/archive/2007/12/20/1956370.aspx</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://julyboxer.javaeye.com/blog/210108#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 12:13:40 +0800</pubDate>
        <link>http://julyboxer.javaeye.com/blog/210108</link>
        <guid>http://julyboxer.javaeye.com/blog/210108</guid>
      </item>
      <item>
        <title>积累。。。</title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/207360" style="color:red;">http://julyboxer.javaeye.com/blog/207360</a>&nbsp;
          发表时间: 2008年06月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>思念许多，不知从何说起：昨天晚上和朋友聊天谈起自己的人生之路，对自己将来的规划。<br />说实话来上海可能很多人觉得我很冲动，很浮躁。上海这个地方生活成本高。生活质量不好，相比厦门而言。厦门的5000可以过比上海这边10000还好的生活，而且生活清闲，安逸。</p>
<p>其实之所以跑到上海来的最根本的原因：现在还不是享受的时候，一切还都在积累。没有了现在的积累，以后的发展让人觉得迷茫。现在也没有资本去享受生活，现在的享受是透支未来的支票。一颗浮躁的心需要经过时间的历练，梅花的香也只有在寒冬季节才能够分外的香</p>
<p><br />自己的技术，经历，架构，沟通等各方面的能力还很差，都存在不同程序的欠缺。希望安心学习三年左右的时间。把技术提高到能够做架构师的水平，沟通方面的能力达到项目经理的水平。更多地经历一些社会事件，让自己的阅历更加丰富。从今天开始到两年之内不再去任何公司面试，这样只会使自己更加浮躁。</p>
<p>今天听到了一个小MM才24岁，工资有我的一倍了，一年左右的时间把客户资产给做到了一亿。<br />这并不会使我浮躁，相反使我觉得现在更是努力学习的时候，只有这样才能够赶超同龄人，实现自己的梦想。努力记下同龄中优秀的人物，作为自己的赶超目标。</p>
<p><br />谢谢关心，鼓励，支持我的人。我会努力的！！！</p>
          <br/>
          <span style="color:red;">
            <a href="http://julyboxer.javaeye.com/blog/207360#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 24 Jun 2008 10:41:56 +0800</pubDate>
        <link>http://julyboxer.javaeye.com/blog/207360</link>
        <guid>http://julyboxer.javaeye.com/blog/207360</guid>
      </item>
      <item>
        <title>关于创业(转)</title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/199682" style="color:red;">http://julyboxer.javaeye.com/blog/199682</a>&nbsp;
          发表时间: 2008年06月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>
    创业是充满诱惑的。如果成功，它可以使人最大限度地实现自身的价值，在短时间内彻底改变自己的命运！
<br />
  那么怎样才是合适的创业时机呢？
<br />
  创业其实是一件水到渠成的事情。当你有了一定的准备，就像水烧开一样，这时候揭锅就刚刚好。具体来说，要具备以下几个条件：
<br />
1. 你是否具备当领导的能力，你当领导是不是有人服气？
<br />
2. 你的手上有没有合适的、可能赚钱的项目？没有项目，只有满腔热血和激情，是不适合创业的。
<br />
3. 你有没有合适的、很能干的搭档？如果不知道自己的合作伙伴是谁，那你创业多半不会成功。
<br />
  这是创业要具备的最基本的条件。具有创业梦想的人不妨问问自己：我是否具备了以上三个条件？如果答案是&ldquo;是&rdquo;，那么，你的创业时机到了。
<br />
<br />
那么创业应该注意那些事项呢?下面是我个人的一些拙见.呵呵
<br />
1、社会生活中处处充满商机，若没有发现，是因为缺少一对火眼金睛。 
<br />
2、创业，机会很重要，但机会往往青睐有准备的人，如果没有准备，当机会突然降临时，是很难把握住的，因为把机会转变成财富，需要一定的能力，而这种能力不是短时间能学到的。 
<br />
3、做小生意，是解决生活问题；做大生意，则是要解决社会问题。 
<br />
4、创业，最需要的不是资金，也不是人才，而是一个好的思路；没有资金，可以筹集；没有人才，可以召集；而没有一个好的思路，就很难找来资金和人才，思路决定创业的出路。 
<br />
5、创业，设定目标很重要，没有目标，就缺少了奋斗的方向，这样就容易走弯路。 
<br />
6、选合作伙伴，是选择互补性！比如懂管理的，就找一个懂营销的做合作伙伴；有资金，就找一个有项目懂技术的人做合作伙伴。 
<br />
7、创业，有许多潜规则，这是书本上看不到的，因为潜规则本身就是说不清道不明的东西，是需要悟的，只有多次经历过了，才能悟到。 
<br />
8、在创业者眼里，没有什么不可能的事情，只有一些待解决的问题。 
<br />
9、失败对创业者来说是一笔财富，只有小的失败才能积累大的成功。 
<br />
10、创业，贵在坚持，对于看好的事情，一定不要轻易放弃，因为，失败与成功之间往往只有一步之遥。 
<br />
创业迈的是沉重的脚步，稍有点不小心，就会跌倒。有人跌倒一千次也能够坚持站起来，但是有人跌倒一次却永远都站不起来。这或许是人的不同本性吧。有人经不起风吹雨打，有人就经得起风吹雨打。
<br />
<br />
  好了,说了这么多你也听累了吧,如果你觉得自己能行就赶快行动吧? A ZA A ZA Fighting!</p>
          <br/>
          <span style="color:red;">
            <a href="http://julyboxer.javaeye.com/blog/199682#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Jun 2008 12:08:25 +0800</pubDate>
        <link>http://julyboxer.javaeye.com/blog/199682</link>
        <guid>http://julyboxer.javaeye.com/blog/199682</guid>
      </item>
      <item>
        <title>DB2,PostgreSQL &amp; MySQL体系结构概述和对比(转)</title>
        <author>julyboxer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://julyboxer.javaeye.com">julyboxer</a>&nbsp;
          链接：<a href="http://julyboxer.javaeye.com/blog/198274" style="color:red;">http://julyboxer.javaeye.com/blog/198274</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table cellspacing="0" border="1" width="100%" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="100%" colspan="4">
<p style="margin-bottom: 0.5cm;">体系结构概述和对比</p>
<p style="margin-bottom: 0.5cm;"><a href="http://blog.chinaunix.net/u/17076/showart.php?id=174108#fig1">http://blog.chinaunix.net/u/17076/showart.php?id=174108#fig1</a>
</p>
<p style="margin-bottom: 0.5cm;">在 <span style="font-family: Times New Roman,serif;">DB2</span>
、<span style="font-family: Times New Roman,serif;"><a href="javascript:;" onclick="javascript:tagshow(event, 'MySQL');" target="_self"><span style="text-decoration: underline;"><strong>MySQL</strong>
</span>
</a>
 </span>
和 <span style="font-family: Times New Roman,serif;">PostgreSQL </span>
之间有许多差异。我们先看看这三种<a href="javascript:;" onclick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" target="_self"><span style="text-decoration: underline;"><strong>数据库</strong>
</span>
</a>
服务器在基本体系结构方面的一些差异和相似之处。</p>
<ul>
<li>
<p><strong>体系结构模型</strong>
 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">MySQL </span>
数据库服务器使用一种基于专用服务器线程的体系结构。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">PostgreSQL </span>
和 <span style="font-family: Times New Roman,serif;">DB2 </span>
使用一种专用服务器进程模型体系结构。 </p>
</li>
<li>
<p><strong>存储引擎</strong>
 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">MySQL </span>
数据库使用可插入的存储引擎体系结构。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">PostgreSQL </span>
和 <span style="font-family: Times New Roman,serif;">DB2 </span>
使用专用的存储引擎。 </p>
</li>
<li>
<p><strong>表空间模型</strong>
 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">MySQL </span>
对于 <span style="font-family: Times New Roman,serif;">InnoDB </span>
和 <span style="font-family: Times New Roman,serif;">NDB </span>
存储引擎使用表空间。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">PostgreSQL </span>
表空间可以跨越多个数据库。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">DB2 </span>
表空间特定于一个数据库。 </p>
</li>
<li>
<p><strong>模式支持</strong>
 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">PostgreSQL </span>
和 <span style="font-family: Times New Roman,serif;">DB2 </span>
具有真正的模式支持。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">MySQL </span>
不具有真正的模式支持。<span style="font-family: Times New Roman,serif;">MySQL </span>
中的模式可以被看作 <span style="font-family: Times New Roman,serif;">MySQL </span>
数据库。 </p>
</li>
<li>
<p><strong>数据库<a href="javascript:;" onclick="javascript:tagshow(event, '%B6%D4%CF%F3');" target="_self"><span style="text-decoration: underline;"><strong>对象</strong>
</span>
</a>
名是否是大小写敏感的</strong>
 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;"><a href="javascript:;" onclick="javascript:tagshow(event, 'Linux');" target="_self"><span style="text-decoration: underline;"><strong>Linux</strong>
</span>
</a>
 </span>
上的 <span style="font-family: Times New Roman,serif;">MySQL </span>
和 <span style="font-family: Times New Roman,serif;">PostgreSQL </span>
使用大小写敏感的数据库名、表名和列名。 </p>
</li>
<li>
<p>所有平台上的 <span style="font-family: Times New Roman,serif;">DB2 </span>
都使用大小写不敏感的名称。但是，<span style="font-family: Times New Roman,serif;">DB2 </span>
只按照大写存储名称。 </p>
</li>
<li>
<p><strong>数组列</strong>
 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">MySQL </span>
和 <span style="font-family: Times New Roman,serif;">DB2 </span>
不支持数组列。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">PostgreSQL </span>
支持数组列。 </p>
</li>
<li>
<p><strong>身份验证</strong>
 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">DB2 </span>
使用各种外部安全机制来执行身份验证，比如操作系统、<span style="font-family: Times New Roman,serif;">PAM</span>
、<span style="font-family: Times New Roman,serif;">Kerberos</span>
、<span style="font-family: Times New Roman,serif;">Active Directory</span>
、<span style="font-family: Times New Roman,serif;">LDAP </span>
等等。它还允许插入第三方安全模块。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">PostgreSQL </span>
按照许多不同方式之一执行身份验证。它可以使用数据库用户<span style="font-family: Times New Roman,serif;">/</span>
角色、操作系统、<span style="font-family: Times New Roman,serif;">PAM</span>
、<span style="font-family: Times New Roman,serif;">Kerberos </span>
等等，这取决于主机配置文件（<span style="font-family: Times New Roman,serif;">pg_hba.conf</span>
）中的设置。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">MySQL </span>
在数据库级实现身份验证并对密码进行加密。 </p>
</li>
<li>
<p><strong>实例体系结构</strong>
 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">DB2 </span>
实例管理不同的数据库，在同一台机器上可以有许多 <span style="font-family: Times New Roman,serif;">DB2 </span>
实例。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">PostgreSQL </span>
的实例概念与数据库集群相似。 </p>
</li>
<li>
<p style="margin-bottom: 0.5cm;"><span style="font-family: Times New Roman,serif;">MySQL </span>
实例与 <span style="font-family: Times New Roman,serif;">DB2 </span>
数据库相似。 </p>
</li>
</ul>
<p style="margin-bottom: 0.5cm;"><span style="font-family: Times New Roman,serif;">MySQL </span>
和 <span style="font-family: Times New Roman,serif;">PostgreSQL </span>
数据库可以几乎每周都进行特性修改，但是 <span style="font-family: Times New Roman,serif;">DB2 </span>
中的特性实现和修改要经过非常仔细的计划，这是因为有众多的业务依赖于使用 <span style="font-family: Times New Roman,serif;">DB2 </span>
产品。请注意，在本文中我们使用 <span style="font-family: Times New Roman,serif;">MySQL 5.1</span>
、<span style="font-family: Times New Roman,serif;">PostgreSQL 8.0.3 </span>
和 <span style="font-family: Times New Roman,serif;">DB2 V8.2 </span>
进行比较，所以在阅读本文时请考虑到这一点。 </p>
<p style="margin-bottom: 0.5cm;"><a href="http://blog.chinaunix.net/u/17076/showart.php?id=174108#fig1">图 <span style="font-family: Times New Roman,serif;">1</span>
</a>
、<a href="http://blog.chinaunix.net/u/17076/showart.php?id=174108#fig2">图 <span style="font-family: Times New Roman,serif;">2</span>
</a>
<span style="font-family: Times New Roman,serif;"> </span>
和 <a href="http://blog.chinaunix.net/u/17076/showart.php?id=174108#fig3">图 <span style="font-family: Times New Roman,serif;">3</span>
</a>
<span style="font-family: Times New Roman,serif;"> </span>
是 <span style="font-family: Times New Roman,serif;">MySQL</span>
、<span style="font-family: Times New Roman,serif;">PostgreSQL </span>
和 <span style="font-family: Times New Roman,serif;">DB2 </span>
的体系结构图。我们在阅读一些文档之后竭尽我们的能力绘制出 <span style="font-family: Times New Roman,serif;">MySQL </span>
和 <span style="font-family: Times New Roman,serif;">PostgreSQL </span>
的体系结构图。如果您发现不符合实际情况的地方，请告诉我们，我们会进行纠正。 </p>
<p style="margin-bottom: 0.5cm;"><a name="N10199"></a>
<span style="font-family: Times New Roman,serif;">MySQL</span>
</p>
<p style="margin-bottom: 0.5cm;"><span style="font-family: Times New Roman,serif;">MySQL </span>
使用一种基于线程的体系结构，而 <span style="font-family: Times New Roman,serif;">PostgreSQL </span>
和 <span style="font-family: Times New Roman,serif;">DB2 </span>
采用基于进程的体系结构。正如在 <a href="http://blog.chinaunix.net/u/17076/showart.php?id=174108#fig1">图 <span style="font-family: Times New Roman,serif;">1</span>
</a>
 中看到的，一个 <span style="font-family: Times New Roman,serif;">MySQL </span>
实例可以管理许多数据库。一个实例中的所有 <span style="font-family: Times New Roman,serif;">MySQL </span>
数据库共享一个公用的系统编目，<span style="font-family: Times New Roman,serif;">INFORMATION_SCHEMA</span>
。</p>
<p style="margin-bottom: 0.5cm;"><span style="font-family: Times New Roman,serif;">DB2 </span>
中的数据库是一个单独的实体，有自己的系统编目、表空间、缓冲池等等。<span style="font-family: Times New Roman,serif;">DB2 </span>
实例管理不同的数据库，但是数据库并不共享表空间、<a href="javascript:;" onclick="javascript:tagshow(event, '%C8%D5%D6%BE');" target="_self"><span style="text-decoration: underline;"><strong>日志</strong>
</span>
</a>
、系统编目或临时表空间。</p>
<p style="margin-bottom: 0.5cm;">具有许多数据库的一个 <span style="font-family: Times New Roman,serif;">MySQL </span>
实例可以看作 <span style="font-family: Times New Roman,serif;">DB2 </span>
中的一个数据库，而每个 <span style="font-family: Times New Roman,serif;">MySQL </span>
数据库相当于 <span style="font-family: Times New Roman,serif;">DB2 </span>
中的一个模式。如果服务器上运行几个 <span style="font-family: Times New Roman,serif;">MySQL </span>
实例，每个实例管理几个数据库，那么可以采用以下迁移方式之一： </p>
<ul>
<li>
<p>将每个 <span style="font-family: Times New Roman,serif;">MySQL </span>
实例迁移为同一 <span style="font-family: Times New Roman,serif;">DB2 </span>
实例下的一个 <span style="font-family: Times New Roman,serif;">DB2 </span>
数据库。 </p>
</li>
<li>
<p style="margin-bottom: 0.5cm;">将每个 <span style="font-family: Times New Roman,serif;">MySQL </span>
实例迁移为只包含一个 <span style="font-family: Times New Roman,serif;">DB2 </span>
数据库的 <span style="font-family: Times New Roman,serif;">DB2 </span>
实例，并为每个 <span style="font-family: Times New Roman,serif;">MySQL </span>
数据库分配不同的模式。 </p>
</li>
</ul>
<p style="margin-bottom: 0.5cm;"><strong>注意：</strong>
 当我们提到基于进程的体系结构时，指的是 <span style="font-family: Times New Roman,serif;">UNIX&reg; </span>
平台，因为 <span style="font-family: Times New Roman,serif;"><a href="javascript:;" onclick="javascript:tagshow(event, 'Windows');" target="_self"><span style="text-decoration: underline;"><strong>Windows</strong>
</span>
</a>
 </span>
上的模型是基于线程的体系结构。<span style="font-family: Times New Roman,serif;">DB2 </span>
和 <span style="font-family: Times New Roman,serif;">PostgreSQL </span>
都是这样的。 </p>
<p style="margin-bottom: 0.5cm;">在一个 <span style="font-family: Times New Roman,serif;">DB2 </span>
连接的范围内只能访问一个数据库资源，而 <span style="font-family: Times New Roman,serif;">MySQL </span>
允许在同一个连接的范围内访问多个数据库资源。 </p>
<p style="margin-bottom: 0.5cm;"><span style="font-family: Times New Roman,serif;">MySQL </span>
最有意思的特性之一是可插入的存储引擎。可以选择 <span style="font-family: Times New Roman,serif;">MyISAM</span>
、<span style="font-family: Times New Roman,serif;">InnoDB</span>
、<span style="font-family: Times New Roman,serif;">Archive</span>
、<span style="font-family: Times New Roman,serif;">Federated</span>
、<span style="font-family: Times New Roman,serif;">Memory</span>
、<span style="font-family: Times New Roman,serif;">Merge</span>
、<span style="font-family: Times New Roman,serif;">Cluster</span>
、<span style="font-family: Times New Roman,serif;">NDB </span>
或 <span style="font-family: Times New Roman,serif;">Custom </span>
存储引擎。每个存储引擎具有不同的性质，可以根据自己的特定需求选择某一存储引擎。对于比较，我们发现 <span style="font-family: Times New Roman,serif;">InnoDB </span>
最接近于关系数据库。 </p>
<p style="margin-bottom: 0.5cm;"><a name="fig1"></a>
<span style="font-family: Times New Roman,serif;"><br />
</span>
<strong>图 </strong>
<span style="font-family: Times New Roman,serif;"><strong>1. MySQL </strong>
</span>
<strong>体系结构和进程概况</strong>
<span style="font-family: Times New Roman,serif;"><br />
</span>
<img title="点击图片可在新窗口打开" src="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0606khatri/MySQLArchitecture.gif" alt="" style="cursor: pointer;" />
 </p>
<p style="margin-bottom: 0.5cm;"><span style="font-family: Times New Roman,serif;">MySQL </span>
服务器进程（<span style="font-family: Times New Roman,serif;">mysqld</span>
）可以创建许多线程：</p>
<ul>
<li>
<p>一个全局线程（每个服务器进程有一个）负责创建和管理每个用户连接线程。 </p>
</li>
<li>
<p>为处理每个新的用户连接创建一个线程。 </p>
</li>
<li>
<p>每个连接线程还执行身份验证和查询。 </p>
</li>
<li>
<p>在 <span style="font-family: Times New Roman,serif;">Windows </span>
上，有一个命名管道处理器线程，它针对命名管道连接请求执行与连接线程相同的<a href="javascript:;" onclick="javascript:tagshow(event, '%B9%A4%D7%F7');" target="_self"><span style="text-decoration: underline;"><strong>工作</strong>
</span>
</a>
。 </p>
</li>
<li>
<p>一个信号线程处理警报并迫使长时间空闲的连接超时。 </p>
</li>
<li>
<p>分配一个线程来处理关闭事件。 </p>
</li>
<li>
<p>有一些线程在复制期间处理主服务器和从服务器的同步。 </p>
</li>
<li>
<p style="margin-bottom: 0.5cm;">使用线程处理表刷新、维护任务等等。 </p>
</li>
</ul>
<p style="margin-bottom: 0.5cm;"><span style="font-family: Times New Roman,serif;">MySQL </span>
使用数据缓存、记录缓存、键缓存、表缓存、主机名缓存和特权缓存来缓存和检索服务器进程中所有线程所使用的不同类型的数据。 </p>
<p style="margin-bottom: 0.5cm;">另外，<span style="font-family: Times New Roman,serif;">MySQL </span>
主进程（<span style="font-family: Times New Roman,serif;">mysqld</span>
）具有用来处理数据库管理<a href="javascript:;" onclick="javascript:tagshow(event, '%BB%EE%B6%AF');" target="_self"><span style="text-decoration: underline;"><strong>活动</strong>
</span>
</a>
的线程，比如备份、恢复、并发控制等等。 </p>
<p style="margin-bottom: 0.5cm;"><a name="N101F7"></a>
<span style="font-family: Times New Roman,serif;">PostgreSQL</span>
</p>
<p style="margin-bottom: 0.5cm;"><span style="font-family: Times New Roman,serif;">PostgreSQL </span>
实例（见 <a href="http://blog.chinaunix.net/u/17076/showart.php?id=174108#fig2">图 <span style="font-family: Times New Roman,serif;">2</span>
</a>
）可以管理一个数据库集群。每个数据库有自己的系统编目，<span style="font-family: Times New Roman,serif;"><em>INFORMATION_SCHEMA</em>
 </span>
和 <span style="font-family: Times New Roman,serif;"><em>pg_catalog</em>
</span>
。所有数据库共享 <span style="font-family: Times New Roman,serif;"><code><span style="font-family: NSimsun;">pg_databases</span>
</code>
 </span>
作为公用系统表。每个数据库是一个单独的实体，数据库的集合称为集群。一个 <span style="font-family: Times New Roman,serif;">PostgreSQL </span>
实例可以管理一个数据库集群。一台服务器可以运行多个实例。</p>
<p style="margin-bottom: 0.5cm;">在逻辑上，<span style="font-family: Times New Roman,serif;">PostgreSQL </span>
数据库可以迁移到 <span style="font-family: Times New Roman,serif;">DB2 </span>
数据库。这两种数据库都支持模式对象类型。不能从命名的连接访问<a href="javascript:;" onclick="javascript:tagshow(event, '%C6%E4%CB%FB');" target="_self"><span style="text-decoration: underline;"><strong>其他</strong>
</span>
</a>
数据库。</p>
<p style="margin-bottom: 0.5cm;"><span style="font-family: Times New Roman,serif;">PostgreSQL </span>
和 <span style="font-family: Times New Roman,serif;">DB2 </span>
之间最显著的差异与表空间相关。<span style="font-family: Times New Roman,serif;">PostgreSQL </span>
表空间可以跨越多个数据库，而 <span style="font-family: Times New Roman,serif;">DB2 </span>
表空间特定于一个数据库。 </p>
<p style="margin-bottom: 0.5cm;"><a name="fig2"></a>
<span style="font-family: Times New Roman,serif;"><br />
</span>
<strong>图 </strong>
<span style="font-family: Times New Roman,serif;"><strong>2. PostgreSQL </strong>
</span>
<strong>体系结构和进程概况</strong>
<span style="font-family: Times New Roman,serif;"><br />
</span>
<img title="点击图片可在新窗口打开" src="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0606khatri/PostgresqlArchitecture.gif" alt="" style="cursor: pointer;" />
 </p>
<p style="margin-bottom: 0.5cm;"><span style="font-family: Times New Roman,serif;">PostgreSQL </span>
会话由几个主进程组成：</p>
<ul>
<li>
<p><span style="font-family: Times New Roman,serif;">postmaster </span>
进程是一个主管进程，它生成其他进程并监听用户连接。 </p>
</li>
<li>
<p>用户进程（比如 <span style="font-family: Times New Roman,serif;">psql</span>
）用来处理交互式 <span style="font-family: Times New Roman,serif;">SQL </span>
查询。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">postmaster </span>
生成一个或多个名为 <span style="font-family: Times New Roman,serif;">postgres </span>
的服务器进程来处理用户的数据请求。 </p>
</li>
<li>
<p style="margin-bottom: 0.5cm;">服务器进程通过信号量和共享内存来相互通信。 </p>
</li>
</ul>
<p style="margin-bottom: 0.5cm;"><a name="N10236"></a>
<span style="font-family: Times New Roman,serif;">DB2</span>
</p>
<p style="margin-bottom: 0.5cm;"><a href="http://blog.chinaunix.net/u/17076/showart.php?id=174108#fig3">图 <span style="font-family: Times New Roman,serif;">3</span>
</a>
 显示 <span style="font-family: Times New Roman,serif;">DB2 </span>
的体系结构。这张图解释了 <span style="font-family: Times New Roman,serif;">DB2 </span>
如何使用缓冲池在磁盘之间处理数据（文件、原始设备、目录等等）。<span style="font-family: Times New Roman,serif;">DB2 </span>
使用一个连接集中器来处理大量连接。<span style="font-family: Times New Roman,serif;">DB2 </span>
页清理器和预获取器异步地工作，各个进程单独处理重做日志活动。关于 <span style="font-family: Times New Roman,serif;">DB2 </span>
中锁和进程的工作方式的详细描述，请参见 <a href="http://blog.chinaunix.net/u/17076/showart.php?id=174108#Resources">参考资料</a>
。 </p>
<p style="margin-bottom: 0.5cm;"><a name="fig3"></a>
<span style="font-family: Times New Roman,serif;"><br />
</span>
<strong>图 </strong>
<span style="font-family: Times New Roman,serif;"><strong>3. DB2 </strong>
</span>
<strong>体系结构和进程概况</strong>
<span style="font-family: Times New Roman,serif;"><br />
</span>
<img title="点击图片可在新窗口打开" src="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0606khatri/DB2Architecture.gif" alt="" style="cursor: pointer;" />
 </p>
<p style="margin-bottom: 0.5cm;"><span style="font-family: Times New Roman,serif;">DB2 </span>
会话由几个进程组成：</p>
<ul>
<li>
<p>&nbsp;</p>
<table dir="ltr" rules="rows" cellspacing="0" border="1" frame="void" align="right" width="60%" cellpadding="5">
<colgroup>
<col width="7" />
<col width="249" />
</colgroup>
<tbody>
<tr>
<td rowspan="2" width="3%">
<p><img title="点击图片可在新窗口打开" src="http://www.ibm.com/i/c.gif" border="0" height="2" align="bottom" alt="" style="cursor: pointer;" width="10" />
</p>
</td>
<td bgcolor="#eeeeee" width="97%">
<p style="margin-bottom: 0.5cm;"><a name="quicksumm"></a>
<span style="font-family: Times New Roman,serif;"><strong>MySQL</strong>
</span>
<strong>、</strong>
<span style="font-family: Times New Roman,serif;"><strong>PostgreSQL </strong>
</span>
<strong>和 </strong>
<span style="font-family: Times New Roman,serif;"><strong>DB2 </strong>
</span>
<strong>之间有什么差异？</strong>
</p>
<ul>
<li>
<p><span style="font-family: Times New Roman,serif;">MySQL </span>
使用基于线程的体系结构模型，而 <span style="font-family: Times New Roman,serif;">PostgreSQL </span>
和 <span style="font-family: Times New Roman,serif;">DB2 </span>
使用基于进程的体系结构模型。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">DB2 </span>
可以在一台服务器上有多个实例。每个实例中可以有许多数据库。每个数据库与其他数据库在物理上和逻辑上隔离。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;">MySQL </span>
可以在一台服务器上运行多个 <span style="font-family: Times New Roman,serif;">mysqld </span>
实例。每个实例可以管理一个或多个 <span style="font-family: Times New Roman,serif;">MySQL </span>
数据库。一个实例中的每个数据库并不在物理上或逻辑上隔离。<span style="font-family: Times New Roman,serif;">MySQL </span>
中的每个数据库可以被看作 <span style="font-family: Times New Roman,serif;">DB2 </span>
中的模式。 </p>
</li>
<li>
<p>可以认为 <span style="font-family: Times New Roman,serif;">PostgreSQL </span>
数据库集群相当于 <span style="font-family: Times New Roman,serif;">DB2 </span>
实例。 </p>
</li>
</ul>
</td>
</tr>
<tr>
<td width="97%"><br />
</td>
</tr>
</tbody>
</table>
db2sysc，主 DB2 系统控制器，即引擎进程。 
</li>
<li>
<p>监听器进程，比如 <span style="font-family: Times New Roman,serif;"><strong>db2tcpcm</strong>
 </span>
和 <span style="font-family: Times New Roman,serif;"><strong>db2ipccm</strong>
</span>
，它们监听用户的连接请求。 </p>
</li>
<li>
<p>一个或多个代表应用程序工作的代理。代理有两种类型： </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;"><strong>db2agent</strong>
 </span>
代表一个应用程序工作，并使用进程间通信或远程通信协议与其他代理通信。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;"><strong>db2agntp</strong>
 </span>
用来在打开内部并行的情况下满足对数据库的客户机请求。 </p>
</li>
<li>
<p>用户的进程（比如 <span style="font-family: Times New Roman,serif;"><strong>db2</strong>
</span>
）用来处理来自命令行的交互式查询。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;"><strong>db2bp</strong>
 &mdash;&mdash; </span>
一个持久的后台进程，用于 <span style="font-family: Times New Roman,serif;">DB2 Command Line Processor</span>
（<span style="font-family: Times New Roman,serif;">CLP</span>
）。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;"><strong>db2disp</strong>
 &mdash;&mdash; </span>
一个代理调度器进程，在启用连接集中器的情况下用于将连接分配给可用的协作代理。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;"><strong>db2fmcd</strong>
 &mdash;&mdash; </span>
每个服务器的故障监视器协作守护进程。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;"><strong>db2fmd</strong>
 &mdash;&mdash; </span>
每个实例的故障监视器守护进程。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;"><strong>db2resyn</strong>
 &mdash;&mdash; </span>
一个重新同步管理器进程，用于处理两阶段提交。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;"><strong>db2dlock</strong>
 &mdash;&mdash; </span>
一个 <span style="font-family: Times New Roman,serif;">DB2 </span>
死锁探测器。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;"><strong>db2loggr</strong>
 &mdash;&mdash; </span>
数据库日志读取器。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;"><strong>db2loggw</strong>
 &mdash;&mdash; </span>
数据库日志写入器。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;"><strong>db2pclnr</strong>
 &mdash;&mdash; </span>
缓冲池页清理器。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;"><strong>db2pfchr</strong>
 &mdash;&mdash; </span>
缓冲池预获取器。 </p>
</li>
<li>
<p><span style="font-family: Times New Roman,serif;"><strong>db2fmp</strong>
 &mdash;&mdash; </span>
用于在服务器上 <span style="font-family: Times New Roman,serif;">DB2 </span>
地址空间之外运行用户<a href="javascript:;" onclick="javascript:tagshow(event, '%B4%FA%C2%EB');" target="_self"><span style="text-decoration: underline;"><strong>代码</strong>
</span>
</a>
。 </p>
</li>
<li>
<p style="margin-bottom: 0.5cm;">等等 </p>
</li>
</ul>
<p style="margin-bottom: 0.5cm;"><span style="font-family: Times New Roman,serif;">DB2 </span>
服务器进程通过称为数据库管理器内存（<span style="font-family: Times New Roman,serif;">Database Manager Memory</span>
）和数据库共享内存（<span style="font-family: Times New Roman,serif;">Database Shared Memory</span>
）的内存区域相互通信，见 <a href="http://blog.chinaunix.net/u/17076/showart.php?id=174108#fig4">图 <span style="font-family: Times New Roman,serif;">4</span>
</a>
。 </p>
<p style="margin-bottom: 0.5cm;"><a name="fig4"></a>
<span style="font-family: Times New Roman,serif;"><br />
</span>
<strong>图 </strong>
<span style="font-family: Times New Roman,serif;"><strong>4. DB2 </strong>
</span>
<strong>数据库管理器（实例）和数据库共享内存体系结构</strong>
<span style="font-family: Times New Roman,serif;"><br />
</span>
<img title="点击图片可在新窗口打开" src="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0606khatri/DB2Memory.gif" alt="" style="cursor: pointer;" />
 </p>
<p style="margin-bottom: 0.5cm;"><a name="N102F8"></a>
特性对比</p>
<p style="margin-bottom: 0.5cm;"><a href="http://blog.chinaunix.net/u/17076/showart.php?id=174108#table1">表 <span style="font-family: Times New Roman,serif;">1</span>
</a>
 对比了 <span style="font-family: Times New Roman,serif;">MySQL</span>
、<span style="font-family: Times New Roman,serif;">PostgreSQL </span>
和 <span style="font-family: Times New Roman,serif;">DB2 </span>
特性。这不是一个完整的列表，但是对比了最常用的特性。 </p>
<p><a name="table1"></a>
<span style="font-family: Times New Roman,serif;"><br />
</span>
<strong>表 </strong>
<span style="font-family: Times New Roman,serif;"><strong>1. MySQL</strong>
</span>
<strong>、</strong>
<span style="font-family: Times New Roman,serif;"><strong>PostgreSQL </strong>
</span>
<strong>和 </strong>
<span style="font-family: Times New Roman,serif;"><strong>DB2 </strong>
</span>
<strong>特性对比</strong>
</p>
</td>
</tr>
<tr>
<th width="12%">
<p>特性</p>
</th>
<th width="28%">
<p><span style="font-family: Times New Roman,serif;">MySQL</span>
</p>
</th>
<th width="30%">
<p><span style="font-family: Times New Roman,serif;">PostgreSQL</span>
</p>
</th>
<th width="31%">
<p><span style="font-family: Times New Roman,serif;">DB2</span>
</p>
</th>
</tr>
<tr>
<td width="12%">
<p>实例 </p>
</td>
<td width="28%">
<p>通过执行 <span style="font-family: Times New Roman,serif;">MySQL </span>
命令（<span style="font-family: Times New Roman,serif;">mysqld</span>
）启动实例。一个实例可以管理一个或多个数据库。一台服务器可以运行多个 <span style="font-family: Times New Roman,serif;">mysqld </span>
实例。一个实例管理器可以监视 <span style="font-family: Times New Roman,serif;">mysqld </span>
的各个实例。 </p>
</td>
<td width="30%">
<p>通过执行 <span style="font-family: Times New Roman,serif;">Postmaster </span>
进程（<span style="font-family: Times New Roman,serif;">pg_ctl</span>
）启动实例。一个实例可以管理一个或多个数据库，这些数据库组成一个集群。集群是磁盘上的一个区域，这个区域在<a href="javascript:;" onclick="javascript:tagshow(event, '%B0%B2%D7%B0');" target="_self"><span style="text-decoration: underline;"><strong>安装</strong>
</span>
</a>
时初始化并由一个目录组成，所有数据都存储在这个目录中。使用 <span style="font-family: Times New Roman,serif;">initdb </span>
创建第一个数据库。 </p>
</td>
<td width="31%">
<p>实例是一个 <span style="font-family: Times New Roman,serif;">DB2 </span>
安装，它管理一个或多个数据库。在安装期间创建一个默认实例。使用 <span style="font-family: Times New Roman,serif;"><code><span style="font-family: NSimsun;">db2start</span>
</code>
 </span>
命令启动实例。还可以使用 <span style="font-family: Times New Roman,serif;"><strong>db2icrt</strong>
 </span>
命令在同一台机器上创建多个实例。在创建数据库本身之前，并不分配数据存储。数据库可以使用原始设备自己管理存储，或使用操作系统文件系统。环境变量 <span style="font-family: Times New Roman,serif;">DB2INSTANCE </span>
决定要连接哪个实例。 </p>
</td>
</tr>
<tr>
<td width="12%">
<p>数据库 </p>
</td>
<td width="28%">
<p>数据库是命名的对象集合，是与实例中的其他数据库分离的实体。一个 <span style="font-family: Times New Roman,serif;">MySQL </span>
实例中的所有数据库共享同一个系统编目。 </p>
</td>
<td width="30%">
<p>数据库是命名的对象集合，每个数据库是与其他数据库分离的实体。每个数据库有自己的系统编目，但是所有数据库共享 <span style="font-family: Times New Roman,serif;">pg_databases</span>
。 </p>
</td>
<td width="31%">
<p>数据库是命名的对象集合，是与其他数据库分离的实体。数据库是在物理上和逻辑上独立的实体，不与其他数据库共享任何东西。一个 <span style="font-family: Times New Roman,serif;">DB2 </span>
实例可以管理一个或多个数据库。 </p>
</td>
</tr>
<tr>
<td width="12%">
<p>数据缓冲区 </p>
</td>
<td width="28%">
<p>通过 <span style="font-family: Times New Roman,serif;"><strong>innodb_buffer_pool_size</strong>
 </span>
配置参数设置数据缓冲区。这个参数是内存缓冲区的字节数，<span style="font-family: Times New Roman,serif;">InnoDB </span>
使用这个缓冲区来缓存表的数据和索引。在专用的数据库服务器上，这个参数最高可以设置为机器物理内存量的 <span style="font-family: Times New Roman,serif;">80%</span>
。 </p>
</td>
<td width="30%">
<p><span style="font-family: Times New Roman,serif;"><strong>Shared_buffers</strong>
 </span>
缓存。在默认情况下分配 <span style="font-family: Times New Roman,serif;">64 </span>
个缓冲区。默认的块大小是 <span style="font-family: Times New Roman,serif;">8K</span>
。可以通过设置 <span style="font-family: Times New Roman,serif;">postgresql.conf </span>
文件中的 <span style="font-family: Times New Roman,serif;">shared_buffers </span>
参数来更新缓冲区缓存。 </p>
</td>
<td width="31%">
<p>在默认情况下分配一个缓冲池，并可以使用 <span style="font-family: Times New Roman,serif;"><strong>CREATE BUFFERPOOL</strong>
 </span>
命令添加其他缓冲池。默认的页大小在创建数据库时决定，可以是 <span style="font-family: Times New Roman,serif;">4</span>
、<span style="font-family: Times New Roman,serif;">8</span>
、<span style="font-family: Times New Roman,serif;">16 </span>
或 <span style="font-family: Times New Roman,serif;">32K</span>
。 </p>
</td>
</tr>
<tr>
<td width="12%">
<p>数据库连接 </p>
</td>
<td width="28%">
<p>客户机使用 <span style="font-family: Times New Roman,serif;">CONNECT </span>
或 <span style="font-family: Times New Roman,serif;">USE </span>
语句连接数据库，这时要指定数据库名，还可以指定用户 <span style="font-family: Times New Roman,serif;">id </span>
和密码。使用角色管理数据