为什么nginx在开发环境中非常缓慢地为我的rails应用程序提供服务?

时间:2013-04-02 13:33:55

标签: ruby-on-rails nginx rack

我正在mac OSX上开发一个RoR应用程序。

为了能够在http://localhost访问我的应用程序,并且为了在我的测试中支持SSL,我使用nginx作为我的Webrick端口3000的代理,具有以下配置:

server {
    listen 80;
    server_name app.mysite.com;
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect off;
        proxy_pass http://127.0.0.1:3000;
    }
}

server {
    listen       443 ssl;
    server_name  secure.app.mysite.com;

    ssl                  on;
    ssl_certificate      ssl/server.crt;
    ssl_certificate_key  ssl/server.key;

    keepalive_timeout 600;
    ssl_session_timeout 10m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers   on;

    location / {
        proxy_pass http://127.0.0.1:3000;
        ### force timeouts if one of backend is died ##
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
        ### Set headers ####
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        ### Most PHP, Python, Rails, Java App can use this header ###
        proxy_set_header X-Forwarded-Proto https;
        ### By default we don't want to redirect it ####
        proxy_redirect     off;
   }
}

当我在http://localhost/https://localhost/上访问该应用时 服务器响应迅速,http://localhost:3000以上的开销可以忽略不计。

但是,当我尝试从同一网络上的另一台计算机访问我的计算机时(例如http://10.0.1.9/),服务器响应速度非常慢,或根本没有响应。

在这种情况下,似乎nginx甚至没有向端口3000发送内部请求,尽管请求从外部到达nginx肯定,并且从外部请求端口3000非常快。

重要的是要注意我的应用程序是以开发模式运行的,而且我的资产(相当多)都没有预编译。

除了nginx之外还有其他选项可以轻松地在我的网络上公开我的开发站点,这很容易配置,并且支持SSL吗?

谢谢, 爱丽儿

3 个答案:

答案 0 :(得分:2)

原来这是nginx的权限问题。 我在发现nginx错误日志中的错误后找到了它。

解决方案可以在这里找到

https://serverfault.com/questions/235154/permission-denied-while-reading-upstream

答案 1 :(得分:0)

我打赌它根本不是nginx。很难想象nginx会在传递到同一服务器上游之前将请求保留很长时间。您是否可以检查访问日志(nginx和ROR)以查看请求的开始时间是否不同?

您的osx的哪个版本?是狮子还是山狮?两者都存在使用/ etc / hosts中的条目进行慢速dns查找的问题。

我的同事经历了同样的缓慢。有关讨论,请参阅Mac OSX Lion DNS lookup order。这有点乱。

答案 2 :(得分:0)

要尝试的几个项目,因为使用localhost工作正常但不能从另一台计算机上工作听起来很可疑。

  • 同样'netstat -na | grep 80'以确保Nginx正在侦听0.0.0.0或*:80而不是127.0.0.1。如果Nginx没有监听0.0.0.0或*那么它可能是TCP路由问题。任何服务器都一样。 这是一个很好的示例输出(我的例子是监听8000)

    tcp4 0 0 *.8000 *.* LISTEN

  • 为了好玩,在Nginx代理语句中将“127.0.0.1”更改为“localhost”和/或“0.0.0.0”(尽管路由将在它到达时完成)

另外,我建议您尝试使用Nginx的日志记录来查看是否还有其他问题。这里有更好的代理/上游日志记录的堆栈溢出:logging proxy activity in nginx

此外,您应该打开调试日志(我已经解决了这个问题),将它置于access_log指令的下方/上方。这样的事情应该没问题:

 error_log  /Users/your_name/nginx_test/logs/error.log  debug;

请注意,对于Nginx,您必须使用日志的绝对路径。

祝你好运。