Настройка Redmine nginx unicorn god

В предыдущей статье мы установили Redmine и проверили его работу через встроенный http сервер webric. Webric не самый лучший выбор для http сервера.

По этому мы рассмотрим другой http сервер Unicorn, который является более быстрым и может поддерживать большое количество соединений.

А так же для подстраховки будем использовать god  — Фрэймвор на Ruby для мониторинга работы процессов. God будет «воскрешать» наши unicorn процессы если они вдруг внезапно «умрут».

Настройка unicorn

# cd /srv/redmine
# vim Gemfile
#добавим строку
gem 'unicorn'
#установим модуль
# bundle install --without development test
#создадим фаил настроек unicorn.rb
# vim config/unicorn.rb

[ruby]
worker_processes 1 #Количество процессов master + 1 потомок
working_directory "/srv/redmine/" #Домашний каталог redmine

preload_app true

timeout 30

listen "/srv/redmine/tmp/sockets/unicorn.sock", :backlog => 64 #путь до unix сокета к нему будет обращаться nginx

pid "/srv/redmine/tmp/pids/unicorn.pid"

stderr_path "/srv/redmine/log/unicorn.stderr.log"
stdout_path "/srv/redmine/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
[/ruby]

Проверим что все правильно настроено

# bundle exec unicorn_rails -E production -c config/unicorn.rb -D
# ps ax | grep corn
2752 ? Sl 0:03 unicorn_rails master -E production -c config/unicorn.rb -D
2757 ? Sl 0:00 unicorn_rails worker[0] -E production -c config/unicorn.rb -D
2761 pts/0 S+ 0:00 grep --color=auto corn

Настройка god

# gem install god
# vim /etc/redmine.god

[ruby]
RAILS_ROOT = ‘/srv/redmine/’

God.watch do |w|
w.name = ‘redmine’
w.interval = 30.seconds #Интервал проверки
w.log = ‘/var/log/god.log’ #фаил журнала
w.uid = ‘redmine’ #от какого пользователя будет запущен процесс
w.gid = ‘redmine’ #аналогично группа

w.pid_file = File.join(RAILS_ROOT, "tmp/pids/unicorn.pid") #мониторинг PID
w.behavior(:clean_pid_file)

w.dir = RAILS_ROOT
w.env = { ‘PATH’ => ‘/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin’ }

w.start = "bundle exec unicorn_rails -E production -c config/unicorn.rb -D" #команда запуска unicron
w.stop_signal = ‘QUIT’
w.restart = "kill -USR2 `cat #{w.pid_file}`"
w.start_grace = w.restart_grace = 30

w.start_if do |start|
start.condition(:process_running) do |c|
c.running = false
end
end
end
[/ruby]


#Добавим пользователя
# adduser redmine -d /srv/redmine -s /sbin/nologin
#Создадим фаил журнала
# touch /var/log/god.log
#Назначим владельца redmine на фаил журнала
# chown redmine:redmine /var/log/god.log
#Проверим запуск god
# god -c /etc/redmine.god
# ps ax | grep god
2817 pts/0 Sl 0:00 /usr/bin/ruby /usr/local/bin/god -c /etc/redmine.god
2857 pts/0 S+ 0:00 grep --color=auto god
# ps ax | grep corn
2846 ? Sl 0:03 unicorn_rails master -E production -c config/unicorn.rb -D
2851 ? Sl 0:00 unicorn_rails worker[0] -E production -c config/unicorn.rb -D
2864 pts/0 S+ 0:00 grep --color=auto corn

Как видим все прошло успешно, настроим nginx для обработки http запросов от клиентов.

Настрйока nginx

# vim /etc/nginx/conf.d/redmine.conf

[shell]
upstream redmine {
server unix:/srv/redmine/tmp/sockets/unicorn.sock; #путь до unix сокет файла unicorn
}

server {
client_max_body_size 200m;
root /srv/redmine/;

location / {
try_files $uri @ruby;
}

location @ruby {
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_redirect off;
proxy_read_timeout 300;
proxy_pass http://redmine; #upstream redmine
}
}
[/shell]

Не забудьте закомментировать default сервер в /etc/nginx/nginx.conf

#Запустим nginx
# systemctl start nginx
#Добавим в автозапуск nginx
# systemctl enable nginx
#Добавим в автозапуск god
# echo "god -c /etc/redmine.god" >> /etc/rc.local