В предыдущей статье мы установили 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