`

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安装信息,参考:http://www.nginx.cn/install
更多nginx参考信息:http://nginx.org/cn/docs/
 
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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics