05/05/2017 - BEANSTALK, CAPISTRANO, RABBITMQ, SUPERVISOR, SYMFONY
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.
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
# 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
Capistrano ile iletim sırasında "deployer" kullanıcısının supervisor'u kullanabilmesi için, ona bazı hakları vermemiz gerekiyor.
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
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
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
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.