本着日行一善的原则,今天把直接thin 跑的rails 3 站点部署到nginx上了。
最初的想法使用passenger和ree+nginx,结果可耻的失败了,原因和gems的load路径有关系,把load_path解决了,结果说正常的程序有问题。本着拿得起放的下的原则,放弃使用passenger,决定采用thin。
我的系统是rhel 5
先装nginx,
通过 cat /etc/*release 查看到rhel的版本,
然后通过新建/etc/yum.repos.d/nginx.repo文件添加nginx的rpm source
其中$releasever和rhel的版本对应,我这里填5
然后将thin安装成服务
$thin install
这会将在/etc/rc.d下添加thin的服务
如果直接service start thin 会报错
因为在rhel下实际上是使用的/etc/rc.d/init.d 所以要
$mv /etc/rc.d/thin /etc/rc.d/init.d
然后
$ thin config -C /etc/thin/<appname>.yml -c /var/rails/<appdir> --servers 3 --socket /tmp/thin.appname.sock
配置app的config文件
如果使用了rvm务必需产生 rvm wrapper
命令如下
$ rvm wrapper 1.9.2 bootup thin
同时更改 /etc/rc.d/init.d下的thin 文件,将DAEMON文件指向wrapper
DAEMON=/usr/local/rvm/wrappers/ruby-1.9.2/thin
再
service thin start
thin 就OK了。
配置nginx.conf
user nginx; # user 很重要,要和你的app的用户和用户组一致,否则出现403错误 worker_processes 5; error_log /var/log/nginx.error.log; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] $request ' '"$status" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx.access.log main; sendfile on; keepalive_timeout 65; upstream thin_cluster { server unix:/tmp/thin.0.sock; server unix:/tmp/thin.1.sock; server unix:/tmp/thin.2.sock; server unix:/tmp/thin.3.sock; server unix:/tmp/thin.4.sock; } server { listen 80; server_name www.myserver.com; root /var/rails/mysapp/public;#对应app path,务必要指向public 文件夹为止 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 false; if (-f $request_filename/index.html) { rewrite (.*) $1/index.html break; } if (-f $request_filename.html) { rewrite (.*) $1.html break; } if (!-f $request_filename) { proxy_pass http://thin_cluster; break; } } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
然后
nginx -s reload,
大功告成。