いろいろやってみる
2013年7月28日日曜日
Nginx+unicornでRailsを動かす
表題の件で苦戦したので忘備録として残します。 [こちらの図](http://semind.github.io/blog/2012/01/19/nginx-plus-unicornderails3-dot-1gadong-zuo-suruhuan-jing-wozuo-ru/) のように、Nginxでは静的コンテンツ、unicornにて動的コンテンツ(Rails)を扱う構成を想定します。 今回は、仮想環境を最初に作成する時だけvagrantを使用し、以降の作業は仮想環境の中で手動設定を行います。 # VagrantでUbuntu環境を用意 <pre> $ mkdir UbuntuTest $ cd UbuntuTest $ vagrant box add precise64 http://files.vagrantup.com/precise64.box $ vagrant box list $ vagrant init precise64 $ vi Vagrantfile #とりあえず下記2行をコメントインします。 config.vm.network :private_network, ip: "192.168.33.10" config.vm.synced_folder "./data", "/vagrant_data" #dirは適当なものに変更 $ mkdir data $ ls -p Vagrantfile data/ $ vagrant up </pre> # 仮想環境に接続 以降の作業は仮想環境で行います。 <pre> $ vagrant ssh Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64) * Documentation: https://help.ubuntu.com/ Welcome to your Vagrant-built virtual machine. Last login: Fri Sep 14 06:23:18 2012 from 10.0.2.2 vagrant@precise64:~$ </pre> # curlをinstall <pre> vagrant@precise64:~$ sudo apt-get install curl </pre> # RVMをinstallし、 ruby1.9.3をinstall defaultだとruby1.8.7なので。 <pre> vagrant@precise64:~$ ruby -v ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux] vagrant@precise64:~$ curl -L get.rvm.io | bash -s stable vagrant@precise64:~$ echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function' >> ~/.bash_profile vagrant@precise64:~$ source ~/.bash_profile vagrant@precise64:~$ rvm list known # MRI Rubies [ruby-]1.8.6[-p420] [ruby-]1.8.7[-p374] [ruby-]1.9.1[-p431] [ruby-]1.9.2[-p320] [ruby-]1.9.3[-p448] [ruby-]2.0.0-p195 [ruby-]2.0.0[-p247] [ruby-]2.0.0-head ruby-head -snip- vagrant@precise64:~$ rvm install 1.9.3 vagrant@precise64:~$ ruby -v ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-linux] </pre> # Rails 3.2.xをinstall version指定しないとRails4.0がinstallされる。今はまだRails3.2系の環境を想定しているので。 <pre> vagrant@precise64:~$ gem install rails --version "~>3.2.0" --no-ri --no-rdoc Successfully installed rails-3.2.14 1 gem installed vagrant@precise64:~$ rails -v Rails 3.2.14 </pre> # Rails環境作成 <pre> vagrant@precise64:~$ cd /vagrant_data/ vagrant@precise64:/vagrant_data$ ls vagrant@precise64:/vagrant_data$ rails new unicorntest vagrant@precise64:/vagrant_data$ cd unicorntest/ vagrant@precise64:/vagrant_data/unicorntest$ ls app config config.ru db doc Gemfile Gemfile.lock lib log public Rakefile README.rdoc script test tmp vendor vagrant@precise64:/vagrant_data/unicorntest$ bunlde install </pre> # unicornをinstall & unicorn動作確認 <pre> vagrant@precise64:/vagrant_data/unicorntest$ vi Gemfile gem 'unicorn' # コメントイン gem 'execjs' #後述のunicorn_rails起動時のエラーになるので、事前に登録 gem 'therubyracer' #同上 vagrant@precise64:/vagrant_data/unicorntest$ bunlde install vagrant@precise64:/vagrant_data/unicorntest$ unicorn_rails I, [2013-07-28T01:42:48.129123 #7134] INFO -- : listening on addr=0.0.0.0:8080 fd=7 I, [2013-07-28T01:42:48.129303 #7134] INFO -- : worker=0 spawning... I, [2013-07-28T01:42:48.130433 #7134] INFO -- : master process ready I, [2013-07-28T01:42:48.131054 #7136] INFO -- : worker=0 spawned pid=7136 I, [2013-07-28T01:42:48.131251 #7136] INFO -- : Refreshing Gem list I, [2013-07-28T01:42:50.247690 #7136] INFO -- : worker=0 ready </pre>
local PCのブラウザから「http://192.168.33.10:8080」を指定。すると、下記のように表示されます。 動作確認後、一旦「Ctl + c」でunicorn_railsを停止します。
# unicorn設定 [こちら](http://unicorn.bogomips.org/examples/unicorn.conf.rb)を参考に、railsのproject内のconfig/unicorn.rbを作成します。 下記コメントしている部分を変更したぐらいです。 <pre> vagrant@precise64:/vagrant_data/unicorntest$ vi config/unicorn.rb worker_processes 2 listen "/tmp/unicorn.sock", :backlog => 64 # 後述のnginxの設定と合わせる! listen 8088, :tcp_nopush => true timeout 30 pid "/tmp/unicorn.pid" stderr_path "/vagrant_data/unicorntest/log/unicorn.stderr.log" # 自分の環境にあわせて。 stdout_path "/vagrant_data/unicorntest/log/unicorn.stdout.log" # 自分の環境にあわせて。 preload_app true GC.respond_to?(:copy_on_write_friendly=) and GC.copy_on_write_friendly = true check_client_connection false 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 </pre> 設定ファイルを指定して、unicornをdaemonとして起動。 <pre> vagrant@precise64:/vagrant_data/unicorntest$ unicorn_rails -c config/unicorn.rb -D </pre> # nginxをinstall <pre> vagrant@precise64:/vagrant_data/unicorntest$ cd vagrant@precise64:~$ sudo apt-get install nginx vagrant@precise64:~$ nginx -v nginx version: nginx/1.1.19 </pre> # nginxの設定準備 今回は、シンプルに/etc/nginx/sites-available/defaultを変更しました。 <pre> vagrant@precise64:~$ ls /etc/nginx/sites-available/ default vagrant@precise64:~$ sudo vi /etc/nginx/sites-available/default #下記を追加 upstream uniconrtest { server unix:/tmp/unicorn.sock; #unicornの設定で行ったのと同じpathを設定 } #下記rootを変更 server { -snip- root /vagrant_data/unicorntest/public; -snip- </pre> # nginxを再起動 <pre> vagrant@precise64:~$ sudo /etc/init.d/nginx restart Restarting nginx: nginx. vagrant@precise64:~$ </pre> local PCのブラウザから「http://192.168.33.10」を指定。すると、下記のように表示されます。
# rails assetsのprecomile 上述の画像をみると、Railsのdefault pageにpng画像が表示されていません。 Railsのasset pipelineという仕組みが関係しているようです。 今回は事前に下記コマンドを実行することで、Railsプロジェクト内のpublic/assets/以下にpng fileを生成しておきます。 <pre> vagrant@precise64:~$ cd /vagrant_data/unicorntest/ vagrant@precise64:/vagrant_data/unicorntest$ ls app config config.ru db doc Gemfile Gemfile.lock lib log public Rakefile README.rdoc script test tmp vendor vagrant@precise64:/vagrant_data/unicorntest$ rake assets:precompile /home/vagrant/.rvm/rubies/ruby-1.9.3-p448/bin/ruby /home/vagrant/.rvm/gems/ruby-1.9.3-p448@global/bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets vagrant@precise64:/vagrant_data/unicorntest$ ls app config config.ru db doc Gemfile Gemfile.lock lib log public Rakefile README.rdoc script test tmp vendor vagrant@precise64:/vagrant_data/unicorntest$ cd public/ vagrant@precise64:/vagrant_data/unicorntest/public$ ls 404.html 422.html 500.html assets favicon.ico index.html robots.txt vagrant@precise64:/vagrant_data/unicorntest/public$ cd assets/ vagrant@precise64:/vagrant_data/unicorntest/public/assets$ ls application-00e0de334aededf0deeb8a28335a997e.js application.js.gz application-00e0de334aededf0deeb8a28335a997e.js.gz jquery.min-6336c5bca4c709e809647cdfcb484d0a.map application-1b13569e9620782f423d4cd3ce931750.css jquery.min.map application-1b13569e9620782f423d4cd3ce931750.css.gz manifest.yml application.css rails-a3386665c05a2d82f711a4aaa72d247c.png application.css.gz rails.png application.js </pre> 再度、local PCからアクセスするとpng画像が表示されるようになりました。
# まとめ * 今回初めて、Nginx + Railsの環境を作成しました。動的コンテンツを扱う場合、railsではunicornを使うのが一般的なようですが、汎用的な設定を探すのに時間がかかりました。 * 今回は動的コンテンツとしてRailsを用意しましたが、実際にはinit時のdefaultの静的コンテンツです。実際の動的コンテンツでの動作についても引き続き確認します。 * 最終的には、vagrant upコマンド一発で、これらの「Nginx+unicorn+Railsの環境」が自動構築されるようにしたいと思います。 # 参考 [dotinstall Vagrant](http://dotinstall.com/lessons/basic_vagrant) [Nginx + unicornでrails3.1が動作する環境を作る](http://semind.github.io/blog/2012/01/19/nginx-plus-unicornderails3-dot-1gadong-zuo-suruhuan-jing-wozuo-ru/) [nginx + Unicorn を試してみた](http://d.hatena.ne.jp/milk1000cc/20100804/1280893810) [ubuntuでnginx + unicorn - 設定編](http://prototype-beta.com/server/entry/12_ubuntu%E3%81%A7nginx_+_unicorn_-_%E8%A8%AD%E5%AE%9A%E7%B7%A8) [5分でわかる!? アセットパイプライン(Assets Pipeline)](http://rails.hatenadiary.jp/entry/2013/03/03/125801)
Tweet
次の投稿
前の投稿
ホーム