deployment RoR with nginx & unicorn on ubuntu

本来一直都是用rails自带的webrick做本地开发的,但是自从ruby升级到1.9.3后,用rails3.2.5开发的时候,每次启动3000端口,运行程序后总是有一大堆的waring:
WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true,很是烦人。除此之外,每次一个简简单单的get请求都要很长时间才能反应过来,即在页面请求已经发出去了,但是你tail日志发现,日志要很长时间才会反映出来,这个过程大约要5~10秒,这个实在是让我恼火不已,于是决定改用nginx + unicorn来跑本地的RoR项目。以下是我的安装和部署过程:
1、安装nginx:
a、在正式安装nginx前,要确保你的主机有编译环境gcc,g++,你可以通过一下方式进行安装
apt-get install build-essential
apt-get install libtool
b、选定源码目录(本文选的是/usr/local/src,当然你可以指定任意你觉得合适的目录)
一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩。
安装PCRE库:
cd /usr/local/src
wget http://sourceforge.net/projects/pcre/files/pcre/8.32/pcre-8.32.tar.gz/download
tar zxvf pcre-8.32.tar.gz
cd pcre-8.32
./configure
make
make install

安装zlib库:
cd /usr/local/src
wget http://zlib.net/zlib-1.2.7.tar.gz
tar zxvf zlib-1.2.7.tar.gz
cd zlib-1.2.7
./configure
make
make install

安装ssl
apt-get install openssl
apt-get install libssl-dev
c、安装nginx(在这里我也把nginx安装到了/user/local/src)
cd /usr/local/src
wget http://nginx.org/download/nginx-1.3.10.tar.gz
tar zxvf nginx-1.3.10.tar.gz
cd nginx-1.3.10
./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid
--with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.32 --with-zlib=/usr/local/src/zlib-1.2.7

make
make install

//--with-pcre=/usr/src/pcre-8.32 指的是pcre-8.32 的源码路径。
//--with-pcre=/usr/src/zlib-1.2.7 指的是zlib-1.2.7 的源码路径。

到此为止,nginx算是安装完成了,你可以在命令行输入:sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
然后在浏览器输入localhost:80,如果你看到:welcome to nginx说明你的nginx已经安装完成了(注:这个welcome to nginx 是/usr/local/nginx/html/index.html)的内容,如果你想让你的项目真正的跑起来的话,需要将这个文件删除,就跟rails删除public下的index.html一个道理。

下面是一些配置的变量信息:
--prefix=path 定义一个目录,存放服务器上的文件 ,也就是nginx的安装目录。默认使用 /usr/local/nginx。
--sbin-path=path 设置nginx的可执行文件的路径,默认为 prefix/sbin/nginx.
--conf-path=path 设置在nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf.
--pid-path=path 设置nginx.pid文件,将存储的主进程的进程号。安装完成后,可以随时改变的文件名 , 在nginx.conf配置文件中使用 PID指令。默认情况下,文件名 为prefix/logs/nginx.pid.
--error-log-path=path 设置主错误,警告,和诊断文件的名称。安装完成后,可以随时改变的文件名 ,在nginx.conf配置文件中 使用 的error_log指令。默认情况下,文件名 为prefix/logs/error.log.
--http-log-path=path 设置主请求的HTTP服务器的日志文件的名称。安装完成后,可以随时改变的文件名 ,在nginx.conf配置文件中 使用 的access_log指令。默认情况下,文件名 为prefix/logs/access.log.
--user=name 设置nginx工作进程的用户。安装完成后,可以随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的用户名是nobody。
--group=name 设置nginx工作进程的用户组。安装完成后,可以随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的为非特权用户。
--with-select_module --without-select_module 启用或禁用构建一个模块来允许服务器使用select()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
--with-poll_module --without-poll_module 启用或禁用构建一个模块来允许服务器使用poll()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
--without-http_gzip_module — 不编译压缩的HTTP服务器的响应模块。编译并运行此模块需要zlib库。
--without-http_rewrite_module 不编译重写模块。编译并运行此模块需要PCRE库支持。
--without-http_proxy_module — 不编译http_proxy模块。
--with-http_ssl_module — 使用https协议模块。默认情况下,该模块没有被构建。建立并运行此模块的OpenSSL库是必需的。
--with-pcre=path — 设置PCRE库的源码路径。PCRE库的源码(版本4.4 - 8.30)需要从PCRE网站下载并解压。其余的工作是Nginx的./ configure和make来完成。正则表达式使用在location指令和 ngx_http_rewrite_module 模块中。
--with-pcre-jit —编译PCRE包含“just-in-time compilation”(1.1.12中, pcre_jit指令)。
--with-zlib=path —设置的zlib库的源码路径。要下载从 zlib(版本1.1.3 - 1.2.5)的并解压。其余的工作是Nginx的./ configure和make完成。ngx_http_gzip_module模块需要使用zlib 。
--with-cc-opt=parameters — 设置额外的参数将被添加到CFLAGS变量。例如,当你在FreeBSD上使用PCRE库时需要使用:--with-cc-opt="-I /usr/local/include。.如需要需要增加 select()支持的文件数量:--with-cc-opt="-D FD_SETSIZE=2048".
--with-ld-opt=parameters —设置附加的参数,将用于在链接期间。例如,当在FreeBSD下使用该系统的PCRE库,应指定:--with-ld-opt="-L /usr/local/lib".

以上为nginx安装信息,参考:[url]http://www.nginx.cn/install[/url]
更多nginx参考信息:[url]http://nginx.org/cn/docs/[/url]

2、安装Unicorn
gem install unicorn
获取 unicorn 配置文件
进入项目目录:cd workspace/app_name
curl -o config/unicorn.rb https://raw.github.com/defunkt/unicorn/master/examples/unicorn.conf.rb
修改配置文件:
vi config/unicorn.rb
以下为unicorn.rb的配置信息:
worker_processes 4

app_path= "/home/naitnix/workspace/app_name"

working_directory app_path # available in 0.94.0+

listen app_path + "/tmp/sockets/unicorn.sock", :backlog => 64
(sockets 需提前创建该文件目录,特别注意:unicorn.sock 不用创建,当unicorn 启动后,会自动生成该文件*.sock)

listen 8080, :tcp_nopush => true

timeout 30

pid app_path + "/tmp/pids/unicorn.pid"

stderr_path app_path + "/log/unicorn.stderr.log"
stdout_path app_path + "/log/unicorn.stdout.log"
(须在项目log目录下创建 unicorn.stderr.log ,unicorn.stdout.log,两个文件)
touch log/unicorn.stderr.log

touch log/unicorn.stdout.log

preload_app true

GC.respond_to?(:copy_on_write_friendly=) and
GC.copy_on_write_friendly = true


before_fork do |server, worker|

defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!

end

after_fork do |server, worker|

defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection

end


3、启动unicorn
在项目根目录 unicorn -c config/unicorn.rb -E development -D
-c 指定配置文件
-E 指定运行环境,如果是生产环境,则指定为production
-D 指定为后台运行

4、配置nginx.conf

user root root;
worker_processes 1;

events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;

#upstream app_name1_server {
#server unix:/home/naitnix/workspace/app_name1/tmp/sockets/unicorn.sock fail_timeout=0;
#}


#upstream app_name2_server {
#server unix:/home/naitnix/workspace/app_name2/tmp/sockets/unicorn.sock fail_timeout=0;
#}


#upstream app_name3_server {
#server unix:/home/naitnix/workspace/app_name3/tmp/sockets/unicorn.sock fail_timeout=0;
#}


#upstream app_name4_server {
#server unix:/home/naitnix/workspace/app_name4/tmp/sockets/unicorn.sock fail_timeout=0;
#}


include /usr/local/nginx/conf/services/app_name1.conf;
#include /usr/local/nginx/conf/services/app_name2.conf;
#include /usr/local/nginx/conf/services/app_name3.conf;
#include /usr/local/nginx/conf/services/app_name4.conf;

}

5、在/usr/local/nginx/conf/目录下简历一个services目录
sudo mkdir services
sudo touch app_name1.conf

6、编辑app_name1.conf


server {
listen 80;
server_name zuzher.local;

root /home/naitnix/workspace/app_name1/public;

location / {

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-Host $host;

proxy_set_header X-Forwarded-Server $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_buffering on;

proxy_pass http://app_name1_server;

}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

}

7、测试nginx配置是否正确:
sudo /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
如果输出以下内容,说明你的配置是没问题的:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

tip:
nginx启动命令:
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx停止命令:
sudo /usr/local/nginx/sbin/nginx -s stop
nginx 重启命令:
sudo /usr/local/nginx/sbin/nginx -s reload

unicorn重启:

$ ps auwx | grep unicorn

获取:master 的pid



naitnix 1200 1 0 12:16 ? 00:00:15 unicorn master -c config/unicorn.rb -E development -D

重启
$ kill -9 1200 && unicorn -c config/unicorn.rb -E development -D
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值