Apache+unicorn, запуск проекта на ruby

Проще и правильнее всего запускать приложения на Ruby и использованием Nginx в качестве прокси и Unicorn, но для проксирования можно использовать и Apache2.



Unicorn известен как сервер, под которым успешно работаю сайты на Ruby и Python. Он может создавать большое количество воркеров и обслуживать быстро нарастающее количество соединений с сервером, при этом память, запрашиваемая процессами, не выделяется сразу — используется память родительского процесса — фактически она задействуется только тогда когда нужно производить операцию записи.


Конфигурация Apache для работы в связке с Unicorn

Создаем файл виртуального хоста

 

mcedit /etc/apache2/sites-availible/example.com.conf

 

<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /home/ruby/example.com/www/public
CustomLog /var/log/apache2/user-logs/example.com/access.log combined
RewriteEngine On

<Proxy balancer://unicornservers>
BalancerMember http://127.0.0.1:5100
</Proxy>

# RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
# RewriteRule ^/(.*)$ balancer://unicornservers%{REQUEST_URI} [P,QSA,L]

ProxyPass /assets !
ProxyPass / balancer://unicornservers/
ProxyPassReverse / balancer://unicornservers/
ProxyPreserveHost on

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

# Don't allow client to fool Puma into thinking connection is secure
RequestHeader unset X-Forwarded-Proto

# Anything under public is open to the world
<Directory /home/ruby/example.com/www/public>
Require all granted
Options -MultiViews
Satisfy Any
AuthType None
</Directory>

# Disable ETags (https://github.com/h5bp/server-configs-apache/tree/master/doc#configure-etags)
# Set Expiration date for all assets to one year in the future
<LocationMatch «^/assets/.*$»>
Header unset ETag
FileETag None
ExpiresActive On
ExpiresDefault «access plus 1 year»
</LocationMatch>

# Rewrite requests for js and css to gzipped versions if client and server support it
#<LocationMatch «^/assets/.*\.(css|js)$»>
#RewriteEngine on
#RewriteCond %{HTTP:Accept-Encoding} \b(x-)?gzip\b
#RewriteCond %{REQUEST_FILENAME}.gz -s
#RewriteRule ^(.+)$ $1.gz
#</LocationMatch>

# Set type and headers for gzipped css
<LocationMatch «^/assets/.*\.css\.gz$»>
ForceType text/css
Header set Content-Encoding gzip
Header add Vary Accept-Encoding
</LocationMatch>

# Set type and headers for gzipped js
<LocationMatch «^/assets/.*\.js\.gz$»>
ForceType application/javascript
Header set Content-Encoding gzip
Header add Vary Accept-Encoding
</LocationMatch>

# Compress HTML on the fly
AddOutputFilterByType DEFLATE text/html

</VirtualHost>

 

Активируем виртуальный хост

a2ensite example.com.conf

 

Перезапускаем Apache

/etc/init.d/apache2 restart

 

Настройка Unicorn и его запуска через Supervisor

Предполагается, что Ruby на сервере уже стоит, также как поставлены необходимые гемы — в т.ч. Unicorn, установка окружения через RVM рассматривается в другом материале

Unicorn будем запускать через Supervisor для чего установим сам Supervisor и напишем конфиг

 

apt-get install supervisor

 

Создаем конфигурационный файл, предварительно убеждаемся в том, что каталог conf.d подключается в основном конфге

mcedit /etc/supervisor/conf.d/unicorn.conf

 

[program:unicorn]
user = ruby
directory = /home/ruby/example.com/www
environment=PATH=»/home/ruby/.rvm/gems/ruby-2.2.1/bin:/home/ruby/.rvm/gems/ruby-2.2.1@global/bin:/home/ruby/.rvm/rubies/ruby-2.2.1/bin:/home/ruby/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/ruby/.rvm/bin:/home/ruby/.rvm/bin»,GEM_PATH=»/home/ruby/.rvm/gems/ruby-2.2.1:/home/ruby/.rvm/gems/ruby-2.2.1@global»,GEM_HOME=»/home/ruby/.rvm/gems/ruby-2.2.1",RAILS_ENV=»production rake assets:precompile»,RAILS_SERVE_STATIC_FILES=true
command = /home/ruby/.rvm/gems/ruby-2.2.1/bin/unicorn_rails -c /home/ruby/example.com/www/config/unicorn.rb -E production

 

Как следует из конфга от имени пользователя ruby выполняется команда /home/ruby/.rvm/gems/ruby-2.2.1/bin/unicorn_rails -c /home/ruby/example.com/www/config/unicorn.rb -E production

 

Опцией -с указывается конфигурационный файл /home/ruby/example.com/www/config/unicorn.rb.

Той же командой Unicorn при необходимости запускается вручную

 

Конфигурационный файл unicorn.rb выглядит следующим образом:

mcedit /home/ruby/example.com/www/config/unicorn.rb

 

worker_processes 2
working_directory «/home/ruby/example.com/www/»

preload_app true

timeout 30

listen «127.0.0.1:5100»

pid «/home/ruby/example.com/www/tmp/pids/unicorn.pid»

stderr_path «/home/ruby/example.com/www/log/unicorn.stderr.log»
stdout_path «/home/ruby/example.com/www/log/unicorn.stdout.log»

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

 

На этом конфигурация связки Apache2 + Unicorn закончена. Также требуется подключить базу данных — это делается на уровне прложения и перезапустить сервисы:

/etc/init.d/apache2 restart

 

Apache перезапускается обычным способом, но может работать из под runit

supervisorctl restart all

 

Unicorn заведен в supervisor и перезапускается через него. Это нужно для того, чтобы при перезагрузке сервера Unicorn запускался автоматически и не было необходимости стартовать его вручную.