有时候,仔细追踪一个项目的各次提交也是蛮有趣的,特别是各种 Bugfix,会发现,原来牛人也会有各种低级错误。

例如,Nginx 刚在 12 月 8 号发布了 nginx-1.9.8,马上就又发布 nginx-1.9.9,这种密集的发布,一看就是 Bug 修复了。我们看看到底修复了什么 Bug。

首先,看看changelog:

Changes with nginx 1.9.9 09 Dec 2015

*) Bugfix: proxying to unix domain sockets did not work when using variables; the bug had appeared in 1.9.8.

再来看看是如何修复的,变更前的代码片段:

static void
ngx_http_upstream_init_request(ngx_http_request_t *r)
{  
    ....
    if (u->resolved->port == 0) {  
        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,  
                      "no port in upstream \"%V\"", host);  
        ngx_http_upstream_finalize_request(r, u,  
                                       NGX_HTTP_INTERNAL_SERVER_ERROR);  
        return;  
    }  
    ....
}  

变更后的代码片段:

static void
ngx_http_upstream_init_request(ngx_http_request_t *r)  
{  
    ....
            if (u->resolved->port == 0  
                && u->resolved->sockaddr->sa_family != AF_UNIX)  
            {  
                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,  
                              "no port in upstream \"%V\"", host);  
                ngx_http_upstream_finalize_request(r, u,  
                                               NGX_HTTP_INTERNAL_SERVER_ERROR);  
                return;  
            }  
    ....
}  

作为旁观者和事后诸葛亮,可以很明显看出之前的问题所在:在 upstream 中,Unix 本地域套接字不能用了。

这次版本更新,除了修正这个 Bug 外,没有做其他任何事情,所以,如果你已经尝鲜在用 1.9.8 了,赶紧直接升级到 1.9.9 吧。