Rails 502 Bad Gateway nginx/1.1.19

liker · 2013年09月04日 · 最后由 liker 回复于 2013年09月04日 · 7838 次阅读

我写了一个 setting(用户信息设置)页面,production 和 development 环境下,都没问题。但项目部署后,有时会出现 ,当然也有显示正常的时候。请指教。谢谢

这个是部署配置的问题,Nginx 要反向代理的那个 Rails 进程挂了,或者正在重启中,你应该介绍一下你的部署方式,以及有没有自动启动脚本之类的?

#1 楼 @lgn21st

upstream myapp{
server unix:/tmp/unicorn.hmp.sock;
#server unix:/tmp/unicorn.rhea.sock;
#server 192.168.1.7:9000;
}
server {
listen  80;
server_name hmp;
client_max_body_size 4G;
client_body_buffer_size 20M;
access_log /home/hmpuser/deploy/shared/log/access.log;
error_log /home/hmpuser/deploy/shared/log/error.log;
root      /home/hmpuser/deploy/current;
index    index.html;

location / { 
     proxy_set_header X-Real-IP  $remote_addr;
     proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
     proxy_set_header  Host $http_host;
     proxy_redirect    off;
    try_files /system/maintenance.html $uri $uri/index.html $uri.html @ruby;
}

location @ruby{
proxy_pass http://myapp;
}
}

先看看 access.log 和 error.log 里怎么说

遇到 Nginx 错误,需要看 Nginx 的错误日志,你的在: /home/hmpuser/deploy/shared/log/error.log

2013/09/04 09:28:12 [error] 1121#0: *6454 upstream sent too big header while reading response header from upstream, client: 192.168.1.137, server: hmp, request: "GET /settings HTTP/1.1", upstream: "http://unix:/tmp/unicorn.hmp.sock:/settings", host: "192.168.1.7", referrer: "http://192.168.1.7/"

响应头的某一行过长,估计是 cookie。先在开发环境看看响应都发了哪些 cookie。 nginx 默认 header 支持的 header 长度有限,可以针对性的调整一下,但不建议调太高。

相关参数文档 http://wiki.nginx.org/HttpProxyModule#proxy_buffers

#6 楼 +1

另外可以检查下是不是程序里往 flash[:notice] 放的东西太大了

恩 正在尝试中。。有一个修改密码的验证码 是通过 session 保存的。。

def settings
   session[:noisy_image] = NoisyImage.new(4) #生成一个有4字符的图片
   session[:code] = session[:noisy_image].code
   if current_user
     @user=current_user
   else
     @user=User.find(params[:id])
   end
 end

#7 楼 @luikore 好久不写 rails,都快忘记 flash[:notice] 这东西了。什么东西都可以往 cookie 里写,实在不是好的实践。

另外还可以看看 session 有没有痴肥...

#9 楼 @Lax golang 的 gorilla, nodejs 的 express... 都有 flash 啊。是不该在 cookie 保存太多状态,客户端缓存数据的话还有很多其他手段

不用 flash 跨请求传递信息会很不方便啊

#12 楼 @edokeh session 东西太多的话就该存一些到数据库了。如果仅仅做缓存的用的话可以用 html local storage

已解决 就是 session 的问题。谢谢大家

需要 登录 后方可回复, 如果你还没有账号请 注册新账号