• 2010-08-29

    Lighttpd mod_fastcgi源码分析

    Views: 22645 | No Comments

    最近在设计一种网络服务器架构, 最重要的一点是把耗时操作委托给工作进程(或者线程)来做, 所以考察一下 fastcgi. 大概看了下 lighttpd 的 mod_fastcgi 的源码, 没想到立即被卡住了. 根据我的想法, PHP 等 fastcgi 程序(php-cgi 进程)监听网络, 然后 mod_fastcgi 只需要 connect 这些进程即可, 奇怪的是, 我竟然看到了 listen! -

    fcgi_spawn_connection() 函数:
    
    fcgi_fd = socket(socket_type, SOCK_STREAM, 0);
    
    if (-1 == connect(fcgi_fd, fcgi_addr, servlen)) {
        close(fcgi_fd);
        fcgi_fd = socket(socket_type, SOCK_STREAM, 0);
        /* create socket */
        bind(fcgi_fd, fcgi_addr, servlen);
        listen(fcgi_fd, 1024);
    
        switch ((child = fork())) {
        case 0: {
            // child process
            if(fcgi_fd != FCGI_LISTENSOCK_FILENO) {
                close(FCGI_LISTENSOCK_FILENO);
                dup2(fcgi_fd, FCGI_LISTENSOCK_FILENO);
                close(fcgi_fd);
            }
            /* exec the cgi */
            execve(arg.ptr[0], arg.ptr, env.ptr);
            exit(errno);
        }
    }
    

    我很奇怪, mod_fastcgi 为什么要监听网络连接? 谁会连接它? 问了同事, 同事说可能是 fastcgi 进程要连接它, 可问题是 fastcgi 进程怎么知道连接什么地方, 更不用说, fastcgi 协议里没有提到要 fastcgi 进程主动连接 Web Server 一说.

    Continue reading »

    Posted by ideawu at 2010-08-29 18:00:51
  • 2010-08-22

    Master-Workers 模式处理高负载

    Views: 29972 | 7 Comments

    对于高负载的网络服务器, 瓶颈几乎总是在等待 IO, 而 CPU 的计算能力往往不是最先遇到的问题. 你的服务器程序, 接收客户端的请求, 可能还要连接另一台网络服务器, 一起合作处理客户端的请求. 很多情况下, 你无法把客户端的连接以及与另一台服务器的连接统一处理, 不可避免地要出现等待. 这时, 只能使用多进程或者多线程.

    Master-Workers(管理者-工作者)模式是处理这种情况的主要方式, 只要有 IO 等待或者其它耗时的操作, 都交互若干个工作者之一处理, 这样, 后续的请求不会被阻塞, 从而实现高负载.

    目录:

    下文中有时用"进程"一词同时指代进程和线程, 它们的区别主要考虑的是通信方式.
    Continue reading »

    Posted by ideawu at 2010-08-22 16:03:57
  • 2010-07-07

    TCP协议思想和技术的广泛应用

    Views: 32819 | 1 Comment

    TCP 协议是大量重要的网络和通讯的思想和技术的集合体. 这些思想和技术被应用在 TCP 身上, 另一方面, 学习 TCP 可以了解这些思想和技术. 通讯的思想和技术不仅仅可以应用狭义的数据通讯上, 也可以应用在广义的信息通讯上, 后者一般可以理解为应用层的交互协议, 例如即时通讯(IM)的聊天协议.

    首先, TCP 协议是一种可靠的传输协议. 这种可靠性可以从两方面理解: 1. TCP 保证数据的有序性和无差错; 2. TCP 尽最大努力确保数据被接收.

    有序和无差错可能比较好理解, 但"最大努力"则和我们一般理解的"可靠"有较大差别. 首先, TCP 尽最大努力传输数据, 一旦发送方无法保证数据传输到接收方, 它将通过断开连接(使连接失效)来声明这一点. 其次, TCP 可以明确地告诉一个数据分段已经被对方接收, 但无法准确的断定未被确认的数据没有被对方接收, 也就是说, 数据可能没有被对方接收, 也能已经被对方接收. 这种对传输失败的不确定性, 显然是对可靠性的一个重大打击. "两军队问题(Two Army Problem)"说明了这一点, 事实上, 我们无法判断一个确认(ACK)是丢失了还是没有发出.

    Continue reading »

    Posted by ideawu at 2010-07-07 12:16:47
  • 2010-07-06

    以浏览器引擎为核心的软件架构

    Views: 9865 | No Comments

    我在 2006 年的时候, 曾经提出过用 HTML/CSS 来做桌面应用程序的界面的想法, 但更早之前(2001年), 著名游戏开发者, 网易的游戏工程师云风便在其公司的"大话西游"网站游戏中应用了嵌入浏览器做界面的方法.

    Windows 控制面板里的"添加/删除应用程序"应该是较早的利用浏览器来做程序界面的一个程序, 当然, 微软肯定还有更早的程序. 后来的 Google Talk, 又是一个经典的利用浏览器做界面的一个软件.

    Continue reading »

    Posted by ideawu at 2010-07-06 10:34:22
  • 2010-06-22

    if-else对优化代码冗余度的反作用

    Views: 13731 | 8 Comments

    有些程序员可能过于追求 if-else 对代码优化的效果, 却忽略了其带来的对代码清晰度的反作用. 假设这样一个功能, 根据用户的等级显示不同的页面. 如果用户的等级大于等于 5, 他能看到的东西和普通用户(等级小于5)不同, 代码如下:

    echo "欢迎您, ";
    if(level > 5){
    	echo "高级用户!";
    }else{
    	echo "用户!"
    }
    // ... 大段代码
    echo '<a href="#">个人信息</a>';
    if(level > 5){
    	echo "审核文章!";
    }else{
    	echo "发表文章!"
    }
    echo "...";
    

    Continue reading »

    Posted by ideawu at 2010-06-22 10:52:44
  • 2010-06-06

    endlessssh – SSH 代理工具

    Views: 27949 | 9 Comments

    新建了一个开源项目 endlessssh, 用于 SSH 代理(不是 SSH 作为代理, 而是 SSH 使用代理), 放在 Google Project Hosting. 工具有两个特点:

    1. Tunneling SSH over REAL HTTP(完善中)

    让 SSH 工作在 HTTP 协议上, 从而穿越防火墙.

    2. 持续的会话

    即使 TCP 网络连接断开(这时, SSH 会话会失效), SSH 会话仍然保持, 直到网络重连后, 会话继续.

    项目地址: http://code.google.com/p/endlessssh/

    补充:

    谢谢评论中 Zealot 朋友的推荐.

    大概看了下类似的一个 GNU 项目 httptunnel(http://www.nocrew.org/software/httptunnel.html). 这个项目所使用的交互过程更像是 HTTP 交互, 在一个 HTTP 报文中包含自己的多个报文. httptunnel 没有确认机制, 也没有会话保持机制. 不过, httptunnel 可以值得借鉴.

    Posted by ideawu at 2010-06-06 15:17:22
|<<<34567891011>>>| 7/11 Pages, 62 Results.