- PVSM.RU - https://www.pvsm.ru -
Доброго времени суток!
Как переехать на
Я постоянно слышу от многих своих знакомых программистов PHP, что они не хотят переходить на рельсы только из-за того, что нет адекватного и дешевого
Что вы должны иметь для начала:
Для справки: все действия, в моем случае, выполняются на
Заходим на машину по ssh через терминал:
:~ ssh root@<ip машины>
Ставим nginx из репозитория:
:~ apt-get install nginx
Создаем директорию для конфигов наших приложений, вдруг их будет несколько:
:~ mkdir /etc/nginx/sites
Пишем конфиг для первого приложения. Я использую vim, но это дело вкуса, можно использовать хоть стандартный nano:
:~ vi /etc/nginx/sites/first_app.conf
Пишем сюда следующее содержимое:
server {
listen 80;
# Имя сервера это то, что будет запускаться.
# Некоторые провайдеры генерируют случайное доменное имя, если это ваш случай, то пишем его сюда.
server_name first_app.com;
root /home/first_app/web-app/public;
client_max_body_size 32m;
location / {
try_files $uri @unicorn;
}
location @unicorn {
proxy_set_header Client-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass unix [2]:/home/first_app/web-app/tmp/sockets/unicorn.sock;
}
}
Теперь редактируем кофиг самого сервера nginx. Ниже приведен полный файл конфига:
user nobody nogroup;
worker_processes 4;
pid /var/run/nginx.pid;
events {
worker_connections 4096;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
log_format main '$remote_addr - $remote_user[$time_local] "$request"'
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "http_x_forwarded_for"'
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites/*.conf;
}
#mail {
# # See sample authentication script at:
# # wiki.nginx.org/ImapAuthenticateWithApachePhpScript [3]
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
Теперь нам надо, чтобы nginx запускался автоматически при запуске
:~ apt-get install runit
:~ mkdir /etc/sv/nginx
Создадим исполняемый файл для запуска nginx:
:~ vi /etc/sv/nginx/run
И напишем туда вот что:
#!/bin/sh
exec 2>&1
exec /usr/sbin/nginx
Делаем его исполняемым:
:~ chmod +x /etc/sv/nginx/run
Проверим заработало ли все это дело:
:~ /etc/sv/nginx/run
:~ ps aux | grep nginx
Если все хорошо вы увидете 4 запущенных worker_process и сервер nginx. Проблемы могут возникнуть только в том случае если на
:~ ln -s /etc/sv/nginx/ /etc/service
Поздравляю nginx утановлен и настроен. На все про все при должной снаровке уйдет минуты 2. Нужно еще создать пользователя, из-под которого будет запускаться приложение:
:~ adduser first_app
:~ vi home/itnotes/.bashrc
Дописываем в этот файл:
export RAILS_ENV=production
В том же терминале продолжаем:
:~ apt-get install curl
:~ bash -s stable < <(curl -s raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer [4])
:~ apt-get install build-essential bison openssl libreadline6 libreadline6-dev zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev
:~ gpasswd -a first_app rvm
:~ apt-get install rubygems
:~ rvm use --create ruby-1.9.2-p318@first_app
:~ rvm ruby-1.9.2-p318@global gem install bundler
:~ mkdir /home/first_app/web-app
:~ apt-get install git-core git-gui git-doc
Здесь мы устанавливаем curl, затем с его помощь ставим rvm, доставляем пачку пакетов, которые пригодятся для компиляции Ruby, работы sqlite и т.д. После этого ставим Rubygems, создаем гемсет для нашего проекта, утанавливаем bundler для всех проектов и создаем папку для нашего приложения в home директории созданного нами пользователя. Устанавливаем Git.
Выходим из рута, завершаем ssh.
Заходим под созданным пользоватлем по ssh:
:~ ssh first_app@<IP машины>
:~ rvm install ruby-1.9.2-p318
Выходим и снова заходим под рутом.
В подавляющем большинстве случаев в качестве бд используется mysql, но знаете, мое личное мнение таково, что если проект не большой, а так себе сайтик чего там делает, то не стоит ему юзать такую бд, ему вполне хватит и sqlite. Кроме того, мы сэкономими еще кучу времени. Переехать потом на mysql, если такое вообще понадобится, можно произвести без особых проблем. Поэтому мы не будем настраивать никаких субд, а сразу перейдем к Capistrano.
Допишите в Gemfile приложения:
group :development do
...
gem 'capistrano-deploy', '~> 0.1.1', :require => nil
end
group :production do
...
gem 'unicorn', '~> 3.6.2', :require => nil
end
Создайте в корне проекта Capfile со следующим содержимым:
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require "rvm/capistrano"
set :rvm_ruby_string, '1.9.2'
require 'capistrano-deploy'
use_recipes :git, :rails, :bundle, :unicorn
server '<IP машины>', :web, :app, :db, :primary => true
set :user, 'first_app'
set :deploy_to, '/home/first_app/web-app'
set :repository, 'git@github.com:<репозиторий>'
after 'deploy:update', 'bundle:install'
after 'deploy:restart', 'unicorn:stop'
Тут есть маленький нюанс, если у вас как и у меня git репозиторий находится на github, то надо не забыть из под созданного юзера на
В терминале пишем:
:~ mkdir /etc/sv/first_app_unicorn
:~ touch /etc/sv/first_app_unicorn/run
:~ chmod +x /etc/sv/first_app_unicorn/run
:~ vi /etc/sv/first_app_unicorn/run
Пишем в этот файлик вот это:
#!/bin/sh
exec 2>&1
export USER=first_app
export HOME=/home/$USER
export RAILS_ENV=production
UNICORN="/usr/local/rvm/bin/rvm ruby-1.9.2-p318@first_app exec bundle exec unicorn"
UNICORN_CONF=/etc/unicorn/first_app.rb
cd $HOME/web-app
exec chpst -u $USER:$USER $UNICORN -c $UNICORN_CONF
Далее заполняем файл /etc/unicorn/first_app.rb вот этим:
worker_processes 4
working_directory "/home/first_app/web-app"
listen "/home/first_app/web-app/tmp/sockets/unicorn.sock", :backlog => 64
pid "/home/first_app/web-app/tmp/pids/unicorn.pid"
stderr_path "/home/first_app/web-app/log/unicorn.stderr.log"
stdout_path "/home/first_app/web-app/log/unicorn.stdout.log"
Последний рывок:
ln -s /etc/sv/first_app_unicorn /etc/service
Необходимо добавить 2 записи А типа: для субдомена @ и www, с указанием IP вашего
Идем делаем бутерброды и запускаем в браузере.
Для быстрого обновления мелких изменений на сайте я создал такой файлик в корне приложения:
git add .
git commit -a -m "Release"
git push
cap deploy:update
cap deploy:restart
Назвал его deploy и сделал его исполняемым. Теперь чтобы обновить сайт на github и
:~ ./deploy
Автор: verybigman
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/nginx/4401
Ссылки в тексте:
[1] VDS: https://www.reg.ru/?rlink=reflink-717
[2] unix: http://unix
[3] wiki.nginx.org/ImapAuthenticateWithApachePhpScript: http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
[4] raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer: https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer
Нажмите здесь для печати.