标题来自CoolShell的博文http://coolshell.cn/articles/9308.html,文章说得非常好,毫无疑问的支持啊。

其实我本来以为程序员都是不用百度的,随便对比下就发现百度和Google技术差距实在太过明显,但是上周五我推荐我们公司里一个前Python程序员(不久前被迫转Ruby)pry这个工具的时候,他竟然用了百度(当然毫无疑问,首页没有一个正确结果)。当时我就差点没昏过去,三十多岁了,不知道用Github也就算了,我当年还是懵懂少年的时候好歹也是用Google搜的,而且也能搜到正确结果的(当然,质量上肯定还是Github的略胜一筹)。哎,我三观还是显得太幼稚了啊。

以前的这个回复也是啊:

作为对反对技术人员用百度的响应,本博客使用了Coolshell那篇博文里贴出来的代码:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="http://coolshell.cn/wp-content/themes/inove/js/jquery.bpopup-0.8.0.min.js"></script>
 
<script type="text/javascript">
;(function($) {
    $(function() {
        var url=document.referrer;
        if ( url && url.search("http://")>-1) {
            var refurl =  url.match(/:\/\/(.[^/]+)/)[1];
            if(refurl.indexOf("baidu.com")>-1){
                $('#nobaidu_dlg').bPopup();
            }
        }
    });
 
})(jQuery);
</script>
 
<div id="nobaidu_dlg" style="background-color:#fff; border-radius:15px;color:#000;display:none;padding:20px;min-width:450px;min-height:180px;">
    <img src="http://coolshell.cn/wp-content/themes/inove/img/nobaidu.jpg" align="left">
     <p style="margin-left:200px;margin-top: 20px; line-height: 30px;">
     检测到你还在使用百度这个搜索引擎,<br/>
     做为一个程序员,这是一种自暴自弃!<br/>
     <br/>
     </p>
     <p align="center" style="margin-top:20px;">
     <b><a href="http://coolshell.cn/articles/7186.html">作环保的程序员,从不用百度开始!</a></b>
     </p>
</div>

虽然原文还给出了一个Github项目的地址,这个项目直接给出了一个JavaScript脚本,在源码里只要引用就可以了,比CoolShell的方法更加简单点,但是考虑到那个JavaScript脚本直接放在Github上可能造成Github性能不佳(不过貌似本博客的点击率远远达不到可以搞垮Github的程度),并且还可能遭到屏蔽(毕竟用百度的人肯定不会处于翻墙状态的)。所以还是决定直接用CoolShell的方法更好。因此,以后如果各位用百度访问本博客,将会看到如下对话框:

希望那些看到了这个对话框的程序员们不要介意,我就是这样的人。

由于我所维护的Rails项目规模很大,所以被分割成了多个项目,而其中仅Rails项目就有不下6个,而我在开发我所属的子项目的时候,通常至少同时运行4个项目才能把流程完整的运行起来。而这四个项目中就有三个在生产环境上会监听默认端口(80/443),因此,这些项目的开发者都希望当其他项目与自己的项目产生交互的时候,会采用默认的端口。也许他们在自己开发的时候就是这么做的并且没有发生什么问题,但是作为另一个项目的开发者,遇到这种情况就非常麻烦了。虽然我们有时都会留下一个配置文件供开发者配置,但是由于这个配置文件本身也被Git托管(这个做法其实很不正规),所以我一旦修改配置文件,这个文件就至始至终保持被修改的状态,非常麻烦,经常干扰到我原本华丽而流畅的Git操作(瀑布汗。。)。

所以就希望能寻找到一种办法,能够使服务器不再根据端口,而是根据域名判断请求应该送达的服务器。这个功能其实Apache,Nginx等网页服务器都具备,但是开发环境下的Rails服务器不比真正的网页服务器,没有这种功能。

当然,不能直接简单地用个网页服务器了事,因为传统网页服务器不能实现对Ruby代码的Debug(何况最近还特别迷恋pry神器),而这是我需要的基本功能。除此以外,我还需要它的路由层次必须高于/etc/hosts文件,因为我们还要时常切换到QA环境或是生产环境,而我们切换的方法就是修改/etc/hosts。所以在防火墙甚至于更底层实现都是我不能接受的。

于是我在Twitter和Ruby China发起了提问(http://ruby-china.org/topics/6102),收到了不少响应,比如RVM+Pow的手法,确实不曾听说过,感觉不错的样子。还有Passenger + Apache的办法,来自于Railscasts介绍的办法:http://railscasts.com/episodes/122-passenger-in-development。不过,我更希望的是一种更加简单的办法,不需要复杂的GUI控制,完全透明,而且最好是平台无关的,毕竟我比起Mac OS X还是更希望用Linux开发,因此不希望采用Mac Only的办法。

在反复思虑后,选择了@RainFlying提出的用Apache/Nginx做反向代理的办法,将发送到Apache/Nginx的请求通过代理转发到真正的Rails服务器上,以此实现了让多个Rails App时同时监听80端口的假象。

于是,我就在目前正在使用的Ubuntu 12.04上安装了nginx-light包,这个包比起nginx-full来说仅仅包含了最核心的nginx,不带过多的Modules,保持环境的轻量。然后在/etc/nginx/sites-available里创建了一个新文件,内容如下:

server {
        server_name test1.com;
        location / {
                proxy_pass http://localhost:3000/;
        }
}

server {
        server_name test2.com;
        location / {
                proxy_pass http://localhost:3001/;
        }
}

由于每个站点的配置仅有简单的几行,因此我把所有配置都包含在一个文件里,看上去简洁明了。

然后修改/etc/hosts文件,将域名指向本地服务器。这个步骤也暗示了我随时随地可以通过修改/etc/hosts切换环境,而不需要任何其他操作,完全和以前一样。

最后运行

sudo service nginx restart

重启Nginx。虽然网上有说用

sudo service nginx reload

也可以,但是我在尝试后发现似乎并没能成功更新配置信息,因此还是使用restart命令。

到这里,其实反向代理因此可以工作了,但是由于Nginx服务器毕竟不比为开发设计的Rails服务器,所有的连接都有超时时间。如果在连接时进入了Debug模式,我希望连接能够一直保持等待直到Debug结束,在查阅了Nginx的文档后,发现可以用proxy_read_timeout选项设置Nginx等待被代理服务器的响应时间,默认为60秒,我将这个时间设置到了36000秒,即10个小时,差不多足够了吧。

明天就把这个方法在团队中推广下,大家以后不用再抢端口了吧。

RubyGem Introduction

2012年10月15日 00:53

这是我下次做关于RubyGem Presentation的Slides,这次花了较多的时间来准备,因为一直感觉做不到太多的可以讲的素材,如果只是按照Team Leader的要求讲如何写一个RubyGem,我五分钟就可以讲完了,这样就不是很有意思了。后来由于掌握了一些阅读Rails源码的技巧,发现RubyGem和GemBundler的运作原理绝对是个不错的演讲题材,因此在制作这个Slides的过程中,我一方面自己翻阅资料,阅读源码,另一方面放了些小提示进去,启发大家思考,鼓励大家也通过阅读源码来彻底的了解RubyGem这个东西。

不过按照Team Leader对Slides简单但蕴涵深度的要求,我不会把更多信息放在Slides里,而是准备在演示时带着大家找到问题的答案。

通过做Slides,我自己也学习了很多,了解了很多,还发现了Ruby Plugin这样一个未知领域,呵呵,说不定我下一个目标就是它了!