развертывание приложений rails 3.1 в Amazon Ec2 - PullRequest
3 голосов
/ 24 октября 2011

Я много гуглил, но все еще не могу найти способ развернуть мой сайт в ec2. Может кто-нибудь объяснить мне больше о ec2? Я использую Ubuntu11.04 для разработки. Я хотел бы использовать для развертывания пассажира + nginx, спасибо

1 Ответ

7 голосов
/ 24 октября 2011

Я использую capistrano для развертывания приложения Rails 3.1 на микроэкземпляре EC2.Я также настроил Ruby на своем EC2, используя rvm.Я использовал тонкий, но в эти выходные я переключился на Единорога, чтобы проверить это.Я поделюсь с вами тем, что делаю, и, возможно, вы сможете выяснить, как изменить его соответствующим образом, чтобы использовать Passenger (или кто-то другой может это прокомментировать).Я также приветствовал бы любые комментарии, если у людей есть некоторые предложения для любого из этого, поскольку я ни в коем случае не эксперт.:)

Я хотел бы отметить, что у меня все еще есть проблема на этапе развертывания "rake assets: precompile".Он переходит к третьему этапу assets: precompile: nodigest и завершается ошибкой без кода выхода.Я думаю может не хватило памяти.Это не откат развертывания.Если я запускаю "rake assets: precompile: nodigest", то он заканчивает только найти и все хорошо.Этого не происходит при развертывании на моей виртуальной машине для тестирования, только при развертывании на своем микроэкземпляре EC2 (что заставляет меня думать, что это может быть ошибкой OOM, так как EC2 micro крошечный, и я видел ошибки OOM в прошлом).

Несмотря на это, вот что у меня есть.Возможно, это поможет вам начать работу.

Некоторые важные вещи из моего Gemfile:

gem 'rails', '3.1.1'

group :assets do
  gem 'jquery-rails',
  gem 'sass-rails', "~> 3.1.4"
  gem 'coffee-rails', "~> 3.1.1"
  gem 'uglifier', ">= 1.0.3"
  gem 'compass', :git => 'git://github.com/chriseppstein/compass.git', :branch => 'master'
end

group :production do
  gem 'therubyracer'
end

gem 'unicorn'

Capfile:

load 'deploy' if respond_to?(:namespace)
load 'deploy/assets'

Dir['vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }

load 'config/deploy'

config / deploy.rb:

$:.unshift(File.expand_path('./lib', ENV['rvm_path']))

require "rvm/capistrano"
require "bundler/capistrano"

role :app, "your-ec2-domain"
role :db,  "your-ec2-domain", :primary => true
set :user, "your-login-username"

set :application, "your-app-name"

set :scm, :git
set :repository, "."
set :branch, "deploy"   # or whatever git branch you deploy from

set :deploy_via, :copy
set :deploy_to, "/home/#{user}/rails/#{application}"
set :use_sudo, false

set :rails_env, "production"

set :rvm_ruby_string, "ruby-1.9.2-p290"
set :rvm_type, :user

set :unicorn_pid do
  "#{shared_path}/pids/unicorn.pid"
end

before "deploy:assets:precompile", "bundle:install"

namespace :deploy do
  task :start do
    top.unicorn.start
  end

  task :stop do
    top.unicorn.stop
  end

  task :restart do
    top.unicorn.reload
  end
end

namespace :unicorn do
  desc "start unicorn server"
  task :start, :roles => :app do
    run "cd #{current_path} && bundle exec unicorn -E #{rails_env} -D -P #{unicorn_pid}"
  end

  desc "stop unicorn server"
  task :stop do
    run "kill -s QUIT `cat #{unicorn_pid}`"
  end

  desc "restart unicorn"
  task :restart do
    top.unicorn.stop
    top.unicorn.start
  end

  desc "reload unicorn (gracefully restart workers)"
  task :reload do
    run "kill -s USR2 `cat #{unicorn_pid}`"
  end

  desc "reconfigure unicorn (reload config and gracefully restart workers)"
  task :reconfigure, :roles => :app do
    run "kill -s HUP `cat #{unicorn_pid}`"
  end
end

Мой nginx.conf:

user www-data;
worker_processes 1;
pid /var/run/nginx.pid;

events {
  worker_connections 768;
  accept_mutex off;
}

http {
  include /etc/nginx/mime.types;

  access_log /var/log/nginx/access.log combined;
  error_log /var/log/nginx/error.log;

  sendfile on;
  tcp_nopush on;
  keepalive_timeout 65;
  tcp_nodelay off;

  gzip on;
  gzip_disable "MSIE [1-6]\.(?!.*SV1)";

  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
}

Затем в / etc / nginx / sites-available вы должны создать файл для своего сайта.Мы назовем его foobar.conf:

upstream rails {
  server unix:/tmp/.sock fail_timeout=0;
  server 127.0.0.1:8080 fail_timeout=0;
}

server {
  listen 80 default deferred;
  server_name foobar.com

  access_log /var/log/nginx/rails.access.log main;

  # foobar is your project. current is a symlink setup by capistrano
  root /home/username/rails/foobar/current/public;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;

    proxy_pass http://rails;
  }

  location ~ ^/assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  error_page 500 502 503 504 /500.html
  location = /500.html
    root /home/username/rails/foobar/current/public;
  }
}

Затем вы должны создать символическую ссылку из файла, который вы только что создали в / etc / nginx / sites-available, и сделать так, чтобы символическая ссылка указывала на / etc / nginx/ сайты с поддержкой / Foobar

...