<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>cym2015 (蔡源茂)</title>
    <link>https://ruby-china.org/cym2015</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>用 Ruby 写一个没有什么用的爬虫</title>
      <description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;前两天面试一家公司，被问道，如何获取一个网页，找出其中的所有链接，并且得到哪些链接是可以访问的，哪些不可以？&lt;/p&gt;

&lt;p&gt;最初，我以为这是一个比较清晰简单的题目，构想了以下步骤：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;获取整个 html 文档&lt;/li&gt;
&lt;li&gt;解析整个 html 文档，找出里面的所有链接&lt;/li&gt;
&lt;li&gt;依次访问链接中的地址，&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;今天想着做一个试试，却发现这三个步骤做起来，要考虑的东西还是蛮多的。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;如何获取到整个 html 页面。

&lt;ul&gt;
&lt;li&gt;大部分网页都是由 js 动态生成的，仅通过 net/http 不能获取到完整的 html 页面。这步骤也是最麻烦的，当然，解决方案也有很多，这个帖子汇总的比较全面：&lt;a href="https://ruby-china.org/topics/31784" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/31784&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如何解析 html 文档。

&lt;ul&gt;
&lt;li&gt;这个就相对的要单纯一点，&lt;code&gt;nokogiri&lt;/code&gt; 是一个很容易找到的 gem 包&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;http 请求超时问题。

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Timeout&lt;/code&gt;可以搞定 &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;多链接请求带来的并发问题。

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;线程&lt;/code&gt;是个好东西&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;未考虑到的细节，欢迎大家补充&lt;/strong&gt; &lt;img title=":grinning:" alt="😀" src="https://twemoji.ruby-china.com/2/svg/1f600.svg" class="twemoji"&gt; &lt;/p&gt;
&lt;h2 id="代码"&gt;代码&lt;/h2&gt;
&lt;p&gt;贴一段我尝试实现的代码&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'timeout'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'net/http'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'nokogiri'&lt;/span&gt;  &lt;span class="c1"&gt;#gem install nokogiri &lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Web_crawler&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="vi"&gt;@url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;

        &lt;span class="c1"&gt;#存储检索页面各项信息数据&lt;/span&gt;
        &lt;span class="vi"&gt;@links&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;  &lt;span class="c1"&gt;#页面链接总数&lt;/span&gt;
        &lt;span class="vi"&gt;@success_links&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; 
        &lt;span class="vi"&gt;@failed_links&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; 
        &lt;span class="vi"&gt;@timeout_links&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; 
        &lt;span class="vi"&gt;@invalid_links&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; 
        &lt;span class="vi"&gt;@forbidden_links&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; 
        &lt;span class="vi"&gt;@exception_links&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; 

        &lt;span class="c1"&gt;#记录程序启动时间&lt;/span&gt;
        &lt;span class="vi"&gt;@begin_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;
        &lt;span class="vi"&gt;@timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="c1"&gt;#访问超时设定，单位秒&lt;/span&gt;

    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;

        &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;open_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;analysis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;print_result&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="kp"&gt;private&lt;/span&gt; 

        &lt;span class="c1"&gt;#采用线程并发检查各个链接的可达性，并限制线程并发量和链接访问超时时间&lt;/span&gt;
        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;analysis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;thread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
            &lt;span class="n"&gt;html_doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Nokogiri&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTML&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;a_lable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;html_doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;xpath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"//a"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#找出所有的&amp;lt;a&amp;gt;标签&lt;/span&gt;
            &lt;span class="n"&gt;a_lable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;each_lable&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
                &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt; 
                    &lt;span class="k"&gt;break&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;  &lt;span class="no"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="c1"&gt;#线程并发量&lt;/span&gt;
                    &lt;span class="nb"&gt;sleep&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="k"&gt;end&lt;/span&gt;

                &lt;span class="n"&gt;href1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;each_lable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;
                &lt;span class="n"&gt;thread&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;href1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
                    &lt;span class="vi"&gt;@links&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;

                    &lt;span class="c1"&gt;#本地链接时，补齐url地址&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"http://"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                        &lt;span class="n"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vi"&gt;@url&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;
                    &lt;span class="k"&gt;end&lt;/span&gt;

                    &lt;span class="n"&gt;open_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;end&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="c1"&gt;#两倍超时设定，保证所有链接均正常检查完成&lt;/span&gt;
            &lt;span class="no"&gt;Timeout&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@timeout&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; 
                &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt; 
                    &lt;span class="k"&gt;break&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@success_links&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="vi"&gt;@failed_links&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;a_lable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;
                    &lt;span class="nb"&gt;sleep&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="k"&gt;end&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="s2"&gt;"遍历异常结束，请检查！"&lt;/span&gt;
            &lt;span class="n"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;kill&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt; 


        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;open_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;begin&lt;/span&gt;
                &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;open_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;
                &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="no"&gt;Net&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTTPSuccess&lt;/span&gt;
                    &lt;span class="c1"&gt;##&amp;lt;Net::HTTPOK 200 OK readbody=true&amp;gt;&lt;/span&gt;
                    &lt;span class="vi"&gt;@success_links&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;
                &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="no"&gt;Net&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTTPForbidden&lt;/span&gt;
                    &lt;span class="c1"&gt;#&amp;lt;Net::HTTPForbidden 403 Forbidden readbody=true&amp;gt;&lt;/span&gt;
                    &lt;span class="vi"&gt;@forbidden_links&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;
                    &lt;span class="vi"&gt;@failed_links&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;
                &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="no"&gt;Net&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTTPMovedPermanently&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;Net&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTTPFound&lt;/span&gt;
                    &lt;span class="c1"&gt;#&amp;lt;Net::HTTPMovedPermanently 301 Moved Permanently readbody=true&amp;gt;&lt;/span&gt;
                    &lt;span class="c1"&gt;#&amp;lt;Net::HTTPFound 302 Moved Temporarily readbody=true&amp;gt;&lt;/span&gt;
                    &lt;span class="vi"&gt;@invalid_links&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;
                    &lt;span class="vi"&gt;@failed_links&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;
                    &lt;span class="vi"&gt;@failed_links&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;
                &lt;span class="k"&gt;end&lt;/span&gt;

            &lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;InvalidURIError&lt;/span&gt;
                &lt;span class="vi"&gt;@invalid_links&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;
                &lt;span class="vi"&gt;@failed_links&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;
            &lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="no"&gt;Timeout&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Error&lt;/span&gt;
                &lt;span class="vi"&gt;@timeout_links&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;
                &lt;span class="vi"&gt;@failed_links&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;
            &lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="no"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt; 
                &lt;span class="vi"&gt;@exception_links&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;
                &lt;span class="vi"&gt;@failed_links&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;
            &lt;span class="k"&gt;end&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;

        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;open_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Timeout&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@timeout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Net&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTTP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;

        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;print_result&lt;/span&gt;
            &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"网址 &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 分析结果:"&lt;/span&gt;
            &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"共发现链接 &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@links.size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 个."&lt;/span&gt;
            &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"能成功访问 &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@success_links.size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 个."&lt;/span&gt;
            &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"访问失败 &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@failed_links.size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 个"&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@forbidden_links&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="vi"&gt;@timeout_links&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="vi"&gt;@invalid_links&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="vi"&gt;@exception_links&lt;/span&gt; &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
                &lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
                &lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;"拒绝访问 &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@forbidden_links.size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 个"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;  &lt;span class="vi"&gt;@forbidden_links&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
                &lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;"访问超时 &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@timeout_links.size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 个"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;  &lt;span class="vi"&gt;@timeout_links&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
                &lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;"无效链接 &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@invalid_links.size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 个"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;  &lt;span class="vi"&gt;@invalid_links&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
                &lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;"访问异常 &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@exception_links.size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 个"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;  &lt;span class="vi"&gt;@exception_links&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
                &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"(&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;","&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;
            &lt;span class="k"&gt;end&lt;/span&gt; 
            &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"."&lt;/span&gt;
            &lt;span class="n"&gt;run_time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;

        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_time&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="vi"&gt;@begin_time&lt;/span&gt;
            &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"耗时：&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 分 &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 秒 &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;毫秒"&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;begin&lt;/span&gt; 
    &lt;span class="n"&gt;web&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Web_crawler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'http://www.sangfor.com.cn'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="no"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"出现未知异常，程序异常终止！"&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;backtrace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;




&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="执行结果"&gt;执行结果&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/4402e063-e85d-45e9-9b85-e7743de6bfcc.jpg!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>cym2015</author>
      <pubDate>Sun, 07 Jan 2018 17:36:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/34845</link>
      <guid>https://ruby-china.org/topics/34845</guid>
    </item>
    <item>
      <title>部署 Rails 访问 demo 实例，总是提示 ‘Incomplete response received from application’</title>
      <description>&lt;p&gt;本人新手，第一次在 linux 上部署 rails，由于周围没有老前辈指引，虽已尝试部署多日，但是总是不成。无奈，来社区发帖，希望前辈们指点一二，小弟万分感激。&lt;/p&gt;

&lt;p&gt;部署上是参照社区 wiki：&lt;a href="https://ruby-china.org/wiki/rvm-guide" rel="nofollow" target="_blank"&gt;https://ruby-china.org/wiki/rvm-guide&lt;/a&gt; 示例，在 ubuntu 上操作，除最后一步安装 nginx 是采用的自行下载源码，通过 rvmsudo passenger-install-nginx-module 外，其他均与示例中保持一致操作。&lt;/p&gt;

&lt;p&gt;我本地的 demo 实例，rails s 启动后，是可以通过&lt;a href="http://localhost:3000/say/hello," rel="nofollow" target="_blank"&gt;http://localhost:3000/say/hello,&lt;/a&gt;正常访问，
但是，通过 sudo /opt/nginx/sbin/nginx 启动 nginx 后，本地访问&lt;a href="http://localhost/say/helloIncomplete" rel="nofollow" target="_blank"&gt;http://localhost/say/helloIncomplete&lt;/a&gt;时，总是提示‘response received from application’&lt;/p&gt;

&lt;p&gt;以下是 nginx 的配置文件&lt;/p&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;
&lt;span class="c"&gt;#user  nobody;
&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="n"&gt;caiyuanmao&lt;/span&gt; &lt;span class="n"&gt;caiyuanmao&lt;/span&gt;;
&lt;span class="n"&gt;worker_processes&lt;/span&gt;  &lt;span class="m"&gt;1&lt;/span&gt;;

&lt;span class="c"&gt;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
&lt;/span&gt;
&lt;span class="c"&gt;#pid        logs/nginx.pid;
&lt;/span&gt;

&lt;span class="n"&gt;events&lt;/span&gt; {
    &lt;span class="n"&gt;worker_connections&lt;/span&gt;  &lt;span class="m"&gt;1024&lt;/span&gt;;
}


&lt;span class="n"&gt;http&lt;/span&gt; {
    &lt;span class="n"&gt;passenger_root&lt;/span&gt; /&lt;span class="n"&gt;home&lt;/span&gt;/&lt;span class="n"&gt;caiyuanmao&lt;/span&gt;/.&lt;span class="n"&gt;rvm&lt;/span&gt;/&lt;span class="n"&gt;gems&lt;/span&gt;/&lt;span class="n"&gt;ruby&lt;/span&gt;-&lt;span class="m"&gt;2&lt;/span&gt;.&lt;span class="m"&gt;3&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;@&lt;span class="n"&gt;rails5&lt;/span&gt;/&lt;span class="n"&gt;gems&lt;/span&gt;/&lt;span class="n"&gt;passenger&lt;/span&gt;-&lt;span class="m"&gt;5&lt;/span&gt;.&lt;span class="m"&gt;1&lt;/span&gt;.&lt;span class="m"&gt;2&lt;/span&gt;;
    &lt;span class="n"&gt;passenger_ruby&lt;/span&gt; /&lt;span class="n"&gt;home&lt;/span&gt;/&lt;span class="n"&gt;caiyuanmao&lt;/span&gt;/.&lt;span class="n"&gt;rvm&lt;/span&gt;/&lt;span class="n"&gt;gems&lt;/span&gt;/&lt;span class="n"&gt;ruby&lt;/span&gt;-&lt;span class="m"&gt;2&lt;/span&gt;.&lt;span class="m"&gt;3&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;@&lt;span class="n"&gt;rails5&lt;/span&gt;/&lt;span class="n"&gt;wrappers&lt;/span&gt;/&lt;span class="n"&gt;ruby&lt;/span&gt;;

    &lt;span class="n"&gt;include&lt;/span&gt;       &lt;span class="n"&gt;mime&lt;/span&gt;.&lt;span class="n"&gt;types&lt;/span&gt;;
    &lt;span class="n"&gt;default_type&lt;/span&gt;  &lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;octet&lt;/span&gt;-&lt;span class="n"&gt;stream&lt;/span&gt;;

    &lt;span class="c"&gt;#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
&lt;/span&gt;    &lt;span class="c"&gt;#                  '$status $body_bytes_sent "$http_referer" '
&lt;/span&gt;    &lt;span class="c"&gt;#                  '"$http_user_agent" "$http_x_forwarded_for"';
&lt;/span&gt;
    &lt;span class="c"&gt;#access_log  logs/access.log  main;
&lt;/span&gt;
    &lt;span class="n"&gt;sendfile&lt;/span&gt;        &lt;span class="n"&gt;on&lt;/span&gt;;
    &lt;span class="c"&gt;#tcp_nopush     on;
&lt;/span&gt;
    &lt;span class="c"&gt;#keepalive_timeout  0;
&lt;/span&gt;    &lt;span class="n"&gt;keepalive_timeout&lt;/span&gt;  &lt;span class="m"&gt;65&lt;/span&gt;;

    &lt;span class="c"&gt;#gzip  on;
&lt;/span&gt;
    &lt;span class="n"&gt;server&lt;/span&gt; {
        &lt;span class="n"&gt;listen&lt;/span&gt;       &lt;span class="m"&gt;80&lt;/span&gt;;
        &lt;span class="n"&gt;server_name&lt;/span&gt;  &lt;span class="n"&gt;localhost&lt;/span&gt;;

        &lt;span class="c"&gt;#charset koi8-r;
&lt;/span&gt;
        &lt;span class="c"&gt;#access_log  logs/host.access.log  main;
&lt;/span&gt;    &lt;span class="n"&gt;root&lt;/span&gt;   /&lt;span class="n"&gt;home&lt;/span&gt;/&lt;span class="n"&gt;caiyuanmao&lt;/span&gt;/&lt;span class="n"&gt;demo&lt;/span&gt;/&lt;span class="n"&gt;public&lt;/span&gt;;
    &lt;span class="n"&gt;passenger_enabled&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;;

        &lt;span class="c"&gt;#location / {
&lt;/span&gt;        &lt;span class="c"&gt;#alias /websites/secondapp/public$1;  # &amp;lt;-- be sure to point to 'public'!
&lt;/span&gt;            &lt;span class="c"&gt;#passenger_base_uri /subpath;
&lt;/span&gt;            &lt;span class="c"&gt;#passenger_app_root /websites/secondapp;
&lt;/span&gt;            &lt;span class="c"&gt;#passenger_document_root /websites/secondapp/public;
&lt;/span&gt;            &lt;span class="c"&gt;#passenger_enabled on;
&lt;/span&gt;            &lt;span class="c"&gt;#root   html;
&lt;/span&gt;            &lt;span class="c"&gt;#index  index.html index.htm;
&lt;/span&gt;        &lt;span class="c"&gt;#}
&lt;/span&gt;
        &lt;span class="c"&gt;#error_page  404              /404.html;
&lt;/span&gt;
        &lt;span class="c"&gt;# redirect server error pages to the static page /50x.html
&lt;/span&gt;        &lt;span class="c"&gt;#
&lt;/span&gt;        &lt;span class="n"&gt;error_page&lt;/span&gt;   &lt;span class="m"&gt;500&lt;/span&gt; &lt;span class="m"&gt;502&lt;/span&gt; &lt;span class="m"&gt;503&lt;/span&gt; &lt;span class="m"&gt;504&lt;/span&gt;  /&lt;span class="m"&gt;50&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;.&lt;span class="n"&gt;html&lt;/span&gt;;
        &lt;span class="n"&gt;location&lt;/span&gt; = /&lt;span class="m"&gt;50&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;.&lt;span class="n"&gt;html&lt;/span&gt; {
            &lt;span class="n"&gt;root&lt;/span&gt;   &lt;span class="n"&gt;html&lt;/span&gt;;
        }

        &lt;span class="c"&gt;# proxy the PHP scripts to Apache listening on 127.0.0.1:80
&lt;/span&gt;        &lt;span class="c"&gt;#
&lt;/span&gt;        &lt;span class="c"&gt;#location ~ \.php$ {
&lt;/span&gt;        &lt;span class="c"&gt;#    proxy_pass   http://127.0.0.1;
&lt;/span&gt;        &lt;span class="c"&gt;#}
&lt;/span&gt;
        &lt;span class="c"&gt;# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
&lt;/span&gt;        &lt;span class="c"&gt;#
&lt;/span&gt;        &lt;span class="c"&gt;#location ~ \.php$ {
&lt;/span&gt;        &lt;span class="c"&gt;#    root           html;
&lt;/span&gt;        &lt;span class="c"&gt;#    fastcgi_pass   127.0.0.1:9000;
&lt;/span&gt;        &lt;span class="c"&gt;#    fastcgi_index  index.php;
&lt;/span&gt;        &lt;span class="c"&gt;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
&lt;/span&gt;        &lt;span class="c"&gt;#    include        fastcgi_params;
&lt;/span&gt;        &lt;span class="c"&gt;#}
&lt;/span&gt;
        &lt;span class="c"&gt;# deny access to .htaccess files, if Apache's document root
&lt;/span&gt;        &lt;span class="c"&gt;# concurs with nginx's one
&lt;/span&gt;        &lt;span class="c"&gt;#
&lt;/span&gt;        &lt;span class="c"&gt;#location ~ /\.ht {
&lt;/span&gt;        &lt;span class="c"&gt;#    deny  all;
&lt;/span&gt;        &lt;span class="c"&gt;#}
&lt;/span&gt;    }


    &lt;span class="c"&gt;# another virtual host using mix of IP-, name-, and port-based configuration
&lt;/span&gt;    &lt;span class="c"&gt;#
&lt;/span&gt;    &lt;span class="c"&gt;#server {
&lt;/span&gt;    &lt;span class="c"&gt;#    listen       8000;
&lt;/span&gt;    &lt;span class="c"&gt;#    listen       somename:8080;
&lt;/span&gt;    &lt;span class="c"&gt;#    server_name  somename  alias  another.alias;
&lt;/span&gt;
    &lt;span class="c"&gt;#    location / {
&lt;/span&gt;    &lt;span class="c"&gt;#        root   html;
&lt;/span&gt;    &lt;span class="c"&gt;#        index  index.html index.htm;
&lt;/span&gt;    &lt;span class="c"&gt;#    }
&lt;/span&gt;    &lt;span class="c"&gt;#}
&lt;/span&gt;

    &lt;span class="c"&gt;# HTTPS server
&lt;/span&gt;    &lt;span class="c"&gt;#
&lt;/span&gt;    &lt;span class="c"&gt;#server {
&lt;/span&gt;    &lt;span class="c"&gt;#    listen       443 ssl;
&lt;/span&gt;    &lt;span class="c"&gt;#    server_name  localhost;
&lt;/span&gt;
    &lt;span class="c"&gt;#    ssl_certificate      cert.pem;
&lt;/span&gt;    &lt;span class="c"&gt;#    ssl_certificate_key  cert.key;
&lt;/span&gt;
    &lt;span class="c"&gt;#    ssl_session_cache    shared:SSL:1m;
&lt;/span&gt;    &lt;span class="c"&gt;#    ssl_session_timeout  5m;
&lt;/span&gt;
    &lt;span class="c"&gt;#    ssl_ciphers  HIGH:!aNULL:!MD5;
&lt;/span&gt;    &lt;span class="c"&gt;#    ssl_prefer_server_ciphers  on;
&lt;/span&gt;
    &lt;span class="c"&gt;#    location / {
&lt;/span&gt;    &lt;span class="c"&gt;#        root   html;
&lt;/span&gt;    &lt;span class="c"&gt;#        index  index.html index.htm;
&lt;/span&gt;    &lt;span class="c"&gt;#    }
&lt;/span&gt;    &lt;span class="c"&gt;#}
&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nginx 的 error.log 如下：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt; 2017-03-19 23:47:31.0842 25983/b6810700 age/Wat/WatchdogMain.cpp:1281 &lt;span class="o"&gt;]&lt;/span&gt;: Starting Passenger watchdog...
&lt;span class="o"&gt;[&lt;/span&gt; 2017-03-19 23:47:31.1052 25986/b6778700 age/Cor/CoreMain.cpp:1070 &lt;span class="o"&gt;]&lt;/span&gt;: Starting Passenger core...
&lt;span class="o"&gt;[&lt;/span&gt; 2017-03-19 23:47:31.1054 25986/b6778700 age/Cor/CoreMain.cpp:245 &lt;span class="o"&gt;]&lt;/span&gt;: Passenger core running &lt;span class="k"&gt;in &lt;/span&gt;multi-application mode.
&lt;span class="o"&gt;[&lt;/span&gt; 2017-03-19 23:47:31.1255 25986/b6778700 age/Cor/CoreMain.cpp:820 &lt;span class="o"&gt;]&lt;/span&gt;: Passenger core online, PID 25986
&lt;span class="o"&gt;[&lt;/span&gt; 2017-03-19 23:47:31.1467 25999/b677c700 age/Ust/UstRouterMain.cpp:529 &lt;span class="o"&gt;]&lt;/span&gt;: Starting Passenger UstRouter...
&lt;span class="o"&gt;[&lt;/span&gt; 2017-03-19 23:47:31.1481 25999/b677c700 age/Ust/UstRouterMain.cpp:342 &lt;span class="o"&gt;]&lt;/span&gt;: Passenger UstRouter online, PID 25999
&lt;span class="o"&gt;[&lt;/span&gt; 2017-03-19 23:47:34.2566 25986/b64ffb40 age/Cor/SecurityUpdateChecker.h:464 &lt;span class="o"&gt;]&lt;/span&gt;: Security update check: no update found &lt;span class="o"&gt;(&lt;/span&gt;next check &lt;span class="k"&gt;in &lt;/span&gt;24 hours&lt;span class="o"&gt;)&lt;/span&gt;
App 26034 stdout: 
App 26113 stdout: 
&lt;span class="o"&gt;[&lt;/span&gt; 2017-03-19 23:47:48.4542 25986/b59feb40 age/Cor/Con/InternalUtils.cpp:112 &lt;span class="o"&gt;]&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;Client 1-1] Sending 502 response: application did not send a &lt;span class="nb"&gt;complete &lt;/span&gt;response
App 26034 stderr: &lt;span class="o"&gt;[&lt;/span&gt; 2017-03-19 23:47:48.4538 26113/0x84e5bbc&lt;span class="o"&gt;(&lt;/span&gt;Worker 1&lt;span class="o"&gt;)&lt;/span&gt; utils.rb:87 &lt;span class="o"&gt;]&lt;/span&gt;: &lt;span class="k"&gt;***&lt;/span&gt; Exception RuntimeError &lt;span class="k"&gt;in &lt;/span&gt;Rack application object &lt;span class="o"&gt;(&lt;/span&gt;Missing &lt;span class="sb"&gt;`&lt;/span&gt;secret_key_base&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s1"&gt;'production'&lt;/span&gt; environment, &lt;span class="nb"&gt;set &lt;/span&gt;this value &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;config/secrets.yml&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;process 26113, thread 0x84e5bbc&lt;span class="o"&gt;(&lt;/span&gt;Worker 1&lt;span class="o"&gt;))&lt;/span&gt;:
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/railties-5.0.0.1/lib/rails/application.rb:513:in &lt;span class="sb"&gt;`&lt;/span&gt;validate_secret_key_config!&lt;span class="s1"&gt;'
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/railties-5.0.0.1/lib/rails/application.rb:246:in `env_config'&lt;/span&gt;
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/railties-5.0.0.1/lib/rails/engine.rb:693:in &lt;span class="sb"&gt;`&lt;/span&gt;build_request&lt;span class="s1"&gt;'
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/railties-5.0.0.1/lib/rails/application.rb:521:in `build_request'&lt;/span&gt;
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/railties-5.0.0.1/lib/rails/engine.rb:521:in &lt;span class="sb"&gt;`&lt;/span&gt;call&lt;span class="s1"&gt;'
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb:97:in `process_request'&lt;/span&gt;
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb:152:in &lt;span class="sb"&gt;`&lt;/span&gt;accept_and_process_next_request&lt;span class="s1"&gt;'
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb:113:in `main_loop'&lt;/span&gt;
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/request_handler.rb:416:in &lt;span class="sb"&gt;`&lt;/span&gt;block &lt;span class="o"&gt;(&lt;/span&gt;3 levels&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;start_threads&lt;span class="s1"&gt;'
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/utils.rb:113:in `block in create_thread_and_abort_on_exception'&lt;/span&gt;
App 26034 stderr: &lt;span class="o"&gt;[&lt;/span&gt; 2017-03-19 23:49:39.9406 26113/0x84e5bbc&lt;span class="o"&gt;(&lt;/span&gt;Worker 1&lt;span class="o"&gt;)&lt;/span&gt; utils.rb:87 &lt;span class="o"&gt;]&lt;/span&gt;: &lt;span class="k"&gt;***&lt;/span&gt; Exception RuntimeError &lt;span class="k"&gt;in &lt;/span&gt;Rack application object &lt;span class="o"&gt;(&lt;/span&gt;Missing &lt;span class="sb"&gt;`&lt;/span&gt;secret_key_base&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s1"&gt;'production'&lt;/span&gt; environment, &lt;span class="nb"&gt;set &lt;/span&gt;this value &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;config/secrets.yml&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;process 26113, thread 0x84e5bbc&lt;span class="o"&gt;(&lt;/span&gt;Worker 1&lt;span class="o"&gt;))&lt;/span&gt;:
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/railties-5.0.0.1/lib/rails/application.rb:513:in &lt;span class="sb"&gt;`&lt;/span&gt;validate_secret_key_config!&lt;span class="s1"&gt;'
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/railties-5.0.0.1/lib/rails/application.rb:246:in `env_config'&lt;/span&gt;
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/railties-5.0.0.1/lib/rails/engine.rb:693:in &lt;span class="sb"&gt;`&lt;/span&gt;build_request&lt;span class="s1"&gt;'
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/railties-5.0.0.1/lib/rails/application.rb:521:in `build_request'&lt;/span&gt;
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/railties-5.0.0.1/lib/rails/engine.rb:521:in &lt;span class="sb"&gt;`&lt;/span&gt;call&lt;span class="s1"&gt;'
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb:97:in `process_request'&lt;/span&gt;
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb:152:in &lt;span class="sb"&gt;`&lt;/span&gt;accept_and_process_next_request&lt;span class="s1"&gt;'
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb:113:in `main_loop'&lt;/span&gt;
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/request_handler.rb:416:in &lt;span class="sb"&gt;`&lt;/span&gt;block &lt;span class="o"&gt;(&lt;/span&gt;3 levels&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;start_threads&lt;span class="s1"&gt;'
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/utils.rb:113:in `block in create_thread_and_abort_on_exception'&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; 2017-03-19 23:49:39.9408 25986/b517cb40 age/Cor/Con/InternalUtils.cpp:112 &lt;span class="o"&gt;]&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;Client 2-1] Sending 502 response: application did not send a &lt;span class="nb"&gt;complete &lt;/span&gt;response
App 26034 stderr: &lt;span class="o"&gt;[&lt;/span&gt; 2017-03-19 23:53:01.8904 26113/0x84e5bbc&lt;span class="o"&gt;(&lt;/span&gt;Worker 1&lt;span class="o"&gt;)&lt;/span&gt; utils.rb:87 &lt;span class="o"&gt;]&lt;/span&gt;: &lt;span class="k"&gt;***&lt;/span&gt; Exception RuntimeError &lt;span class="k"&gt;in &lt;/span&gt;Rack application object &lt;span class="o"&gt;(&lt;/span&gt;Missing &lt;span class="sb"&gt;`&lt;/span&gt;secret_key_base&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s1"&gt;'production'&lt;/span&gt; environment, &lt;span class="nb"&gt;set &lt;/span&gt;this value &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;config/secrets.yml&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;process 26113, thread 0x84e5bbc&lt;span class="o"&gt;(&lt;/span&gt;Worker 1&lt;span class="o"&gt;))&lt;/span&gt;:
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/railties-5.0.0.1/lib/rails/application.rb:513:in &lt;span class="sb"&gt;`&lt;/span&gt;validate_secret_key_config!&lt;span class="s1"&gt;'
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/railties-5.0.0.1/lib/rails/application.rb:246:in `env_config'&lt;/span&gt;
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/railties-5.0.0.1/lib/rails/engine.rb:693:in &lt;span class="sb"&gt;`&lt;/span&gt;build_request&lt;span class="s1"&gt;'
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/railties-5.0.0.1/lib/rails/application.rb:521:in `build_request'&lt;/span&gt;
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/railties-5.0.0.1/lib/rails/engine.rb:521:in &lt;span class="sb"&gt;`&lt;/span&gt;call&lt;span class="s1"&gt;'
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb:97:in `process_request'&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; 2017-03-19 23:53:01.8906 25986/b59feb40 age/Cor/Con/InternalUtils.cpp:112 &lt;span class="o"&gt;]&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;Client 1-2] Sending 502 response: application did not send a &lt;span class="nb"&gt;complete &lt;/span&gt;response
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb:152:in &lt;span class="sb"&gt;`&lt;/span&gt;accept_and_process_next_request&lt;span class="s1"&gt;'
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb:113:in `main_loop'&lt;/span&gt;
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/request_handler.rb:416:in &lt;span class="sb"&gt;`&lt;/span&gt;block &lt;span class="o"&gt;(&lt;/span&gt;3 levels&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;start_threads&lt;span class="s1"&gt;'
App 26034 stderr:   from /home/caiyuanmao/.rvm/gems/ruby-2.3.0@rails5/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/utils.rb:113:in `block in create_thread_and_abort_on_exception'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>cym2015</author>
      <pubDate>Mon, 20 Mar 2017 00:09:56 +0800</pubDate>
      <link>https://ruby-china.org/topics/32578</link>
      <guid>https://ruby-china.org/topics/32578</guid>
    </item>
  </channel>
</rss>
