<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_李道兵的墙内博客</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/70066/rss</id><updated>2011-12-16T06:50:11Z</updated><author><name>LI Daobing</name><uri>http://www.cnblogs.com/lidaobing/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lidaobing/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/70066/rss"/><entry><id>http://www.cnblogs.com/lidaobing/archive/2011/12/16/encrypt-with-gpg.html</id><title type="text">[有问有答] 如何用邮件安全地传递密码</title><summary type="text">Q: 我想把一个密码用邮件发给我的朋友，这么避免发送过程中被人窃听导致泄密A: 使用 GPG 加密即可，具体步骤如下假设小王想发送密码给我，那么我首先做如下操作1. 生成一个新的 GPG key:$ gpg --gen-key中间需要输入一些必要的信息2. 确认 GPG key$ gpg -K/home/lidb/.gnupg/secring.gpg-----------------------------sec 2048R/E0084AC3 2011-12-16uid LI Daobing &amp;lt;lidaobing@gmail.com&amp;gt;ssb 2048R...</summary><published>2011-12-16T06:37:00Z</published><updated>2011-12-16T06:37:00Z</updated><author><name>LI Daobing</name><uri>http://www.cnblogs.com/lidaobing/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lidaobing/archive/2011/12/16/encrypt-with-gpg.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lidaobing/archive/2011/12/16/encrypt-with-gpg.html"/><content type="html">&lt;p&gt;Q: 我想把一个密码用邮件发给我的朋友，这么避免发送过程中被人窃听导致泄密&lt;/p&gt;&#xD;
&lt;p&gt;A: 使用 GPG 加密即可，具体步骤如下&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;假设小王想发送密码给我，那么我首先做如下操作&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1. 生成一个新的 GPG key:&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;$ gpg --gen-key&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;中间需要输入一些必要的信息&lt;/p&gt;&#xD;
&lt;p&gt;2. 确认 GPG key&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;$ gpg -K&lt;br /&gt;/home/lidb/.gnupg/secring.gpg&lt;br /&gt;-----------------------------&lt;br /&gt;sec   2048R/E0084AC3 &lt;span style="color: #800080;"&gt;2011&lt;/span&gt;-&lt;span style="color: #800080;"&gt;12&lt;/span&gt;-&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;br /&gt;uid                  LI Daobing &amp;lt;lidaobing@gmail.com&amp;gt;&lt;br /&gt;ssb   2048R/FFB0140F &lt;span style="color: #800080;"&gt;2011&lt;/span&gt;-&lt;span style="color: #800080;"&gt;12&lt;/span&gt;-&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;3. 导出 GPG 的公钥&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;$ gpg --export --armor E0084AC3 &amp;gt; lidaobing.key&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;4. 把生成的 lidaobing.key 发送给小王&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;小王收到 lidaobing.key 后，要如下步骤操作&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1. 导入 GPG 公钥&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;$&amp;nbsp;gpg --import lidaobing.key&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;2. 确认导入成功&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;$ gpg -k&lt;br /&gt;/home/everbox/.gnupg/pubring.gpg&lt;br /&gt;--------------------------------&lt;br /&gt;pub   2048R/E0084AC3 &lt;span style="color: #800080;"&gt;2011&lt;/span&gt;-&lt;span style="color: #800080;"&gt;12&lt;/span&gt;-&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;br /&gt;uid                  LI Daobing &amp;lt;lidaobing@gmail.com&amp;gt;&lt;br /&gt;sub   2048R/FFB0140F &lt;span style="color: #800080;"&gt;2011&lt;/span&gt;-&lt;span style="color: #800080;"&gt;12&lt;/span&gt;-&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;3. 加密文件&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;$ gpg --recipient lidaobing@gmail.com --encrypt password.txt &lt;br /&gt;gpg: FFB0140F: There &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; no assurance &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt; key belongs to the named user&lt;br /&gt;&lt;br /&gt;pub  2048R/FFB0140F &lt;span style="color: #800080;"&gt;2011&lt;/span&gt;-&lt;span style="color: #800080;"&gt;12&lt;/span&gt;-&lt;span style="color: #800080;"&gt;16&lt;/span&gt; LI Daobing &amp;lt;lidaobing@gmail.com&amp;gt;&lt;br /&gt; Primary key fingerprint: 6E39 DB6A 37EE &lt;span style="color: #800080;"&gt;0704&lt;/span&gt; 62B0  F7FA 5C26 5D2C E008 4AC3&lt;br /&gt;      Subkey fingerprint: DDE0 42FC 8D79 BB4F 72AC  06E8 658A F431 FFB0 140F&lt;br /&gt;&lt;br /&gt;It &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; NOT certain that the key belongs to the person named&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; the user ID.  If you *really* know what you are doing,&lt;br /&gt;you may answer the next question with yes.&lt;br /&gt;&lt;br /&gt;Use &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt; key anyway? (y/N) y&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;4. 把生成的 password.txt.gpg 发给我。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;我收到 password.txt.gpg 后需要做如下的操作&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1. 解密&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;$ gpg --output password.txt --decrypt password.txt.gpg&lt;br /&gt;&lt;br /&gt;You need a passphrase to unlock the secret key &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;br /&gt;user: &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;LI Daobing &amp;lt;lidaobing@gmail.com&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800080;"&gt;2048&lt;/span&gt;-bit RSA key, ID FFB0140F, created &lt;span style="color: #800080;"&gt;2011&lt;/span&gt;-&lt;span style="color: #800080;"&gt;12&lt;/span&gt;-&lt;span style="color: #800080;"&gt;16&lt;/span&gt; (main key ID E0084AC3)&lt;br /&gt;&lt;br /&gt;gpg: encrypted with &lt;span style="color: #800080;"&gt;2048&lt;/span&gt;-bit RSA key, ID FFB0140F, created &lt;span style="color: #800080;"&gt;2011&lt;/span&gt;-&lt;span style="color: #800080;"&gt;12&lt;/span&gt;-&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;LI Daobing &amp;lt;lidaobing@gmail.com&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;2. 查看 password.txt&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;备注&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1. 生成的公钥 lidaobing.key 无须保密，可以反复使用，可以到处分发&lt;/p&gt;&#xD;
&lt;p&gt;2. 你的公钥可以发布到一些公共的 GPG 平台，用于大家给你发送加密信息或者验证你的签名&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;$ gpg --keyserver hkp://keys.gnupg.net --send-keys E0084AC3&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;3. 如果你使用 thunderbird, 可以使用 enigmail 来协助你做加密，解密，签名，验证的工作&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;参考&lt;/p&gt;&#xD;
&lt;p&gt;1.&amp;nbsp;&lt;a href="http://www.madboa.com/geek/gpg-quickstart/"&gt;http://www.madboa.com/geek/gpg-quickstart/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lidaobing/aggbug/2290166.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lidaobing/archive/2011/12/16/encrypt-with-gpg.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lidaobing/archive/2011/12/05/which-process-make-context-switch-high.html</id><title type="text">context switch 很高，谁干的</title><summary type="text">2.6.23 及以上内核可用# grep voluntary_ctxt_switches /proc/*/status | sort -rnk2 | head/proc/1570/status:voluntary_ctxt_switches: 1029453/proc/8143/status:voluntary_ctxt_switches: 835492/proc/2463/status:voluntary_ctxt_switches: 710566/proc/12204/status:voluntary_ctxt_switches: 584719/proc/2463/status:nonvo</summary><published>2011-12-05T14:59:00Z</published><updated>2011-12-05T14:59:00Z</updated><author><name>LI Daobing</name><uri>http://www.cnblogs.com/lidaobing/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lidaobing/archive/2011/12/05/which-process-make-context-switch-high.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lidaobing/archive/2011/12/05/which-process-make-context-switch-high.html"/><content type="html">&lt;p&gt;2.6.23 及以上内核可用&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;# grep voluntary_ctxt_switches /proc&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;/status | sort -rnk2 | head&lt;br /&gt;/proc/1570/status:voluntary_ctxt_switches: 1029453&lt;br /&gt;/proc/8143/status:voluntary_ctxt_switches: 835492&lt;br /&gt;/proc/2463/status:voluntary_ctxt_switches: 710566&lt;br /&gt;/proc/12204/status:voluntary_ctxt_switches: 584719&lt;br /&gt;/proc/2463/status:nonvoluntary_ctxt_switches: 344170&lt;br /&gt;/proc/12204/status:nonvoluntary_ctxt_switches: 252147&lt;br /&gt;/proc/9684/status:voluntary_ctxt_switches: 200307&lt;br /&gt;/proc/10354/status:voluntary_ctxt_switches: 165276&lt;br /&gt;/proc/3/status:voluntary_ctxt_switches: 157927&lt;br /&gt;/proc/10337/status:voluntary_ctxt_switches: 105313&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;参考：&lt;br /&gt;&lt;a href="http://careers.directi.com/display/tu/Understanding+Processes+in+Linux"&gt;http://careers.directi.com/display/tu/Understanding+Processes+in+Linux&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lidaobing/aggbug/2277338.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lidaobing/archive/2011/12/05/which-process-make-context-switch-high.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lidaobing/archive/2011/10/07/how-go-deal-with-syscall.html</id><title type="text">[读书笔记] go 语言如何处理系统调用</title><summary type="text">上一篇博客主要是讲如何避免在高并发下使用太多系统线程或进程，但如果仅仅是减少了线程数，CPU利用率本身没有上来，那么系统的容量很低，那么仍然无法达到高并发的目的。通常情况下，我们会设置线程数等于CPU数，充分利用CPU就等价于如何让线程一直工作，避免把时间浪费在等待系统调用返回上，从而提高系统容量。很多 linux 平台下的异步框架都基于 epoll 来设计，但 epoll 本身只支持 fd, 也就是说能很好的支持文件IO以及socket, 但对于其他系统调用则无法处理，在调用时仍然会造成堵塞，比如 creat, unlink等等。在大部分情况下，能对文件IO和socket进行异步处理已经能满</summary><published>2011-10-07T14:07:00Z</published><updated>2011-10-07T14:07:00Z</updated><author><name>LI Daobing</name><uri>http://www.cnblogs.com/lidaobing/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lidaobing/archive/2011/10/07/how-go-deal-with-syscall.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lidaobing/archive/2011/10/07/how-go-deal-with-syscall.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.cnblogs.com/lidaobing/archive/2011/10/07/difference-between-goroutine-and-erlang-process.html"&gt;上一篇博客&lt;/a&gt;主要是讲如何避免在高并发下使用太多系统线程或进程，但如果仅仅是减少了线程数，CPU利用率本身没有上来，那么系统的容量很低，那么仍然无法达到高并发的目的。&lt;/p&gt;&#xD;
&lt;p&gt;通常情况下，我们会设置线程数等于CPU数，充分利用CPU就等价于如何让线程一直工作，避免把时间浪费在等待系统调用返回上，从而提高系统容量。&lt;/p&gt;&#xD;
&lt;p&gt;很多 linux 平台下的异步框架都基于 &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man7/epoll.7.html" target="_blank"&gt;epoll&lt;/a&gt; 来设计，但 epoll 本身只支持 fd, 也就是说能很好的支持文件IO以及socket, 但对于其他系统调用则无法处理，在调用时仍然会造成堵塞，比如 creat, unlink等等。在大部分情况下，能对文件IO和socket进行异步处理已经能满足我们的需求，比如 libevent, &amp;nbsp;Java 的 NIO 都只提供了这些支持。&lt;/p&gt;&#xD;
&lt;p&gt;node.js 支持得更多一些，具体可以参考他的&amp;nbsp;&lt;a href="http://nodejs.org/docs/v0.4.12/api/fs.html" target="_blank"&gt;fs 模块&lt;/a&gt;&amp;nbsp;，对大量的系统调用同时提供了同步调用和异步调用的接口。&lt;/p&gt;&#xD;
&lt;p&gt;go 语言在编程的时候无需开发者对系统调用做特殊处理，我相信他在内部做了一些处理来支持他的高并发特性，但毕竟要眼见为实。&lt;/p&gt;&#xD;
&lt;p&gt;go 语言与系统调用的模块放在 &lt;a href="http://golang.org/pkg/syscall/"&gt;syscall package&lt;/a&gt;，并在上面封装出了 "os", "time", "net" 等模块，并且建议直接使用后面的模块，单从 syscall 里边函数的接口来看，看不到任何异步非阻塞的迹象，只能从源代码的角度来分析。&lt;/p&gt;&#xD;
&lt;p&gt;syscall package 的源码位于 &lt;a href="http://code.google.com/p/go/source/browse/src/pkg/syscall/syscall_linux.go" target="_blank"&gt;src/pkg/syscall/syscall_linux.go&amp;nbsp;&lt;/a&gt;&amp;nbsp;等文件，不过里边的函数都是简单地对更底层函数的一个包装，比如&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;sys   open(path string, mode int, perm uint32) (fd int, errno int)&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;func Open(path &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;, mode &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;, perm uint32) (fd &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;, errno &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;) {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; open(path, mode|O_LARGEFILE, perm)&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;真正按异步方式的代码位于&amp;nbsp;&lt;a href="http://code.google.com/p/go/source/browse/src/pkg/syscall/zsyscall_linux_amd64.go" target="_blank"&gt;src/pkg/syscall/zsyscall_linux_amd64.go&lt;/a&gt;&amp;nbsp;这样的文件里，这个文件是由上面的文件编译而成的，范例如下&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;func open(path &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;, mode &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;, perm uint32) (fd &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;, errno &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;) {&lt;br /&gt;        r0, _, e1 := Syscall(SYS_OPEN, uintptr(&lt;span style="color: #0000ff;"&gt;unsafe&lt;/span&gt;.Pointer(StringBytePtr(path))), uintptr(mode), uintptr(perm))&lt;br /&gt;        fd = &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;(r0)&lt;br /&gt;        errno = &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;(e1)&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;Syscall 的定义位于&amp;nbsp;&lt;a href="http://code.google.com/p/go/source/browse/src/pkg/syscall/asm_linux_amd64.s" target="_blank"&gt;src/pkg/syscall/asm_linux_amd64.s&lt;/a&gt;, 是用汇编写成的，不过我不懂汇编(泪)&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;TEXT    &amp;middot;&lt;span style="color: #0000ff;"&gt;Syscall&lt;/span&gt;(SB),&lt;span style="color: #800080;"&gt;7&lt;/span&gt;,$&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;CALL&lt;/span&gt;    runtime&amp;middot;entersyscall(SB)&lt;br /&gt;        MOVQ    &lt;span style="color: #800080;"&gt;16&lt;/span&gt;(SP), DI&lt;br /&gt;        MOVQ    &lt;span style="color: #800080;"&gt;24&lt;/span&gt;(SP), SI&lt;br /&gt;        MOVQ    &lt;span style="color: #800080;"&gt;32&lt;/span&gt;(SP), DX&lt;br /&gt;        MOVQ    $&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, R10&lt;br /&gt;        MOVQ    $&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, R8&lt;br /&gt;        MOVQ    $&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, R9&lt;br /&gt;        MOVQ    &lt;span style="color: #800080;"&gt;8&lt;/span&gt;(SP), AX       // &lt;span style="color: #0000ff;"&gt;syscall&lt;/span&gt; entry&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;SYSCALL&lt;/span&gt;&lt;br /&gt;        CMPQ    AX, $0xfffffffffffff001&lt;br /&gt;        JLS     ok&lt;br /&gt;        MOVQ    $-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;, &lt;span style="color: #800080;"&gt;40&lt;/span&gt;(SP)     // r1&lt;br /&gt;        MOVQ    $&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;48&lt;/span&gt;(SP)      // r2&lt;br /&gt;        NEGQ    AX&lt;br /&gt;        MOVQ    AX, &lt;span style="color: #800080;"&gt;56&lt;/span&gt;(SP)  // errno&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;CALL&lt;/span&gt;    runtime&amp;middot;exitsyscall(SB)&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;RET&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;ok:&lt;/span&gt;&lt;br /&gt;        MOVQ    AX, &lt;span style="color: #800080;"&gt;40&lt;/span&gt;(SP)      // r1&lt;br /&gt;        MOVQ    DX, &lt;span style="color: #800080;"&gt;48&lt;/span&gt;(SP)      // r2&lt;br /&gt;        MOVQ    $&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;56&lt;/span&gt;(SP)      // errno&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;CALL&lt;/span&gt;    runtime&amp;middot;exitsyscall(SB)&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;RET&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;其中&amp;nbsp;runtime&amp;middot;entersyscall 和&amp;nbsp;runtime&amp;middot;exitsyscall 位于&amp;nbsp;&lt;a href="http://code.google.com/p/go/source/browse/src/pkg/runtime/proc.c" target="_blank"&gt;src/pkg/runtime/proc.c&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;分析不下去了，不过能确认的是, go 语言确实做了什么，避免了系统调用堵塞线程，保证了程序能充分使用 CPU。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lidaobing/aggbug/2200836.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lidaobing/archive/2011/10/07/how-go-deal-with-syscall.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lidaobing/archive/2011/10/07/difference-between-goroutine-and-erlang-process.html</id><title type="text">[读书笔记] goroutine 与 erlang process 的区别</title><summary type="text">在传统的服务器编程模型中，我们会为每一个请求分配一个线程，请求结束后终止该线程，或者把线程放回线程池。 Java 的 Servlet 就属于这种模型的典型。对于 PHP, Ruby, Python 这些语言，要么对于多线程支持不好，要么在多线程下表现不好，通常我们会为每个请求分配一个进程，但整体模型都差不多。通常我们的请求并不是一直在消耗CPU, 一个请求的大部分时间都花在等待磁盘，数据库，cache，其他服务返回上面，或者说等待一个事件发生(比如 web 版的 IM, 通常会建立一个 HTTP 请求，等待其他人给你发消息)。 所以对于一个8核的 CPU，支撑100个并发，CPU消耗并不大，负</summary><published>2011-10-06T16:31:00Z</published><updated>2011-10-06T16:31:00Z</updated><author><name>LI Daobing</name><uri>http://www.cnblogs.com/lidaobing/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lidaobing/archive/2011/10/07/difference-between-goroutine-and-erlang-process.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lidaobing/archive/2011/10/07/difference-between-goroutine-and-erlang-process.html"/><content type="html">&lt;p&gt;在传统的服务器编程模型中，我们会为每一个请求分配一个线程，请求结束后终止该线程，或者把线程放回线程池。 Java 的 Servlet 就属于这种模型的典型。对于 PHP, Ruby, Python 这些语言，要么对于多线程支持不好，要么在多线程下表现不好，通常我们会为每个请求分配一个进程，但整体模型都差不多。&lt;/p&gt;&#xD;
&lt;p&gt;通常我们的请求并不是一直在消耗CPU, 一个请求的大部分时间都花在等待磁盘，数据库，cache，其他服务返回上面，或者说等待一个事件发生(比如 web 版的 IM, 通常会建立一个 HTTP 请求，等待其他人给你发消息)。 所以对于一个8核的 CPU，支撑100个并发，CPU消耗并不大，负载也不会太高，甚至 1000 左右的并发请求数也不会有大问题。但在高并发下，首先是由于线程数/进程数过多消耗了太多的内存资源，同时大部分CPU都消耗在上下文切换上边，所以系统负载很高，服务器效率大幅度降低，服务响应变慢甚至不可用。&lt;/p&gt;&#xD;
&lt;p&gt;为了让服务器支持高并发，通常我们需要一个新的框架来处理这些请求，比如 Java 这边就有 comet和netty, python 有 tornado, ruby 有 eventmachine。还有很多直接基于 epoll 系统调用, 或者基于 libevent, libev, libcoro的应用。&lt;/p&gt;&#xD;
&lt;p&gt;在解决这个问题时，发展出了 reactor[1] 和 proactor[2] 两种设计模式, 关于 reactor 模式，可以参考一下 libevent, netty 的编程范例。关于 proactor 模式，可以参考一下 node.js， Java NIO.2[3] &amp;nbsp;的编程范例，在此不做解释。对于 libcoro, jscex[4]，从实现层面上仍然可以认为是 proactor 模式，但避免了写大量的 callback 方法，所以更加易用。&lt;/p&gt;&#xD;
&lt;p&gt;go 语言用于解决高并发的技术被成为 &lt;strong&gt;goroutine&lt;/strong&gt;[5], 与 erlang 的 process 类似，但仍然有如下的不同&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;erlang 接收消息的主题是 erlang process, go 语言是 channel&lt;/li&gt;&#xD;
&lt;li&gt;一个 goroutine 可以引用多个 channel, 同样一个 channel 也可以被多个 goroutine 引用 (对于常规的生产者-消费者模型， goroutine 比 erlang 方便)&lt;/li&gt;&#xD;
&lt;li&gt;channel 属于强类型，在编译期可以检查出更多的错误，如果一个 goroutine 希望接收多种类型的消息，一般可以引用多个channel&lt;/li&gt;&#xD;
&lt;li&gt;channel 可以设置为堵塞型或者设定一个 buffer size, 并且可以用select测试 channel 是否已满， erlang 则无法测试(?)&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;div&gt;在编程模型上， goroutine 应该属于reactor 模式，但与常规的 reactor 模式有很大的不同。常规的 reactor 模式中，每处等待都需要占用一个线程，所以通常我们只会使用 1-2 个线程来做等待(比如接收请求处放一个，在异步操作时放一个)，在等待处再根据事件类型来进行事件分发和后续处理。但由于我们需要区分所有的事件，通常我们会设计出一组单根，复杂的事件类型(比如 Java 下)，这对编程人员来说很不利，特别是需要各个模块协作的时候，同时在等待处会出现代码庞大，业务逻辑集中在一处的问题。对于 goroutine, 通常每个 goroutine 会有自己的 reactor 代码(即 select)，更多是通过语言方面的机制来避免每处 select 占用一个线程, 业务逻辑被分解到各个 goroutine 内部，无需集中在一处，对开发有利。&lt;/div&gt;&#xD;
&lt;p&gt;[1]&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Reactor_pattern"&gt;http://en.wikipedia.org/wiki/Reactor_pattern&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;[2]&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Proactor_pattern"&gt;http://en.wikipedia.org/wiki/Proactor_pattern&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;[3]&amp;nbsp;&lt;a href="http://jcp.org/en/jsr/detail?id=203"&gt;http://jcp.org/en/jsr/detail?id=203&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;[4]&amp;nbsp;&lt;a href="https://github.com/JeffreyZhao/jscex"&gt;https://github.com/JeffreyZhao/jscex&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;[5]&amp;nbsp;&lt;a href="http://golang.org/doc/GoCourseDay3.pdf"&gt;http://golang.org/doc/GoCourseDay3.pdf&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lidaobing/aggbug/2200311.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lidaobing/archive/2011/10/07/difference-between-goroutine-and-erlang-process.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lidaobing/archive/2011/08/29/debian-and-packaging.html</id><title type="text">上周日的讲稿: Debian &amp;amp; Packaging</title><summary type="text">Linux 20周年开发者庆典活动 上的讲稿，题目是 &amp;quot;Debian &amp;amp; Packaging&amp;quot;Debian &amp;amp; Packaging View more presentations from LI Daobing下载地址:http://files.cnblogs.com/lidaobing/Debian_Packaging.pdf</summary><published>2011-08-29T14:02:00Z</published><updated>2011-08-29T14:02:00Z</updated><author><name>LI Daobing</name><uri>http://www.cnblogs.com/lidaobing/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lidaobing/archive/2011/08/29/debian-and-packaging.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lidaobing/archive/2011/08/29/debian-and-packaging.html"/><content type="html">&lt;div id="event_header"&gt;&#xD;
&lt;pre&gt;&lt;a href="http://linux20.eventbrite.com/" target="_blank"&gt;Linux 20周年开发者庆典活动&lt;/a&gt; 上的讲稿，题目是 "Debian &amp;amp; Packaging"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div style="width: 425px;" id="__ss_9055515"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/lidaobing/debian-packaging2" title="Debian &amp;amp; Packaging" target="_blank"&gt;Debian &amp;amp; Packaging&lt;/a&gt;&lt;/strong&gt; &#xD;
&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/lidaobing" target="_blank"&gt;LI Daobing&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;下载地址:&amp;nbsp;&lt;a href="http://files.cnblogs.com/lidaobing/Debian_Packaging.pdf"&gt;http://files.cnblogs.com/lidaobing/Debian_Packaging.pdf&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lidaobing/aggbug/2158909.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lidaobing/archive/2011/08/29/debian-and-packaging.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lidaobing/archive/2011/08/06/convert-bzr-to-git.html</id><title type="text">[备忘] 把 bzr 仓库转为 git 仓库</title><summary type="text">$ sudo apt-get installbzr-fastimport git-core$bzr clone lp:~lidaobing/iptux/iptux$cd iptux/$ git init$bzr fast-export . | git fast-import$ gitk --all$ rm -r .bzr$ git reset HEAD</summary><published>2011-08-06T02:08:00Z</published><updated>2011-08-06T02:08:00Z</updated><author><name>LI Daobing</name><uri>http://www.cnblogs.com/lidaobing/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lidaobing/archive/2011/08/06/convert-bzr-to-git.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lidaobing/archive/2011/08/06/convert-bzr-to-git.html"/><content type="html">&lt;p&gt;$ sudo apt-get install&amp;nbsp;bzr-fastimport git-core&lt;/p&gt;&#xD;
&lt;p&gt;$&amp;nbsp;bzr clone lp:~lidaobing/iptux/iptux&lt;/p&gt;&#xD;
&lt;p&gt;$&amp;nbsp;cd iptux/&lt;/p&gt;&#xD;
&lt;p&gt;$ git init&lt;/p&gt;&#xD;
&lt;p&gt;$&amp;nbsp;bzr fast-export . | git fast-import&lt;/p&gt;&#xD;
&lt;p&gt;$ gitk --all&lt;/p&gt;&#xD;
&lt;p&gt;$ rm -r .bzr&lt;/p&gt;&#xD;
&lt;p&gt;$ git reset HEAD&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lidaobing/aggbug/2129225.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lidaobing/archive/2011/08/06/convert-bzr-to-git.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lidaobing/archive/2011/08/02/reset-thunderbird-password.html</id><title type="text">[备忘] 重置 thunderbird 记住的错误密码</title><summary type="text">版本: Thunderbird 3.1.11方法:1. 进入 Edit -&amp;gt; Preferences -&amp;gt; Security -&amp;gt; Passwords -&amp;gt; &amp;quot;Saved Passwords...&amp;quot;选中对应的密码，然后点击 &amp;quot;Remove&amp;quot;2. 重新启动 thunderbird</summary><published>2011-08-02T00:59:00Z</published><updated>2011-08-02T00:59:00Z</updated><author><name>LI Daobing</name><uri>http://www.cnblogs.com/lidaobing/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lidaobing/archive/2011/08/02/reset-thunderbird-password.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lidaobing/archive/2011/08/02/reset-thunderbird-password.html"/><content type="html">&lt;p&gt;版本: Thunderbird 3.1.11&lt;/p&gt;&#xD;
&lt;p&gt;方法:&lt;/p&gt;&#xD;
&lt;p&gt;1. 进入 Edit -&amp;gt; Preferences -&amp;gt; Security -&amp;gt; Passwords -&amp;gt; "Saved Passwords..."&lt;/p&gt;&#xD;
&lt;p&gt;选中对应的密码，然后点击 "Remove"&lt;/p&gt;&#xD;
&lt;p&gt;2. 重新启动 thunderbird&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lidaobing/aggbug/2124513.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lidaobing/archive/2011/08/02/reset-thunderbird-password.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lidaobing/archive/2011/07/25/snmp-config.html</id><title type="text">[备忘] SNMP 配置</title><summary type="text">修改 /etc/default/snmpd (适用于Debian/Ubuntu)把 127.0.0.1 改为 0.0.0.0创建一个 v2 版的只读用户# /etc/snmp/snmpd.conf# rocommunity 通信密钥 允许IProcommunity foo 1.2.3.4rocommunity foo 5.6.7.8重启 snmpd$ sudo /etc/init.d/snmpd restart测试$snmpwalk -v 2c -c &amp;lt;通信密钥&amp;gt; &amp;lt;IP或域名&amp;gt; .1.3.6.1.4.1.2021.11.50.0</summary><published>2011-07-25T10:13:00Z</published><updated>2011-07-25T10:13:00Z</updated><author><name>LI Daobing</name><uri>http://www.cnblogs.com/lidaobing/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lidaobing/archive/2011/07/25/snmp-config.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lidaobing/archive/2011/07/25/snmp-config.html"/><content type="html">&lt;p&gt;&lt;strong&gt;修改 /etc/default/snmpd (适用于Debian/Ubuntu)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;pre&gt;把 127.0.0.1 改为 0.0.0.0&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;创建一个 v2 版的只读用户&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  style="background-color: #efefef; display: block; padding-top: 0.5em; padding-right: 0px; padding-bottom: 0.5em; padding-left: 1em; line-height: 1; border-width: 1px; border-color: #d3d3d3; border-style: solid;"&gt;&lt;code style="color: #006000;"&gt;# /etc/snmp/snmpd.conf&lt;br /&gt;&lt;/code&gt;&lt;code style="color: #006000;"&gt;# rocommunity 通信密钥 允许IP&lt;/code&gt;&lt;br /&gt;&lt;code style="color: #006000;"&gt;rocommunity foo 1.2.3.4&lt;br /&gt;rocommunity foo 5.6.7.8&amp;nbsp;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span face="Arial, Verdana, sans-serif" size="2" style="font-family: Arial, Verdana, sans-serif; font-size: x-small;"&gt;&lt;span  style="line-height: normal;"&gt;重启 snmpd&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span face="Arial, Verdana, sans-serif" size="2" style="font-family: Arial, Verdana, sans-serif; font-size: x-small;"&gt;&lt;span  style="line-height: normal;"&gt;&lt;code&gt;$ sudo /etc/init.d/snmpd restart&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a name="TOC-1" style="color: #4e7dbf;"&gt;&lt;/a&gt;测试&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  style="background-color: #efefef; display: block; padding-top: 0.5em; padding-right: 0px; padding-bottom: 0.5em; padding-left: 1em; line-height: 1; border-width: 1px; border-color: #d3d3d3; border-style: solid;"&gt;&lt;code style="color: #006000;"&gt;$&amp;nbsp;&lt;/code&gt;&lt;code style="color: #006000;"&gt;snmpwalk -v 2c -c &amp;lt;通信密钥&amp;gt; &amp;lt;IP或域名&amp;gt; .1.3.6.1.4.1.2021.11.50.0&lt;/code&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/lidaobing/aggbug/2116513.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lidaobing/archive/2011/07/25/snmp-config.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lidaobing/archive/2011/06/07/deploy-tomcat.html</id><title type="text">[老文] tomcat 部署指南</title><summary type="text">下载与安装个人建议不要使用发行版带的版本, 始终从主页来下载安装, 下载地址位于[1], 安装方法很简单, 直接解压即可, 建议解压到 /usr/local/ 目录, 再链接到 /usr/local/tomcat 目录创建目录 /data/apps/tomcat, 删除 $TOMCAT_HOME/webapps, 将 /data/apps/tomcat 软链接到 $TOMCAT_HOME/webapps创建目录 /data/logs/tomcat, 删除 $TOMCAT_HOME/logs, 将 /data/logs/tomcat 软链接到 $TOMCAT_HOME/logs如果 tomcat</summary><published>2011-06-07T14:19:00Z</published><updated>2011-06-07T14:19:00Z</updated><author><name>LI Daobing</name><uri>http://www.cnblogs.com/lidaobing/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lidaobing/archive/2011/06/07/deploy-tomcat.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lidaobing/archive/2011/06/07/deploy-tomcat.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: large;" size="5"&gt;&lt;span style="line-height: 36px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;下载与安装&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;个人建议不要使用发行版带的版本, 始终从主页来下载安装, 下载地址位于[1], 安装方法很简单, 直接解压即可, 建议解压到 /usr/local/ 目录, 再链接到 /usr/local/tomcat 目录&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;创建目录 /data/apps/tomcat, 删除 $TOMCAT_HOME/webapps, 将 /data/apps/tomcat 软链接到 $TOMCAT_HOME/webapps&lt;/li&gt;&#xD;
&lt;li&gt;创建目录 /data/logs/tomcat,&amp;nbsp; 删除 $TOMCAT_HOME/logs, 将 /data/logs/tomcat 软链接到 $TOMCAT_HOME/logs&lt;/li&gt;&#xD;
&lt;li&gt;如果 tomcat 无须监听 80 端口, 那么就没有必要使用 root 权限来跑, 那么就需要建立 tomcat 用户和 tomcat 用户组(tomcat 用户属于 tomcat 用户组), 再把 /usr/local/tomcat 下的文件owner 改为 tomcat.&lt;/li&gt;&#xD;
&lt;li&gt;安装后的目录结构如[2]所示。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;[1] &lt;a href="http://tomcat.apache.org/download-60.cgi" target="_blank"&gt;http://tomcat.apache.org/download-60.cgi&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;[2] 目录结构示意图&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;/usr/local&lt;br /&gt;|-- apache-tomcat-6.0.24&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- LICENSE&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- NOTICE&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- RELEASE-NOTES&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- RUNNING.txt&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- bin&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- conf&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- lib&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- logs -&amp;gt; /data/logs/tomcat&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- temp&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- webapps -&amp;gt; /data/apps/tomcat&lt;br /&gt;|&amp;nbsp;&amp;nbsp; `-- work&lt;br /&gt;`-- tomcat -&amp;gt; apache-tomcat-6.0.24/&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a name="_27961938787255225_76295852110" id="_27961938787255225_76295852110"&gt;&lt;/a&gt;配置&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a name="_7456906437222921_601622825113" id="_7456906437222921_601622825113"&gt;&lt;/a&gt;基础配置&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一般安装后需要调整如下的几个文件:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;conf/server.xml: 主要是调整端口, URI 编码, 自动部署, 访问日志配置&lt;br /&gt;需要修改的部分已在下面红色的部分标明, 自动部署会带来一些麻烦, 比如 "OutOfMemoryError: PermGen Space", 访问日志部分(AccessLogValve)本来就在文件中, 不过被注释了, 去掉注释就可以了&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&amp;lt;Connector&amp;nbsp;&lt;b&gt;URIEncoding="UTF-8" port="80"&lt;/b&gt;&amp;nbsp;protocol="HTTP/1.1"&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; connectionTimeout="20000"&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; redirectPort="8443" /&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;Engine ...&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Host name="localhost"&amp;nbsp; appBase="webapps"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unpackWARs="true"&amp;nbsp;&lt;b&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span&gt;autoDeploy="false"&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlValidation="false" xmlNamespaceAware="false"&amp;gt;&lt;br /&gt;&#xD;
&lt;div&gt;&lt;b&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;lt;Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"&amp;nbsp; prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&#xD;
&#xD;
&amp;nbsp; &amp;lt;/Host&amp;gt;&lt;br /&gt;&amp;lt;/Engine&amp;gt;&lt;/blockquote&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;bin/setenv.sh&lt;br /&gt;需要创建该文件，加入一些环境配置(比如修改内存设置), 如下所示&lt;br /&gt;CATALINA_OPTS="-XX:MaxPermSize=256M"&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a name="_6714668687364816_518752949770" id="_6714668687364816_518752949770"&gt;&lt;/a&gt;虚拟主机&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;虚拟主机也是在 server.xml 中配置, 范例如下&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&amp;lt;Engine name="Catalina" defaultHost="www.jxphone.com"&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;Host name="www.jxphone.com"&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;appBase="webapps/www.jxphone.com"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unpackWARs="true" autoDeploy="false"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlValidation="false" xmlNamespaceAware="false"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;Alias&amp;gt;jxphone.com&amp;lt;/Alias&amp;gt;&lt;br /&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;Valve className="org.apache.catalina.valves.AccessLogValve"&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;directory="logs"&amp;nbsp; prefix="www.jxphone.com_access_log."&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;suffix=".txt" pattern="common" resolveHosts="false"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Host&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Host name="bar.jxphone.com"&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;appBase="webapps/bar.jxphone.com"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;unpackWARs="true" autoDeploy="false"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;xmlValidation="false" xmlNamespaceAware="false"&amp;gt;&lt;br /&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Valve className="org.apache.catalina.valves.AccessLogValve"&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;directory="logs"&amp;nbsp; prefix="bar.jxphone.com_access_log."&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;suffix=".txt" pattern="common" resolveHosts="false"/&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/Host&amp;gt;&lt;br /&gt;&amp;lt;/Engine&amp;gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;每个虚拟主机用一个&amp;nbsp;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;lt;Host/&amp;gt;&lt;/span&gt;&amp;nbsp;来配置, 其中&amp;nbsp;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;lt;Alias/&amp;gt;&lt;/span&gt;&amp;nbsp;是虚拟主机的别名, 可以有多个, Engine&amp;nbsp; 的 defaultHost 属性表示使用 ip 地址直接访问时使用哪个主机, 也可以不设置 defaultHost 属性。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a name="https_9230758736290823_4526683" id="https_9230758736290823_4526683"&gt;&lt;/a&gt;https&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;首先是要生成 keystore, 生成过程另文叙述, 然后把 keystore 拷贝到 conf 目录, 修改 server.xml 如下所示&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;span style="font-size: xx-small;" size="1"&gt;&amp;lt;Connector URIEncoding="UTF-8" port="8080" protocol="HTTP/1.1"&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; connectionTimeout="20000"&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; redirectPort="&lt;span style="color: #ff0000;" color="#ff0000"&gt;443&lt;/span&gt;" /&amp;gt;&lt;br /&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;&amp;lt;Connector URIEncoding="UTF-8" port="443" protocol="HTTP/1.1" SSLEnabled="true"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; maxThreads="150" scheme="https" secure="true"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clientAuth="false" sslProtocol="TLS" keystoreFile="conf/keystore" keystorePass="changeit" keyAlias="tomcat"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;Connector URIEncoding="UTF-8" port="8009" protocol="AJP/1.3" redirectPort="&lt;span style="color: #ff0000;" color="#ff0000"&gt;443&lt;/span&gt;" /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;PS. https 没有虚拟主机的概念, 所有的虚拟主机必须共享同一份 https 配置, 因为 https 协商加密在前, 传入 Host 参数在后。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a name="apache_80737043003277_79920473" id="apache_80737043003277_79920473"&gt;&lt;/a&gt;apache&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;如果需要把 java 的网站和 php 的网站联合部署在同一台机器上，则一般使用 apache 作为前端, 用 mod_jk 连接 tomcat&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;首先需要安装 libapache2-mod-jk, 并在 apache 中激活, (Debian 下直接使用 "sudo apt-get install libapache2-mod-jk; sudo a2enmod jk" 即可, 其他系统还未试过)&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;在 $TOMCAT_HOME/conf/server.xml 中修改 AJP connector 的配置: "&amp;lt;Connector URIEncoding="UTF-8" port="8009" protocol="AJP/1.3" redirectPort="443" /&amp;gt;", 注意 URIEncoding 一定记得加, redirectPort 是指转向 https 时所用的端口&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;配置 /etc/libapache2-mod-jk/workers.properties, 根据注释填入全部数据即可&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;新建文件 /etc/apache2/sites-available/tomcat, 输入如下的内容&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&amp;lt;VirtualHost *&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ServerName www.jxphone.com&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;JkMount /* ajp13_worker&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&amp;lt;VirtualHost *&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ServerName bar.jxphone.com&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;JkMount /* ajp13_worker&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/blockquote&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;重启 apache (或者重新加载 apache 配置)即可&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;另: apache 的访问日志比 tomcat 自带的好用, 如果全部使用 mod_jk 来访问, 那么可以去掉 server.xml 中&lt;span style="color: #000000;" color="#000000"&gt;AccessLogValve&lt;/span&gt;相关的配置, 缺省日志位置在 /var/log/apache2/other_vhosts_access.log&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a name="_9893382734961357_324955072005" id="_9893382734961357_324955072005"&gt;&lt;/a&gt;日志&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;tomcat 运行在安全模式下时,&amp;nbsp; 能只读 war 包里面的文件, 能读写&amp;nbsp;&lt;a title="workDir" id="mg0j" href="http://tomcat.apache.org/tomcat-6.0-doc/config/host.html"&gt;workDir&lt;/a&gt;&amp;nbsp;里面的文件, 其他文件就需要在 $TOMCAT_HOME/conf/catalina.policy 里面申请&lt;br /&gt;&lt;br /&gt;简单的应用日志直接输送到终端即可, 比如按如下文件来配置 log4j.properties&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;log4j.appender.CONSOLE.layout.ConversionPattern=www.jxphone.com: %d{ABSOLUTE} %5p %c:%L - %m%n&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;log4j.rootLogger=info, CONSOLE&lt;/span&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;在 ConversionPattern 中加入一个前缀, 方便分离日志。&lt;br /&gt;&lt;br /&gt;日志的缺省位置在 $TOMCAT_HOME/logs/catalina.out&lt;br /&gt;&lt;br /&gt;复杂的应用仍需要使用独立的日志的系统&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a name="_3093975801743718_5158116749766071" id="_3093975801743718_5158116749766071"&gt;&lt;/a&gt;自动启动&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;将如下的文件放到 /etc/init.d/tomcat, 并链接到 /etc/rc2.d/S80tomcat&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;#!/bin/sh&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;TOMCAT_HOME=/usr/local/tomcat&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;case "$1" in&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;start)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 'courier new';" face="courier new"&gt;echo $"Starting Tomcat"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /bin/su tomcat $TOMCAT_HOME/bin/startup.sh&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;stop)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="font-family: 'courier new';" face="courier new"&gt;echo $"Stopping Tomcat"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/bin/su tomcat $TOMCAT_HOME/bin/catalina.sh stop&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;restart)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $0 stop&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $0 start&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;*)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo "usage: $0 (start|stop|restart|help)"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;esac&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a name="__9706125031175824" id="__9706125031175824"&gt;&lt;/a&gt;监控&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;修改 $TOMCAT_HOME/bin/setenv.sh, 加入如下一行&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9012 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"&lt;/blockquote&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;建立 $HOME/projects/utils/build.xml, 如下所示&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;lt;project name="Catalina Ant JMX"&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:jmx="antlib:org.apache.catalina.ant.jmx"&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default="state"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; basedir="."&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="jmx.server.name" value="localhost" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="jmx.server.port" value="9012" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="k1" value="machine-auth-51"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="k2" value="tomcat"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="k3" value="TODO"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tstamp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;format property="t" pattern="yyyy-MM-dd'T'HH:mm:ss"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tstamp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;target name="spdc"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;echo&amp;gt;http://moshop.stat.jxphone.com/spdc/?param=s=0400000002|k1=${k1}|k2=${k2}|k3=${k3}|t=${t}|d=${d}"&amp;lt;/echo&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;get src="http://moshop.stat.jxphone.com/spdc/?param=s=0400000002|k1=${k1}|k2=${k2}|k3=${k3}|t=${t}|d=${d}" dest="stat.response"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;target name="state" description="Show JMX Cluster state"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;jmx:open&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; host="${jmx.server.name}"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; port="${jmx.server.port}"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; username="controlRole"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; password="tomcat"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;jmx:get&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name="java.lang:type=Memory"&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; attribute="HeapMemoryUsage"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultproperty="HeapMemoryUsage"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo="true"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;jmx:get&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name="java.lang:type=Memory"&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; attribute="NonHeapMemoryUsage"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultproperty="NonHeapMemoryUsage"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo="true"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;jmx:get&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;name="java.lang:type=OperatingSystem"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;attribute="OpenFileDescriptorCount"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;resultproperty="OpenFileDescriptorCount"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;echo="true"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;jmx:get&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;name="java.lang:type=OperatingSystem"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;attribute="MaxFileDescriptorCount"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;resultproperty="MaxFileDescriptorCount"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;echo="true"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;antcall target="spdc"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="k3" value="HeapMemoryUsage.used"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="d" value="${HeapMemoryUsage.used}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/antcall&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;antcall target="spdc"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="k3" value="HeapMemoryUsage.commited"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="d" value="${HeapMemoryUsage.committed}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/antcall&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;antcall target="spdc"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="k3" value="HeapMemoryUsage.max"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="d" value="${HeapMemoryUsage.max}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/antcall&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;antcall target="spdc"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="k3" value="NonHeapMemoryUsage.used"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="d" value="${NonHeapMemoryUsage.used}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/antcall&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;antcall target="spdc"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="k3" value="NonHeapMemoryUsage.commited"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="d" value="${NonHeapMemoryUsage.committed}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/antcall&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;antcall target="spdc"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="k3" value="NonHeapMemoryUsage.max"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="d" value="${NonHeapMemoryUsage.max}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/antcall&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;antcall target="spdc"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="k3" value="OpenFileDescriptorCount"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="d" value="${OpenFileDescriptorCount}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/antcall&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;antcall target="spdc"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="k3" value="MaxFileDescriptorCount"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;param name="d" value="${MaxFileDescriptorCount}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/antcall&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';" face="courier new"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;/blockquote&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;运行 crontab -e, 加入如下两行&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;ANT_HOME=/usr/local/share/ant&lt;br /&gt;55 23 * * * $ANT_HOME/bin/ant -f $HOME/projects/utils/build.xml &amp;gt;&amp;gt; $HOME/cron.log&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a name="_" id="_"&gt;&lt;/a&gt;部署&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a name="_war_context_xml_9424890589323239" id="_war_context_xml_9424890589323239"&gt;&lt;/a&gt;部署 war 包, 以及配置 context.xml&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;把 war 包拷贝到&lt;a title="虚拟主机" target="_self" id="jp-5" href="https://docs.google.com/Doc?docid=0AWRNSVaJq3r2ZGY0ejZyNjhfMTI1MGdrd2drNmhi&amp;amp;hl=en#__6714668687364816"&gt;虚拟主机&lt;/a&gt;配 置中 appBase 属性所指定的目录, 比如 webapps/www.jxphone.com, 如果要部署到根目录("/"), 则命名为 ROOT.war, 如果要部署到 /api 目录, 则命名为 api.war, 如果要部署到深层次目录, 比如 /api/v1 目录, 则命名为 api#v1.war&lt;/li&gt;&#xD;
&lt;li&gt;停止 tomcat 服务&lt;/li&gt;&#xD;
&lt;li&gt;删除war包对应的已经展开的目录, 只保留 war 包&lt;/li&gt;&#xD;
&lt;li&gt;如 果需要配置 context.xml, 则把 war 包里面的 META-INF/context.xml 拷贝到配置目录的对应位置, 比如 www.jxphone.com 的 api.war 的对应位置为 conf/Catalina/www.jxphone.com/api.xml (其中 Catalina 为 Engine 的名字, www.jxphone.com 为 Host 的名字, api.xml 的名字与 war 包的名字对应 (比如根目录用 ROOT.xml, /api/v1 目录用 api#v1.war)&lt;/li&gt;&#xD;
&lt;li&gt;编辑 api.xml, 修改里边的相关参数&lt;/li&gt;&#xD;
&lt;li&gt;如果 api.xml 有保密数据，比如数据库密码, 则关掉 api.xml 的所有用户可读权限, 比如 "chmod 640 api.xml"&lt;/li&gt;&#xD;
&lt;li&gt;重启 tomcat 服务&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;br /&gt;参考文献:&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;Apache Tomcat Configuration Reference:&amp;nbsp;&lt;a title="Environment Entries" id="pfkp" href="http://tomcat.apache.org/tomcat-6.0-doc/config/context.html#Environment%20Entries"&gt;Environment Entries&lt;/a&gt;,&amp;nbsp;&lt;a title="Resource Definitions" id="vqi0" href="http://tomcat.apache.org/tomcat-6.0-doc/config/context.html#Resource%20Definitions"&gt;Resource Definitions&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a title="JNDI Datasource HOW-TO" id="e.zc" href="http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html"&gt;JNDI Datasource HOW-TO&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a name="__8302071619442667" id="__8302071619442667"&gt;&lt;/a&gt;还未涉及到的内容&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;同时使用 apache 和 https&lt;/li&gt;&#xD;
&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/lidaobing/aggbug/2074664.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lidaobing/archive/2011/06/07/deploy-tomcat.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lidaobing/archive/2011/06/04/create-new-project-on-alioth-git.html</id><title type="text">[备忘] 在 git.debian.org 上建立新项目</title><summary type="text">1. 在 alioth 网站注册[1], 并且申请加入一个特定的组, 比如 chinese 组[1]http://alioth.debian.org/[2]﻿http://alioth.debian.org/projects/chinese/2. 生成自己的SSH密钥﻿$ ssh-keygen -t rsa3. 上传公钥($HOME/.ssh/id_rsa.pub) 到 aliothhttps://alioth.debian.org/account/editsshkeys.php4. 登录 git.debian.org$ ssh git.debian.org -l ALIOTH_USER_NA</summary><published>2011-06-04T08:59:00Z</published><updated>2011-06-04T08:59:00Z</updated><author><name>LI Daobing</name><uri>http://www.cnblogs.com/lidaobing/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lidaobing/archive/2011/06/04/create-new-project-on-alioth-git.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lidaobing/archive/2011/06/04/create-new-project-on-alioth-git.html"/><content type="html">&lt;p&gt;1. 在 alioth 网站注册[1], 并且申请加入一个特定的组, 比如 chinese 组&lt;/p&gt;&#xD;
&lt;p&gt;[1]&amp;nbsp;&lt;a href="http://alioth.debian.org/"&gt;http://alioth.debian.org/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;[2]&amp;nbsp;&lt;a href="﻿http://alioth.debian.org/projects/chinese/"&gt;﻿http://alioth.debian.org/projects/chinese/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2. 生成自己的SSH密钥&lt;/p&gt;&#xD;
&lt;p&gt;﻿&lt;span style="font-family: 'courier new', courier;"&gt;$ ssh-keygen -t rsa&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3. 上传公钥($HOME/.ssh/id_rsa.pub) 到 alioth&lt;/p&gt;&#xD;
&lt;p&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="content-type" /&gt;&#xD;
&lt;a href="https://alioth.debian.org/account/editsshkeys.php"&gt;https://alioth.debian.org/account/editsshkeys.php&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;4. 登录 git.debian.org&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 'courier new', courier;"&gt;$ ssh git.debian.org -l ALIOTH_USER_NAME&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;5. 建立 SSH 仓库&lt;/span&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;lidaobing@vasks$ cd &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;git&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;chinese&lt;br /&gt;lidaobing@vasks$ mkdir debian&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;zh&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;faq.git&lt;br /&gt;lidaobing@vasks$ cd debian&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;zh&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;faq.git&lt;br /&gt;lidaobing@vasks$ git &lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;bare init &lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;shared&lt;br /&gt;lidaobing@vasks$ vi description &lt;br /&gt;lidaobing@vasks$ mv hooks&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;post&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;update.sample hooks&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;post&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;update&lt;br /&gt;lidaobing@vasks$ chmod &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;x hooks&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;post&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;update&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;lidaobing@vasks$ exit&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;6.&amp;nbsp;﻿访问如下的网页确认&lt;/p&gt;&#xD;
&lt;p&gt;&lt;meta content="text/html; charset=utf-8" http-equiv="content-type" /&gt;&#xD;
&lt;a href="http://anonscm.debian.org/gitweb/?p=chinese/debian-zh-faq.git"&gt;http://anonscm.debian.org/gitweb/?p=chinese/debian-zh-faq.git&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;7. 导入当前的版本&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;$ mkdir tmp1; cd tmp1&lt;br /&gt;$ dget http:&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;cdn.debian.net/debian/pool/main/d/debian-zh-faq/debian-zh-faq_1.11.dsc&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;$ mkdir debian&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;zh&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;faq&lt;br /&gt;$ cd debian&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;zh&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;faq&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;$ git init&lt;br /&gt;$ git&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;dsc ..&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;debian&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;zh&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;faq_1.&lt;/span&gt;&lt;span style="color: #800080;"&gt;11&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dsc&lt;br /&gt;$ git remote add origin git&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;ssh:&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;git.debian.org/git/chinese/debian-zh-faq.git&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;$ git push &lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;tags origin master&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
8.&amp;nbsp;访问如下的网页确认&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://anonscm.debian.org/gitweb/?p=chinese/debian-zh-faq.git"&gt;http://anonscm.debian.org/gitweb/?p=chinese/debian-zh-faq.git&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;参考文献:&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&#xD;
&lt;meta content="text/html; charset=utf-8" http-equiv="content-type" /&gt;&#xD;
&lt;a href="http://wiki.debian.org/Alioth/SSH"&gt;http://wiki.debian.org/Alioth/SSH&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&#xD;
&lt;meta content="text/html; charset=utf-8" http-equiv="content-type" /&gt;&#xD;
&lt;a href="http://wiki.debian.org/Alioth/Git"&gt;http://wiki.debian.org/Alioth/Git&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&#xD;
&lt;meta content="text/html; charset=utf-8" http-equiv="content-type" /&gt;&#xD;
&lt;a href="http://www.cnblogs.com/lidaobing/archive/2010/05/20/debian-packaging-with-git.html"&gt;http://www.cnblogs.com/lidaobing/archive/2010/05/20/debian-packaging-with-git.html&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lidaobing/aggbug/2072721.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lidaobing/archive/2011/06/04/create-new-project-on-alioth-git.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
