オルタナティブ・ブログ > ニフティクラウド活用Tips >

ユーザーと中の人が語るクラウド活用Tipsを、クラウド女子がお届けします。

契約後からRails3稼働環境構築まで(後編)

»

こんにちは。ちなつです。
今回は、ライター・吉田雄哉氏の記事「契約後からRails3稼働環境構築まで」の後編をご紹介します。
(*本記事の最後に吉田氏のプロフィールを掲載しています)

*********************************************************************

それでは後編をお届けします。
なお、契約後からサーバを立ち上げるまでの前編はこちらです。

前編ではサーバを使える状態にするまでの流れをご紹介致しました。
後編では、サーバのセットアップを実施し、Ruby on Rails3の開発で利用できるサーバの構築を目指します。

目次

1, 後編の作業概要
2, 作業するサーバについて
3, システムのアップデートとライブラリのインストール
4, checkinstallを利用する
5, MySQLのセットアップ
6, RubyとRailsのセットアップ
7, SqliteとMySQLのライブラリをインストール
8, iptableを調整する
9, Railsのデモアプリを作って確認する
10, Passengerの導入とNginXの導入
11, NginXを自動起動できるようにする
12, テストアプリの配置とNginXの設定調整
13, セットアップ・タイムアタック(全手作業)
14, まとめ

1 後編の作業概要

今回は

  • Ruby(1.9.2p180)
  • Ruby on Rails(3.0.5)
  • MySQL(5.1.55)
  • sqlite3(3.7.5)
  • NginX
  • Passenger

をインストールします。
想定としては

  • Rails3の開発環境
  • Rails3の動作環境

の構築というイメージです。

なお、MySQLのクラスタリングやPassengerのチューニングなど、実際の本番アプリとする上で必要な調整については、また機会を改めてまとめてみようと思います。

2 作業するサーバについて

今回はCentOS 5.3 64bit PlainでLargeを使用しています。
特に深い理由はありません。32bit版でも同じ手順でサーバをセットアップできます。

3 システムのアップデートとライブラリのインストール

3.1 アップデート

結構時間がかかるのですが、やっておきましょう。

 # yum -y update

ひたすら終わるのを待ちます。

3.2 必要なライブラリのインストール

では、次に必要なライブラリを入れます。

# yum -y install rpm-build gccyum kernel-devel zlib-devel openssl-devel readline-devel ncurses-devel gcc-c++ curl-devel sqlite-devel pcre pcre-devel

以上です。

冒頭に書いたインストールするもののうち、ソースからコンパイルするもので必要となるものをまとめて入れています。

4 checkinstallを利用する

ソースから入れるものについては、一度RPMを作っておけばその後に同じインストールをするとき楽になるので、今回はRPMを作成し、インストールする手順としてご紹介します。

4.1 checkinstallについて

今回はcheckinstallというものを利用します。
checkinstall
これを利用することで、rpmやdeb、tgzを作成することができます。

インストール手順です。

# wget http://www.asic-linux.com.mx/~izto/checkinstall/files/source/checkinstall-1.6.2.tar.gz
# tar zxvf checkinstall-1.6.2.tar.gz
# cd checkinstall-1.6.2
# make
# make install

これでcheckinstallのRPMが作成されるので、RPMファイルのインストールを行います。

 # /usr/local/sbin/checkinstall

最後に以下の画面になっているかと思います。

**********************************************************************
  Done. The new package has been saved to
  /usr/src/redhat/RPMS/x86_64/checkinstall-1.6.2-1.x86_64.rpm
  You can install it in your system anytime using:
  rpm -i checkinstall-1.6.2-1.x86_64.rpm
**********************************************************************

上記の画面の指示ではPathが通ってないのでコマンドが実行出来ませんでした。以下のようにコマンドをうちインストールを行います。

 # rpm -i /usr/src/redhat/RPMS/x86_64/checkinstall-1.6.2-1.x86_64.rpm

5 MySQLのセットアップ

色々と調べた結果、今回はMySQL5.1.54を入れることにしました。インストールは本家のサイトよりRPMを取得し、インストールを行います。

MySQL :: Download MySQL Community Server

5.1 MySQLインストール

上記URLのサイトに行くとPlatform毎のインストールファイルを取得することができます。 CentOSは「Red Had & Oracle Enterprise Linux」というプラットフォームに該当します。

プラットフォームの選択を終えると、たくさんのRPMのリンクが表示されますので「Red Hat & Oracle Enterprise Linux 5 」の以下のものを取得します。

  • MySQL Server
  • Client Utilities
  • Shared components
  • Development Libraries

を取得します。

この時、利用しているOSが32bitか64bitかで取得するRPMが違うのでご注意下さい。筆者の環境では以下のものを使いました。

 # ls
MySQL-client-community-5.1.55-1.rhel5.x86_64.rpm
MySQL-devel-community-5.1.55-1.rhel5.x86_64.rpm
MySQL-server-community-5.1.55-1.rhel5.x86_64.rpm
MySQL-shared-community-5.1.55-1.rhel5.x86_64.rpm

MySQLのダウンロードサイトなので画面を貼ることは出来ないので、流れをご紹介することになってしまいますが

  • 該当のRPMの横にある「Download」をクリック
  • 移動したページでアカウント関連を登録するなど行い、ダウンロード先の一覧を表示させる
  • お好きなサーバを選んで、「HTTP」のリンクをコピーする。
  • インストールするサーバで「wget」を使ってダウンロード

という作業です。

RPMを取得後は以下の流れです。
mysqlというディレクトリを作成し、そこへ全rpmを保存してから実行しています。

  # rpm -i ./*.rpm

  PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
  To do so, start the server, then issue the following commands:

  /usr/bin/mysqladmin -u root password 'new-password'
  /usr/bin/mysqladmin -u root -h localhost.localdomain password 'new-password'

  Alternatively you can run:
  /usr/bin/mysql_secure_installation

  which will also give you the option of removing the test
  databases and anonymous user created by default.  This is
  strongly recommended for production servers.

  See the manual for more instructions.

  Please report any problems with the /usr/bin/mysqlbug script!

  Starting MySQL.[  OK  ]
  Giving mysqld 2 seconds to start

上記のように最後でサーバが起動しているか確認してください。

5.2 MySQLの調整

では、データベースの中身を見てみます。

  # mysql -u root -p
   Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.1.55-community MySQL Community Server (GPL)

  Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
  This software comes with ABSOLUTELY NO WARRANTY. This is free software,
  and you are welcome to modify and redistribute it under the GPL v2 license

  Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

  mysql> show databases;
  +--------------------+
   | Database          |
  +--------------------+
   | information_schema |
   | mysql              |
   | test                 |
  +--------------------+
  2 rows in set (0.00 sec)
 
  mysql > quit
  Bye

問題ないですね。
次に、以下のコマンドでセキュリティ強化のための作業を行います。

 # mysql_secure_installation

を実行し、ガイダンスにそってパスワードの変更や、サンプルのデータベースなどの整理などを行ってください。

MySQLの設定ファイルですが、今回の流れでは/etc/my.cnfが無いです。ベースとなるファイルは/usr/share/mysqlの中にあるmy-XXX.cnfを/etcにコピーして使います。

  # cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

/etc/my.cnfを開き [ ] 内のセクションを探して以下を書き加えます。

  [mysql]  
  default_character_set=utf8
 
  [mysqld]
  character_set-server=utf8
  innodb_log_file_size=64M
  innodb_buffer_pool_size=128M

今回はinnodbだけ調整しています。必要に応じて、独自に調整を行ってください。

6 RubyとRailsのセットアップ

6.1 Rubyのインストール

Rubyについては、ソースを取得しインストールを行います。また、今回は chechinstallを利用し、RPM化しています。
これにより、後で別のサーバを作る時にこのRPMが利用でき便利だと思います。

では、まずはRubyの本体を取得します。Rubyのソースは以下のURLより取得できます。
Rubyダウンロードのページ

ここにある「ruby 1.9.2-p180」をダウンロードしました。

# wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p180.tar.gz

  --2011-03-07 11:20:33--  ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p180.tar.gz
  => `ruby-1.9.2-p180.tar.gz'
     ftp.ruby-lang.org をDNSに問いあわせています... 221.186.184.68
     ftp.ruby-lang.org|221.186.184.68|:21 に接続しています... 接続しました。
    anonymous としてログインしています... ログインしました!
    ==> SYST ... 完了しました。
    ==> PWD ... 完了しました。
    ==> TYPE I ... 完了しました。 ==> CWD /pub/ruby/1.9 ... 完了しました。
    ==> SIZE ruby-1.9.2-p180.tar.gz ... 11158935
    ==> PASV ... 完了しました。==> RETR ruby-1.9.2-p180.tar.gz ... 完了しました。
      長さ: 11158935 (11M)

     100%[======================================>] 11,158,935  4.94M/s 時間 2.2s

2011-03-07 11:20:36 (4.94 MB/s) - `ruby-1.9.2-p180.tar.gz' へ保存終了[11158935]

ではインストールです。

 
# tar zxvf ruby-1.9.2-p180.tar.gz
# cd ruby-1.9.2-p180
# ./configure
# make
# checkinstall --fstrans=no

**********************************************************************

Done. The new package has been saved to

/usr/src/redhat/RPMS/x86_64/ruby-1.9.2-p180-1.x86_64.rpm
You can install it in your system anytime using:

       rpm -i ruby-1.9.2-p180-1.x86_64.rpm

**********************************************************************

# rpm -ivh /usr/src/redhat/RPMS/x86_64/ruby-1.9.2-p180-1.x86_64.rpm

以上です。動作確認をしてみますと

 # ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]

ということで、無事確認できました。
今回のセットアップでは一番最初にyumを使い、必要なライブラリをまとめて入れてあります。
yumを使ってインストールを済ませることも可能ですが、独自にコンパイルをさせる方が環境に合わせて最適化されるために良いというのを読んだことがあります。

6.2 gemのアップデートとRailsの最新版をインストール

次にRailsを入れます。 Ruby1.9.2からは最初からgemが入っています。

 # gem -v
1.3.7

最新版のバージョンについては、こちらで確認ができます。
Rubygems.org
この記事を書いている時点では1.6.1が最新版のようなので、アップデートをしておきましょう。

 # gem update --system
Updating RubyGems
Updating rubygems-update
Successfully installed rubygems-update-1.6.1
Updating RubyGems to 1.6.1
Installing RubyGems 1.6.1
RubyGems 1.6.1 installed

=== 1.6.1 / 2011-03-03

Bug Fixes:

* Installation no longer fails when a dependency from a version that won't be
  installed is unsatisfied.
* README.rdoc now shows how to file tickets and get help.  Pull Request #40 by Aaron Patterson.
* Gem files are cached correctly again. Patch #29051 by Mamoru Tasaka.
* Tests now pass with non-022 umask. Patch #29050 by Mamoru Tasaka.

------------------------------------------------------------------------------

RubyGems installed the following executables:
   /usr/local/bin/gem

# gem -v
1.6.1

以上で、gemのアップデートが終わりです。では、Rails3のインストールをしましょう。

 # gem install rails

しばらく待つと、インストールが完了すると思います。では、バージョンの確認。

# rails -v
Rails 3.0.5

はい。入りました。

7 SqliteとMySQLのライブラリをインストール

Rails3ではデフォルトのデータベースがSqlite3になっています。このセットアップでは、動作確認用としてsqliteを入れ、アプリの本番では MySQLを使うという前提でセットアップを進めることにします。

ということで、sqlite3とMySQL用のライブラリを入れます。
CentOSに最初から入っているSqlite3のバージョンを調べてみると

 # sqlite3 -version
3.3.6

と表示されました。

Rubyの"sqlite3"というライブラリは、sqlite3のバージョンが「3.6.16」以上のライブラリなので、sqlite3を新しいものに入れ替えることにします。

sqlite3の最新版はこちらから取得できます。
Sqlite Download page
「SQLite 3.7.5」のtar.gz版を取得してください。以下の流れになります。

 # wget http://www.sqlite.org/sqlite-autoconf-3070500.tar.gz
# tar zxf sqlite-autoconf-3070500.tar.gz
# cd sqlite-autoconf-3070500/
# ./configure
# make
# checkinstall

*********************************************************************

Done. The new package has been saved to

/usr/src/redhat/RPMS/x86_64/sqlite-autoconf-3070500-1.x86_64.rpm
You can install it in your system anytime using:

       rpm -i sqlite-autoconf-3070500-1.x86_64.rpm

**********************************************************************

# rpm -ivh /usr/src/redhat/RPMS/x86_64/sqlite-autoconf-3070500-1.x86_64.rpm
準備中...         ########################################### [100%]
       1:sqlite-autoconf      ########################################### [100%]

では、一度SSHを切って、もう一度繋げましょう。バージョンの確認です。

  # sqlite3 -version
3.7.5

最新版になりました。

では、gemを使いRubyのsqlite関連ライブラリをインストールします。今回はsqlite3のライブラリを2つ入れています。Rails3ではsqlite3だけでいいのですが以前sqlite3-rubyが入っていなくて後で足した経験があるため、念のため入れています。

 # gem install sqlite3-ruby
Building native extensions.  This could take a while...
Fetching: sqlite3-ruby-1.3.3.gem (100%)

#######################################################
  Hello! The sqlite3-ruby gem has changed it's name to just sqlite3.
  Rather than
  installing `sqlite3-ruby`, you should install `sqlite3`.
  Please update your/ndependencies accordingly.

  Thanks from the Ruby sqlite3 team!

      <3 <3 <3 <3

#######################################################

Successfully installed sqlite3-1.3.3
Successfully installed sqlite3-ruby-1.3.3
2 gems installed
Installing ri documentation for sqlite3-1.3.3...
Installing ri documentation for sqlite3-ruby-1.3.3...
Installing RDoc documentation for sqlite3-1.3.3...
Installing RDoc documentation for sqlite3-ruby-1.3.3...

# gem install sqlite3
Building native extensions. This could take a while...
Successfully installed sqlite3-1.3.3
1 gem installed
Installing ri documentation for sqlite3-1.3.3...
Installing RDoc documentation for sqlite3-1.3.3...

ライブラリとしてはsqlite3だけで良いようなのですが、Railsを使っていた時になぜか「sqlite3-ruby」が無くて、後から入れたことがありました。そこで、上記のインストールでは「sqlite3」と「sqlite3-ruby」の両方をインストールしています。

さて、次にMySQLのライブラリです。

# gem install mysql2
Fetching: mysql2-0.2.6.gem (100%)
Building native extensions.  This could take a while...
Successfully installed mysql2-0.2.6
1 gem installed
Installing ri documentation for mysql2-0.2.6...
Installing RDoc documentation for mysql2-0.2.6...

はい、以上で完了となります。

8 iptableを調整する

さて、ここまででRubyとRailsおよびデータベースの作業は完了しましたので、早速デモアプリでも作ってみたいところですが、もう一つ作業をしないといけません。iptableの調整です。

CentOS5.2ではこのiptableのおかげでセキュリティーのレベルが向上しています。iptableの詳細説明については、別のサイトなどでご確認下さい。

簡単に説明するとiptableでは、どのインターフェースにてどのポートを通信させるか制御することが出来ます。ようはLinuxの内側にあるFirewallです。ニフティクラウドでは利用するサーバにグローバルIPが付加されます。従ってこのiptableを使って、自分の身は自分で守る必要があります。

セットアップ系の記事では、よくこのiptableを最初にOFFにするという内容のものがありますが、あまりお勧めできる作業とは思えません。正しくiptable を理解することは、セキュリティー強化の観点から重要なので、しっかりと勉強することをお勧めします。

さて今回は、後にインストールするNginxというWebサーバのためのポート80とRailsの開発時に使うポート3000を開放しようと思います。

まずは、今の設定を確認します。

 # iptables -L

内容を見てみると、現在はsshだけ開いている感じです。これに、80(http)と3000を足します。

 # vim /etc/sysconfig/iptables

で設定ファイルを開き、「–dport 22」と同じように書き足します。

-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 3000 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

この例では、80と3000を書き加えています。

保存した後、iptablesを再起動します。

# /etc/init.d/iptables restart
ファイアウォールルールを適用中:        [ OK  ]
チェインポリシーを ACCEPT に設定中filter :      [  OK  ]
iptables モジュールを取り外し中:        [  OK  ]
iptables ファイアウォールルールを適用中:       [  OK  ]
iptables モジュールを読み込み中ip_conntrack_netbios_ns [  OK  ]

これで、80と3000への通信をサーバが受け取れるようになりました。

9  Railsのデモアプリを作って確認する

では、ここでRailsのデモアプリを作成し、環境が動いているかを確認してみます。と言っても、本当に簡単なものですが。

コマンドは以下の通りです。パスは"/root"の直下で行いました。

# pwd
/root

# mkdir rails
# cd rails
# rails new testapp
create
create  README
create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile      create  app
      create  app/controllers/application_controller.rb
      create  app/helpers/application_helper.rb
      create  app/mailers
      create  app/models
      create  app/views/layouts/application.html.erb
      create  config
      create  config/routes.rb
      create  config/application.rb
      create  config/environment.rb
      create  config/environments
      create  config/environments/development.rb
      create  config/environments/production.rb
      create  config/environments/test.rb
      create  config/initializers
      create  config/initializers/backtrace_silencers.rb
      create  config/initializers/inflections.rb
      create  config/initializers/mime_types.rb
      create  config/initializers/secret_token.rb
      create  config/initializers/session_store.rb
      create  config/locales
      create  config/locales/en.yml
      create  config/boot.rb
      create  config/database.yml
      create  db
      create  db/seeds.rb
      create  doc
      create  doc/README_FOR_APP
      create  lib
      create  lib/tasks
      create  lib/tasks/.gitkeep
      create  log
      create  log/server.log
      create  log/production.log
      create  log/development.log
      create  log/test.log
      create  public
      create  public/404.html
      create  public/422.html
      create  public/500.html
      create  public/favicon.ico
      create  public/index.html
      create  public/robots.txt
      create  public/images
      create  public/images/rails.png
      create  public/stylesheets
      create  public/stylesheets/.gitkeep
      create  public/javascripts
      create  public/javascripts/application.js
      create  public/javascripts/controls.js
      create  public/javascripts/dragdrop.js
      create  public/javascripts/effects.js
      create  public/javascripts/prototype.js
      create  public/javascripts/rails.js
      create  script
      create  script/rails
      create  test
      create  test/fixtures
      create  test/functional
      create  test/integration
      create  test/performance/browsing_test.rb
      create  test/test_helper.rb
      create  test/unit
      create  tmp
      create  tmp/sessions
      create  tmp/sockets
      create  tmp/cache
      create  tmp/pids
      create  vendor/plugins
      create  vendor/plugins/.gitkeep

では、ScaffoldでbooksのCRUDを作成してみます。

# cd testapp/
# rails g scaffold Book name:string price:integer
      invoke  active_record
      create    db/migrate/20110307054221_create_books.rb
      create    app/models/book.rb
      invoke    test_unit
      create      test/unit/book_test.rb
      create      test/fixtures/books.yml
       route  resources :books
      invoke  scaffold_controller
      create    app/controllers/books_controller.rb
      invoke    erb
      create      app/views/books
      create      app/views/books/index.html.erb
      create      app/views/books/edit.html.erb
      create      app/views/books/show.html.erb
      create      app/views/books/new.html.erb
      create      app/views/books/_form.html.erb
      invoke    test_unit
      create      test/functional/books_controller_test.rb
      invoke    helper
      create      app/helpers/books_helper.rb
      invoke      test_unit
      create        test/unit/helpers/books_helper_test.rb
      invoke  stylesheets
      create    public/stylesheets/scaffold.css

作成された感じですね。

では、アプリが起動するためにDB関連のコマンドを実行し、サーバを起動してみます。このテストアプリでは、sqlite3を使います。そのため、特別設定の変更は必要ありません。

# rake db:create
(in /root/rails/testapp)
db/test.sqlite3 already exists
db/development.sqlite3 already exists
LOCALHOST  /root/rails/testapp# rake db:migrate
(in /root/rails/testapp)
==  CreateBooks: migrating ====================================================
-- create_table(:books)
   - 0.0007s
==  CreateBooks: migrated (0.0009s) ===========================================

LOCALHOST  /root/rails/testapp# rails s
=> Booting WEBrick
=> Rails 3.0.5 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2011-03-07 14:44:23] INFO  WEBrick 1.3.1
[2011-03-07 14:44:23] INFO  ruby 1.9.2 (2011-02-18) [x86_64-linux]
[2011-03-07 14:44:23] INFO  WEBrick::HTTPServer#start: pid=1249 port=3000

はい、これで起動しました。
「0.0.0.0:3000」となっているので、このサーバにアサインされているIPアドレス全てに対してbindされています。ということで、グローバルIPでのアクセスが可能か試します。グローバルIPは、ニフティクラウドのコントロールパネルから確認ができます。

さて、グローバルIPを確認したら、
http://グローバルIP:3000/
へアクセスしてください。

正しくアクセスできると「Welcome aboard」と表示されます。
「About your application’s environment」をクリックすると、稼働環境に関する説明が表示されると思います。

20110321_201000_2

では、booksにアクセスします。
http://グローバルIP:3000/books
にアクセスしてみてください。

20110321_201040_2

うまく表示されたら、「New book」をクリックして、適当に操作して動作をご確認下さい。

20110321_201100 20110321_201127 20110321_201137

なお、この稼働確認アプリではRails3での標準データベースであるsqlite3を使っておりますが、もちろんMySQLでの作成も可能です。

もしMySQLでのアプリを作成される場合は

# rails new testapp -d mysql

と実行して下さい。
そうするとconfig/database.ymlがMySQL用のもので生成されます。
通常、database.ymlの中にある「password:」の後に半角スペースを1つ入れてMySQLに設定したパスワードを設定します。(専用ユーザを作成している場合は、ユーザ名も変更を忘れずに。) その後Scaffoldを実行し

# rake db:create:all
# rake db:migrate

で、データベースの作成(上記は開発用、テスト用、本番用をまとめて作成)し、テーブルの作成を行います。データベース操作については、rakeコマンドを一度詳しく見ておくことをお勧めします。

10 PassengerとNginXの導入

さて、ここまでで無事Rails3が稼働する環境ができ上がったことと思います。
次に、フロントにWebサーバを立ち上げ、そのバックでRailsが稼働するようにしてみたいとおもいます。

今回は「Passenger」というものを利用します。
Railsでは開発時はWebrick(つまり、先ほどの「rails s」で起動するサーバ) を使い、本番ではMongrelやPassengerなどのソフトウェアと組合せて環境を作るのが一般的です。今回は「Passenger」を使いますが、様々なWebサーバと組み合わせて稼働させることが可能です。

Passengerではインストール時にApacheとNginXを選択することができます。
今回はApacheの設定をせずに、Passengerのインストール時に同時に行えるNginXを利用してセットアップを行います。
なお、NginXについては、以下のURLをご参照下さい。
nginx
なお"nginx"は「エンジンエックス」と読むそうです。(実はつい最近知りました。)

では、Passengerのインストール&セットアップに進みます。
gemを使い、必要なファイル群をローカルに保存させます。以下のような流れです。

# gem install passenger

Fetching: fastthread-1.0.7.gem (100%)
Building native extensions.  This could take a while…
Fetching: daemoncontroller-0.2.6.gem (100%)
Fetching: spruz-0.2.5.gem (100%)
Fetching: file-tail-1.0.5.gem (100%)
Fetching: passenger-3.0.4.gem (100%)
Successfully installed fastthread-1.0.7
Successfully installed daemoncontroller-0.2.6
Successfully installed spruz-0.2.5
Successfully installed file-tail-1.0.5
Successfully installed passenger-3.0.4
5 gems installed
Installing ri documentation for fastthread-1.0.7…
Installing ri documentation for daemon_controller-0.2.6…
Installing ri documentation for spruz-0.2.5…
Installing ri documentation for file-tail-1.0.5…
Installing ri documentation for passenger-3.0.4…
Installing RDoc documentation for fastthread-1.0.7…
Installing RDoc documentation for daemon_controller-0.2.6…
Installing RDoc documentation for spruz-0.2.5…
Installing RDoc documentation for file-tail-1.0.5…
Installing RDoc documentation for passenger-3.0.4…            

では、セットアップです。Passengerのインストールスクリプトを起動し、画面の指示に従って作業を進めます。

# passenger-install-nginx-module

Welcome to the Phusion Passenger Nginx module installer, v3.0.4.

This installer will guide you through the entire installation process. It
shouldn't take more than 5 minutes in total.

Here's what you can expect from the installation process:

1. This installer will compile and install Nginx with Passenger support.
2. You'll learn how to configure Passenger in Nginx.
3. You'll learn how to deploy a Ruby on Rails application.

Don't worry if anything goes wrong. This installer will advise you on how to
solve any problems.

Press Enter to continue, or Ctrl-C to abort.

ここではEnterを押します。

--------------------------------------------

Checking for required software...

* GNU C++ compiler... found at /usr/bin/g++
* The 'make' tool... found at /usr/bin/make
* A download tool like 'wget' or 'curl'... found at /usr/bin/wget
* Ruby development headers... found
* OpenSSL support for Ruby... found
* RubyGems... found
* Rake... found at /usr/local/bin/rake
* Rake... found at /usr/local/bin/rake
* rack... found
* Curl development headers with SSL support... found
* OpenSSL development headers... found
* Zlib development headers... found

--------------------------------------------

Automatically download and install Nginx?

Nginx doesn't support loadable modules such as some other web servers do,
so in order to install Nginx with Passenger support, it must be recompiled.

Do you want this installer to download, compile and install Nginx for you?

1. Yes: download, compile and install Nginx for me. (recommended)
    The easiest way to get started. A stock Nginx 0.8.54 with Passenger
    support, but with no other additional third party modules, will be
    installed for you to a directory of your choice.

2. No: I want to customize my Nginx installation. (for advanced users)
    Choose this if you want to compile Nginx with more third party modules
    besides Passenger, or if you need to pass additional options to Nginx's
    'configure' script. This installer will  1) ask you for the location of
    the Nginx source code,  2) run the 'configure' script according to your
    instructions, and  3) run 'make install'.

Whichever you choose, if you already have an existing Nginx configuration file,
then it will be preserved.

Enter your choice (1 or 2) or press Ctrl-C to abort: 1

ここではNginXをインストールするので、1を押してください。

Downloading Nginx…
–2011-03-07 15:16:33–  http://sysoev.ru/nginx/nginx-0.8.54.tar.gz
sysoev.ru をDNSに問いあわせています… 81.19.68.137
sysoev.ru|81.19.68.137|:80 に接続しています… 接続しました。
HTTP による接続要求を送信しました、応答を待っています… 200 OK
長さ: 650001 (635K) [application/octet-stream]
`/tmp/root-passenger-1333/nginx.tar.gz' に保存中

100%[======================================>] 650,001      122K/s 時間 5.2s   

2011-03-07 15:16:40 (122 KB/s) - `/tmp/root-passenger-1333/nginx.tar.gz' へ保存完了 [650001/650001]

Extracting Nginx source tarball…

nginx-0.8.54/contrib/
nginx-0.8.54/conf/
nginx-0.8.54/src/

nginx-0.8.54/contrib/unicode2nginx/win-utf
nginx-0.8.54/contrib/unicode2nginx/koi-utf

Where do you want to install Nginx to?
Please specify a prefix directory [/opt/nginx]: /usr/local/nginx

ということで、しばらく自動で進んだ後にインストール位置を聞かれます。
ここでは、「/usr/local/nginx」を入力してください。

別の場所でも構わないのですが、後ほどNginXのデーモンを設定するときにこちらの方が便利なので、今回はこのように入力しています。

--------------------------------------------
Compiling Passenger support files...
--------------------------------------------

Compiling and installing Nginx...
# sh ./configure --prefix='/usr/loc

--------------------------------------------

Nginx with Passenger support was successfully installed.

The Nginx configuration file (/usr/local/nginx/conf/nginx.conf)
must contain the correct configuration options in order for Phusion Passenger
to function correctly.

This installer has already modified the configuration file for you! The
following configuration snippet was inserted:

  http {
      ...
      passenger_root /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.4;
      passenger_ruby /usr/local/bin/ruby;
      ...
  }

After you start Nginx, you are ready to deploy any number of Ruby on Rails
applications on Nginx.

Press ENTER to continue.

--------------------------------------------

以上のように、自動で画面が流れていくと思います。最後に「ENTERを押して」で止まると思いますので、ここを読んでおいて下さい。最後の部分では、confファイルにこのように書き込めという指示が書かれています。この部分だけは、コピーしておいてください。

Enterを押すとさらに画面が進みます。

--------------------------------------------

Deploying a Ruby on Rails application: an example

Suppose you have a Ruby on Rails application in /somewhere. Add a server block
to your Nginx configuration file, set its root to /somewhere/public, and set
'passenger_enabled on', like this:

   server {
      listen 80;
      server_name www.yourhost.com;
      root /somewhere/public;   # <--- be sure to point to 'public'!
      passenger_enabled on;
   }

And that's it! You may also want to check the Users Guide for security and
optimization tips and other useful information:

  /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.4/doc/Users guide Nginx.html

Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) :-)
http://www.modrails.com/

Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.

最後の部分では、NginXで単独のアプリケーションを動かす場合の説明です。

以上で、PassengerとNginXのインストールが終わりになります。
この状態では、まだNginXが起動していません。また、自動でNginXの起動も行われないので、もう少し設定をする必要があります。

11 NginXを自動起動できるようにする

さて、ここまででNginX + Passengerのインストールは完了していますので、引き続きNginXのデーモン化を行います。

今回のデーモンに必要なスクリプトはこちらから入手しました。
nginx init script for redhat (rhel5)
なお、一部今回の流れに合わせて内容を変えています。

まず、次のコマンドを実行してシンボリックリンクを作成します。

 # ln -s /usr/local/nginx/sbin/nginx /usr/sbin/

次に、「/etc/init.d/nginx」というファイルを作成し、以下の内容をそのまま貼り付けてください。

#!/bin/sh
#
# Init file for nginx
#
# chkconfig: 2345 55 25
# description: Nginx web server
#
# processname: nginx
# config: /usr/local/nginx/nginx.conf
# pidfile: /usr/local/nginx/nginx.pid
#
# Description: Startup script for nginx webserver on Debian. Place in /etc/init.d and
# run 'sudo update-rc.d nginx defaults', or use the appropriate command on your
# distro. For CentOS/Redhat run: '/sbin/chkconfig --add nginx'
#
# Author:  Ryan Norbauer <ryan.norbauer@gmail.com
# Modified:     Geoffrey Grosenbach http://topfunky.com
# Modified:     David Krmpotic http://davidhq.com
# Modified:                     Vishnu Gopal http://vish.in

set -e

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="nginx daemon"
NAME=nginx
DAEMON=/usr/sbin/nginx
CONFIGFILE=/usr/local/nginx/conf/nginx.conf
PIDFILE=/usr/local/nginx/logs/nginx.pid
SCRIPTNAME=/etc/init.d/nginx

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0

d_start() {
  $DAEMON -c $CONFIGFILE || echo -en "\n already running"
}

d_stop() {
  kill -QUIT `cat $PIDFILE` || echo -en "\n not running"
}

d_reload() {
  kill -HUP `cat $PIDFILE` || echo -en "\n can't reload"
}

case "$1" in
  start)
    echo -n "Starting $DESC: $NAME"
    d_start
        echo "."
  ;;
  stop)
    echo -n "Stopping $DESC: $NAME"
    d_stop
        echo "."
  ;;
  reload)
    echo -n "Reloading $DESC configuration..."
    d_reload
        echo "."
  ;;
  restart)
    echo -n "Restarting $DESC: $NAME";
    d_stop
    # One second might not be time enough for a daemon to stop,
    # if this happens, d_start will fail (and dpkg will break if
    # the package is being upgraded). Change the timeout if needed
    # be, or change d_stop to have start-stop-daemon use --retry.
    # Notice that using --retry slows down the shutdown process somewhat.
    sleep 1
    d_start
    echo ".";
  ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2
    exit 3
  ;;
esac

exit 0

ファイルに書き込んだら、パーミッションの調整とランレベルの設定をします。

  # chmod 750 /etc/init.d/nginx
  # chkconfig --add nginx
  # chkconfig --level 345 nginx on

これで準備完了です。まずは、NginX単独で起動してみます。

 # /etc/init.d/nginx start
Starting nginx daemon: nginx.

では、「http://グローバルIP/」にアクセスしてみてください。

Welcome to nginx!

と表示されたら、成功です。では、止めてみましょう。

 # /etc/init.d/nginx stop 
Stopping nginx daemon: nginx.

ということで、デーモン化が完了です。

12  テストアプリの配置とNginXの設定調整

さて、Rails3の動作確認で作成したアプリを、今度はNginX越しに動くようにしてみます。

Railsを動かす場合、

  • サーバを1つのアプリケーションでしか使わせない
  • サーバに複数のアプリケーションを配置する

ケースがあるかと思います。
前者の場合は、PassengerとNginXのインストールの最後に表示されていた部分

server {
   listen 80;
   server_name www.yourhost.com;
   root /somewhere/public;   # <--- be sure to point to 'public'!
   passenger_enabled on;
}

とnginx.confに書くことで動作させることができます。

今回は、後者の「複数アプリケーションの配置」の方を紹介します。

12.1 テストアプリでの追加作業

NginXでの公開の場合には、追加で行う作業がありますので以下のように作業を行ってください。

 # cd /root/rails/testapp
# chmod a+w -R log
# chmod a+w -R tmp
# chmod a+w db
# chmod a+w db/production.sqlite3
# rake db:migrate RAILS_ENV=production

次にアプリを配置する位置ですが、色々と考えた結果以下のようにされるのが良いかと思います。以下のコマンドでは、作成されたテストアプリを丸ごと移動しています。

 # cd /usr/local/nginx/
# mkdir rails
# mv /root/rails/testapp ./
# cd /usr/local/nginx/html
# ln -s /usr/local/nginx/rails/testapp/public ./testapp

なお、以上の作業を終えると/usr/local/nginx以下はこのようになっていると思います。

/usr/local/nginx
|-- conf
|   `-- nginx.conf
|-- html
|   |-- 50x.html
|   |-- index.html
|   `-- testapp -> ../rails/testapp/public
|-- logs
|   |-- access.log
|   |-- error.log
|   `-- nginx.pid
|-- rails
|   `-- testapp
|       |-- Gemfile
|       |-- Rakefile
|       |-- app
|       |   |-- controllers
|       |   |   `-- books_controller.rb
|       |   |-- models
|       |   |   `-- book.rb
|       |   `-- views
|       |       |-- books
|       |       |   |-- _form.html.erb
|       |       |   |-- edit.html.erb
|       |       |   |-- index.html.erb
|       |       |   |-- new.html.erb
|       |       |   `-- show.html.erb
|       |       `-- layouts
|       |           `-- application.html.erb
|       |-- config
|       |   |-- application.rb
|       |   |-- boot.rb
|       |   |-- database.yml
|       |   |-- environment.rb
|       |   |-- environments
|       |   |   |-- development.rb
|       |   |   |-- production.rb
|       |   |   `-- test.rb
|       |   |-- initializers
|       |   |-- locales
|       |   `-- routes.rb
|       |-- db
|       |   `-- production.sqlite3
|       |-- log
|       |   `-- production.log
|       |-- public
|       |   |-- images
|       |   |   `-- rails.png
|       |   |-- index.html
|       |   |-- javascripts
|       |   |   |-- application.js
|       |   |   |-- controls.js
|       |   |   |-- dragdrop.js
|       |   |   |-- effects.js
|       |   |   |-- prototype.js
|       |   |   `-- rails.js
|       |   |-- robots.txt
|       |   `-- stylesheets
|       |       `-- scaffold.css
|       |-- tmp
|       |   |-- cache
|       |   |-- pids
|       |   |-- restart.txt
|       |   |-- sessions
|       |   `-- sockets
|       `-- vendor
|           `-- plugins
`-- sbin
    `-- nginx

最後に「/usr/local/nginx/conf/nginx.conf」にアプリを起動する設定を書き加えます。
まず、以下のような部分があると思います。

http {
    passenger_root /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.4;
    passenger_ruby /usr/local/bin/ruby;

これはインストール時にPassengerが書き加えてくれたものです。

では、複数アプリ用に書き加えます。

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   html;
        index  index.html index.htm;

        #Rails3 App
        passenger_enabled on;
        passenger_base_uri /testapp;
    }

serverの項を探し、locationを探してください。

その中に上記の「#Rails3 App」のように書き加えます。これでおしまいです。

/etc/init.d/nginx restart

を行い「http://グローバルIP/testapp」にアクセスしてみてください。

もし設定を失敗していたり、作業を間違っている場合は動作しませんので NginXのerror.logやtestappのproduction.logなどを参照し解決してみてください。

また、この作業で作成されたRPMを保存しておくと、かなり楽にサーバセットアップを行うことができるようになりますので、保存をお忘れなく。

13 セットアップ・タイムアタック(全手作業)

ということで、最後に今までの内容を全速力でやってみます。
(そして、書いている内容に間違いがないか確認。w)

以下、やってみた時間です。

00:00 サーバ(Large)作成開始
00:02 サーバ作成完了
00:03 yum -y updateで更新開始
00:04 MySQLのRPMをSCPでアップロード
00:05 nginxのデーモン用スクリプトをアップし、調整
00:06 iptableの調整
00:07 yum update完了
00:08 yumで追加開始
00:09 rubyとsqliteをwgetで取得し解凍しておく
00:12 yumの追加分終了
00:13 iptablesのrestart
00:15 RPMで上げたMySQLをインストール開始
00:16 mysqlのセキュリティ設定
00:17 rubyのmake
00:18 sqlite3のmake
00:19 rubyのmake完了、インストール
      sqliteのmake完了、インストール
00:20 gem update
00:21 gem install rails
00:24 gem install sqlite3, sqlite3-ruby, mysql2
00:25 gem install passengerとpassenger-install-nginx-module
00:26 nginxのセットアップ完了
00:27 Railsのテストアプリ作成
00:28 フォルダのパーミッションとかシンボリックリンクとか調整
00:29 nginxの停止と起動
00:30 ブラウザでhttp://グローバルIP/testappの動作確認

セットアップ時間を短縮するため、sshによる接続は3つ立ち上げて行いました。
なお、作業はすべてコマンドを手入力しています。
コンパイルしている傍らで、影響しない設定ファイルを書いていたり、ファイル転送中してみたり。そんな自力マルチタスクの結果30分で完成しております。

ソースコードの取得をしてmakeしているので、30分という時間はかなり早い方だと感じます。
一撃ですべてセットアップができるシェルを書いておけば、もっと早くなるかと思います。
もし何度も環境セットアップをされるような使い方をする場合は、取り組んでみて下さい。
(そんな時のために、イメージコピーがあるのですが。)

14 まとめ

さて、前編・後編と2回に渡り、ニフティクラウドでのサーバ起動から始めてサーバの環境設定までをお送り致しました。いかがでしたでしょうか?
実際にサービスが提供できる状態にするには、まだ行わないといけないことがありますが、雰囲気を掴んで頂くことは出来たかと思います。

この2回では開発環境構築として作業してきましたが、今後Railsでの環境構築について、さらに色々と試して行きたいと思っております。(NginX+Passenger以外のサーバを試すとか、デプロイ環境を整えるとか、スケールする構成を考えてみるとか。)

ご紹介した作業内容は改善のしどころ満載なので、アドバイスなどありましたら是非コメントをつけて頂けると嬉しいです。宜しくお願い致します。

------------------------------------
プロフィール

Img_writer_yoshida  ライターネーム:吉田 雄哉
Twitter
co-meeting Inc.

株式会社co-meetingの創業メンバー。
「取締役&External- facing Technologist」と名乗り
新しいIT技術を広く伝える活動とWebアプリケーション
開発を行う毎日。
パッケージベンダーでのSaaS立上げ・製造業の
情報システム部門で企画やPM・受託開発と従事して
きたため、ベンダーサイドとユーザサイド の両方の
視点を持ち合わせる。

------------------------------------

Comment(0)