Bu örneğimizde capistrano ile uygulama iletimi sırasında supervisor servisini yöneteceğiz. Supervisor uygulamamızdaki beanstalk ve RabbitMQ konsol komutunu kontrol edecek yani, komutumuz her zaman yenilenmiş ve sürekli çalışıyor olacak. Aşağıdaki örneği takip ederek işlemin nasıl yapılacağını görebilirsiniz.


Uygulama


Supervisor yapısı


Ortam ile ilgili supervisor dosyalarını yaratalım.


# Structure
app
config
supervisor
production.conf
staging.conf

Aşağıdaki konfigürasyon dosyalarındaki komutlar, symfony uygulamamızdayken php bin/console job:processor country_create --limit={5 or any number} --env={prod or stag} (beanstalk) ve php bin/console rabbitmq:consumer -m {5 or any number} country_create --env={prod or stag} (RabbitMQ) şeklinde çalıştırılır. Konfigürasyon dosyalarındaki kritik parçalar -DFOREGROUND eki ve startsecs=0 seçeneğidir. Bunlar işleyicilerin daha güvenilir bir şekilde çalışmalarını sağlayacaktır. Aksi taktirde # INFO gave up: ... entered FATAL state, too many start retries too quickly veya Exited too quickly (process log may have details) gibi hatalar alabilirsiniz. Daha fazla bilgi için Nondaemonizing of Subprocesses ve startsecs sayfalarını okuyun.


# app/config/supervisor/production.conf
[program:football-prod-country-create]
command=php bin/console job:processor country_create --limit=5 --env=prod -DFOREGROUND # Beanstalk
#command=php bin/console rabbitmq:consumer -m 5 country_create --env=prod -DFOREGROUND # RabbitMQ
directory=/srv/www/football/current
autostart=true
autorestart=true
startretries=5
startsecs=0
user=deployer # Our deployment user
numprocs=1
process_name=%(program_name)s_%(process_num)02d
stderr_logfile=/srv/www/football/current/var/logs/%(program_name)s_stderr.log
stderr_logfile_maxbytes=10MB
stdout_logfile=/srv/www/football/current/var/logs/%(program_name)s_stdout.log
stdout_logfile_maxbytes=10MB

# app/config/supervisor/staging.conf
[program:football-stag-country-create]
command=php bin/console job:processor country_create --limit=5 --env=stag -DFOREGROUND # Beanstalk
#command=php bin/console rabbitmq:consumer -m 5 country_create --env=stag -DFOREGROUND # RabbitMQ
directory=/srv/www/football/current
autostart=true
autorestart=true
startretries=5
startsecs=0
user=deployer # Our deployment user
numprocs=1
process_name=%(program_name)s_%(process_num)02d
stderr_logfile=/srv/www/football/current/var/logs/%(program_name)s_stderr.log
stderr_logfile_maxbytes=10MB
stdout_logfile=/srv/www/football/current/var/logs/%(program_name)s_stdout.log
stdout_logfile_maxbytes=10MB

Sunucuya iletim dosyaları


deploy.rb


# deploy/deploy.rb

set :application, "football"
set :supervisor_srv_conf_path, "/etc/supervisor/conf.d"
set :supervisor_app_conf, "#{fetch(:app_config_path)}/supervisor/"+fetch(:stage).to_s+".conf"
after "deploy:cleanup", "application:supervisor:setup"

namespace :application do
namespace :supervisor do
desc "Sets up supervisor"
task :setup do
on roles (:app) do
puts "-" * 6
puts "Setting up supervisor"
ask :answer, "Would you like to restart supervisor? [y/N]"
if fetch(:answer) == "y"
source = "#{release_path}/#{fetch(:supervisor_app_conf)}"
destination = "#{fetch(:supervisor_srv_conf_path)}/#{fetch(:application)}.conf"
execute :cp, "#{source} #{destination}"
execute :supervisorctl, "reread"
execute :supervisorctl, "update"
execute :supervisorctl, "reload"
end
puts "-" * 6
end
end
end
end

Supervisor sunucu hakları


Capistrano ile iletim sırasında "deployer" kullanıcısının supervisor'u kullanabilmesi için, ona bazı hakları vermemiz gerekiyor.


conf.d


Uygulamamızdaki konfigürasyon dosyalarının "deployer" kullanıcısı tarafından koyulacağı yerdir, o nedenle W haklarını vermemiz lazım.


Mevcut durum.


root@prod:~# ls -l /etc/supervisor/
drwxr-xr-x 2 root root 4096 Jul 30 2013 conf.d
-rw-r--r-- 1 root root 1245 May 4 20:54 supervisord.conf

root@prod:~# ls -l /etc/supervisor/conf.d/
total 0

Özel olarak "supervisor" grubu yaratın ve "deployer" kullanıcısını ona atayın.


root@prod:~# groupadd supervisor
root@prod:~# usermod -a -G supervisor deployer

root@prod:~# groups deployer
deployer : deployer supervisor

Klasör /etc/supervisor/conf.d/'nin sahibini "supervisor" olarak atayalım.


root@prod:~# chgrp -R supervisor /etc/supervisor/conf.d

root@prod:~# ls -l /etc/supervisor
drwxr-xr-x 2 root supervisor 4096 Jul 30 2013 conf.d
-rw-r--r-- 1 root root 1245 May 4 20:54 supervisord.conf

Klasörü 775 olarak ayarlayalım ki "deployer" kullanıcısı ona yazabilsin.


root@prod:~# chmod 775 /etc/supervisor/conf.d

root@prod:~# ls -l /etc/supervisor
drwxrwxr-x 2 root supervisor 4096 Jul 30 2013 conf.d
-rw-r--r-- 1 root root 1245 May 4 20:54 supervisord.conf

supervisord.conf


Konfigürasyon dosyasını aşağıdaki gibi ayarlayalım.


# Replace this part
[unix_http_server]
file=/var/run/supervisor.sock
chmod=0700

# With this part
[unix_http_server]
file=/var/run/supervisor.sock
chmod=0770
chown=root:supervisor

Yeniden başlatma


Yapılan değişiklikleri yansıtmak için tekrar çıkış ve giriş yapalım.


root@prod:~# logout
vagrant@prod:~# su -l root

root@prod:~# service supervisor restart
Restarting supervisor: supervisord.

Bakalım kullanıcımız "deployer" supervisorctl komutunu kullanabiliyor mu.


root@prod:~# su -l deployer
deployer@prod:~$ supervisorctl reload
Restarted supervisord

Eğer yukarıdaki işlemleri yapmasaydık, aşağıdaki hatayı alırdık.


deployer@prod:~$ supervisorctl reload
error: , [Errno 13] Permission denied: file: /usr/lib/python2.7/socket.py line: 224

Test


Bu capistrano iletimi sırasındaki çıktı.


deployer@deploy:/projects/football$ bundle exec cap production deploy
Setting up supervisor
00:18 application:supervisor:setup
01 cp /srv/www/football/releases/20170501121638/app/config/supervisor/production.conf /etc/supervisor/conf.d/football.conf
✔ 01 deployer@192.168.99.50 0.009s
02 supervisorctl reread
02 football-prod-country-create: available
✔ 02 deployer@192.168.99.50 0.107s
03 supervisorctl update
03 football-prod-country-create: added process group
✔ 03 deployer@192.168.99.50 0.088s
04 supervisorctl reload
04 Restarted supervisord
✔ 04 deployer@192.168.99.50 0.141s

Bu da haklar.


deployer@prod:~$ ls -l /etc/supervisor/conf.d/
-rw-rw-r-- 1 deployer deployer 508 May 5 20:03 football.conf

Konfigürasyonumuz sadece bir tane işleyici çalıştırmak için ayarlı. Bakalım doğru mu işlenmiş.


deployer@prod:~$ supervisorctl 
football-prod-country-create:football-prod-country-create_00 RUNNING pid 4906, uptime 0:03:18 # Beanstalk
#football-prod-country-create:football-prod-country-create_00 RUNNING pid 15664, uptime 0:03:18 # RabbitMQ
supervisor>

GUI yukarıdaki sonucun aynısını gösteriyor.




Aşağıda da gördüğümüz gibi, beanstalk işleyicinin kuyruğu yaratılmış ve muhtemel işler için hazır bekliyor. Buna gördüğümüz gibi RabbitMQ'de dahil.