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

我正在开发Mac OSX上的RoR应用程序。

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

 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的开销可以忽略不计。

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

似乎nginx甚至没有发送一个内部请求到端口3000在这种情况下,虽然请求是从外面到达nginx肯定,并且从外部请求到端口3000真的很快。

请注意,我的应用程序正在开发模式下运行,而我的资产(相当多)不会预编译。

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

谢谢,Ariel

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

解决方案可以在这里找到

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

我敢打赌,这根本不是nginx。 很难想象nginx在传递到同一台服务器的上游之前会持续很长时间的请求。 你可以检查两个访问日志(nginx和ROR),看看请求的开始时间是不一样的吗?

你的osx版本是哪一个? 是狮子还是山狮? 两者都有与/ etc / hosts中的条目慢查找问题。

我的同事经历了同样的缓慢。 请参阅Mac OSX Lion DNS查找顺序进行讨论。 这有点乱。

几个项目尝试,因为它听起来很腥,与本地主机工作正常,但不是从另一台计算机。

  • 另外'netstat -na | grep 80' '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的日志记录来查看是否有其他问题。 在这里更好的代理/上游记录已经有了一个stackoverflow: 在nginx中记录代理活动

另外,你应该打开调试日志(我解决了这个问题),把它放在access_log指令的下面/上面。 像这样的事情应该罚款:

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

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

祝你好运。