「Ruby on Rails」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
92行目: 92行目:
 
Unicorn is a stand-alone application server that cannot talk directly to clients. Instead, a web server must sit between clients and Unicorn, proxying requests as needed. [http://unicorn.bogomips.org/ Unicorn] is loosely based on Mongrel. It is used by Github, and it uses an architecture that tries hard to find the best child for handling a request. [https://github.com/blog/517-unicorn Explanation of differences between Unicorn and Mongrel].
 
Unicorn is a stand-alone application server that cannot talk directly to clients. Instead, a web server must sit between clients and Unicorn, proxying requests as needed. [http://unicorn.bogomips.org/ Unicorn] is loosely based on Mongrel. It is used by Github, and it uses an architecture that tries hard to find the best child for handling a request. [https://github.com/blog/517-unicorn Explanation of differences between Unicorn and Mongrel].
   
Install the Unicorn gem:
+
Unicorn gem をインストール:
 
# gem install unicorn
 
# gem install unicorn
   
Then create a configuration file for your application in {{ic|/etc/unicorn/}}. For example; here is a configuration example (Based on [http://www.warden.pl/2011/01/07/running-redmine-under-unicorn-in-debian/]) for Redmine:
+
アプリケーションの設定ファイルを {{ic|/etc/unicorn/}} に作成。以下は Redmine の設定例です ([http://www.warden.pl/2011/01/07/running-redmine-under-unicorn-in-debian/] を参照):
   
 
{{hc|/etc/unicorn/redmine.ru|<nowiki>
 
{{hc|/etc/unicorn/redmine.ru|<nowiki>
120行目: 120行目:
 
</nowiki>}}
 
</nowiki>}}
   
  +
次のコマンドで起動:
Start it using:
 
# usr/bin/unicorn -D -E production -c /etc/unicorn/redmine.ru
+
# /usr/bin/unicorn -D -E production -c /etc/unicorn/redmine.ru
   
 
==== Systemd サービス ====
 
==== Systemd サービス ====
172行目: 172行目:
   
 
[http://www.modrails.com/ Passenger] also known as {{ic|mod_rails}} is a module available for [[Nginx]] and [[Apache]], that greatly simplifies setting up a Rails server environment. Nginx does not support modules as Apache and has to be compiled with {{ic|mod_rails}} in order to support Passenger; let Passenger compile it for you. As for Apache, let Passenger set up the module for you.
 
[http://www.modrails.com/ Passenger] also known as {{ic|mod_rails}} is a module available for [[Nginx]] and [[Apache]], that greatly simplifies setting up a Rails server environment. Nginx does not support modules as Apache and has to be compiled with {{ic|mod_rails}} in order to support Passenger; let Passenger compile it for you. As for Apache, let Passenger set up the module for you.
 
{{note|The current Nginx package in the official repositories actually is compiled with the Passenger module, so you can install it via pacman. The configuration files are stored in {{ic|/etc/nginx/conf/}}.}}
 
{{note|As of 2013-10-07 this doesn't seem to be the case any longer and you will have to follow the remaining steps here}}
 
   
 
Start by installing the 'passenger' gem:
 
Start by installing the 'passenger' gem:
198行目: 195行目:
 
}
 
}
 
</pre>
 
</pre>
  +
  +
=== Puma (Nginx をリバースプロキシサーバーとして使用) ===
  +
  +
[http://puma.io/ Puma] ([https://github.com/puma/puma Github ページ]) は Ruby/Rack アプリケーションのためのシンプル・高速・並列動作の HTTP 1.1 サーバーで、Webrick や Mongrel を置き換えることを目指しています。Rubinius の go-to サーバーとして設計されているだけでなく、JRuby や MRI とも上手く動作します。リバースプロキシサーバーはロードバランサとして機能し、外部リクエストをウェブアプリのプールに振り分けます。
  +
  +
ウェブサーバーはサーバー用のユーザーとグループで使うのが良いので、[[ユーザーとグループ#ユーザーを追加する例]]を見て下さい。以下ではユーザー名として {{ic|rails}} を、グループ名として {{ic|server}} を、rails のアプリ名として {{ic|my_app}} を使います。
  +
  +
まずは {{ic|/var/www/my_app}} にあなたのアプリをコピーしてください。そして以下のコマンドで所有者を設定します:
  +
# cd /var/www/
  +
# chown -R rails:server my_app
  +
  +
そして、次のコマンドでパーミッションを設定:
  +
# chmod -R 775 my_app
  +
  +
次に Gemfile に {{ic|puma gem}} を追加してインストール:
  +
$ cd my_app
  +
$ bundle install
  +
  +
また、pacman で {{ic|nginx}} をインストールしてください。
  +
  +
アプリフォルダに以下のコマンドで sockets, pids, log フォルダを作成:
  +
$ mkdir -p shared/pids shared/sockets shared/log
  +
  +
{{ic|nginx.conf}} をバックアップ:
  +
# cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
  +
  +
Then create a new nginx.conf file with your favorite editor, copy codes below and modify as you like:
  +
<pre>
  +
#user html;
  +
worker_processes 1; # this may connect with the worker numbers puma can use.
  +
  +
#error_log logs/error.log;
  +
#error_log logs/error.log notice;
  +
#error_log logs/error.log info;
  +
  +
#pid logs/nginx.pid;
  +
  +
  +
events {
  +
worker_connections 1024;
  +
}
  +
  +
http {
  +
upstream app {
  +
# Path to Puma SOCK file, as defined previously
  +
server unix:/var/www/my_app/shared/sockets/puma.sock;
  +
}
  +
  +
server {
  +
listen 80;
  +
server_name localhost; # or your server name
  +
  +
root /var/www/my_app/public;
  +
  +
try_files $uri/index.html $uri @app;
  +
  +
location @app {
  +
proxy_pass http://app;
  +
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  +
proxy_set_header Host $http_host;
  +
proxy_redirect off;
  +
}
  +
  +
error_page 500 502 503 504 /500.html;
  +
client_max_body_size 4G;
  +
keepalive_timeout 10;
  +
}
  +
}</pre>
  +
  +
nginx サービスを起動:
  +
# systemctl start nginx
  +
  +
There are several ways to start puma server, two ways are recommended below:
  +
  +
In common create file {{ic|config/puma.rb}}, copy codes below and modify as you like:
  +
<pre>
  +
# Change to match your CPU core count
  +
# You can check available worker numbers with $ grep -c processor /proc/cpuinfo
  +
# also see the comment in the nginx.conf
  +
workers 2
  +
  +
# Min and Max threads per worker
  +
#threads 1, 6
  +
  +
app_dir = File.expand_path("../..", __FILE__)
  +
shared_dir = "#{app_dir}/shared"
  +
  +
# Default to production
  +
#rails_env = ENV['RAILS_ENV'] || "production"
  +
#environment rails_env
  +
  +
# Set up socket location
  +
bind "unix://#{shared_dir}/sockets/puma.sock"
  +
  +
# Logging
  +
#stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true
  +
  +
# Set master PID and state locations
  +
pidfile "#{shared_dir}/pids/puma.pid"
  +
#state_path "#{shared_dir}/pids/puma.state"
  +
#activate_control_app
  +
  +
#on_worker_boot do
  +
# require "active_record"
  +
# ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
  +
# ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env])
  +
#end</pre>
  +
  +
==== 選択肢 A: 設定ファイルを使う ====
  +
  +
Start server with
  +
$ bundle exec puma -C config/puma.rb
  +
  +
You can also run it in background with parameter {{ic|-d}} and check with
  +
$ ps aux| grep puma
  +
when you want to {{ic|kill}} it.
  +
  +
If you want to keep it after you log out, you can use
  +
$ nohup bundle exec puma -C config/puma.rb &
  +
But if the system reboot, the process will still get lost.
  +
  +
==== 選択肢 B: systemd を使う ====
  +
  +
Create a new systemd unit {{ic|puma.service}} under ~/.config/systemd/user/ and copy codes below
  +
<pre>
  +
[Unit]
  +
Description=Puma application server
  +
After=network.target
  +
  +
[Service]
  +
WorkingDirectory=/var/www/my_app
  +
#Environment=RAILS_ENV=production
  +
PIDFile=/var/www/my_app/shared/pids/puma.pid
  +
ExecStart=/home/rails/.gem/ruby/2.2.0/bin/bundle exec \
  +
/home/rails/.gem/ruby/2.2.0/bin/puma \
  +
-C /var/www/my_app/config/puma.rb
  +
  +
[Install]
  +
WantedBy=default.target</pre>
  +
  +
Hint: For ExecStart, if you've installed gem globally, you can change routes to /usr/local/bin/ in ExecStart.
  +
  +
Then start puma with
  +
$ systemctl --user start puma
  +
  +
To enable puma system-widely:
  +
You need to store {{ic|puma.service}} in /etc/systemd/system/ and modify it as below:
  +
<pre>
  +
[Unit]
  +
Description=Puma application server
  +
After=network.target
  +
  +
[Service]
  +
WorkingDirectory=/var/www/my_app
  +
#Environment=RAILS_ENV=production
  +
User=rails
  +
PIDFile=/var/www/my_app/shared/pids/puma.pid
  +
ExecStart=/home/rails/.gem/ruby/2.2.0/bin/bundle exec \
  +
/home/rails/.gem/ruby/2.2.0/bin/puma \
  +
-C /var/www/my_app/config/puma.rb
  +
  +
[Install]
  +
WantedBy=multi-user.target</pre>
  +
  +
For further reading take a look at [[#References]]. Also, for easily deploying app in production mode, you can try [https://github.com/capistrano/capistrano capistrano]
   
 
== データベース ==
 
== データベース ==
333行目: 495行目:
   
 
The strategy is to combine Passenger for Nginx with Passenger Standalone. One must first identify the Ruby environment (interpreter plus gemset) that one uses the most; in this setup the Ruby interpreter and the default gemset were selected. One then proceeds with setting up Passenger for Nginx to use that environment (step 3).
 
The strategy is to combine Passenger for Nginx with Passenger Standalone. One must first identify the Ruby environment (interpreter plus gemset) that one uses the most; in this setup the Ruby interpreter and the default gemset were selected. One then proceeds with setting up Passenger for Nginx to use that environment (step 3).
* Applications within the chosen environment can be served as in [[Ruby_on_Rails#Apache.2FNginx_.28using_Phusion_Passenger.29|Apache/Nginx (using Phusion Passenger)]], page up in this article.
+
* Applications within the chosen environment can be served as in [[#Apache/Nginx (Phusion Passenger を使用)|Apache/Nginx (using Phusion Passenger)]], page up in this article.
 
* All applications that are to use a different Ruby version and/or gemset can be served separately through Passenger Standalone and hook into the main web server via a reverse proxy configuration (step 6).
 
* All applications that are to use a different Ruby version and/or gemset can be served separately through Passenger Standalone and hook into the main web server via a reverse proxy configuration (step 6).
   
478行目: 640行目:
 
* http://beginrescueend.com/integration/passenger
 
* http://beginrescueend.com/integration/passenger
 
* http://blog.phusion.nl/2010/09/21/phusion-passenger-running-multiple-ruby-versions
 
* http://blog.phusion.nl/2010/09/21/phusion-passenger-running-multiple-ruby-versions
  +
* http://www.ruby-journal.com/how-to-setup-rails-app-with-puma-and-nginx/
  +
* https://www.digitalocean.com/community/tutorials/how-to-deploy-a-rails-app-with-puma-and-nginx-on-ubuntu-14-04
   
 
== 参照 ==
 
== 参照 ==
   
* Ruby on Rails http://rubyonrails.org/download.
+
* Ruby on Rails http://rubyonrails.org/download
* Mongrel http://mongrel.rubyforge.org.
+
* Mongrel http://mongrel.rubyforge.org

2015年11月24日 (火) 17:33時点における版

関連記事

Ruby on Rails (よく Rails とか RoR と略されます) は Ruby プログラミング言語によるオープンソースのウェブアプリケーションフレームワークです。Rails はウェブ開発者によって高速な開発のために使用されているアジャイル開発で使われるように出来ています。

このドキュメントでは Arch Linux システムで Ruby on Rails フレームワークをセットアップする方法を説明します。

インストール

Ruby on Rails を使うには Ruby をインストールする必要があるので、先に Ruby の記事を読んでインストールを済まして下さい。また、nodejs パッケージも必要に成ります。

Ruby on Rails 自体は複数の方法でインストールできます:

選択肢 A: RubyGems

ノート: Gem を使ってシステム全体に Rails をインストールすることもできます。その場合、以下のコマンドを root で実行して --no-user-install を付けて下さい。root で RubyGem を使用する危険性については Ruby#gem をユーザー個別またはシステム共通でインストール を読んで下さい。

現在のユーザーで Rails をインストールするコマンド:

$ gem install rails

ドキュメントのビルドには時間がかかります。ドキュメントは不要の場合、--no-document を install コマンドに付けて下さい。

$ gem install rails --no-document

gem は Ruby モジュールのパッケージマネージャであり、Arch Linux における pacman のようなものです。gem をアップデートするには、次を実行:

$ gem update

選択肢 B: pacgem

AURpacgemAUR を使って Rails をインストールすることができます。Pacgem は自動的に PKGBUILD を作成して、それぞれの gem の Arch パッケージを作成します。そしてパッケージは pacman を使ってインストールされます。

# pacgem rails

gem パッケージは次のコマンドでアップデートできます:

# pacgem -u

選択肢 C: AUR

警告: This is not recommended, as this might not include the latest Rails version, and additional dependencies may be introduced that may require you to run gem install anyway.

AUR には ruby-railsAUR パッケージが存在します。

選択肢 D: Quarry バイナリリポジトリ

非公式の quarry リポジトリから ruby-railsインストールしてください。

設定

Rails には WeBrick という名前のベーシックな HTTP サーバーが付属しています。テストアプリケーションを作成してテストすることができます。まず、rails コマンドでアプリケーションを作成:

$ rails new testapp_name
ノート: If you get an error like Errno::ENOENT: No such file or directory (...) An error occurred while installing x, and Bundler cannot continue., you might have to configure Bundler so that it installs gems per-user and not system-wide. Alternatively, run # rails new testapp_name once as root. If it has completed successfully, delete testapp_name/ and run $ rails new testapp_name again as a regular user.
ノート: 以下のようなエラーメッセージが表示される場合:
... FetchError: SSL_connect returned=1 errno= 0 state=SSLv2/v3 read server hello A: sslv3 alert handshake
failure (https://s3.amazonaws.com/ production.s3.rubygems.org/gems/rake-10.0.3.gem) 
nodejs をインストールしてから再度試して下さい。

現在の作業ディレクトリの中に新しいフォルダが作成されます。

$ cd testapp_name

次にウェブサーバーを起動します。デフォルトではポート 3000 を使います:

$ rails server

ローカルマシンのブラウザから http://localhost:3000 を開いて testapp_name のウェブサイトを開いてください。

ノート: JavaScript ランタイムが見つけられないと Ruby がエラーを吐き出す場合、nodejs をインストールしてください。

テストページには "Welcome aboard" と表示されるはずです。

アプリケーションサーバー

Ruby On Rails に内蔵されている HTTP サーバー (WeBrick) は開発用には便利ですが、本番環境での使用は推奨されません。#Thin, #Unicorn, Phusion Passenger などのアプリケーションサーバーを使って下さい。

Thin

Thin は高速でシンプルな Ruby ウェブサーバーです。

thin の gem をまずインストールしてください:

$ gem install thin

そして次のコマンドで起動:

$ thin start

Unicorn

Unicorn is a stand-alone application server that cannot talk directly to clients. Instead, a web server must sit between clients and Unicorn, proxying requests as needed. Unicorn is loosely based on Mongrel. It is used by Github, and it uses an architecture that tries hard to find the best child for handling a request. Explanation of differences between Unicorn and Mongrel.

Unicorn の gem をインストール:

# gem install unicorn

アプリケーションの設定ファイルを /etc/unicorn/ に作成。以下は Redmine の設定例です ([1] を参照):

/etc/unicorn/redmine.ru
working_directory "/srv/http/redmine"
pid "/tmp/redmine.pid"

preload_app true
timeout 60
worker_processes 4
listen 4000
stderr_path('/var/log/unicorn.log')

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

after_fork do |server, worker|
	#start the worker on port 4000, 4001, 4002 etc...
	addr = "0.0.0.0:#{4000 + worker.nr}"
	# infinite tries to start the worker
	server.listen(addr, :tries => -1, :delay => -1, :backlog => 128)

	#Drop privileges if running as root
	worker.user('nobody', 'nobody') if Process.euid == 0
end

次のコマンドで起動:

# /usr/bin/unicorn -D -E production -c /etc/unicorn/redmine.ru

Systemd サービス

/etc/systemd/system/unicorn.service に以下を記述:

/etc/systemd/system/unicorn.service
[Unit]
Description=Unicorn application server
After=network.target

[Service]
Type=forking
User=redmine
ExecStart=/usr/bin/unicorn -D -E production -c /etc/unicorn/redmine.ru

[Install]
WantedBy=multi-user.target

これで systemctl を使って簡単に unicorn を起動・停止できます。

Nginx の設定

After setting up Nginx, configure unicorn as an upstream server using something like this (Warning: this is a stripped example. It probably doesn't work without additional configuration):

http {
	upstream unicorn {
		server 127.0.0.1:4000 fail_timeout=0;
		server 127.0.0.1:4001 fail_timeout=0;
		server 127.0.0.1:4002 fail_timeout=0;
		server 127.0.0.1:4003 fail_timeout=0;
	}

	server {
		listen		80 default;
		server_name	YOURHOSTNAMEHERE;

		location / {
			root			/srv/http/redmine/public;
			proxy_set_header	X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header Host   $http_host;
			proxy_redirect		off;
			proxy_pass		http://unicorn;
		}
	}
}

Apache/Nginx (Phusion Passenger を使用)

Passenger also known as mod_rails is a module available for Nginx and Apache, that greatly simplifies setting up a Rails server environment. Nginx does not support modules as Apache and has to be compiled with mod_rails in order to support Passenger; let Passenger compile it for you. As for Apache, let Passenger set up the module for you.

Start by installing the 'passenger' gem:

# gem install passenger

If you are aiming to use Apache, run:

# passenger-install-apache2-module

In case a rails application is deployed with a sub-URI, like http://example.com/yourapplication, some additional configuration is required, see the modrails documentation

For Nginx:

# passenger-install-nginx-module

The installer will provide you with any additional information regarding the installation (such as installing additional libraries).

To serve an application with Nginx, configure it as follows:

server {
    server_name app.example.org;
    root path_to_app/public; # Be sure to point to 'public' folder!
    passenger_enabled on;
    rails_env development; # Rails environment.
}

Puma (Nginx をリバースプロキシサーバーとして使用)

Puma (Github ページ) は Ruby/Rack アプリケーションのためのシンプル・高速・並列動作の HTTP 1.1 サーバーで、Webrick や Mongrel を置き換えることを目指しています。Rubinius の go-to サーバーとして設計されているだけでなく、JRuby や MRI とも上手く動作します。リバースプロキシサーバーはロードバランサとして機能し、外部リクエストをウェブアプリのプールに振り分けます。

ウェブサーバーはサーバー用のユーザーとグループで使うのが良いので、ユーザーとグループ#ユーザーを追加する例を見て下さい。以下ではユーザー名として rails を、グループ名として server を、rails のアプリ名として my_app を使います。

まずは /var/www/my_app にあなたのアプリをコピーしてください。そして以下のコマンドで所有者を設定します:

# cd /var/www/
# chown -R rails:server my_app

そして、次のコマンドでパーミッションを設定:

# chmod -R 775 my_app

次に Gemfile に puma gem を追加してインストール:

$ cd my_app 
$ bundle install

また、pacman で nginx をインストールしてください。

アプリフォルダに以下のコマンドで sockets, pids, log フォルダを作成:

$ mkdir -p shared/pids shared/sockets shared/log

nginx.conf をバックアップ:

# cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup

Then create a new nginx.conf file with your favorite editor, copy codes below and modify as you like:

#user html;
worker_processes  1; # this may connect with the worker numbers puma can use.

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

http {
	upstream app {
	    # Path to Puma SOCK file, as defined previously
 	    server unix:/var/www/my_app/shared/sockets/puma.sock;
	}

	server {
	    listen 80;
	    server_name localhost; # or your server name

	    root /var/www/my_app/public;

	    try_files $uri/index.html $uri @app;

	    location @app {
		proxy_pass http://app;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header Host $http_host;
		proxy_redirect off;
	    }

	    error_page 500 502 503 504 /500.html;
	    client_max_body_size 4G;
	    keepalive_timeout 10;
	}
}

nginx サービスを起動:

# systemctl start nginx

There are several ways to start puma server, two ways are recommended below:

In common create file config/puma.rb, copy codes below and modify as you like:

# Change to match your CPU core count
# You can check available worker numbers with $ grep -c processor /proc/cpuinfo
# also see the comment in the nginx.conf
workers 2

# Min and Max threads per worker
#threads 1, 6

app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"

# Default to production
#rails_env = ENV['RAILS_ENV'] || "production"
#environment rails_env

# Set up socket location
bind "unix://#{shared_dir}/sockets/puma.sock"

# Logging
#stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true

# Set master PID and state locations
pidfile "#{shared_dir}/pids/puma.pid"
#state_path "#{shared_dir}/pids/puma.state"
#activate_control_app

#on_worker_boot do
#  require "active_record"
#  ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
#  ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env])
#end

選択肢 A: 設定ファイルを使う

Start server with

$ bundle exec puma -C config/puma.rb

You can also run it in background with parameter -d and check with

$ ps aux| grep puma

when you want to kill it.

If you want to keep it after you log out, you can use

$ nohup bundle exec puma -C config/puma.rb &

But if the system reboot, the process will still get lost.

選択肢 B: systemd を使う

Create a new systemd unit puma.service under ~/.config/systemd/user/ and copy codes below

[Unit]
Description=Puma application server
After=network.target

[Service]
WorkingDirectory=/var/www/my_app
#Environment=RAILS_ENV=production
PIDFile=/var/www/my_app/shared/pids/puma.pid
ExecStart=/home/rails/.gem/ruby/2.2.0/bin/bundle exec \
	 /home/rails/.gem/ruby/2.2.0/bin/puma \
	 -C /var/www/my_app/config/puma.rb

[Install]
WantedBy=default.target

Hint: For ExecStart, if you've installed gem globally, you can change routes to /usr/local/bin/ in ExecStart.

Then start puma with

$ systemctl --user start puma

To enable puma system-widely: You need to store puma.service in /etc/systemd/system/ and modify it as below:

[Unit]
Description=Puma application server
After=network.target

[Service]
WorkingDirectory=/var/www/my_app
#Environment=RAILS_ENV=production
User=rails
PIDFile=/var/www/my_app/shared/pids/puma.pid
ExecStart=/home/rails/.gem/ruby/2.2.0/bin/bundle exec \
	 /home/rails/.gem/ruby/2.2.0/bin/puma \
	 -C /var/www/my_app/config/puma.rb

[Install]
WantedBy=multi-user.target

For further reading take a look at #References. Also, for easily deploying app in production mode, you can try capistrano

データベース

Most web applications will need to interact with some sort of database. ActiveRecord (the ORM used by Rails to provide database abstraction) supports several database vendors, the most popular of which are MySQL, SQLite, and PostgreSQL.

SQLite

SQLite は Ruby on Rails のデフォルトの軽量データーベースです。SQLite を使用するには、sqlite をインストールしてください。

PostgreSQL

postgresql をインストールしてください。

MySQL

まず、MySQL サーバーをインストール・設定してください。方法は MySQL を参照。

A gem with some native extensions is required, probably best installed as root:

# gem install mysql

You can generate a rails application configured for MySQL by using the -d parameter:

$ rails new testapp_name -d mysql

You then need to edit config/database.yml. Rails uses different databases for development, testing, production and other environments. Here is an example development configuration for MySQL running on localhost:

 development:
   adapter: mysql
   database: my_application_database
   username: development
   password: my_secret_password

Note that you do not have to actually create the database using MySQL, as this can be done via Rails with:

# rake db:create

If no errors are shown, then your database has been created and Rails can talk to your MySQL database.

Rails パーフェクトセットアップ

Phusion Passenger running multiple Ruby versions.

  • Arch Linux: A simple, lightweight distribution. ;)
  • Nginx: A fast and lightweight web server with a strong focus on high concurrency, performance and low memory usage.
  • Passenger (a.k.a. mod_rails or mod_rack): Supports both Apache and Nginx web servers. It makes deployment of Ruby web applications, such as those built on Ruby on Rails web framework, a breeze.
  • Ruby Version Manager (RVM): A command-line tool which allows you to easily install, manage, and work with multiple Ruby environments from interpreters to sets of gems. RVM lets you deploy each project with its own completely self-contained and dedicated environment —from the specific version of ruby, all the way down to the precise set of required gems to run your application—.
  • SQLite: The default lightweight database for Ruby on Rails.

ステップ 0: SQLite

Install sqlite.

ノート: Of course SQLite is not critical in this setup, you can use MySQL and PostgreSQL as well.

ステップ 1: RVM

Make a multi-user RVM installation as specified here.

In the 'adding users to the rvm group' step, do

# usermod -a -G rvm http
# usermod -a -G rvm nobody

http and nobody are the users related to Nginx and Passenger, respectively.

ノート: Maybe adding the 'nobody' user to the 'rvm' group is not necessary.

ステップ 2: Ruby

Once you have a working RVM installation in your hands, it is time to install the latest Ruby interpreter

ノート: During the installation of Ruby patches will be applied. Consider installing the base-devel group beforehand.
$ rvm install 2.0.0
ノート: It may be useful to delete the 'global' gemsets of the environments that have web applications. Their gems might somehow interfere with Passenger. In that case, a rvm 2.0.0 do gemset delete global is sufficient.

ステップ 3: Nginx と Passenger

Run the following to allow passenger install nginx:

$ rvm use 2.0.0 
$ gem install passenger
$ rvmsudo passenger-install-nginx-module

The passenger gem will be put into the default gemset.

This will download the sources of Nginx, compile and install it for you. It will guide you through all the process. Note that the default location for Nginx will be /opt/nginx.

ノート: If you encounter a compilation error regarding Boost threads, see this article.

After completion, add the following two lines into the 'http block' at /opt/nginx/conf/nginx.conf that look like:

http { 
  ...
  passenger_root /usr/local/rvm/gems/ruby-2.0.0-p353/gems/passenger-3.0.9;
  passenger_ruby /usr/local/rvm/wrappers/ruby-2.0.0-p353/ruby;
  ...
}
ノート: This step is currently being done automatically by the installer script.

ステップ 4: Gemsets と Apps

For each Rails application you should have a gemset. Suppose that you want to try RefineryCMS against BrowserCMS, two open-source Content Management Systems based on Rails.

Install RefineryCMS first:

$ rvm use 2.0.0@refinery --create
$ gem install rails -v 4.0.1
$ gem install passenger
$ gem install refinerycms refinerycms-i18n sqlite3

Deploy a RefineryCMS instance called refineria:

$ cd /srv/http/
$ rvmsudo refinerycms refineria

Install BrowserCMS in a different gemset:

$ rvm use 2.0.0@browser --create
$ gem install rails -v 4.0.1
$ gem install passenger
$ gem install browsercms sqlite3

Deploy a BrowserCMS instance called navegador:

$ cd /srv/http/
$ rvmsudo browsercms demo navegador
$ cd /srv/http/navegador
$ rvmsudo rake db:install

Passenger for Nginx and Passenger Standalone

Observe that the passenger gem was installed three times and with different intentions; in the environments

  • 2.0.0 => for Nginx,
  • 2.0.0@refinery => Standalone
  • 2.0.0@browser => Standalone

The strategy is to combine Passenger for Nginx with Passenger Standalone. One must first identify the Ruby environment (interpreter plus gemset) that one uses the most; in this setup the Ruby interpreter and the default gemset were selected. One then proceeds with setting up Passenger for Nginx to use that environment (step 3).

  • Applications within the chosen environment can be served as in Apache/Nginx (using Phusion Passenger), page up in this article.
  • All applications that are to use a different Ruby version and/or gemset can be served separately through Passenger Standalone and hook into the main web server via a reverse proxy configuration (step 6).

ステップ 5: .rvmrc ファイルと所有者

This step is crucial for the correct behaviour of the setup. RVM seeks for .rvmrc files when changing folders; if it finds one, it reads it. In these files normally one stores a line like

rvm <ruby_version>@<gemset_name>

so the specified environment is set at the entrance of applications' root folder.

Create /srv/http/refineria/.rvmrc doing

# echo "rvm ree@refinery" > /srv/http/refineria/.rvmrc

, and /srv/http/navegador/.rvmrc with

# echo "rvm 2.0.0@browser" > /srv/http/navegador/.rvmrc

You have to enter to both application root folders now, because every first time that RVM finds a .rvmrc it asks you if you trust the given file, consequently you must validate the two files you have just created.

These files aid the programs involved to find the correct gems.

Apart, if applications' files and folders are not owned by the right user you will face database write-access problems. The use of rvmsudo produces root-owned archives when generated by Rails; in the other hand, nobody is the user for Passenger —if you have not changed it—: who will use and should posses them. Fix this doing

# chown -R nobody.nobody /srv/http/refineria /srv/http/navegador

ステップ 6: リバースプロキシ

You have to start the Passenger Standalone web servers for your applications. So, do

$ cd /srv/http/refineria
$ rvmsudo passenger start --socket tmp/sockets/passenger.socket -d

and

$ cd /srv/http/navegador
$ rvmsudo passenger start --socket tmp/sockets/passenger.socket -d

. The first time that you run a Passenger Standalone it will perform a minor installation.

Note that you are using unix domain sockets instead of the commonly-used TCP sockets; it turns out that unix domain are significantly faster than TCP sockets.

ノート: If you are experimenting trouble with unix sockets, changing to TCP should work:
rvmsudo passenger start -a 127.0.0.1 -p 3000 -d

システムの起動時に Passenger Standalone デーモンを起動

Do you have a script? Please post it here.

The systemd script below was made for a Typo blog I host at /srv/http/typo. It's located at /etc/systemd/system/passenger_typo.service. I set the Environment= tags (see "man systemd.exec") from the output of "rvm env". The only exception was PATH=, which I had to combine from my regular PATH and the output of rvm env.

Note: If you don't set the "WorkingDirectory=" variable to your application folder, passenger will fail to find your app and will subsequently shut itself down.

[Unit]
Description=Passenger Standalone Script for Typo
After=network.target

[Service]
Type=forking
WorkingDirectory=/srv/http/typo
PIDFile=/srv/http/typo/tmp/pids/passenger.pid

Environment=PATH=/usr/local/rvm/gems/ruby-2.0.0-p0@typo/bin:/usr/local/rvm/gems/ruby-2.0.0-p0@global/bin:/usr/local/rvm/rubies/ruby-2.0.0-p0/bin:/usr/local/rvm/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/bin/core_perl
Environment=rvm_env_string=ruby-2.0.0-p0@typo
Environment=rvm_path=/usr/local/rvm
Environment=rvm_ruby_string=ruby-2.0.0-p0
Environment=rvm_gemset_name=typo
Environment=RUBY_VERSION=ruby-2.0.0-p0
Environment=GEM_HOME=/usr/local/rvm/gems/ruby-2.0.0-p0@typo
Environment=GEM_PATH=/usr/local/rvm/gems/ruby-2.0.0-p0@typo:/usr/local/rvm/gems/ruby-2.0.0-p0@global
Environment=MY_RUBY_HOME=/usr/local/rvm/rubies/ruby-2.0.0-p0
Environment=IRBRC=/usr/local/rvm/rubies/ruby-2.0.0-p0/.irbrc

ExecStart=/bin/bash -c "rvmsudo passenger start --socket /srv/http/typo/tmp/sockets/passenger.socket -d"

[Install]
WantedBy=multi-user.target

ステップ 7: デプロイメント

サブドメインを使用

Once again edit /opt/nginx/conf/nginx.conf to include some vital instructions:

## RefineryCMS ##

server {
    server_name refinery.domain.com;
    root /srv/http/refineria/public;
    location / {
        proxy_pass http://unix:/srv/http/refineria/tmp/sockets/passenger.socket;
        proxy_set_header Host $host;
    }
}

## BrowserCMS ##

server {
    server_name browser.domain.com;
    root /srv/http/navegador/public;
    location / {
        proxy_pass http://unix:/srv/http/navegador/tmp/sockets/passenger.socket;
        proxy_set_header Host $host;
    }
}
ノート: Or if using TCP sockets, configure the proxy_pass directive like
proxy_pass http://127.0.0.1:3000;

サブドメインを使用しない

If you for some reason don't want to host each application on it's own subdomain but rather in a url like: site.com/railsapp then you could do something like this in your config:

server {
    server_name site.com;
    #Base for the html files etc
    root /srv/http/;

    #First application you want hosted under domain site.com/railsapp
    location /railsapp {
        root /srv/http/railsapp/public;
        #you may need to change passenger_base_uri to be the uri you want to point at, ie:
        #passenger_base_uri /railsapp;
        #but probably only if you're using the other solution with passenger phusion
        proxy_pass http://unix:/srv/http/railsapp/tmp/sockets/passenger.socket;
        proxy_set_header Host $host;
    }

    #Second applicatino you want hosted under domain site.com/anotherapp
    location /anotherapp {
        root /srv/http/anotherapp/public;
        #same thing about the passenger_base_uri here, but with value /anotherapp instead
        proxy_pass http://unix:/srv/http/anotherapp/tmp/sockets/passenger.socket;
        proxy_set_header Host $host;
    }
}

At this point you are in conditions to run Nginx with:

# systemctl start nginx

and to access both CMSs through refinery.domain.com and browser.domain.com.

参照

参照