<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>开源小站 &#187; 服务器</title>
	<atom:link href="http://www.litrin.net/tag/server/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.litrin.net</link>
	<description>It is Cool to OpenSource</description>
	<lastBuildDate>Fri, 03 Feb 2012 04:33:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ubuntu上KVM虚拟化的部署</title>
		<link>http://www.litrin.net/2012/01/20/ubuntu%e4%b8%8akvm%e8%99%9a%e6%8b%9f%e5%8c%96%e7%9a%84%e9%83%a8%e7%bd%b2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ubuntu%25e4%25b8%258akvm%25e8%2599%259a%25e6%258b%259f%25e5%258c%2596%25e7%259a%2584%25e9%2583%25a8%25e7%25bd%25b2</link>
		<comments>http://www.litrin.net/2012/01/20/ubuntu%e4%b8%8akvm%e8%99%9a%e6%8b%9f%e5%8c%96%e7%9a%84%e9%83%a8%e7%bd%b2/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 08:38:44 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[硬件相关]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1649</guid>
		<description><![CDATA[这个KVM跟控制台切换器之类的东西一点关系没有，KVM全称Kernel-based Virtual Machine，是基于Linux核心的虚拟机。之前曾经写过基于XEN的虚拟化，最终linux世界还是没有选择XEN。KVM被正式导入Linux是在2007年的2.6.20核心上，以替代XEN，不过相对XEN来说，KVM要求CPU硬件上支持虚拟化技术，即Intel-vt或者AMD-v的支持。这对于2008年之后的机器来说几乎是标配的。对于这一个时期的CPU都一个劲的堆核心，内存也空前的便宜，硬盘也逐步到了320G起板的水平，可以大胆的玩虚拟机了！ 再此之前，还是先确认系统的CPU是否支持虚拟化： #egrep &#8216;(vmx&#124;svm)&#8217; /proc/cpuinfo 应该有返回，如果没有返回，且确认您的CPU支持虚拟化的话，建议去看看BIOS设置，大多数的主板都支持关闭此技术的。 还是以最常用的Ubuntu Server 做例子，desktop的可以直接apt-get install ubuntu-server之后，用server的核心启动。如果你全程参考本文，个人建议还是通过后一种方式来做，因为本文的过程需要X环境。 首先，设置好桥接，由于我使用的机器在远程，操作全部通过ssh，桥接的过程断开过网络。让机房重起数次之后，找到了最稳妥的方法，虽然也要断网，但好在会自己恢复。 #sudo apt-get install bridge-utils uml-utilities #vi /etc/network/intefaces auto lo iface lo inet loopback auto tap0 iface tap0 inet manual up ifconfig $IFACE 0.0.0.0 up down ifconfig $IFACE down tunctl_user root auto br0 iface br0 inet static bridge_ports eth0 tap0 address 192.168.1.3 [...]]]></description>
			<content:encoded><![CDATA[<p>这个KVM跟控制台切换器之类的东西一点关系没有，KVM全称Kernel-based Virtual Machine，是基于Linux核心的虚拟机。之前曾经写过<a title="Ubuntu上Xen的快速部署" href="http://www.litrin.net/2010/10/08/ubuntu%e4%b8%8axen%e7%9a%84%e5%bf%ab%e9%80%9f%e9%83%a8%e7%bd%b2/">基于XEN的虚拟化</a>，最终linux世界还是没有选择XEN。KVM被正式导入Linux是在2007年的2.6.20核心上，以替代XEN，不过相对XEN来说，KVM要求CPU硬件上支持虚拟化技术，即Intel-vt或者AMD-v的支持。这对于2008年之后的机器来说几乎是标配的。对于这一个时期的CPU都一个劲的堆核心，内存也空前的便宜，硬盘也逐步到了320G起板的水平，可以大胆的玩虚拟机了！</p>
<p>再此之前，还是先确认系统的CPU是否支持虚拟化：<br />
#egrep &#8216;(vmx|svm)&#8217; /proc/cpuinfo</p>
<p>应该有返回，如果没有返回，且确认您的CPU支持虚拟化的话，建议去看看BIOS设置，大多数的主板都支持关闭此技术的。</p>
<p><span id="more-1649"></span></p>
<p>还是以最常用的Ubuntu Server 做例子，desktop的可以直接apt-get install ubuntu-server之后，用server的核心启动。如果你全程参考本文，个人建议还是通过后一种方式来做，因为本文的过程需要X环境。</p>
<p>首先，设置好桥接，由于我使用的机器在远程，操作全部通过ssh，桥接的过程断开过网络。让机房重起数次之后，找到了最稳妥的方法，虽然也要断网，但好在会自己恢复。</p>
<p>#sudo apt-get install bridge-utils uml-utilities</p>
<p>#vi /etc/network/intefaces</p>
<p>auto lo<br />
iface lo inet loopback</p>
<p>auto tap0<br />
iface tap0 inet manual<br />
up ifconfig $IFACE 0.0.0.0 up<br />
down ifconfig $IFACE down<br />
tunctl_user root</p>
<p>auto br0<br />
iface br0 inet static<br />
bridge_ports eth0 tap0<br />
address 192.168.1.3<br />
netmask 255.255.255.0<br />
network 192.168.1.0<br />
broadcast 192.168.1.255<br />
gateway 192.168.1.254</p>
<p>注意这个br0，我通过前端防火墙做的DMZ通道，所以设置了内网地址。主机通过这个ip访问。所有的虚拟主机也直接设置到192.168.1.0/24网段。</p>
<p>#/etc/init.d/network restart</p>
<p>断网了，等待几分钟后网络恢复，直接ifconfig</p>
<p>br0       Link encap:Ethernet  HWaddr 02:0b:b1:f7:79:01<br />
inet addr:192.168.1.3  Bcast:192.168.1.255  Mask:255.255.255.0<br />
inet6 addr: fe80::b:b1ff:fef7:7901/64 Scope:Link<br />
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1<br />
RX packets:506941 errors:0 dropped:0 overruns:0 frame:0<br />
TX packets:733910 errors:0 dropped:0 overruns:0 carrier:0<br />
collisions:0 txqueuelen:0<br />
RX bytes:45469237 (45.4 MB)  TX bytes:654152049 (654.1 MB)</p>
<p>eth0      Link encap:Ethernet  HWaddr e4:1f:13:95:82:cf<br />
inet6 addr: fe80::e61f:13ff:fe95:82cf/64 Scope:Link<br />
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1<br />
RX packets:1367878 errors:0 dropped:0 overruns:0 frame:0<br />
TX packets:1541493 errors:0 dropped:0 overruns:0 carrier:0<br />
collisions:0 txqueuelen:100<br />
RX bytes:689206805 (689.2 MB)  TX bytes:1062795975 (1.0 GB)<br />
Memory:81a80000-81aa0000</p>
<p>eth0:0    Link encap:Ethernet  HWaddr e4:1f:13:95:82:cf<br />
inet addr:192.168.1.2  Bcast:0.0.0.0  Mask:0.0.0.0<br />
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1<br />
Memory:81a80000-81aa0000</p>
<p>桥接成功！</p>
<p>相对来说，我还是比较喜欢图形化的管理工具，命令行实在太痛苦</p>
<p>#apt-get install virt-manager libvirtd kvm libvirt-bin</p>
<p>看看是否安装成功</p>
<p># ls /dev | grep kvm</p>
<p>直接用ssh通道执行gnome-session就可以连到远程桌面，执行系统工具里的“虚拟系统管理器”。添加连接中选择本地，QEMU/KVM。</p>
<p><a href="http://www.litrin.net/2012/01/20/ubuntu%e4%b8%8akvm%e8%99%9a%e6%8b%9f%e5%8c%96%e7%9a%84%e9%83%a8%e7%bd%b2/kvm-conn/" rel="attachment wp-att-1650"><img class="aligncenter size-medium wp-image-1650" title="kvm-conn" src="http://www.litrin.net/wp-content/uploads/2012/01/kvm-conn-229x300.png" alt="" width="229" height="300" /></a><a href="http://www.litrin.net/2012/01/20/ubuntu%e4%b8%8akvm%e8%99%9a%e6%8b%9f%e5%8c%96%e7%9a%84%e9%83%a8%e7%bd%b2/virt-manager/" rel="attachment wp-att-1651"><img class="aligncenter size-medium wp-image-1651" title="virt-manager" src="http://www.litrin.net/wp-content/uploads/2012/01/virt-manager-292x300.png" alt="" width="292" height="300" /></a>然后建立新的虚拟主机，个人觉得这块跟用VM之类的工具没有什么区别了，直接跳过了。不过在第五步的时候，请将网卡设置为桥接设备，除非仅仅用于NAT方式联网。<a href="http://www.litrin.net/2012/01/20/ubuntu%e4%b8%8akvm%e8%99%9a%e6%8b%9f%e5%8c%96%e7%9a%84%e9%83%a8%e7%bd%b2/kvm-net/" rel="attachment wp-att-1652"><img class="aligncenter size-medium wp-image-1652" title="kvm-net" src="http://www.litrin.net/wp-content/uploads/2012/01/kvm-net-199x300.png" alt="" width="199" height="300" /></a></p>
<p>需要注意的是，如果你跟我一样通过远程连接，直接打开主机的控制台的时候，键盘会不听使唤。这不是切换键盘设置可以搞定的问题，我尝试过不同的X客户端和操作系统，涵盖了windows mac linux，全都如此。只能认为是一个bug。我的最终解决方法是通过ssh通道，将远程主机的5900 VNC端口转接回本地，然后再通过vnc客户端连接本地才得以通过，键盘的问题得以解决。很傻，如果你有更好的方式，敬请赐教了！</p>
<p>照旧建立一个虚拟主机，我还是选择了Ubuntu Server 1110 64bit，也没有什么好说的。安装好之后，配置好了ssh。从此就可以直接抛弃vnc和宿主主机的X访问了。</p>
<p>在虚拟主机上安装定制的内核:</p>
<p>#apt-get install kernel-virtual</p>
<p>重起的速度那是嗖嗖的！直接lsmod发觉真的是定制内核，和标准的server内核比起来一点多余的没有：</p>
<p>root@www:~# lsmod<br />
Module                  Size  Used by<br />
psmouse                73882  0<br />
serio_raw              13166  0<br />
lp                     17799  0<br />
parport                46562  1 lp<br />
8139too                32177  0<br />
8139cp                 27412  0</p>
<p>对比一下性能吧，还是<a title="Ctypes实现“C重构”" href="http://www.litrin.net/2012/01/04/ctypes%e5%ae%9e%e7%8e%b0c%e9%87%8d%e6%9e%84/">那道题目</a>的python原版，稍作优化：</p>
<p>虚拟机：</p>
<p>root@www:/home/litrin# python TimeCost.py<br />
10240<br />
Cost: 0.508388996124<br />
root@www:/home/litrin# python TimeCost.py<br />
10240<br />
Cost: 0.507208108902<br />
root@www:/home/litrin#</p>
<p>宿主机：</p>
<p>root@vserver:~# python TimeCost.py<br />
10240<br />
Cost: 4.35039806366<br />
root@vserver:~# python TimeCost.py<br />
10240<br />
Cost: 4.35194683075</p>
<p>我开始真的不知道该如何解释。虚拟机的性能竟然强于宿主机。后来检查了python的版本才明白，宿主是py2.6而客户机是2.7，版本不同，性能有差距，但可以肯定的是，从这一点上来说虚拟化的性能损失不大。</p>
<p>最后一步，去掉虚拟机上不需要的东西，精简主义者！</p>
<p>这次就直接用宿主的命令行操作吧：</p>
<p>#virsh</p>
<p>virsh # list<br />
Id Name                 State<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
30 www.litrin.net       running //我的虚拟主机名为www.litrin.net，请注意！</p>
<p>virsh # edit www.litrin.net</p>
<p>删掉vnc, pty, mouse, graphic</p>
<p>virsh # destroy www.litrin.net</p>
<p>virsh # start www.litrin.net</p>
<p>这里有一个问题也凸现，就是无法使用宿主机的reboot和halt命令，只能强行的destroy。</p>
<p>你同时还可以配合DHCP和主机克隆，大规模快速甚至自动化的架设多个虚拟机，本文不再探讨。</p>
<p>尽管现在“云”已经被用滥了，搞个虚拟机就敢号称云托管的大有人在。个人觉得其实对于少数几台主机的虚拟化来说，更多的是节约机房的托管费用和主机成本，这对于稍微大一点的项目并没有什么太多的优势。如果配合上open stack之类的故障平滑迁移技术才是虚拟化方案的终极利器。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2012/01/20/ubuntu%e4%b8%8akvm%e8%99%9a%e6%8b%9f%e5%8c%96%e7%9a%84%e9%83%a8%e7%bd%b2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>非阻塞的Python web框架tornado</title>
		<link>http://www.litrin.net/2011/10/18/%e9%9d%9e%e9%98%bb%e5%a1%9e%e7%9a%84python-web%e6%a1%86%e6%9e%b6tornado/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e9%259d%259e%25e9%2598%25bb%25e5%25a1%259e%25e7%259a%2584python-web%25e6%25a1%2586%25e6%259e%25b6tornado</link>
		<comments>http://www.litrin.net/2011/10/18/%e9%9d%9e%e9%98%bb%e5%a1%9e%e7%9a%84python-web%e6%a1%86%e6%9e%b6tornado/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 08:10:12 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1581</guid>
		<description><![CDATA[公司项目中需要使用长链接方式的获取后端数据库——主要是Redis的实时数据。 由于项目本身是PHP的初次看到这个项目，首先想到的是Apache + mod_php的方式，配合php的ob_start()方式直接调用，就如同我之前的一篇东西所说的那样。可问题不这么简单： 系统是nginx + php-fpm方式，php-fpm“hold不住”过多的Http请求，而nginx需要调整响应时间。 用户数量很多，Apache的消耗很大。本身功能点很小，实现成本不合算。 说到并发，Apache采用的方式是大量的fork进程，通过“人多力量大”的方式应对多个请求，这样的基于进程（线程）模型的并发，一旦调用sleep，进程只是休眠而已，仍然占用着内存，仍然需要进程调度，资源始终得不到释放，资源自然无法得到控制。这些年nginx的流行大多都是因为nginx采用的epoll方式有效的解决这个问题——直接挂掉进程，然后再指定时间内重新启用。这就是传说中的“非阻塞”(asynchronous IO  AIO)。 多并发、轻量级应用，我首先想到的是Python，加上“非阻塞”关键字，得到的结果就是Tornado。 tornado原本是FriendFeed引擎的开源版本，本身就是为解决“C10K”问题而生的。 稍微研究了一下，coding也很简便： #!/usr/bin/env python #By Litrin J #http://www.litrin.net/ import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web import time, redis, hashlib,random from tornado.options import define, options define("port", default=8888, help="run on the given port", type=int) class LongPolling(tornado.web.RequestHandler): minWaitTime = 15 maxWaitTime = 900 RedisHost = [...]]]></description>
			<content:encoded><![CDATA[<p>公司项目中需要使用长链接方式的获取后端数据库——主要是Redis的实时数据。</p>
<p>由于项目本身是PHP的初次看到这个项目，首先想到的是Apache + mod_php的方式，配合php的ob_start()方式直接调用，就如同我之前的<a title="重新认识下PHP的输出" href="http://www.litrin.net/2011/01/16/%e9%87%8d%e6%96%b0%e8%ae%a4%e8%af%86%e4%b8%8bphp%e7%9a%84%e8%be%93%e5%87%ba/">一篇东西</a>所说的那样。可问题不这么简单：</p>
<ol>
<li>系统是nginx + php-fpm方式，php-fpm“hold不住”过多的Http请求，而nginx需要调整响应时间。</li>
<li>用户数量很多，Apache的消耗很大。本身功能点很小，实现成本不合算。<span id="more-1581"></span></li>
</ol>
<p>说到并发，Apache采用的方式是大量的fork进程，通过“人多力量大”的方式应对多个请求，这样的基于进程（线程）模型的并发，一旦调用sleep，进程只是休眠而已，仍然占用着内存，仍然需要进程调度，资源始终得不到释放，资源自然无法得到控制。这些年nginx的流行大多都是因为nginx采用的epoll方式有效的解决这个问题——直接挂掉进程，然后再指定时间内重新启用。这就是传说中的“非阻塞”(asynchronous IO  AIO)。</p>
<p>多并发、轻量级应用，我首先想到的是Python，加上“非阻塞”关键字，得到的结果就是<a rel="nofollow" target="_blank" href="http://www.tornadoweb.org/">Tornado</a>。</p>
<p>tornado原本是FriendFeed引擎的开源版本，本身就是为解决“C10K”问题而生的。</p>
<p>稍微研究了一下，coding也很简便：</p>
<pre class="py" name=code>#!/usr/bin/env python
#By Litrin J
#http://www.litrin.net/
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import time, redis, hashlib,random
from tornado.options import define, options

define("port", default=8888, help="run on the given port", type=int)

class LongPolling(tornado.web.RequestHandler):

    minWaitTime = 15
    maxWaitTime = 900

    RedisHost   = "172.18.194.98"
    RedisPrefix = "Q/MSG%s"

    SignSalt    = "salt"

    StopCode    = "{'stop':1}"

    @tornado.web.asynchronous
    def get(self):
        sUid        = self.get_argument("uid", None)
        sSign       = self.get_argument("sign", None)
        sJsonCall   = self.get_argument("jsonCallback", None)

        if (sUid is None or sSign is None
                or self.checkSign(sUid, sSign) == False):
            raise tornado.web.HTTPError(404)
            self.clear()

        else:
            self.doLongPolling(callback=self.onWaitting)

    def checkSign(self, sUid, sSign):
        return True

    def doLongPolling(self, callback):
        #Check if the client close the connection
        if self.request.connection.stream.closed():
            self.clear()

        sKey        =   self.RedisPrefix % self.uid
        res         =   redis.Redis(self.RedisHost)
        sMessage    =   res.rpop(sKey)
        del res #close the redis at 1st time

        callback(sMessage)

    def onWaitting(self, sMessage):
        if (sMessage is not None):
            self.onRespones(sMessage)
        else:
            iNextPollingTime = time.time() + self.minWaitTime
            if self.minWaitTime &lt; self.maxWaitTime:
                self.minWaitTime *= 2
                #Can't useing time.sleep for no-bloking mode
                tornado.ioloop.IOLoop.instance().add_timeout(
                iNextPollingTime ,
                lambda: self.doLongPolling(callback=self.onWaitting)
            )
            else:
                self.onRespones(self.StopCode)

    def onRespones(self, sMessage):
        sJsonCall   = self.get_argument("jsonCallback", None)
        if sJsonCall is not None:
            sMessage= sJsonCall + "( " + sMessage.decode('utf-8') + ")"

        self.write(sMessage)
        self.finish()

def main():
    tornado.options.parse_command_line()
    application = tornado.web.Application([
        (r"/", LongPolling),
    ])
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()</pre>
<p>一旦建立http连接，系统会每隔一段时间去轮询用户的队列中是否有数据，有数据时才向客户端发送请求，否则就是“长时间小菊花”状态。很简单，仅仅用了不到100行代码的样子。当然，为了安全因素和节省资源，代码里添加了很多限制性的操作，否则可能会更简洁高效。</p>
<p>需要注意的是，tornado的理念就是建立在“非阻塞”基础上的，你当然可以选择time.sleep(n)，但传统上的time.sleep(n)方式的休眠会导致IO阻塞，故只能采用tornado.ioloop.IOLoop.instance().add_timeout 的方法回调来回调去，将下次启动的时间转给系统。话说回来，这是我第一次在Java或JS以外使用回调函数……</p>
<p>初步测试了一下，借助Redis本身就很强的并发能力在台式机上可以每秒钟完成4K次请求以上，并可以保持同时4K以上的访问不掉线，此时的CPU load仍然保持在1以下，单是测试的结果就足以让Apache+Php组合汗颜。</p>
<p>部署的时候采用了单IP多端口方式，服务器有4个核心，决定开4个端口对应，分别是8885~8888，修改</p>
<pre>define("port", default=8888, help="run on the given port", type=int)</pre>
<p>即可</p>
<p>前端nginx用负责负载分发：</p>
<pre>upstream backend {
        server 127.0.0.1:8888;
        server 127.0.0.1:8887;
        server 127.0.0.1:8886;
        server 127.0.0.1:8885;
}
 server{
        listen  80;
        server_name message.test.com;
        keepalive_timeout 65;    #
        proxy_read_timeout 2000; #
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;

        proxy_pass  http://backend;
        }
}</pre>
<p>需要注意的是，这样的httpSocket方式很可能被内核认为是SYN攻击，而且对于大量的keep alive而言，很可能超过核心限制，还要修改sysctl参数。</p>
<pre>#系统最大打开文件数
fs.file-max = 201510

#TCP连接的最长时间
net.ipv4.tcp_keepalive_time = 1800
#出现问题的尝试次数
net.ipv4.tcp_keepalive_probes = 15
#检查是否连接的等待时间
net.ipv4.tcp_keepalive_intvl = 60
#不进行SYN cookies防御
net.ipv4.tcp_syncookies = 0</pre>
<pre></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/10/18/%e9%9d%9e%e9%98%bb%e5%a1%9e%e7%9a%84python-web%e6%a1%86%e6%9e%b6tornado/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hadoop的单机部署</title>
		<link>http://www.litrin.net/2011/08/19/hadoop%e7%9a%84%e5%8d%95%e6%9c%ba%e9%83%a8%e7%bd%b2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=hadoop%25e7%259a%2584%25e5%258d%2595%25e6%259c%25ba%25e9%2583%25a8%25e7%25bd%25b2</link>
		<comments>http://www.litrin.net/2011/08/19/hadoop%e7%9a%84%e5%8d%95%e6%9c%ba%e9%83%a8%e7%bd%b2/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 13:23:08 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[DataBase]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1528</guid>
		<description><![CDATA[&#160; 要说最近最热的云计算，不得不提Hadoop。这个项目就是为集群运算而生的。依赖于它的项目n多，个人感觉hadoop已经逐渐成为一个“基于Java的分布式运算中间件”。 这里安装的hadoop为ver 0.21.0版本，包含了HDFS分布式文件系统。平台为老一套的Ubuntu 1104 server for amd64。 既然是Java Base的，首先要准备jdk环境。默认1104已经把java从apt中剔除了——跟oracle收购sun不无关系，尽管openjdk还在，我还是建议安装sun-jdk。具体实现如下： echo “deb http://archive.canonical.com/ natty partner” &#62;&#62; /etc/apt/sources.list #添加源 apt-get update apt-get install sun-java-jdk 文件多而大，耐心等待。 基础环境 默认apt方式安装的jdk目录为/usr/lib/jvm/java-6-sun ，等待jdk完成之后， echo "/usr/lib/jvm/java-6-sun"  &#62; /etc/jvm 官方建议关闭ipv6，尽管我不清楚有什么影响 echo "blacklist ipv6" &#62;&#62; /etc/modprobe.d/blacklist 建立用户/组，没什么要解释的 addgroup hadoop adduser --ingroup hadoop hadoop 修改环境变量，vi /etc/bash.bashrc，在末尾添加： export JAVA_HOME=/usr/lib/jvm/java-6-sun export JDK_HOME=$JAVA_HOME export PATH=$PATH:$JAVA_HOME/bin 切换用户到hadoop, su &#8211; hadoop 调通ssh，具体参见这里之前的东西。 mkdir [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>要说最近最热的云计算，不得不提<a rel="nofollow" target="_blank" href="http://hadoop.apache.org" target="_blank">Hadoop</a>。这个项目就是为集群运算而生的。依赖于它的项目n多，个人感觉hadoop已经逐渐成为一个“基于Java的分布式运算中间件”。</p>
<p>这里安装的hadoop为ver 0.21.0版本，包含了HDFS分布式文件系统。平台为老一套的Ubuntu 1104 server for amd64。</p>
<p>既然是Java Base的，首先要准备jdk环境。默认1104已经把java从apt中剔除了——跟oracle收购sun不无关系，尽管openjdk还在，我还是建议安装sun-jdk。具体实现如下：</p>
<p><span id="more-1528"></span><br />
echo “deb http://archive.canonical.com/ natty partner” &gt;&gt; /etc/apt/sources.list #添加源<br />
apt-get update<br />
apt-get install sun-java-jdk</p>
<p>文件多而大，耐心等待。</p>
<p><strong>基础环境</strong></p>
<p><strong></strong>默认apt方式安装的jdk目录为/usr/lib/jvm/java-6-sun ，等待jdk完成之后，</p>
<pre>echo "/usr/lib/jvm/java-6-sun"  &gt; /etc/jvm</pre>
<p>官方建议关闭ipv6，尽管我不清楚有什么影响</p>
<pre>echo "blacklist ipv6" &gt;&gt; /etc/modprobe.d/blacklist</pre>
<p>建立用户/组，没什么要解释的</p>
<pre>addgroup hadoop
adduser --ingroup hadoop hadoop</pre>
<p>修改环境变量，vi /etc/bash.bashrc，在末尾添加：</p>
<pre>export JAVA_HOME=/usr/lib/jvm/java-6-sun
export JDK_HOME=$JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin</pre>
<p>切换用户到hadoop, su &#8211; hadoop</p>
<p>调通ssh，具体参见<a title="用publickey验证登录SSH服务器" href="http://www.litrin.net/2006/04/10/%e7%94%a8publickey%e9%aa%8c%e8%af%81%e7%99%bb%e5%bd%95ssh%e6%9c%8d%e5%8a%a1%e5%99%a8/" target="_blank">这里</a>之前的东西。</p>
<pre>mkdir .ssh
cd .ssh
ssh-keygen -t rsa
cat id_rsa.pub &gt;&gt; authorized_keys
ssh localhost</pre>
<p><strong>配置Hadoop</strong></p>
<p>我默认已经使用hadoop用户进行操作，root权限可以不用了。</p>
<p>将下载后的hadoop保存在适当的目录下，我选择了/opt/hadoop目录。</p>
<p>修改/opt/hadoop/conf/hadoop-env.sh文件中，添加 export JAVA_HOME=/usr/lib/jvm/java-6-sun</p>
<p>cd /opt/hadoop/conf 一堆的配置文件要改。</p>
<p>conf/core-site.xml:</p>
<pre>&lt;configuration&gt;
     &lt;property&gt;
         &lt;name&gt;fs.default.name&lt;/name&gt;&lt;!--文件系统名称--&gt;
        &lt;!--&lt;value&gt;hdfs://localhost:9000&lt;/value&gt;单机，不使用集群文件系统 --&gt;&lt;value&gt;/date/hadoop&lt;/value&gt;
     &lt;/property&gt;
&lt;/configuration&gt;</pre>
<p>conf/hdfs-site.xml:</p>
<pre>&lt;configuration&gt;
     &lt;property&gt;
         &lt;name&gt;dfs.replication&lt;/name&gt;
         &lt;value&gt;1&lt;/value&gt;
     &lt;/property&gt;
&lt;/configuration&gt;</pre>
<p>conf/mapred-site.xml:</p>
<pre>&lt;configuration&gt;
     &lt;property&gt;
         &lt;name&gt;mapred.job.tracker&lt;/name&gt;
         &lt;value&gt;localhost:9001&lt;/value&gt;
     &lt;/property&gt;
&lt;/configuration&gt;</pre>
<p>需要注意的是，不同的版本号之间，配置方式有细微的不同。</p>
<p>配置OK!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/08/19/hadoop%e7%9a%84%e5%8d%95%e6%9c%ba%e9%83%a8%e7%bd%b2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>分布式文件系统Moose FS的部署</title>
		<link>http://www.litrin.net/2011/06/20/%e5%88%86%e5%b8%83%e5%bc%8f%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9fmoose-fs%e7%9a%84%e9%83%a8%e7%bd%b2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%2588%2586%25e5%25b8%2583%25e5%25bc%258f%25e6%2596%2587%25e4%25bb%25b6%25e7%25b3%25bb%25e7%25bb%259fmoose-fs%25e7%259a%2584%25e9%2583%25a8%25e7%25bd%25b2</link>
		<comments>http://www.litrin.net/2011/06/20/%e5%88%86%e5%b8%83%e5%bc%8f%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9fmoose-fs%e7%9a%84%e9%83%a8%e7%bd%b2/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 03:22:46 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1500</guid>
		<description><![CDATA[近期随着云概念的热炒，什么都分布式。所谓分布式的文件系统就是把若干机器上的磁盘空间统一维护，成为一个逻辑上的独立空间，当然，还有对应的容错和压力分散解决方案。 这些天在研究分布式存储的东西，测试了比较出名的几个分布式文件系统。首先是淘宝的tfs，国人出品应该支持了，谁知TFS的支持库实在不敢恭维，换了几种操作系统，最终才在suse上安装成功。可作为一个绑死操作系统的应用，风险太大。接着是MogileFS，MogileFS是基于perl的，在安装了一系列的perl依赖包之后，MogileFS安装的很顺利，性能也能达到要求，问题就是在于我们实在不愿意去维护一个perl环境。最后剩下了MooseFS。 凡是分布式系统一般都会有中心和节点的概念，对应到mfs上就是master server和chunk servers。其中master 是运算消耗型，chunk是磁盘消耗型。整个系统是网络带宽消耗型。建议生产环境中使用千兆网络，并可以根据本站提供的信息建立bond。 mfs还有自己的Backup server被称为metalogger在master出现故障时能够及时替换掉master的地位。硬件相同于master一致，至少拥有同样大小的内存。 MooseFS环境准备 作为测试环境，我准备了两台服务器，仅搭建Master和chunk各一台。没有metakogger。 192.168.1.1 master #Ubuntu 11.04 192.168.1.101 chunk #Ubuntu 11.04 192.168.1.201 客户端 #Ubuntu 11.04 由于需要编译，build-essential, pkg-config,  zlib1g-dev是必须的。 下载源码包 http://sourceforge.net/projects/moosefs/ MooseFS Master的安装 #groupadd mfs  #准备组/用户 #useradd -g mfs mfs #tar -zxvf mfs-1.6.15.tar.gz #cd mfs-1.6.15 #./configure &#8211;prefix=/usr &#8211;sysconfdir=/etc/mfs &#8211;localstatedir=/var/lib &#8211;with-default-user=mfs&#8211;with-default-group=mfs &#8211;disable-mfschunkserver &#8211;disable-mfsmount #make #make install 需要注意的是，这次所有的./configure都是类似的，不要搞错！安装结束后/etc/mfs下会有几个dist结尾的配置文件，去掉.dist结尾。 其中 mfsmaster.cfg 文件是允许访问的主机权限，做过nfs的应该很清楚了。 cd /var/lib/mfs cp [...]]]></description>
			<content:encoded><![CDATA[<p>近期随着云概念的热炒，什么都分布式。所谓分布式的文件系统就是把若干机器上的磁盘空间统一维护，成为一个逻辑上的独立空间，当然，还有对应的容错和压力分散解决方案。</p>
<p>这些天在研究分布式存储的东西，测试了比较出名的几个分布式文件系统。首先是淘宝的tfs，国人出品应该支持了，谁知TFS的支持库实在不敢恭维，换了几种操作系统，最终才在suse上安装成功。可作为一个绑死操作系统的应用，风险太大。接着是MogileFS，MogileFS是基于perl的，在安装了一系列的perl依赖包之后，MogileFS安装的很顺利，性能也能达到要求，问题就是在于我们实在不愿意去维护一个perl环境。最后剩下了MooseFS。</p>
<p><span id="more-1500"></span></p>
<p>凡是分布式系统一般都会有中心和节点的概念，对应到mfs上就是master server和chunk servers。其中master 是运算消耗型，chunk是磁盘消耗型。整个系统是网络带宽消耗型。建议生产环境中使用千兆网络，并可以根据<a title="Linux下多网卡负载的实现" href="http://www.litrin.net/2006/05/21/linux%e4%b8%8b%e5%a4%9a%e7%bd%91%e5%8d%a1%e8%b4%9f%e8%bd%bd%e7%9a%84%e5%ae%9e%e7%8e%b0/" target="_blank">本站提供的信息建立bond</a>。</p>
<p>mfs还有自己的Backup server被称为metalogger在master出现故障时能够及时替换掉master的地位。硬件相同于master一致，至少拥有同样大小的内存。</p>
<h2>MooseFS环境准备</h2>
<p>作为测试环境，我准备了两台服务器，仅搭建Master和chunk各一台。没有metakogger。</p>
<p>192.168.1.1 master #Ubuntu 11.04</p>
<p>192.168.1.101 chunk #Ubuntu 11.04</p>
<p>192.168.1.201 客户端 #Ubuntu 11.04</p>
<p>由于需要编译，build-essential, pkg-config,  zlib1g-dev是必须的。</p>
<p>下载源码包 http://sourceforge.net/projects/moosefs/</p>
<h2><strong>MooseFS Master的安装</strong></h2>
<p>#groupadd mfs  #准备组/用户<br />
#useradd -g mfs mfs</p>
<p>#tar -zxvf mfs-1.6.15.tar.gz<br />
#cd mfs-1.6.15</p>
<p>#./configure &#8211;prefix=/usr &#8211;sysconfdir=/etc/mfs &#8211;localstatedir=/var/lib &#8211;with-default-user=mfs&#8211;with-default-group=mfs <span style="text-decoration: underline;">&#8211;disable-mfschunkserver &#8211;disable-mfsmount</span><br />
#make<br />
#make install</p>
<p>需要注意的是，这次所有的./configure都是类似的，不要搞错！安装结束后/etc/mfs下会有几个dist结尾的配置文件，去掉.dist结尾。</p>
<p>其中 mfsmaster.cfg 文件是允许访问的主机权限，做过nfs的应该很清楚了。</p>
<p>cd /var/lib/mfs<br />
cp metadata.mfs.empty metadata.mfs</p>
<p>mfsmaster start #启动服务器</p>
<p>mfscgiserv #启动webbase管理界面，通过http://192.168.1.1:9425可以看到一个相当不错的界面。</p>
<p>借此，master段配置完成</p>
<h2><strong>MooseFS Chunk的安装</strong></h2>
<p>与master差不多的过程，我直接贴了：</p>
<p>#groupadd mfs  #准备组/用户<br />
#useradd -g mfs mfs</p>
<p>#tar -zxvf mfs-1.6.15.tar.gz<br />
#cd mfs-1.6.15</p>
<p>#./configure &#8211;prefix=/usr &#8211;sysconfdir=/etc/mfs &#8211;localstatedir=/var/lib &#8211;with-default-user=mfs&#8211;with-default-group=mfs <span style="text-decoration: underline;">&#8211;disable-mfsmaster</span></p>
<p>make &amp;&amp; make install</p>
<p>同样，将/etc/mfs下的.dist文件改名，文件不大，我是直接新建的。</p>
<p>mfshdd.cfg 里面记录了你想要共享（事实上是存放文件信息的）的路径，我习惯上用了/data</p>
<p>mfschunckserver.cfg 加上两行：</p>
<pre>MASTER_HOST = 192.168.1.1</pre>
<pre>MASTER_PORT = 9420</pre>
<p>/data目录的权限要注意，mfs可写。</p>
<p>mfschunkserver start #启动chunk server。回头去看http://192.168.1.1:9425的disks选项卡，应该会多出一个记录。</p>
<h2><strong>MooseFS Client的安装</strong></h2>
<p>moosefs支持fuse的直接挂装，客户端先安装fuse.</p>
<p>apt-get install fuse-util</p>
<p>总算不用添加mfs用户组了！</p>
<p>#tar -zxvf mfs-1.6.15.tar.gz<br />
#cd mfs-1.6.15<br />
#./configure &#8211;prefix=/usr &#8211;sysconfdir=/etc/mfs &#8211;localstatedir=/var/lib &#8211;with-default-user=mfs&#8211;with-default-group=mfs <span style="text-decoration: underline;">&#8211;disable-mfsmaster&#8211;disable-mfschunkserver </span> #3个disable!</p>
<p>#make &amp;&amp; make install</p>
<p>mfsmount /mnt -H 192.168.1.1 #Master 的IP</p>
<p>df -h | grep mnt结果</p>
<p>192.168.1.1:9421    4.6G     0  46G   0% /mnt</p>
<p>挂装成功！写个大文件看看：dd if=/dev/zero of=/mnt/bigfile bs=1024 count=1seek=$((20*1024*1024-1))</p>
<p>去http://192.168.1.1:9425，应该会有变化，但由于mfs是支持动态压缩的，磁盘占用不会像上面那条命令那么变态的20G。</p>
<p>当chunk写满后可以很方便的再添加一台chunk，这就是分布式的方便之处！</p>
<h2><strong>MooseFS 安装问题</strong></h2>
<p>在Ubuntu下异常的顺利，在redhat系下出了几个问题。</p>
<ol>
<li>安装fuse后启动fuse系统提示error in fuse_mount<br />
出现在fuse2.8.x 的安装过程中，这是因为fuse2.8要求linux内核版本较高，使用2.7.6即可。不要忘记安装kernel-devel库</li>
<li>出现fuse library is too old or not installed &#8211; mfsmount needs version 2.6 or higher<br />
可以在fuse的./configure中prefix=/usr，或者 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH更改默认路径即可！</li>
</ol>
<h2><strong>MooseFS 的常用维护</strong></h2>
<ol>
<li>察看文件保存状态：<br />
client：  mfsgetgoal -r FILENAME　或　mfsgetgoal -r FILENAME</li>
<li>备份meta状态：<br />
master: /var/lib/mfs下的metadata.mfs文件是当前的metadata，默认每小时都会更新，旧文件将会添加.back后缀备份即可，并同时增加changelog.*.log。当然，推荐使用moosefs metalogger</li>
<li>强行数据回写：<br />
master: mfsmetarestore -a</li>
<li>数据回滚：<br />
master: mfsmetarestore -m metadata.mfs.back -o metadata.mfs changelog.?.mfs</li>
</ol>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/06/20/%e5%88%86%e5%b8%83%e5%bc%8f%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9fmoose-fs%e7%9a%84%e9%83%a8%e7%bd%b2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ubuntu上Coreseek+php的安装</title>
		<link>http://www.litrin.net/2011/06/16/ubuntu%e4%b8%8acoreseekphp%e7%9a%84%e5%ae%89%e8%a3%85/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ubuntu%25e4%25b8%258acoreseekphp%25e7%259a%2584%25e5%25ae%2589%25e8%25a3%2585</link>
		<comments>http://www.litrin.net/2011/06/16/ubuntu%e4%b8%8acoreseekphp%e7%9a%84%e5%ae%89%e8%a3%85/#comments</comments>
		<pubDate>Thu, 16 Jun 2011 02:23:30 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[DataBase]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1489</guid>
		<description><![CDATA[Coreseek是一个基于sphinx引擎，支持与mmseg中文分词模块合作完成中文的全文搜索引擎。相对sql这类操作，Coreseek负载可谓是微不足道。当然类似的索引服务器还有给予Java的solr等。我选择coreseek的主要原因之一是他可以通过配置后可以与现有的mysql客户端兼容，并可以直接嵌入到mysql中成为mysql的引擎之一。 首先，下载安装包，我选择的是最新的stable版， 不过不客气的说，即便是coreseek的stable版本，不论是从稳定性、兼容性还是灵活性上都不能算是完善，至少无法跟apache这类经典应用相提并论。 安装ubuntu开发包： apt-get install make gcc g++ automake libtool mysql-client libmysqlclient15-dev libxml2-dev libexpat1-dev   解压： tar xzvf coreseek-3.2.14.tar.gz cd coreseek-3.2.14 应该看到有mmseg csft testpack 至少3个目录 安装mmseg中文分词模块 cd mmseg-3.2.14 ./bootstrap ./configure &#8211;prefix=/usr/local/mmseg3 #不喜欢这个官方目录配置，更换目录后配置无法生效郁闷了很久，稍后再说 make make install cd ../testpack /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml #测试结果，请确保终端可以看到utf8中文，应该可以看到分词后的结果 安装Python包 虽然coreseek支持直接的mysql连接，但考虑到分词、分表的情况，这种设置不是很灵活。我的方案是通过python脚本的预处理，将mysql的数据整理后传输到coreseek建立索引。这样还有一个优势就是“万能数据源”——memcache、redis这类几乎不指望coreseek官方支持的妖异存储方案，只要有python的api，均可以索引。 官方的安装手册中介绍的python接口是基于ActivePython 替代系统python语言的方式进行的。ActivePython属于第三方封包，远没有系统自带python来的方便，刚开始用系统python测试了数次，均不成功，后来根据出错信息，找到了原因。 apt-get install python-dev python-sqlite python-mysqldb python-memcache 安装coreseek cd ../csft-3.2.14 [...]]]></description>
			<content:encoded><![CDATA[<p>Coreseek是一个基于sphinx引擎，支持与mmseg中文分词模块合作完成中文的全文搜索引擎。相对sql这类操作，Coreseek负载可谓是微不足道。当然类似的索引服务器还有给予Java的solr等。我选择coreseek的主要原因之一是他可以通过配置后可以与现有的mysql客户端兼容，并可以直接嵌入到mysql中成为mysql的引擎之一。</p>
<p>首先，下载安装包，我选择的是<a rel="nofollow" target="_blank" href="http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz">最新的stable版</a>， 不过不客气的说，即便是coreseek的stable版本，不论是从稳定性、兼容性还是灵活性上都不能算是完善，至少无法跟apache这类经典应用相提并论。</p>
<p><span id="more-1489"></span><br />
安装ubuntu开发包：<br />
apt-get install make gcc g++ automake libtool mysql-client libmysqlclient15-dev libxml2-dev libexpat1-dev</p>
<p><strong> </strong><br />
解压：<br />
tar xzvf coreseek-3.2.14.tar.gz<br />
cd coreseek-3.2.14</p>
<p>应该看到有mmseg csft testpack 至少3个目录</p>
<p><strong>安装mmseg中文分词模块</strong></p>
<p>cd mmseg-3.2.14<br />
./bootstrap<br />
./configure &#8211;prefix=/usr/local/mmseg3 #不喜欢这个官方目录配置，更换目录后配置无法生效郁闷了很久，稍后再说<br />
make<br />
make install<br />
cd ../testpack<br />
/usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml #测试结果，请确保终端可以看到utf8中文，应该可以看到分词后的结果</p>
<p><strong>安装Python包</strong></p>
<p>虽然coreseek支持直接的mysql连接，但考虑到分词、分表的情况，这种设置不是很灵活。我的方案是通过python脚本的预处理，将mysql的数据整理后传输到coreseek建立索引。这样还有一个优势就是“万能数据源”——memcache、redis这类几乎不指望coreseek官方支持的妖异存储方案，只要有python的api，均可以索引。</p>
<p>官方的安装手册中介绍的python接口是基于<a rel="nofollow" target="_blank" href="http://www.activestate.com/activepython" target="_blank">ActivePython</a> 替代系统python语言的方式进行的。ActivePython属于第三方封包，远没有系统自带python来的方便，刚开始用系统python测试了数次，均不成功，后来根据出错信息，找到了原因。</p>
<p>apt-get install python-dev python-sqlite python-mysqldb python-memcache</p>
<p><strong>安装coreseek</strong></p>
<p>cd ../csft-3.2.14<br />
./buildconf.sh<br />
./configure &#8211;prefix=/usr/local/coreseek &#8211;without-unixodbc &#8211;with-mmseg &#8211;with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ &#8211;with-mmseg-libs=/usr/local/mmseg3/lib/ &#8211;with-mysql &#8211;with-python<br />
make<br />
make install</p>
<p>cd ../testpack<br />
/usr/local/coreseek/bin/indexer -c etc/csft.conf &#8211;all<br />
/usr/local/coreseek/bin/search -c etc/csft.conf 网络搜索 #没什么问题了</p>
<p><strong>安装libsphinxclient</strong></p>
<p>coreseek官方教程中建议php使用直接include一个php文件进行操作，事实上php有独立的sphinx模块可以直接操作coreseek (coreseek就是sphinx！)已经进入了php的官方函数库，而且效率的提升不是一点点！但php模块依赖于libsphinxclient包。</p>
<p>cd ../csft-3.2.14/api/libsphinxclient<br />
./configure<br />
make<br />
make install<br />
ldconfig</p>
<p><strong>安装php-sphinx支持 </strong></p>
<p>apt-get install php5-dev<br />
wget http://pecl.php.net/get/sphinx-1.1.0.tgz<br />
tar vzxf  sphinx-1.1.0.tgz<br />
cd  sphinx-1.1.0<br />
phpize<br />
./configure<br />
make<br />
make install</p>
<p>确信成功后修改php.ini，还是遵从ubuntu的配置规则<br />
echo “extension=sphinx.so”  &gt; /etc/php5/conf.d/sphinx.ini</p>
<p>如果使用apache或者fast-cgi的话，请重起。察看phpinfo() 如下则安装成功。</p>
<h2><a name="module_sphinx">sphinx</a></h2>
<table border="0" cellpadding="3" width="600">
<tbody>
<tr>
<th>sphinx support</th>
<th>enabled</th>
</tr>
<tr>
<th>Version</th>
<th>1.1.0</th>
</tr>
<tr>
<th>Revision</th>
<th>$Revision: 303462 $</th>
</tr>
</tbody>
</table>
<p> </p>
<p><strong>配置coreseek</strong></p>
<p>说容易也容易，说麻烦也麻烦的工作，照贴一份吧前面说过，我用的是python数据源</p>
<p>/usr/local/coreseek/etc/coreseek.conf</p>
<pre>python
{
           path = /usr/local/coreseek/DBSource #python 数据源脚本的存放路径
}
source Blog #索引库1 “Blog”
{
          type = python #类型为python
          name = Blog.MainSource #调用python的class
}
index Blog
{
    source          = Blog #数据源名称
    path            = /data/sphinx/Blog #数据文件存放路径
    docinfo         = extern
    mlock           = 0
    morphology      = none
    min_word_len    = 1
    html_strip      = 0
   charset_dictpath = /usr/local/mmseg3/etc/ #mmseg中文分词库的位置，本文开头时我说不能修改mmseg的安装路径就错在这里
   charset_type        = zh_cn.utf-8
}
source UserInfo #索引库2 “UserInfo” 其余同上
{
    type = python
    name = UserInfo.MainSource
}
index UserInfo
{
     source          = UserInfo
     path            = /data/sphinx/UserInfo
     docinfo         = extern
     mlock           = 0
    morphology      = none
    min_word_len    = 1
    html_strip      = 0
    charset_dictpath = /usr/local/mmseg3/etc/
    charset_type        = zh_cn.utf-8
}

searchd #服务器配置
{
    listen          =   9312  #显而易见，默认的监听端口
    listen          =   172.18.196.90:3306:mysql41 #兼容mysql方式的监听，我们配置了php-sphinx，故除了命令行方式外意义不大，可以关闭
    pid_file        =   /var/run/coreseek.pid
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/06/16/ubuntu%e4%b8%8acoreseekphp%e7%9a%84%e5%ae%89%e8%a3%85/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>运维的CAP原则</title>
		<link>http://www.litrin.net/2011/05/28/%e8%bf%90%e7%bb%b4%e7%9a%84cap%e5%8e%9f%e5%88%99/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e8%25bf%2590%25e7%25bb%25b4%25e7%259a%2584cap%25e5%258e%259f%25e5%2588%2599</link>
		<comments>http://www.litrin.net/2011/05/28/%e8%bf%90%e7%bb%b4%e7%9a%84cap%e5%8e%9f%e5%88%99/#comments</comments>
		<pubDate>Sat, 28 May 2011 07:23:42 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[站长的blog]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1480</guid>
		<description><![CDATA[小站上的 文章大多以实际操作为主，这次就介绍点理论吧。 曾经跟几个同行聊起了数据库这边的容错方案，有朋友发过类似的牢骚：“网站（或者数据库）做了负载均衡，可用性提高了，单点故障也不怕了，但数据的同步总是慢半拍，无法适用某些应用。如果要求完全解决一一致性的麻烦，就只能到回去。” 程序开发上始终念念不忘的有个“摩尔定律”，归根结底的就是说不要放太多精力去隄防运算速度达不到的问题。在运维以及底层架构涉及上有着同样重要的定律“CAP”，最早由加州大学伯克利分校（又是他）的Eric A. Brewer教授提出的。所有的分布式系统的好坏主要有3个重要的指标来衡量： 一致性（Consistency） 可用性（Availibility） 容错性、鲁棒性原文翻译是“分区容错”（Partition tolerance） 任何一个分布式系统只能同时满足3个条件中的两个，无法同时达到3者兼备。 就拿磁盘RAID来说： RAID0的情况是数据分散在多块硬盘之上，只存一份。由于只有一份数据，不存在数据不同步的情况，一致性得到保障。多磁盘分散IO，性能提升，可用性提升。多块磁盘拼凑一份数据，磁盘损坏的概率正比上升，同时增加磁盘的难度提升，容错性下降。即为了C和A，放弃了P。 RAID1的情况是数据在每个磁盘上做一个备份。由于有多个备份，可能出现多个磁盘上数据不统一的情况，一致性下降。多磁盘分散IO，性能提升，可用性上升。很容易增加备份磁盘，多个备份，磁盘损坏概率反比下降，鲁棒性上升。即为了A和P，放弃了C。 RAID5的情况是一份数据分散在多块硬盘上，另外保存一份校验数据以方便恢复。数据只有一份，不存在一致性的问题。数据读写的同时可能会需要生成校验数据，影响速度，可用性下降。任何一块磁盘的损坏都可以通过剩余的磁盘中的数据和校验数据恢复，鲁棒性上升。即为了C和P，放弃了A。 对于传统的关系数据库的要求又不得不提ACID： 原子性 （Atomicity）数据和操作不可再次分隔 一致性（Consistency）操作结束后，仍可进行同样的操作 隔离性／无关性（Isolation）操作和操作不得影响 不可撤销（Durability） “不可撤销”，“隔离性”，“原子性”都是限制鲁棒性和容错性的P，一致性本身就是C。剩余的A只能作为牺牲的指标。说得明显点就是目前尚没有什么有效的方法让一条SQL同时在多台主机上同时执行正常。跨表SQL很正常，跨数据库操作已经够变态的了，跨系统进行SQL操作而且保证数据的实时和一致几乎是不可能的。 对于传统的关系型数据库来说难度就是CAP三个之中在你需要任何一个的情况下，即便你愿意花钱去升级硬件，也必须以其他的下降作为代价。要么高可用（负载均衡），要么高安全（热备份），要么高容错（事务回滚），想要正比的升级来获取A是不可能的。 这些年大负载架构的出现带动了nosql型数据库。类似memcache，bigtable和Hbase这类的key-value也是一大亮点。相比关系型的数据库而言，新的数据模型仍然无法摆脱这个魔咒，唯一的优势在于这些架构相对灵活，可以根据需要进行CAP取舍，找出真正适合的C 、A、 P比例。]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.litrin.net">小站</a>上的 文章大多以实际操作为主，这次就介绍点理论吧。</p>
<p>曾经跟几个同行聊起了数据库这边的容错方案，有朋友发过类似的牢骚：“网站（或者数据库）做了负载均衡，可用性提高了，单点故障也不怕了，但数据的同步总是慢半拍，无法适用某些应用。如果要求完全解决一一致性的麻烦，就只能到回去。”</p>
<p><span id="more-1480"></span></p>
<p>程序开发上始终念念不忘的有个“摩尔定律”，归根结底的就是说不要放太多精力去隄防运算速度达不到的问题。在运维以及底层架构涉及上有着同样重要的定律“CAP”，最早由加州大学伯克利分校（又是他）的Eric A. Brewer教授提出的。所有的分布式系统的好坏主要有3个重要的指标来衡量：</p>
<ul>
<li>一致性（Consistency）</li>
<li>可用性（Availibility）</li>
<li>容错性、鲁棒性原文翻译是“分区容错”（Partition tolerance）</li>
</ul>
<p>任何一个分布式系统只能同时满足3个条件中的两个，无法同时达到3者兼备。</p>
<p>就拿磁盘RAID来说：</p>
<p>RAID0的情况是数据分散在多块硬盘之上，只存一份。由于只有一份数据，不存在数据不同步的情况，一致性得到保障。多磁盘分散IO，性能提升，可用性提升。多块磁盘拼凑一份数据，磁盘损坏的概率正比上升，同时增加磁盘的难度提升，容错性下降。即为了C和A，放弃了P。</p>
<p>RAID1的情况是数据在每个磁盘上做一个备份。由于有多个备份，可能出现多个磁盘上数据不统一的情况，一致性下降。多磁盘分散IO，性能提升，可用性上升。很容易增加备份磁盘，多个备份，磁盘损坏概率反比下降，鲁棒性上升。即为了A和P，放弃了C。</p>
<p>RAID5的情况是一份数据分散在多块硬盘上，另外保存一份校验数据以方便恢复。数据只有一份，不存在一致性的问题。数据读写的同时可能会需要生成校验数据，影响速度，可用性下降。任何一块磁盘的损坏都可以通过剩余的磁盘中的数据和校验数据恢复，鲁棒性上升。即为了C和P，放弃了A。</p>
<p>对于传统的关系数据库的要求又不得不提ACID：</p>
<ul>
<li>原子性 （Atomicity）数据和操作不可再次分隔</li>
<li>一致性（Consistency）操作结束后，仍可进行同样的操作</li>
<li>隔离性／无关性（Isolation）操作和操作不得影响</li>
<li>不可撤销（Durability）</li>
</ul>
<p>“不可撤销”，“隔离性”，“原子性”都是限制鲁棒性和容错性的P，一致性本身就是C。剩余的A只能作为牺牲的指标。说得明显点就是目前尚没有什么有效的方法让一条SQL同时在多台主机上同时执行正常。跨表SQL很正常，跨数据库操作已经够变态的了，跨系统进行SQL操作而且保证数据的实时和一致几乎是不可能的。</p>
<p>对于传统的关系型数据库来说难度就是CAP三个之中在你需要任何一个的情况下，即便你愿意花钱去升级硬件，也必须以其他的下降作为代价。要么高可用（负载均衡），要么高安全（热备份），要么高容错（事务回滚），想要正比的升级来获取A是不可能的。</p>
<p>这些年大负载架构的出现带动了nosql型数据库。类似memcache，bigtable和Hbase这类的key-value也是一大亮点。相比关系型的数据库而言，新的数据模型仍然无法摆脱这个魔咒，唯一的优势在于这些架构相对灵活，可以根据需要进行CAP取舍，找出真正适合的C 、A、 P比例。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/05/28/%e8%bf%90%e7%bb%b4%e7%9a%84cap%e5%8e%9f%e5%88%99/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>LAMP的常用扩展安装</title>
		<link>http://www.litrin.net/2011/05/16/lamp%e7%9a%84%e5%b8%b8%e7%94%a8%e6%89%a9%e5%b1%95%e5%ae%89%e8%a3%85/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lamp%25e7%259a%2584%25e5%25b8%25b8%25e7%2594%25a8%25e6%2589%25a9%25e5%25b1%2595%25e5%25ae%2589%25e8%25a3%2585</link>
		<comments>http://www.litrin.net/2011/05/16/lamp%e7%9a%84%e5%b8%b8%e7%94%a8%e6%89%a9%e5%b1%95%e5%ae%89%e8%a3%85/#comments</comments>
		<pubDate>Mon, 16 May 2011 01:57:56 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[DataBase]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1467</guid>
		<description><![CDATA[之前已经弄过许多篇关于LAMP搭建的东西，都是基于最简单包的，这次说说几个比较常用扩展的安装： FreeBSD + Apache + PHP + Mysql (恶搞版) FreeBSD + Apache + PHP + Mysql + Oracle Ubuntu + Apache + PHP + Mysql ，比较简单，正常server版安装结束的最后一步可以选择安装LAMP Ubuntu + nginx + php Ubuntu + php + Oracle Memcache 说起Memcache，这年头稍微大点的网站几乎是必不可少的。内存Key-value一对一数据库，但数据易失。新浪的团队也有个项目是memcachedb，就是以速度为代价，部分数据回写硬盘。但似乎不是memcache的本意，个人觉得不如直接写sql，仁者见仁吧。 For Ubuntu apt-get install memcached php5-memcache /etc/init.d/memcached start For FreeBSD cd /usr/ports/databases/memcached make install clean cd /usr/ports/databases/pecl-memcache make [...]]]></description>
			<content:encoded><![CDATA[<p>之前已经弄过许多篇关于LAMP搭建的东西，都是基于最简单包的，这次说说几个比较常用扩展的安装：</p>
<ul>
<li><a title="用FreeBSD的ports安装apache+php+mysql" href="http://www.litrin.net/2005/11/09/%e7%94%a8freebsd%e7%9a%84ports%e5%ae%89%e8%a3%85apachephpmysql/" target="_blank">FreeBSD + Apache + PHP + Mysql</a> (<a title="用FreeBSD的ports安装apache+php+mysql·改" href="http://www.litrin.net/2007/08/01/%e7%94%a8freebsd%e7%9a%84ports%e5%ae%89%e8%a3%85apachephpmysql%c2%b7%e6%94%b9/" target="_blank">恶搞版</a>)</li>
<li><a title="FreeBSD+apache+PHP+OCI支持Oracle" href="http://www.litrin.net/2009/06/15/freebsdapachephpoci%e6%94%af%e6%8c%81oracle/" target="_blank">FreeBSD + Apache + PHP + Mysql + Oracle</a></li>
<li>Ubuntu + Apache + PHP + Mysql ，比较简单，正常server版安装结束的最后一步可以选择安装LAMP</li>
<li><a title="Ubuntu下安装Nginx+php(FastCGI)" href="http://www.litrin.net/2010/10/27/ubuntu%e4%b8%8b%e5%ae%89%e8%a3%85nginxphpfastcgi/" target="_blank">Ubuntu + nginx + php</a></li>
<li><a title="配置Ubuntu的php支持OCI8" href="http://www.litrin.net/2009/09/15/%e9%85%8d%e7%bd%aeubuntu%e7%9a%84php%e6%94%af%e6%8c%81oci8/" target="_blank">Ubuntu + php + Oracle</a></li>
</ul>
<p><span id="more-1467"></span></p>
<p><strong>Memcache</strong></p>
<p>说起Memcache，这年头稍微大点的网站几乎是必不可少的。内存Key-value一对一数据库，但数据易失。新浪的团队也有个项目是memcachedb，就是以速度为代价，部分数据回写硬盘。但似乎不是memcache的本意，个人觉得不如直接写sql，仁者见仁吧。</p>
<ul>
<li>For Ubuntu<br />
apt-get install memcached php5-memcache<br />
/etc/init.d/memcached start</li>
<li>For FreeBSD<br />
cd /usr/ports/databases/memcached<br />
make install clean<br />
cd /usr/ports/databases/pecl-memcache<br />
make install clean<br />
echo”memcached_enable=YES” &gt;&gt; /etc/rc.conf<br />
/usr/local/etc/rc.d/memcached start</li>
</ul>
<p><strong>Redis</strong></p>
<p>也是一个Key-value数据库，比起Memcache速度慢一点，但会回写硬盘，数据不丢失。处理Feed之类SQL吃上劲的应用必备。</p>
<ul>
<li>For Ubuntu //11.04可行，8.04不行，官方似乎从904以后才加入的。之前的版本不妨用<a rel="nofollow" target="_blank" href="http://ftp.us.debian.org/debian/pool/main/r/redis/" target="_blank">debian包<br />
</a>apt-get install redis-server php-redis //同样的<a rel="nofollow" target="_blank" href="http://ftp.us.debian.org/debian/pool/main/p/php-radius/" target="_blank">debian包下载</a><br />
/etc/init.d/redis-server start</li>
<li>For Freebsd<br />
cd /usr/ports/databases/redis<br />
make install clean<br />
echo &#8216;redis_enable=”YES”&#8216; &gt;&gt; /etc/rc.conf<br />
/usr/local/etc/rc.d/redis restart<br />
cd /usr/ports/databases/php5-redis<br />
make install clean //敲的条件反射了</li>
</ul>
<p>说起redis的PHP支持类，由于redis是明文的传输，所以很多人会选择<a rel="nofollow" target="_blank" href="https://github.com/jdp/redisent" target="_blank">redisend</a>这类基于socket连接方式的php类——说白了就是模拟telnet 6379。根据实际测试的结果，C扩展至少有40%以上的提升，而且内存更少，加包和拆包的过程更迅速。更何况redisend的前一个版本一堆问题，后一个版本又是php5.3 only的天上一脚，地上一脚的维护也是麻烦。不是万不得已还是少用为妙。</p>
<p><strong>PHP-FPM</strong></p>
<p>这个是给Nginx做fastcgi扩展的，相比php-cgi, spawn-cgi不但性能上有提升，配置上也灵活的多，但FreeBSD不支持，Ubuntu也不官方推荐。这里使用了ubuntu的非官方库。</p>
<p>echo “deb <a rel="nofollow" target="_blank" href="http://php53.dotdeb.org">http://php53.dotdeb.org</a> stable all” &gt;&gt; /etc/apt/sources.list<br />
apt-get update; apt-get upgrade<br />
apt-get install php5-fpm</p>
<p>会直接覆盖之前官方支持的PHP包，请慎重考虑。</p>
<p>/etc/init.d/php5-fpm start</p>
<p><strong>PHP-GD</strong></p>
<p>最常见的缺失，但很容易。</p>
<ul>
<li>For Ubuntu<br />
apt-get install php5-gd</li>
<li>For FreeBSD<br />
cd /usr/ports/graphics/php5-gd<br />
make install clean</li>
</ul>
<p><strong>Minify</strong></p>
<p>Minify是一个基于PHP5的CSS/JS优化包，其实这不属于Php的扩展。</p>
<ol>
<li><a rel="nofollow" target="_blank" href="http://code.google.com/p/minify/">http://code.google.com/p/minify/</a> 下载最新的minify，解压后，将min目录拷贝至网站根目录下。</li>
<li>确认是否开启了apache 的mod_rewrite，Ubuntu默认不开启，需要a2enmod,选择rewrite后,/etc/init.d/apache2 restart 重起apache</li>
<li>网站根目录下编辑.htaccess内容如下：
<pre>RewriteEngine On
        RewriteBase /
         RewriteRule ^(.*\.(css|js))\S?$ min/index.php?f=$1 [L]</pre>
</li>
<li>如果系统已经安装了memcache包，不妨用MC替代文件方式存储优化后的信息，编辑min/config.php，末尾添加
<pre class="php">require 'lib/Minify/Cache/Memcache.php';
$memcache = new Memcache;
$memcache-&gt;connect('localhost', 11211); //根据本地配置调整
$min_cachePath = new Minify_Cache_Memcache($memcache);</pre>
</li>
</ol>
<p><strong>TokyoTyrant (ttServer)</strong></p>
<p>TykyoTyrant想必web game, social game的公司用的很多，大概是由于某家企鹅公司的框架所限吧。这东西就是一个“支持lua扩展并可持续化”的key-value。个人觉得完全可以通过memcache + redis两者取代。</p>
<ul>
<li>for Ubuntu (natty ok, hardy not support)<br />
apt-get install tokyotyrant<br />
/etc/init.d/tokyotyrant 52~53行稍作修改：<br />
52 #SERVERHOST=”$RUNDIR/$NAME.sock”<br />
53 SERVERPORT=1978<br />
即可通过/etc/init.d/tokyotyrant start命令启动1978端口的监听</li>
</ul>
<ul>
<li>for Freebsd<br />
cd /usr/ports/databases/tokyotyrant/<br />
make install clean</li>
</ul>
<div>tokyotyrant有自己的php模块，但习惯上都是通过memcache模块进行操作的，命令等价于memcahce的操作。</div>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/05/16/lamp%e7%9a%84%e5%b8%b8%e7%94%a8%e6%89%a9%e5%b1%95%e5%ae%89%e8%a3%85/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>google的下一代web协议spdy</title>
		<link>http://www.litrin.net/2011/04/14/google%e7%9a%84%e4%b8%8b%e4%b8%80%e4%bb%a3web%e5%8d%8f%e8%ae%aespdy/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google%25e7%259a%2584%25e4%25b8%258b%25e4%25b8%2580%25e4%25bb%25a3web%25e5%258d%258f%25e8%25ae%25aespdy</link>
		<comments>http://www.litrin.net/2011/04/14/google%e7%9a%84%e4%b8%8b%e4%b8%80%e4%bb%a3web%e5%8d%8f%e8%ae%aespdy/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 00:09:08 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[网络和安全]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1433</guid>
		<description><![CDATA[之前听过Stanely发过一个牢骚：说在公司局域网内使用Chrome，很快收到了网管寄出的Email，大致上是通知他换用其他的浏览器，然后说了一堆Chrome种种的不好、不安全之类的言论。更让他郁闷的是邮件的收件人只是几个Chrome的用户，没有针对其他人，为什么能准确的辨别出谁使用了Chrome？ 我想，排除了其他因素，诸如网管可能有远程监视硬盘之类的技术，仅仅通过公司企业的前端路由——估计他们这种规模的企业，一定有深包分析之类的高级设备，完全可以清除的知道谁在使用Chrome，原因就是因为Chrome正在测试google下一代的web协议spdy。 单从发音上就知道spdy = speedy。快！它的核心是针对目前HTTP传输中对多重数据传输的低效，无优先排序功能重新构架的。google已经在自家的gmail等应用上偷偷支持了spdy协议，据说可以提升接近一半的传输速度。本想看看他们的协议白皮书，无奈，众所周知，这个网站并不存在。 大致上概括下，spdy协议可以让网页打开时优先传输html，完成后再去传输图片和js，css。而且就我理解下来，spdy是支持压缩和加密传输模式的，而且效率远高于http。 如果需要让您当前的网站支持spdy协议的传输，google提供了一个apache mod 。但说实话，由于spdy协议目前只是处在测试阶段，而且仅仅只能被Chrome支持，我还是不建议马上部署这个模块。 查看spdy的状态简单的方法是在Chrome中打开这个链接：chrome://net-internals 。 回答开始的话题，由于目前spdy尚处于测试阶段，大部分企业的防火墙都不会认为这是一个正常的http访问，兴许会作为一个攻击来源之类的抛出警报。网管们烦心，发出个邮件禁止一下也在情理之中。]]></description>
			<content:encoded><![CDATA[<p>之前听过Stanely发过一个牢骚：说在公司局域网内使用Chrome，很快收到了网管寄出的Email，大致上是通知他换用其他的浏览器，然后说了一堆Chrome种种的不好、不安全之类的言论。更让他郁闷的是邮件的收件人只是几个Chrome的用户，没有针对其他人，为什么能准确的辨别出谁使用了Chrome？</p>
<p>我想，排除了其他因素，诸如网管可能有远程监视硬盘之类的技术，仅仅通过公司企业的前端路由——估计他们这种规模的企业，一定有深包分析之类的高级设备，完全可以清除的知道谁在使用Chrome，原因就是因为Chrome正在测试google下一代的web协议spdy。</p>
<p><span id="more-1433"></span>单从发音上就知道spdy = speedy。快！它的核心是针对目前HTTP传输中对多重数据传输的低效，无优先排序功能重新构架的。google已经在自家的gmail等应用上偷偷支持了spdy协议，据说可以提升接近一半的传输速度。本想看看他们的协议白皮书，无奈，众所周知，这个网站并不存在。</p>
<p>大致上概括下，spdy协议可以让网页打开时优先传输html，完成后再去传输图片和js，css。而且就我理解下来，spdy是支持压缩和加密传输模式的，而且效率远高于http。</p>
<p>如果需要让您当前的网站支持spdy协议的传输，google提供了一个<a rel="nofollow" target="_blank" href="http://code.google.com/p/mod-spdy/" target="_blank">apache mod </a>。但说实话，由于spdy协议目前只是处在测试阶段，而且仅仅只能被Chrome支持，我还是不建议马上部署这个模块。</p>
<p>查看spdy的状态简单的方法是在Chrome中打开这个链接：<a rel="nofollow" target="_blank" href="chrome://net-internals/#events&amp;q=type:SPDY_SESSION%20is:active">chrome://net-internals</a> 。</p>
<p>回答开始的话题，由于目前spdy尚处于测试阶段，大部分企业的防火墙都不会认为这是一个正常的http访问，兴许会作为一个攻击来源之类的抛出警报。网管们烦心，发出个邮件禁止一下也在情理之中。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/04/14/google%e7%9a%84%e4%b8%8b%e4%b8%80%e4%bb%a3web%e5%8d%8f%e8%ae%aespdy/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ubuntu的AppArmor引发的Mysql问题</title>
		<link>http://www.litrin.net/2011/04/08/ubuntu%e7%9a%84apparmor%e5%bc%95%e5%8f%91%e7%9a%84mysql%e9%97%ae%e9%a2%98/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ubuntu%25e7%259a%2584apparmor%25e5%25bc%2595%25e5%258f%2591%25e7%259a%2584mysql%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2011/04/08/ubuntu%e7%9a%84apparmor%e5%bc%95%e5%8f%91%e7%9a%84mysql%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 02:56:29 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1430</guid>
		<description><![CDATA[这些天一台ubuntu server的mysql数据目录/var/lib/mysql所在分区快用光了，于是想把Mysql的数据目录移到一个相对空闲的分区下，直接修改了my.cnf中的配置，系统提示无法启动Mysql。又自做聪明的使用了链接文件访问，仍然无效。完全排除了所有linux文件系统权限的可能之后，我回忆起了之前在Redhat系操作系统上发生过的SeLinux导致的类似问题。看了一下官档，果然！Ubuntu在710之后，增加了一个类似于Selinux的权限控制服务叫做AppArmor，名字就很有意思：应用铠甲，让我想起了Diablo2中的暗金⋯⋯ 首先，解决那个Mysql的问题： #sudo nano /etc/apparmor.d/usr.sbin.mysqld ＃好吧，我承认，我sudo出了习惯 发现了有两行配置： /home/mysql/ r, /home/mysql/** rwk, 修改掉 /data/mysql/ r, /data/mysql/** rwk, 重启AppArmor /etc/init.d/apparmor reload 重启Mysql，一切OK! 当然你可以直接关闭apparmor服务避免类似的问题，但从安全角度考虑，我不建议这么做，毕竟修改两行参数的事，不复杂。 事实上，这个应用是Novell主导的，想必Suse上也有同样的设置。在/etc/apparmor.d目录下的增减文件可以在Linux文件系统权限之外基于程序对文件系统的访问操作进行限制。如果你想要限制一个/a/b的文件，对应的配置文件就是/etc/apparmor.d/a.b。内容应该很好理解了。 感觉上相比Selinux而言AppArmor简单一点，不知安全程度如何。但就我个人而言，我更加信任相对复杂的SeLinux。 ps: 之前我还碰到过ssh上去不能读写移动硬盘的问题，估计也于此有关。]]></description>
			<content:encoded><![CDATA[<p>这些天一台ubuntu server的mysql数据目录/var/lib/mysql所在分区快用光了，于是想把Mysql的数据目录移到一个相对空闲的分区下，直接修改了my.cnf中的配置，系统提示无法启动Mysql。又自做聪明的使用了链接文件访问，仍然无效。完全排除了所有linux文件系统权限的可能之后，我回忆起了之前在Redhat系操作系统上发生过的SeLinux导致的类似问题。看了一下官档，果然！Ubuntu在710之后，增加了一个类似于Selinux的权限控制服务叫做AppArmor，名字就很有意思：应用铠甲，让我想起了Diablo2中的暗金⋯⋯</p>
<p><span id="more-1430"></span>首先，解决那个Mysql的问题：</p>
<pre>#sudo nano /etc/apparmor.d/usr.sbin.mysqld ＃好吧，我承认，我sudo出了习惯</pre>
<p>发现了有两行配置：</p>
<pre>/home/mysql/ r,
/home/mysql/** rwk,</pre>
<p>修改掉</p>
<pre>/data/mysql/ r,
/data/mysql/** rwk,</pre>
<p>重启AppArmor</p>
<pre>/etc/init.d/apparmor reload</pre>
<p>重启Mysql，一切OK!<br />
当然你可以直接关闭apparmor服务避免类似的问题，但从安全角度考虑，我不建议这么做，毕竟修改两行参数的事，不复杂。</p>
<p>事实上，这个应用是Novell主导的，想必Suse上也有同样的设置。在/etc/apparmor.d目录下的增减文件可以在Linux文件系统权限之外基于程序对文件系统的访问操作进行限制。如果你想要限制一个/a/b的文件，对应的配置文件就是/etc/apparmor.d/a.b。内容应该很好理解了。</p>
<p>感觉上相比Selinux而言AppArmor简单一点，不知安全程度如何。但就我个人而言，我更加信任相对复杂的SeLinux。</p>
<p>ps:</p>
<p>之前我还碰到过ssh上去不能读写移动硬盘的问题，估计也于此有关。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/04/08/ubuntu%e7%9a%84apparmor%e5%bc%95%e5%8f%91%e7%9a%84mysql%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>安装Subversion服务器</title>
		<link>http://www.litrin.net/2011/01/05/%e5%ae%89%e8%a3%85subversion%e6%9c%8d%e5%8a%a1%e5%99%a8/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%25ae%2589%25e8%25a3%2585subversion%25e6%259c%258d%25e5%258a%25a1%25e5%2599%25a8</link>
		<comments>http://www.litrin.net/2011/01/05/%e5%ae%89%e8%a3%85subversion%e6%9c%8d%e5%8a%a1%e5%99%a8/#comments</comments>
		<pubDate>Wed, 05 Jan 2011 02:53:19 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[桌面应用]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1380</guid>
		<description><![CDATA[SVN虽说已经老了，可能逐步要被Git这类的新型版本控制服务软件代替了。但就单单兼容性和整合度来说，唯一与之媲美的只有更加古老的CVS了。 总之，没什么可以解释的，直接切入正题吧。服务器又是我近期一贯使用的Ubuntu Server。版本是1004 LTS。 $sudo apt-get update #迟早会像我一样条件反射的打这条命令的 $ sudo apt-get install subversion subversion-tools $cd /data/subversion   $ svnadmin create ExampleProject #建立SVN项目ExampleProject 修改ExampleProject下的passwd 建立用户名，authz建立工作组和权限。 如果您仅仅只是在内网中使用SVN的话，到这一步其实已经结束了，直接执行 $sudo  svnserve -d -r /data/subversion   之后就netstat -an可以看到3690的监听就说明svn的服务已经起来了，可以通过TortroseSVN这类的工具连接server://IP/ExampleProject的方式进行访问。 如果你需要通过http方式访问的话，那么继续。 $ sudo apt-get install mod_svn apache2 编辑/etc/apache2/mods-available/dav_svn.conf，在末尾加上： &#60;Location /svn/&#62;         DAV svn         SVNParentPath /data/subversion         AuthType Basic         AuthName "SVN repository"         AuthUserFile /data/subversion/.htpasswd [...]]]></description>
			<content:encoded><![CDATA[<p>SVN虽说已经老了，可能逐步要被Git这类的新型版本控制服务软件代替了。但就单单兼容性和整合度来说，唯一与之媲美的只有更加古老的CVS了。</p>
<p>总之，没什么可以解释的，直接切入正题吧。服务器又是我近期一贯使用的Ubuntu Server。版本是1004 LTS。</p>
<p>$sudo apt-get update #迟早会像我一样条件反射的打这条命令的<br />
$ sudo apt-get install subversion subversion-tools</p>
<p><span id="more-1380"></span></p>
<p>$cd /data/subversion  <br />
$ svnadmin create ExampleProject #建立SVN项目ExampleProject<br />
修改ExampleProject下的passwd 建立用户名，authz建立工作组和权限。</p>
<p>如果您仅仅只是在内网中使用SVN的话，到这一步其实已经结束了，直接执行<br />
$sudo  svnserve -d -r /data/subversion  <br />
之后就netstat -an可以看到3690的监听就说明svn的服务已经起来了，可以通过<a rel="nofollow" target="_blank" href="http://tortoisesvn.net/downloads.html" target="_blank">TortroseSVN</a>这类的工具连接server://IP/ExampleProject的方式进行访问。</p>
<p>如果你需要通过http方式访问的话，那么继续。</p>
<p>$ sudo apt-get install mod_svn apache2</p>
<p>编辑/etc/apache2/mods-available/dav_svn.conf，在末尾加上：</p>
<pre>&lt;Location /svn/&gt;
        DAV svn
        SVNParentPath /data/subversion

        AuthType Basic
        AuthName "SVN repository"

        AuthUserFile /data/subversion/.htpasswd
        require valid-user

        &lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;
                Require valid-user
        &lt;/LimitExcept&gt;
&lt;/Location&gt;</pre>
<p>重启apache2<br />
$sudo apache2ctl restart</p>
<p>$htpasswd -c /data/subversion/.htpasswd UserName1</p>
<p>$htpasswd -m /data/subversion/.htpasswd UserName2 注意，参数变了！</p>
<p>之前编辑的passwd文件可以不要理会了，直接编辑authz文件的工作组和权限就好了。</p>
<p>如果之前一直都没有问题的话，直接连接server://IP/svn/ExampleProject就可以访问了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/01/05/%e5%ae%89%e8%a3%85subversion%e6%9c%8d%e5%8a%a1%e5%99%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从GAE看网站架构趋势</title>
		<link>http://www.litrin.net/2010/12/21/%e4%bb%8egae%e7%9c%8b%e7%bd%91%e7%ab%99%e6%9e%b6%e6%9e%84%e8%b6%8b%e5%8a%bf/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e4%25bb%258egae%25e7%259c%258b%25e7%25bd%2591%25e7%25ab%2599%25e6%259e%25b6%25e6%259e%2584%25e8%25b6%258b%25e5%258a%25bf</link>
		<comments>http://www.litrin.net/2010/12/21/%e4%bb%8egae%e7%9c%8b%e7%bd%91%e7%ab%99%e6%9e%b6%e6%9e%84%e8%b6%8b%e5%8a%bf/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 01:59:53 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[站长的blog]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[GAE]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[业界话题]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1372</guid>
		<description><![CDATA[在Google App Engine做了几个东西。从当初觉得这个平台的迥然不同，直到现在逐步了解了这个平台的逻辑架构。作为Google的一款成功的作品，相信GAE的很多东西将会陆陆续续被模仿和抄袭，直到真正影响到我们。本文就以我个人的理解，谈谈GAE将会给今后的网站架构带来哪些革命性的东西。 首当其冲的应该算是云技术，但这个技术总体上属于物理层的技术，况且云已经成为公认的技术趋势。这里主要是谈下网站的架构，云技术相对关系较为偏离，我也就不再探讨了。 BigTable数据库 一开始接触下来的GAE，最感觉不适应的就非它的“数据存储”技术。通常用惯了SQL，用了GAE觉得数据设计上很要有很大的转变。 GAE的“数据库”感觉就是一个巨大的List，每一条记录都是key-value的对应关系。当然起初是无法满足很多传统上的数据结构。不过如果你能够在数据结构设计上打破SQL的限制，通过极端灵活的Key-value, key-value, key-value，你就能发觉这样的框架事实上比传统的SQL更适合网站。 说mysql比oracle在网站实现上的优势并非是因为它功能的强大，而是它速度快，结构简单。尽管有人戏称mysql“裸奔”，但无可否认的就是这种“裸奔”的效果带来的mysql的成功。GAE的数据库比mysql还要“裸奔”，但更快的响应将会是SQL永远无法企及的。FaceBook之前也抛弃了SQL亦证明了这一点。 此外整站之间的数据复制也算是革新之一。 多通道的融合 GAE整合了mail，xmpp，跨域验证等一系列的通道也算是特色之一，想必很多人会认为google这是在捆绑自己的产品。作为之前的门户网站的特色，每家人都会有一个自己的邮箱，一个自己的聊天工具，以及一系列自己的产品捆绑在内。GAE的创新在于用户只需要一个自己的google帐户就可以实现捆绑所有的gae服务。这是一个真正意义上的以用户为本。 Xmpp的捆绑还意味着EDM之后，将来IM营销或者类似的IM推送将会逐步成为一个产业。或者更进一步，IM机器人或者类似的技术将会一定程度上取代现有人人对话模式。当然，这需要一段时间，但至少个人认为目前大量的taobao网店需要这种技术^_^。 精巧的运维界面 相信GAE的后他大家也会印象深刻，能对每一个模块进行精确的监控，已经让运维的工作从翻阅日志的文本化提升到了图形化。粒度也更为精准，如果能配合Analytics之类的数据，完全可以实现智能化的运维。 RSS XML SOAP 网址抓取&#8230; 其实这也不算是什么革新，Web2.0时代的开始就是以此为标志的。但事实上单单从开发库中各个库的名称都叫API来看，就可以明白，其实整个GAE就是构建在这些基础之上的。SOAP成为了各个模块之间的粘合剂。 这个带来的优势就是，无需关心这个库那个库——好像本站技术性文档的大部分都是解决的“库问题”。各自统一接口，加速了开发的进程。]]></description>
			<content:encoded><![CDATA[<p>在Google App Engine做了几个东西。从当初觉得这个平台的迥然不同，直到现在逐步了解了这个平台的逻辑架构。作为Google的一款成功的作品，相信GAE的很多东西将会陆陆续续被模仿和抄袭，直到真正影响到我们。本文就以我个人的理解，谈谈GAE将会给今后的网站架构带来哪些革命性的东西。</p>
<p>首当其冲的应该算是云技术，但这个技术总体上属于物理层的技术，况且云已经成为公认的技术趋势。这里主要是谈下网站的架构，云技术相对关系较为偏离，我也就不再探讨了。</p>
<p><span id="more-1372"></span></p>
<p><strong>BigTable数据库</strong></p>
<p>一开始接触下来的GAE，最感觉不适应的就非它的“数据存储”技术。通常用惯了SQL，用了GAE觉得数据设计上很要有很大的转变。<br />
GAE的“数据库”感觉就是一个巨大的List，每一条记录都是key-value的对应关系。当然起初是无法满足很多传统上的数据结构。不过如果你能够在数据结构设计上打破SQL的限制，通过极端灵活的Key-value, key-value, key-value，你就能发觉这样的框架事实上比传统的SQL更适合网站。<br />
说mysql比oracle在网站实现上的优势并非是因为它功能的强大，而是它速度快，结构简单。尽管有人戏称mysql“裸奔”，但无可否认的就是这种“裸奔”的效果带来的mysql的成功。GAE的数据库比mysql还要“裸奔”，但更快的响应将会是SQL永远无法企及的。FaceBook之前也抛弃了SQL亦证明了这一点。</p>
<p>此外整站之间的数据复制也算是革新之一。</p>
<p><strong>多通道的融合</strong></p>
<p>GAE整合了mail，xmpp，跨域验证等一系列的通道也算是特色之一，想必很多人会认为google这是在捆绑自己的产品。作为之前的门户网站的特色，每家人都会有一个自己的邮箱，一个自己的聊天工具，以及一系列自己的产品捆绑在内。GAE的创新在于用户只需要一个自己的google帐户就可以实现捆绑所有的gae服务。这是一个真正意义上的以用户为本。<br />
Xmpp的捆绑还意味着EDM之后，将来IM营销或者类似的IM推送将会逐步成为一个产业。或者更进一步，IM机器人或者类似的技术将会一定程度上取代现有人人对话模式。当然，这需要一段时间，但至少个人认为目前大量的taobao网店需要这种技术^_^。</p>
<p><strong>精巧的运维界面</strong></p>
<p>相信GAE的后他大家也会印象深刻，能对每一个模块进行精确的监控，已经让运维的工作从翻阅日志的文本化提升到了图形化。粒度也更为精准，如果能配合Analytics之类的数据，完全可以实现智能化的运维。</p>
<p><strong>RSS XML </strong><strong>SOAP </strong>网址抓取&#8230;</p>
<p>其实这也不算是什么革新，Web2.0时代的开始就是以此为标志的。但事实上单单从开发库中各个库的名称都叫API来看，就可以明白，其实整个GAE就是构建在这些基础之上的。SOAP成为了各个模块之间的粘合剂。<br />
这个带来的优势就是，无需关心这个库那个库——好像<a href="http://www.litrin.net/" target="_blank">本站</a>技术性文档的大部分都是解决的“库问题”。各自统一接口，加速了开发的进程。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/12/21/%e4%bb%8egae%e7%9c%8b%e7%bd%91%e7%ab%99%e6%9e%b6%e6%9e%84%e8%b6%8b%e5%8a%bf/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ubuntu下安装Nginx+php(FastCGI)</title>
		<link>http://www.litrin.net/2010/10/27/ubuntu%e4%b8%8b%e5%ae%89%e8%a3%85nginxphpfastcgi/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ubuntu%25e4%25b8%258b%25e5%25ae%2589%25e8%25a3%2585nginxphpfastcgi</link>
		<comments>http://www.litrin.net/2010/10/27/ubuntu%e4%b8%8b%e5%ae%89%e8%a3%85nginxphpfastcgi/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 04:46:13 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1330</guid>
		<description><![CDATA[Nginx是近期最火的www服务器软件，它的种种优势这里就不在累述了，直接进入正题吧。 安装nginx 老一套的把戏 sudo apt-get install nginx 安装好之后sudo /etc/init.d/nginx restart 启动服务，正常情况下，你应该可以访问它获得经典的Welcome to nginx!欢迎界面。 安装php5 不同于apache的mod方式，nginx只限于fastcgi模式调用php。说道fastcgi，之前一直有兄弟问过我CGI和FastCGI的区别。其实FastCGI就是一个预先启动的进程，减少了CGI方式每次启动解释器的资源耗用。当然，这个方式带来的缺陷就是很容易因为解释器的挂死而失效。 sudo apt-get install php5-cgi 修改nginx的配置，使其支持php5 sudo /etc/nginx/sites-available/default location ~ \.php$ { fastcgi_pass   127.0.0.1:9000; fastcgi_index  index.php; fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name; include fastcgi_params; } 需要注意的是，默认nginx默认配置中注释掉的那一段中对于fastcgi_param的那段配置是有问题的，需要设置正确的路径。 如果你重启nginx的话，这里是无法正常使用php的，原理是php的fastcgi进程还没有启动。 sudo php-cgi -b 127.0.0.1:9000  &#38; //与上面的fastcgi_pass设置是同一端口 正常情况下，nginx已经支持了php。 由于这种方式容易出现问题导致php失效。这里我建议使用spawn-fcgi守护进程。 sudo apt-get install spawn-fcgi sudo spawn-fcgi -a 127.0.0.1 -p [...]]]></description>
			<content:encoded><![CDATA[<p>Nginx是近期最火的www服务器软件，它的种种优势这里就不在累述了，直接进入正题吧。</p>
<p><strong>安装nginx</strong><br />
老一套的把戏 sudo apt-get install nginx</p>
<p>安装好之后sudo /etc/init.d/nginx restart 启动服务，正常情况下，你应该可以访问它获得经典的Welcome to nginx!欢迎界面。</p>
<p><span id="more-1330"></span><strong>安装php5</strong></p>
<p>不同于apache的mod方式，nginx只限于fastcgi模式调用php。说道fastcgi，之前一直有兄弟问过我CGI和FastCGI的区别。其实FastCGI就是一个预先启动的进程，减少了CGI方式每次启动解释器的资源耗用。当然，这个方式带来的缺陷就是很容易因为解释器的挂死而失效。</p>
<p>sudo apt-get install php5-cgi</p>
<p><strong>修改nginx的配置，使其支持php5</strong></p>
<p>sudo /etc/nginx/sites-available/default</p>
<pre>location ~ \.php$ {
 fastcgi_pass   127.0.0.1:9000;
 fastcgi_index  index.php;
 fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name;
 include fastcgi_params;
 }
</pre>
<p>需要注意的是，默认nginx默认配置中注释掉的那一段中对于fastcgi_param的那段配置是有问题的，需要设置正确的路径。</p>
<p>如果你重启nginx的话，这里是无法正常使用php的，原理是php的fastcgi进程还没有启动。</p>
<p>sudo php-cgi -b 127.0.0.1:9000  &amp; //与上面的fastcgi_pass设置是同一端口</p>
<p>正常情况下，nginx已经支持了php。</p>
<p>由于这种方式容易出现问题导致php失效。这里我建议使用spawn-fcgi守护进程。</p>
<p>sudo apt-get install spawn-fcgi</p>
<p>sudo spawn-fcgi -a 127.0.0.1 -p 9000 -c 5 -f /usr/bin/php5-cgi //其中的 -c意味着同时同时启动5个进程</p>
<p>为了更加方便，不妨修改下nginx的启动脚本</p>
<p>sudo nano /etc/init.d/nginx //修改</p>
<pre>start)
 echo -n "Starting $DESC: "
 test_nginx_config
 start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
 --exec $DAEMON -- $DAEMON_OPTS || true
 echo -n "Starting Php FastCGI"
 /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -c 5 -f /usr/bin/php5-cgi
 echo "$NAME."
</pre>
<pre>stop)
 echo -n "Stopping $DESC: "
 start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
 --exec $DAEMON || true
 echo -n "Stopping Php FastCGI"
 killall php5-cgi
 echo "$NAME."
 ;;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/10/27/ubuntu%e4%b8%8b%e5%ae%89%e8%a3%85nginxphpfastcgi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ubuntu上Xen的快速部署</title>
		<link>http://www.litrin.net/2010/10/08/ubuntu%e4%b8%8axen%e7%9a%84%e5%bf%ab%e9%80%9f%e9%83%a8%e7%bd%b2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ubuntu%25e4%25b8%258axen%25e7%259a%2584%25e5%25bf%25ab%25e9%2580%259f%25e9%2583%25a8%25e7%25bd%25b2</link>
		<comments>http://www.litrin.net/2010/10/08/ubuntu%e4%b8%8axen%e7%9a%84%e5%bf%ab%e9%80%9f%e9%83%a8%e7%bd%b2/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 02:02:29 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1324</guid>
		<description><![CDATA[上篇CentOS上Xen的快速部署中给的承诺，现在兑现。 注意的是本文的实例采用的是Ubuntu804 Server的LTS版本，采用这个版本而不是习惯上采用最新版本的Ubuntu主要是考虑到几个因素： 至少在904之后，Ubuntu从支持库中移除了Kernel-xen的包，仅保留xen-server的支持包。这也就意味着Xen已经得不到官方支持，804成了目前唯一提供官方支持的xen版本。当然你可以手工编译自己的内核或者使用debian的对应包强行安装Xen，但出错的概率比较大（本人在1004的版本上尝试过几次才顺利启动）。 1004的grub设置变动很大，尚没有搞懂手动修改启动顺序的正确方法。设置错误会直接损坏grub导致无法启动。 这次主机比上次的好，至少支持硬件虚拟化，方便很多。 安装Xen支持 Ubuntu的标志性命令，非常容易。 #sudo apt-get install ubuntu-xen-server xen 如果使用的是804以后的版本，在此之后，如果使用debian包，则下载linux linux-modules linux-headers的带xen的包，并使用sudo dpkg -i 方法安装。 直接编译内核的同学，可以直接load /boot/config-xxxx-xxx文件并手工添加xen的支持(make menuconfig) 用xen内核重启。 #sudo nano /etc/xen/xend-config.sxp 将#(vnc-listen &#8217;127.0.0.1&#8242;)修改为(vnc-listen &#8217;0.0.0.0&#8242;) 安装来宾操作系统：方法1，直接安装 这种方式的前提是你的cpu支持硬件虚拟化 建立虚拟硬盘，如果使用实际裸分区，可跳过 #sudo mkdir /xen #sudo dd if=/dev/zero of=/xen/2003_disk bs=1 count=0 seek=5G 编辑配置文件/etc/xen/2003 kernel = '/usr/lib64/xen/boot/hvmloader'#64位内核，32位的则替换为'/usr/lib/xen/boot/hvmloader' builder='hvm' memory = 512 #内存 shadow_memory = 8 name [...]]]></description>
			<content:encoded><![CDATA[<p>上篇<a title="Permanent Link: CentOS上Xen的快速部署" rel="bookmark" href="http://www.litrin.net/2010/09/16/centos%e4%b8%8axen%e7%9a%84%e5%bf%ab%e9%80%9f%e9%83%a8%e7%bd%b2/">CentOS上Xen的快速部署</a>中给的承诺，现在兑现。</p>
<p>注意的是本文的实例采用的是Ubuntu804 Server的LTS版本，采用这个版本而不是习惯上采用最新版本的Ubuntu主要是考虑到几个因素：</p>
<ol>
<li>至少在904之后，Ubuntu从支持库中移除了Kernel-xen的包，仅保留xen-server的支持包。这也就意味着Xen已经得不到官方支持，804成了目前唯一提供官方支持的xen版本。当然你可以手工编译自己的内核或者使用<a rel="nofollow" target="_blank" href="http://security.debian.org/debian-security/pool/updates/main/l/">debian的对应包</a>强行安装Xen，但出错的概率比较大（本人在1004的版本上尝试过几次才顺利启动）。</li>
<li>1004的grub设置变动很大，尚没有搞懂手动修改启动顺序的正确方法。设置错误会直接损坏grub导致无法启动。</li>
</ol>
<p>这次主机比上次的好，至少支持硬件虚拟化，方便很多。</p>
<p><span id="more-1324"></span></p>
<p><strong>安装Xen支持</strong></p>
<p>Ubuntu的标志性命令，非常容易。<br />
#sudo apt-get install <a title="ubuntu" href="http://www.litrin.net/tag/ubuntu/">ubuntu</a>-xen-server xen</p>
<p>如果使用的是804以后的版本，在此之后，如果使用debian包，则下载linux linux-modules linux-headers的带xen的包，并使用sudo dpkg -i 方法安装。<br />
直接编译内核的同学，可以直接load /boot/config-xxxx-xxx文件并手工添加xen的支持(make menuconfig)</p>
<p>用xen内核重启。</p>
<p>#sudo nano /etc/xen/xend-config.sxp<br />
将#(vnc-listen &#8217;127.0.0.1&#8242;)修改为(vnc-listen &#8217;0.0.0.0&#8242;)</p>
<p><strong>安装来宾操作系统：方法1，直接安装</strong></p>
<p>这种方式的前提是你的cpu支持硬件虚拟化</p>
<p>建立虚拟硬盘，如果使用实际裸分区，可跳过<br />
#sudo mkdir /xen<br />
#sudo dd if=/dev/zero of=/xen/2003_disk bs=1 count=0 seek=5G<br />
编辑配置文件/etc/xen/2003</p>
<pre>kernel = '/usr/lib64/xen/boot/hvmloader'#64位内核，32位的则替换为'/usr/lib/xen/boot/hvmloader'
builder='hvm'
memory = 512 #内存
shadow_memory = 8
name = "2003"
vif = [ 'type=ioemu, bridge=eth0' ]
disk = [
   'tap:aio:/xen/2003_disk,hda,w',
   #'phy:/dev/sda5,hda,w', #挂装裸分区方式
   'phy:/dev/cdrom,hdc:cdrom,r'
]

boot = "dc"
device_model = '/usr/lib64/xen/bin/qemu-dm'
vnc=1
vncpasswd=''
serial='pty'
sdl=1</pre>
<p>启动虚拟机<br />
sudo xm create /etc/xen/2003</p>
<p>用vnc客户端直接连接主机，即可开始典型的图形化安装过程。</p>
<p><strong>安装来宾操作系统：方法2，xen-create-image</strong></p>
<p>sudo xen-create-image &#8211;hostname=xen-ubuntu &#8211;size=5gb &#8211;memory=256mb &#8211;partitions=with-data &#8211;dist=lucid &#8211;ip=192.168.103.101 &#8211;gateway=192.168.103.254 &#8211;netmask=255.255.254.0  &#8211;mirror=http://cn.archive.ubuntu.com/ubuntu  &#8211;boot &#8211;passwd &#8211;role udev &#8211;dir=/etc/xen &#8211;force</p>
<p>系统会自动完成xen的配置并从制定的源中下载安装操作系统。</p>
<p><strong>部分操作（照贴过来的）</strong></p>
<p>xm console &lt;NAME&gt; 连接到虚拟机控制台<br />
xm create &lt;NAME&gt; 根据配置文件创建主机，如果您一直follow之前的操作并且完成了虚拟主机的安装，这条命令实际上等于启动一台虚拟机<br />
xm shutdown &lt;NAME&gt; 关机<br />
xm reboot &lt;NAME&gt; 重启<br />
xm destroy &lt;NAME&gt; 删除主机<br />
xentop 各主机之前的资源占用情况</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/10/08/ubuntu%e4%b8%8axen%e7%9a%84%e5%bf%ab%e9%80%9f%e9%83%a8%e7%bd%b2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>FreeBSD ZFS版本升级的问题</title>
		<link>http://www.litrin.net/2010/09/10/freebsd-zfs%e7%89%88%e6%9c%ac%e5%8d%87%e7%ba%a7%e7%9a%84%e9%97%ae%e9%a2%98/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=freebsd-zfs%25e7%2589%2588%25e6%259c%25ac%25e5%258d%2587%25e7%25ba%25a7%25e7%259a%2584%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2010/09/10/freebsd-zfs%e7%89%88%e6%9c%ac%e5%8d%87%e7%ba%a7%e7%9a%84%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Fri, 10 Sep 2010 09:32:34 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[网络和安全]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1308</guid>
		<description><![CDATA[之前的文章,介绍FreeBSD下的ZFS。 FreeBSD 8.1比较吸引我的一个重要更新就是将ZFS从测试模块升级到了正式模块。这意味着Zfs已经足够的成熟和稳定了。 闲话不说，我这台主机是用zfs来做nfs服务器。刚升级到了FreeBSD 8.1 stable的版本。 首先，升级zpool的版本 #zpool upgrade -a 接着，升级zfs版本 #zfs upgrade -a 正常情况下zfs的升级就完成了。中间几乎没有延时。 由于zfs需要使用nfs，而且随着zfs成为了正式版本，原本有一个垃圾设置（设不设没效果）sharenfs 已经正式实现了。不去修改的话就会出现nfs被挂装但是无法访问文件的问题。 # zfs set sharenfs=yes  /YOURPATCH 由于默认i386默认没有为zfs开启prefetch（预读），需要在/boot/load.conf中加入vfs.zfs.prefetch_disable=0。 同时，系统vm.kmem_size_max和vm.kmem_size两个设置如果过大的话可能会在系统拷贝大文件时吃光所有内存，设置请慎重。]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.litrin.net/2008/11/19/freebsd%e7%9a%84zfs/" target="_blank">之前的文章,介绍FreeBSD下的ZFS。</a></p>
<p>FreeBSD 8.1比较吸引我的一个重要更新就是将ZFS从测试模块升级到了正式模块。这意味着Zfs已经足够的成熟和稳定了。</p>
<p>闲话不说，我这台主机是用zfs来做nfs服务器。刚升级到了FreeBSD 8.1 stable的版本。</p>
<p><span id="more-1308"></span></p>
<p>首先，升级zpool的版本</p>
<p>#zpool upgrade -a</p>
<p>接着，升级zfs版本</p>
<p>#zfs upgrade -a</p>
<p>正常情况下zfs的升级就完成了。中间几乎没有延时。</p>
<p>由于zfs需要使用nfs，而且随着zfs成为了正式版本，原本有一个垃圾设置（设不设没效果）sharenfs 已经正式实现了。不去修改的话就会出现nfs被挂装但是无法访问文件的问题。</p>
<p># zfs set sharenfs=yes  /YOURPATCH</p>
<p>由于默认i386默认没有为zfs开启prefetch（预读），需要在/boot/load.conf中加入vfs.zfs.prefetch_disable=0。</p>
<p>同时，系统vm.kmem_size_max和vm.kmem_size两个设置如果过大的话可能会在系统拷贝大文件时吃光所有内存，设置请慎重。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/09/10/freebsd-zfs%e7%89%88%e6%9c%ac%e5%8d%87%e7%ba%a7%e7%9a%84%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>通过motd信息简化巡检操作</title>
		<link>http://www.litrin.net/2010/08/17/%e9%80%9a%e8%bf%87motd%e4%bf%a1%e6%81%af%e7%ae%80%e5%8c%96%e5%b7%a1%e6%a3%80%e6%93%8d%e4%bd%9c/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e9%2580%259a%25e8%25bf%2587motd%25e4%25bf%25a1%25e6%2581%25af%25e7%25ae%2580%25e5%258c%2596%25e5%25b7%25a1%25e6%25a3%2580%25e6%2593%258d%25e4%25bd%259c</link>
		<comments>http://www.litrin.net/2010/08/17/%e9%80%9a%e8%bf%87motd%e4%bf%a1%e6%81%af%e7%ae%80%e5%8c%96%e5%b7%a1%e6%a3%80%e6%93%8d%e4%bd%9c/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 01:57:41 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[solaris]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[桌面应用]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1300</guid>
		<description><![CDATA[作为一个Unix系统的管理员，手工巡检几乎成了工作中一个重要的部分。这里不放使用Linux的motd通告信息实现简单的信息通告，至少能省去了不少手工命令的时间。 motd即Message Of ToDay，每天的信息。大部分的固定文本信息放置在/etc/motd下，如果没有你可以直接创建一个，然后修改其中的内容制作一个主机登录Banner以便于区分多台主机。对于Ubuntu来说，特别是启用了server中“landscope管理系统”后，这里没有效果，你需要修改的文件为/etc/motd.tail。 对于部分相对比较保守的Unix版本而言剩下可供修改的并不多，只有通过/etc/issue的方法，除了使用现有的字符，issue还支持参数如下： /l 显示终端机接口号 /m 显示内核的硬件版本 /n 显示主机名 /o 显示 域名 /r 显示操作系统的版本，类似于uname -r  /t 显示本地端时间 /s 操作系统的名称 /v 操作系统的版本 对于比较激进的操作系统（ubuntu就曾经因为motd爆出安全漏洞）那就更灵活了。 Ubuntu： 修改/etc/init.d/bootmisc.sh脚本，其中： uname -snrvm &#62; /var/run/motd         [ -f /etc/motd.tail ] &#38;&#38; cat /etc/motd.tail &#62;&#62; /var/run/motd 我要加入uptime和df -h的信息就修改为： uname -snrvm &#62; /var/run/motd         [ -f /etc/motd.tail ] &#38;&#38; cat /etc/motd.tail &#62;&#62; /var/run/motd [...]]]></description>
			<content:encoded><![CDATA[<p>作为一个Unix系统的管理员，手工巡检几乎成了工作中一个重要的部分。这里不放使用Linux的motd通告信息实现简单的信息通告，至少能省去了不少手工命令的时间。</p>
<p>motd即Message Of ToDay，每天的信息。大部分的固定文本信息放置在/etc/motd下，如果没有你可以直接创建一个，然后修改其中的内容制作一个主机登录Banner以便于区分多台主机。对于Ubuntu来说，特别是启用了server中“landscope管理系统”后，这里没有效果，你需要修改的文件为/etc/motd.tail。</p>
<p><span id="more-1300"></span></p>
<p>对于部分相对比较保守的Unix版本而言剩下可供修改的并不多，只有通过/etc/issue的方法，除了使用现有的字符，issue还支持参数如下：</p>
<p>/l 显示终端机接口号<br />
/m 显示内核的硬件版本<br />
/n 显示主机名<br />
/o 显示 域名<br />
/r 显示操作系统的版本，类似于uname -r <br />
/t 显示本地端时间<br />
/s 操作系统的名称<br />
/v 操作系统的版本</p>
<p>对于比较激进的操作系统（ubuntu就曾经因为motd爆出安全漏洞）那就更灵活了。</p>
<p>Ubuntu：</p>
<p>修改/etc/init.d/bootmisc.sh脚本，其中：</p>
<pre class="bash" name='code'>        uname -snrvm &gt; /var/run/motd
        [ -f /etc/motd.tail ] &amp;&amp; cat /etc/motd.tail &gt;&gt; /var/run/motd</pre>
<p>我要加入uptime和df -h的信息就修改为：</p>
<pre class="bash" name='code'>        uname -snrvm &gt; /var/run/motd
        [ -f /etc/motd.tail ] &amp;&amp; cat /etc/motd.tail &gt;&gt; /var/run/motd
        uptime &gt;&gt; /var/run/motd
        df -h &gt;&gt; /var/run/motd</pre>
<p>重启服务：</p>
<p>/etc/init.d/bootmisc.sh stop<br />
/etc/init.d/bootmisc.sh start // 不支持restart reload等操作</p>
<p>登录查看，成功！</p>
<p>FreeBSD：</p>
<p>其实是一个原理，方式类似：</p>
<p>ee /etc/rc.d/motd</p>
<pre class="bash" name='code'>        uname -v | sed -e 's,^\([^#]*\) #\(.* [1-2][0-9][0-9][0-9]\).*/\([^\]*\) $,\1 (\3) #\2,' &gt; ${T}
        awk '{if (NR == 1) {if ($1 == "FreeBSD") {next} else {print "\n"$0}} else {print}}' &lt; /etc/motd &gt;&gt; ${T}</pre>
<p>改为：</p>
<pre class="bash" name='code'>        uname -v | sed -e 's,^\([^#]*\) #\(.* [1-2][0-9][0-9][0-9]\).*/\([^\]*\) $,\1 (\3) #\2,' &gt; ${T}
        awk '{if (NR == 1) {if ($1 == "FreeBSD") {next} else {print "\n"$0}} else {print}}' &lt; /etc/motd &gt;&gt; ${T}

        uptime &gt;&gt; ${T}
        df -h &gt;&gt; ${T} </pre>
<p>重启</p>
<p> /etc/rc.d/motd stop;  /etc/rc.d/motd start</p>
<p>成功！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/08/17/%e9%80%9a%e8%bf%87motd%e4%bf%a1%e6%81%af%e7%ae%80%e5%8c%96%e5%b7%a1%e6%a3%80%e6%93%8d%e4%bd%9c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个怪异的Cron问题</title>
		<link>http://www.litrin.net/2010/08/13/%e4%b8%80%e4%b8%aa%e6%80%aa%e5%bc%82%e7%9a%84cron%e9%97%ae%e9%a2%98/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e4%25b8%2580%25e4%25b8%25aa%25e6%2580%25aa%25e5%25bc%2582%25e7%259a%2584cron%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2010/08/13/%e4%b8%80%e4%b8%aa%e6%80%aa%e5%bc%82%e7%9a%84cron%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 03:24:22 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[redhat]]></category>
		<category><![CDATA[solaris]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1297</guid>
		<description><![CDATA[一个朋友向我咨询他遇到的一个问题。 Centos的操作系统，自然是主流应用的WWW。近期无缘无故的Cron失效，所有的任务都无法执行。多次重启主机，重启Cron服务均是如此。 起先我由于没有拿到控制台，怀疑是Cron经典的环境变量问题，修改了半天也是白忙。总算此兄开恩，将root的权限给了我。:) 登入主机，crontab -l，所有命令都正常，单独执行也都OK。跑到/var/spool/cron下也没有发现有什么文件权限之类的问题。 每天都被cron mail挤爆信箱的我觉的从邮件入手吧。谁知那位兄弟没有配置邮件系统，而且直接disable了sendmail服务。 这里需要说明的是，Crontab 默认会将定时执行的结果通过mail返回给用户。如果没有启动Sendmail服务，系统（确切的应该是sendmail程序）将会把每一个结果保存为一个文件，放置在/var/spool/clientmqueue下。 cd /var/spool/clientmqueue 呵呵，果然！等了半个多小时愣是没有给list出来。du -sh 也是个费时费力的操作了。 mv * 太慢，直接 ls &#124; xargs rm 操作，清空了所有的文件，重试了一下，搞定！ 解决此类方法的建议： 开启sendmail服务，这是最佳途径。 每条命令使用 &#8216;&#62;&#62;&#8217;  指向一个日志文件，如果觉得返回没有必要，就直接  &#62;&#62; /dev/null 2&#62;&#38;1 丢弃掉。 更加变态的方式就是再加一条cron，定期清空 /var/spool/clientmqueue PS： 之前没有弄过，完成测试的时候才理清的一个Cron问题： 30 3 * * 1 dosomething ,是每周一3点半执行是确信无疑的了。 30 3 1 * 1 dosomething, 是当1号是周一的时候执行吗？不是！是1号，或者周一的时候执行。crontab中的星期是一个“或”的概念，而非其他的“和”的概念。]]></description>
			<content:encoded><![CDATA[<p>一个朋友向我咨询他遇到的一个问题。</p>
<p>Centos的操作系统，自然是主流应用的WWW。近期无缘无故的Cron失效，所有的任务都无法执行。多次重启主机，重启Cron服务均是如此。</p>
<p>起先我由于没有拿到控制台，怀疑是Cron经典的环境变量问题，修改了半天也是白忙。总算此兄开恩，将root的权限给了我。:)</p>
<p><span id="more-1297"></span></p>
<p>登入主机，crontab -l，所有命令都正常，单独执行也都OK。跑到/var/spool/cron下也没有发现有什么文件权限之类的问题。</p>
<p>每天都被cron mail挤爆信箱的我觉的从邮件入手吧。谁知那位兄弟没有配置邮件系统，而且直接disable了sendmail服务。</p>
<p>这里需要说明的是，Crontab 默认会将定时执行的结果通过mail返回给用户。如果没有启动Sendmail服务，系统（确切的应该是sendmail程序）将会把每一个结果保存为一个文件，放置在/var/spool/clientmqueue下。</p>
<p>cd /var/spool/clientmqueue 呵呵，果然！等了半个多小时愣是没有给list出来。du -sh 也是个费时费力的操作了。</p>
<p>mv * 太慢，直接 ls | xargs rm 操作，清空了所有的文件，重试了一下，搞定！</p>
<p>解决此类方法的建议：</p>
<ol>
<li>开启sendmail服务，这是最佳途径。</li>
<li>每条命令使用 &#8216;&gt;&gt;&#8217;  指向一个日志文件，如果觉得返回没有必要，就直接  &gt;&gt; /dev/null 2&gt;&amp;1 丢弃掉。</li>
<li>更加变态的方式就是再加一条cron，定期清空 /var/spool/clientmqueue</li>
</ol>
<p>PS：</p>
<p>之前没有弄过，完成测试的时候才理清的一个Cron问题：</p>
<p>30 3 * * 1 dosomething ,是每周一3点半执行是确信无疑的了。<br />
30 3 1 * 1 dosomething, 是当1号是周一的时候执行吗？不是！是1号，或者周一的时候执行。crontab中的星期是一个“或”的概念，而非其他的“和”的概念。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/08/13/%e4%b8%80%e4%b8%aa%e6%80%aa%e5%bc%82%e7%9a%84cron%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>利用Ubuntu搭建私有云</title>
		<link>http://www.litrin.net/2010/08/11/%e5%88%a9%e7%94%a8ubuntu%e6%90%ad%e5%bb%ba%e7%a7%81%e6%9c%89%e4%ba%91/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%2588%25a9%25e7%2594%25a8ubuntu%25e6%2590%25ad%25e5%25bb%25ba%25e7%25a7%2581%25e6%259c%2589%25e4%25ba%2591</link>
		<comments>http://www.litrin.net/2010/08/11/%e5%88%a9%e7%94%a8ubuntu%e6%90%ad%e5%bb%ba%e7%a7%81%e6%9c%89%e4%ba%91/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 06:30:09 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1293</guid>
		<description><![CDATA[这一段时间大家都在谈云计算，Ubuntu也是在它的server版本中增加了Eucalyptus软件包，用以支持一个与亚马逊EC2兼容的企业云。作为一个弹性扩展方式，Cloud的确很方便。 闲来无事，测试了一下。报下配置，理论上用虚拟机是完全可以的： 1台Dell 台式机，用以安装Cluster，双核+2G+250G；一台Asus本本，用以安装Node，双核+2G+160G；当然，我的测试中还有我自己的ubuntu本本充当客户端，这台机器可以省略，将客户端放在上述主机中的任何一台——前提是只要不是生产环境。 1. 安装Cluster主机 貌似这里没什么好说的，我用的是Ubuntu 910 x86_64 server，我的网络已经开启了DHCP（ip:192.168.103.223），没有太多的配置。安装的最后，系统会询问你安装的软件包。选择 Install Ubuntu Enterprise Cloud Cluster。系统会要求配置postfix以发送验证邮件，internet Site选项即可。Name your cluster 也没什么特别，我就用了My Cloud。 a list of available IP addresses on your network 选项是用于虚拟机的IP段，这里用一个空的Ip段即可。 2. 安装Node主机 同样没什么可以多说的，但要求Node主机跟Cluster在同一个网段内即可（ip:192.168.103.233）。选择 Install Ubuntu Enterprise Cloud Node。由于Cluster主机已经启动了，向导直接就通过了。 3. 调试Cloud 在Cluster上执行 sudo euca_conf &#8211;no-rsync &#8211;discover-nodes ，系统会提示发现Node并将Node加如Cloud。 用客户端访问https://192.168.103.223:8443 (建议使用Linux+Firefox)，默认的用户名和密码都是admin，比较汗。登录后在Credentials选项卡中download Credentials下载打包好的验证文件。我的文件名~/euca2-admin-x509.zip    4. 配置客户端  据说有一个基于Firefox插件的图形化客户端，没有测试过，各位可以测试下。我还是比较笨的用命令行。 sudo apt-get install ec2-api-tools   euca2ools mkdir ~/.euca cd ~/.euca unzip ~/euca2-admin-x509.zip chmod -R 0700 ~/.euca  ~/.euca/eucarc  echo ”[ -r ~/.euca/eucarc ] &#38;&#38; . ~/.euca/eucarc” &#62;&#62; ~/.bashrc 重新开一个终端，让配置生效，或者。。。重启吧。]]></description>
			<content:encoded><![CDATA[<p>这一段时间大家都在谈云计算，Ubuntu也是在它的server版本中增加了Eucalyptus软件包，用以支持一个与亚马逊EC2兼容的企业云。作为一个弹性扩展方式，Cloud的确很方便。</p>
<p>闲来无事，测试了一下。报下配置，理论上用虚拟机是完全可以的：<br />
1台Dell 台式机，用以安装Cluster，双核+2G+250G；一台Asus本本，用以安装Node，双核+2G+160G；当然，我的测试中还有我自己的ubuntu本本充当客户端，这台机器可以省略，将客户端放在上述主机中的任何一台——前提是只要不是生产环境。</p>
<p><span id="more-1293"></span></p>
<p><strong>1. 安装Cluster主机</strong></p>
<p>貌似这里没什么好说的，我用的是Ubuntu 910 x86_64 server，我的网络已经开启了DHCP（ip:192.168.103.223），没有太多的配置。安装的最后，系统会询问你安装的软件包。选择 Install Ubuntu Enterprise Cloud Cluster。系统会要求配置postfix以发送验证邮件，internet Site选项即可。Name your cluster 也没什么特别，我就用了My Cloud。<br />
a list of available IP addresses on your network 选项是用于虚拟机的IP段，这里用一个空的Ip段即可。</p>
<p><strong>2. 安装Node主机</strong></p>
<p>同样没什么可以多说的，但要求Node主机跟Cluster在同一个网段内即可（ip:192.168.103.233）。选择 Install Ubuntu Enterprise Cloud Node。由于Cluster主机已经启动了，向导直接就通过了。</p>
<p><strong>3. 调试Cloud</strong></p>
<p>在Cluster上执行 sudo euca_conf &#8211;no-rsync &#8211;discover-nodes ，系统会提示发现Node并将Node加如Cloud。<br />
用客户端访问<a rel="nofollow" target="_blank" href="https://192.168.103.223:8443">https://192.168.103.223:8443</a> (建议使用Linux+Firefox)，默认的用户名和密码都是admin，比较汗。登录后在Credentials选项卡中download Credentials下载打包好的验证文件。我的文件名~/euca2-admin-x509.zip   </p>
<p><strong>4. 配置客户端</strong> </p>
<p>据说有一个基于<a rel="nofollow" target="_blank" href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=609" target="_blank">Firefox插件的图形化客户端</a>，没有测试过，各位可以测试下。我还是比较笨的用命令行。</p>
<p>sudo apt-get install ec2-api-tools   euca2ools</p>
<p>mkdir ~/.euca<br />
cd ~/.euca<br />
unzip ~/euca2-admin-x509.zip<br />
chmod -R 0700 ~/.euca<br />
 ~/.euca/eucarc <br />
echo ”[ -r ~/.euca/eucarc ] &amp;&amp; . ~/.euca/eucarc” &gt;&gt; ~/.bashrc</p>
<p>重新开一个终端，让配置生效，或者。。。重启吧。</p>
<p><strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/08/11/%e5%88%a9%e7%94%a8ubuntu%e6%90%ad%e5%bb%ba%e7%a7%81%e6%9c%89%e4%ba%91/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SQLServer的聚合索引问题</title>
		<link>http://www.litrin.net/2010/07/05/sqlserver%e7%9a%84%e8%81%9a%e5%90%88%e7%b4%a2%e5%bc%95%e9%97%ae%e9%a2%98/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sqlserver%25e7%259a%2584%25e8%2581%259a%25e5%2590%2588%25e7%25b4%25a2%25e5%25bc%2595%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2010/07/05/sqlserver%e7%9a%84%e8%81%9a%e5%90%88%e7%b4%a2%e5%bc%95%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 06:08:45 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[DataBase]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1272</guid>
		<description><![CDATA[ 有台SqlServer2000的主机，主要是用来纪录日志的。系统配置属于双核+2G，不算很高，目前数据文件大约在2G左右。高峰时每分钟100次写入左右。 这些天，系统在部分时间（不一定是高峰期），会出现大量的堵塞。堵塞每次持续时间最多5分钟，之后要么自己恢复，要么系统IO吃光。已经排除了病毒或者网络的问题。 利用sqlserver自带的“事件探查器”发觉大多数的阻塞都是跟其中的一个表有关。这个表数据有3M行的数据，并建立了聚合索引。 反复优化索引，系统没有起色。狠心删除了主键的聚合索引，问题竟奇迹般的解决了！ 将聚合索引索引转为非聚合索引之后，系统再也没有出现故障。 分析下来大致如此： 系统纪录的日志文件是以时间倒序为聚合索引，但由于日志的记入方式决定了数据的纪录方式并非按照顺序。即会出现新纪录比旧纪录先写入的情况。 3百万行的数据大约有500~700M的磁盘空间占用，按照聚合索引占整体数据大小的30%来计，索引大小大约为200M左右。 由于聚合索引是按照固定的顺序纪录，出现乱序的数据写入，sqlserver就必须重建聚合索引，每次都要重新生成这200M。 200M的数据需要相当长的时间，在此期间如果再有数据记入，行锁就上升为表锁，故出现系统阻塞。而之前一直没有出现问题，只不过是由于数据小，而索引生成的很快罢了。 所以建议聚合索引的使用前请确认在大数据的情况下务必保证新加的数据都在文件的末尾，这样系统就不会因为频繁的重建索引而造成数据阻塞或者IO的浪费。]]></description>
			<content:encoded><![CDATA[<p> 有台SqlServer2000的主机，主要是用来纪录日志的。系统配置属于双核+2G，不算很高，目前数据文件大约在2G左右。高峰时每分钟100次写入左右。</p>
<p>这些天，系统在部分时间（不一定是高峰期），会出现大量的堵塞。堵塞每次持续时间最多5分钟，之后要么自己恢复，要么系统IO吃光。已经排除了病毒或者网络的问题。<br />
<span id="more-1272"></span></p>
<p>利用sqlserver自带的“事件探查器”发觉大多数的阻塞都是跟其中的一个表有关。这个表数据有3M行的数据，并建立了聚合索引。<br />
反复优化索引，系统没有起色。狠心删除了主键的聚合索引，问题竟奇迹般的解决了！<br />
将聚合索引索引转为非聚合索引之后，系统再也没有出现故障。</p>
<p>分析下来大致如此：</p>
<ol>
<li>系统纪录的日志文件是以时间倒序为聚合索引，但由于日志的记入方式决定了数据的纪录方式并非按照顺序。即会出现新纪录比旧纪录先写入的情况。</li>
<li>3百万行的数据大约有500~700M的磁盘空间占用，按照聚合索引占整体数据大小的30%来计，索引大小大约为200M左右。</li>
<li>由于聚合索引是按照固定的顺序纪录，出现乱序的数据写入，sqlserver就必须重建聚合索引，每次都要重新生成这200M。</li>
<li>200M的数据需要相当长的时间，在此期间如果再有数据记入，行锁就上升为表锁，故出现系统阻塞。而之前一直没有出现问题，只不过是由于数据小，而索引生成的很快罢了。</li>
</ol>
<p>所以建议聚合索引的使用前请确认在大数据的情况下务必保证新加的数据都在文件的末尾，这样系统就不会因为频繁的重建索引而造成数据阻塞或者IO的浪费。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/07/05/sqlserver%e7%9a%84%e8%81%9a%e5%90%88%e7%b4%a2%e5%bc%95%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordPress google-syntax-highlighter 插件的问题</title>
		<link>http://www.litrin.net/2010/06/12/wordpress-google-syntax-highlighter-%e6%8f%92%e4%bb%b6%e7%9a%84%e9%97%ae%e9%a2%98/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wordpress-google-syntax-highlighter-%25e6%258f%2592%25e4%25bb%25b6%25e7%259a%2584%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2010/06/12/wordpress-google-syntax-highlighter-%e6%8f%92%e4%bb%b6%e7%9a%84%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Sat, 12 Jun 2010 09:16:08 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[站长的blog]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">/?p=1251</guid>
		<description><![CDATA[小站上一直使用Google Syntax Highlighter for WordPress 插件实现代码高亮，就在上一篇文章发布之后，我发现了这个插件中存在的一个bug：windows + IE 8无法正常加亮python代码。 查阅了官方网站，发掘Google Syntax Highlighter for WordPress插件用的1.5版已经停止更新，只能使用2.0以上的版本，但2.0版本和之前的版本又存在兼容的问题，直接替换是不行的。不想每篇文章的修改&#60;pre&#62;标记，那就改插件喽。 下载最新版本的Syntax Highlighter，解压。 将原来/wp-content/plugins/google-syntax-highlighter目录下的Scripts和Styles目录清空后，分别用新版本的对应路径中的文件替换，注意大小写方式请不要变动。 修改google_syntax_highlighter.php文件，我用了minify的插件，这里就直接调用了。 &#60;?php function insert_header() {  $current_path = get_option('siteurl') .'/wp-content/plugins/' . basename(dirname(__FILE__)) .'/';  ?&#62;  &#60;link href="&#60;?php echo $current_path; ?&#62;Styles/shCore.css" type="text/css" rel="stylesheet" /&#62;  //可根据自己的需要选择不同的Styles &#60;link href="&#60;?php echo $current_path; ?&#62;Styles/shThemeEclipse.css" type="text/css" rel="stylesheet" /&#62;  &#60;?php } function insert_footer(){ $current_path = 'wp-content/plugins/' . [...]]]></description>
			<content:encoded><![CDATA[<p>小站上一直使用Google Syntax Highlighter for WordPress 插件实现代码高亮，就在上一篇文章发布之后，我发现了这个插件中存在的一个bug：windows + IE 8无法正常加亮python代码。</p>
<p>查阅了官方网站，发掘Google Syntax Highlighter for WordPress插件用的1.5版已经停止更新，只能使用2.0以上的版本，但2.0版本和之前的版本又存在兼容的问题，直接替换是不行的。不想每篇文章的修改&lt;pre&gt;标记，那就改插件喽。</p>
<p><span id="more-1251"></span></p>
<ol>
<li>下载<a rel="nofollow" target="_blank" href="http://alexgorbatchev.com/downloads/grab.php?name=sh" target="_blank">最新版本的Syntax Highlighter</a>，解压。</li>
<li>将原来/wp-content/plugins/google-syntax-highlighter目录下的Scripts和Styles目录清空后，分别用新版本的对应路径中的文件替换，注意大小写方式请不要变动。</li>
<li>修改google_syntax_highlighter.php文件，我用了minify的插件，这里就直接调用了。</li>
</ol>
<pre class="php" name='code'>&lt;?php

function insert_header() {
 $current_path = get_option('siteurl') .'/wp-content/plugins/' . basename(dirname(__FILE__)) .'/';
 ?&gt;
 &lt;link href="&lt;?php echo $current_path; ?&gt;Styles/shCore.css" type="text/css" rel="stylesheet" /&gt;
 //可根据自己的需要选择不同的Styles
 &lt;link href="&lt;?php echo $current_path; ?&gt;Styles/shThemeEclipse.css" type="text/css" rel="stylesheet" /&gt;
 &lt;?php
}

function insert_footer(){
$current_path = 'wp-content/plugins/' . basename(dirname(__FILE__)) .'/';
 ?&gt;
&lt;?php
/*
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shCore.js"&gt;&lt;/script&gt;

&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shLegacy.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushCSharp.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushPhp.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushJScript.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushJava.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushVb.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushSql.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushXml.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushDelphi.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushPython.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushRuby.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushCss.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushCpp.js"&gt;&lt;/script&gt;
*/
&lt;script src="/wp-content/plugins/wp-minify/min/?b=&lt;?php echo $current_path; ?&gt;Scripts&amp;f=shCore.js,shLegacy.js,shBrushPhp.js,shBrushSql.js,shBrushPython.js"&gt;&lt;/script&gt;
&lt;script&gt;
dp.SyntaxHighlighter.ClipboardSwf = '&lt;?php echo $current_path; ?&gt;Scripts/clipboard.swf';
SyntaxHighlighter.all();
dp.SyntaxHighlighter.HighlightAll('code');
&lt;/script&gt;
&lt;?php
}
add_action('wp_head','insert_header');
add_action('wp_footer','insert_footer');
?&gt;</pre>
<p>测试，通过！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/06/12/wordpress-google-syntax-highlighter-%e6%8f%92%e4%bb%b6%e7%9a%84%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>GAE的数据导入问题</title>
		<link>http://www.litrin.net/2010/05/26/gae%e7%9a%84%e6%95%b0%e6%8d%ae%e5%af%bc%e5%85%a5%e9%97%ae%e9%a2%98/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gae%25e7%259a%2584%25e6%2595%25b0%25e6%258d%25ae%25e5%25af%25bc%25e5%2585%25a5%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2010/05/26/gae%e7%9a%84%e6%95%b0%e6%8d%ae%e5%af%bc%e5%85%a5%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Wed, 26 May 2010 01:58:28 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[GAE]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">/?p=1242</guid>
		<description><![CDATA[又是关于Google App Engine的问题。 根据GAE的官方文档，向GAE的存储区导入数据，导入了数次均出现问题，翻来覆去的无法成功。 CVS结构示例：1300428,浙江省嘉兴市,联通130卡 （一个手机号码的对应归属地列表） configfile: from google.appengine.ext import db from google.appengine.tools.bulkloader  import Loader class MobilePhone(db.Model):   Number = db.StringProperty()   Area = db.StringProperty()   BrandType = db.StringProperty() class MPLoader(Loader):   def __init__(self):     Loader.__init__(self, 'MobilePhone',                     [('Number', unicode),                      ('Area', unicode),                      ('BrandType', unicode),                      ]) loaders = [MPLoader] 主要分析了一下，问题分为几类。 1.验证不能通过的问题： 这个问题很多时候是一个低级错误，之前我曾经犯过类似的错误。在app.yaml中的handlers handlers: [...]]]></description>
			<content:encoded><![CDATA[<p>又是关于Google App Engine的问题。<br />
根据<a rel="nofollow" target="_blank" href="http://code.google.com/intl/zh-CN/appengine/docs/python/tools/uploadingdata.html" target="_blank">GAE的官方文档</a>，向GAE的存储区导入数据，导入了数次均出现问题，翻来覆去的无法成功。</p>
<p>CVS结构示例：1300428,浙江省嘉兴市,联通130卡 （一个手机号码的对应归属地列表）</p>
<p>configfile:</p>
<pre class="py" name="code" >
from google.appengine.ext import db
from google.appengine.tools.bulkloader  import Loader

class MobilePhone(db.Model):
  Number = db.StringProperty()
  Area = db.StringProperty()
  BrandType = db.StringProperty()

class MPLoader(Loader):
  def __init__(self):

    Loader.__init__(self, 'MobilePhone',
                    [('Number', unicode),
                     ('Area', unicode),
                     ('BrandType', unicode),
                     ])

loaders = [MPLoader]</pre>
<p>主要分析了一下，问题分为几类。</p>
<p><span id="more-1242"></span></p>
<p>1.验证不能通过的问题：</p>
<p>这个问题很多时候是一个低级错误，之前我曾经犯过类似的错误。在app.yaml中的handlers</p>
<p>handlers:<br />
- url: /remote_api<br />
  script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py<br />
  login: admin<br />
- url: /*<br />
  script: main.py</p>
<p>这个/*的配置必须放在最后。否则所有的访问都会直接匹配main.py自然出现问题。</p>
<p>2.跟编码有关的错误：</p>
<p>这个错误是GAE SDK的一个bug，恐怕对于ASCII系统的用户没什么关系，对于我们UTF-8，GB2312，ASCII已经昏倒的用户来说，这是个严重的问题。</p>
<p>在GAE的安装目录下 google\appengine\tools\bulkloader.py文件中2521行</p>
<pre class="python" name="code">
    for (name, converter), val in zip(self.__properties, values):
      if converter is bool and val.lower() in ('0', 'false', 'no'):
        val = False
      properties[name] = converter(val)</pre>
<p>修改为：</p>
<pre class="python" name="code" >    for (name, converter), val in zip(self.__properties, values):
        if converter is bool and val.lower() in ('0', 'false', 'no'):
            val = False
        if isinstance(val,str) and not isinstance(val, unicode):
            val=unicode(val,'utf-8')
        properties[name] = converter(val)</pre>
<p>系统会将unicode类型的变量转换。</p>
<p>3.对于大容量数据的删除</p>
<p>GAE的限制，一次最多载入1000行的数据，每次最多删除500行数据，这对于像我制作的手机号码归属之类的大数据库是远远不够的，多次删除又会导致500报错，我的方法是使用task queue。<br />
Task Queue在官方的中文文档中没有提及，在英文文档中介绍的也不够详细。个人的理解就是让系统定期的去访问一个页面而已，我的例子：</p>
<pre class="python" name="code">from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext import db
from google.appengine.api.labs import taskqueue

class MobilePhone(db.Model):
    Number = db.StringProperty()
    Area = db.StringProperty()
    BrandType = db.StringProperty()

class Delete(webapp.RequestHandler):
    def get(self):
        q = db.GqlQuery("SELECT * FROM MobilePhone limit 100")
        results = q.fetch(100)
        db.delete(results)
        q = db.GqlQuery("SELECT * FROM MobilePhone limit 100")
        if (q.count() &gt; 0):
            self.addqueue()

        self.response.out.write('Hello world!')

    def addqueue(self):
        taskurl = 'http://ip-and-mp.appspot.com/'
        taskqueue.add( url='/del', params=dict(url=taskurl))
        self.response.out.write('added!')</pre>
<p>每次删除100行，使用默认的default queue，即每秒一次。</p>
<p>4.关于命令行的问题</p>
<p>我按照中文文档的办法始终有问题，添加了&#8211;email=xxxx &#8211;passin的参数才成功。手册已经远远落后了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/05/26/gae%e7%9a%84%e6%95%b0%e6%8d%ae%e5%af%bc%e5%85%a5%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

