Supervisor wykorzystuję do pilnowania kolejek zadań w aplikacjach webowych, jednak może on kontrolować w zasadzie każdy proces w systemie operacyjnym. Dzisiejszy post poświęciłem w całości na instalację Supervisora na CentOS 8 oraz konfigurację do współpracy z frameworkiem Laravel.
Instalacja na CentOS 8
Najpierw aktualizujemy paczki i instalujemy Supervisor.
1 2 3 4 | sudo dnf update -y sudo dnf install epel-release sudo yum update sudo yum -y install supervisor |
Po pomyślnej instalacji uruchamiamy go.
1 | sudo systemctl start supervisord |
Włączamy również autostart po bootowaniu systemu.
1 | sudo systemctl enable supervisor |
Status Supervisora można sprawdzić za pomocą komendy:
1 | sudo systemctl status supervisord |
Konfiguracja Supervisora
Domyślny plik konfiguracyjny znajduje się w /etc/supervisord.conf. Jeśli go tam nie ma, za pomocą tego polecenia skopiujemy przygotowany preset.
1 | echo_supervisord_conf > /etc/supervisord.conf |
Budowanie pliku konfiguracyjnego
Mam zasadę tworzenia osobnych plików konfiguracyjnych dla każdego procesu i podpinania ich w pliku głównym. Tworzymy więc nowy plik konfiguracyjny, np. w katalogu domeny naszej aplikacji. Niech plik ten nazywa się w tym przypadku laravel_worker.config. Nazwa pliku nie ma znaczenia, możemy nadać własną.
Dokumentacja Laravela proponuje gotowy plik konfiguracyjny. Wykorzystajmy go więc.
1 2 3 4 5 6 7 8 9 10 | [program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=/path/to/php /var/www/app.com/artisan queue:work sqs --sleep=3 --tries=3 --max-time=3600 autostart=true autorestart=true user=forge numprocs=8 redirect_stderr=true stdout_logfile=/var/www/app.com/worker.log stopwaitsecs=3600 |
Poszczególne linie powyższego kodu są dość zrozumiałe, jednak pozwolę je sobie krótko opisać.
- Nazwa program
- Nazwa procesów – zawsze zostawiam domyślną wartość. W przypadku wielu procesów (punkt 7) należy zostawić ten ciąg znaków %(process_num)
- Komenda do wykonywania – w tym przypadku wywołuje ona zadania zapisane w kolejce Laravela
- Jeśli wystąpi wartość „true” to program uruchomi się razem z Supervisorem
- Jeśli wystąpi wartość „true” to Supervisor zresetuje już istniejące procesy w przypadku wystąpienia w nich błędu
- Użytkownik
- Liczba instancji programu, które zostaną uruchomione
- Przekierowywanie wyjścia programu (patrz – punkt 9)
- Ścieżka do pliku, do którego zostanie przekierowane wyjście programu (punkt 8)
- Czas do zabicia procesu liczony w sekundach. Upewnij się, że zadanie w kolejce nie wykonuje się dłużej niż podana tutaj wartość
Podłączanie własnej konfiguracji do /etc/supervisord.conf
Edytujemy plik /etc/supervisord.conf i przechodzimy na jego koniec. Usuwamy średniki z dwóch linii:
1 2 | ;[include] ;files=/somepath/*.ini |
Następnie podajemy ścieżkę do własnej, dodatkowej konfiguracji.
1 2 | [include] files=/var/www/app.com/laravel_worker.config |
Uruchamianie kontroli procesów
Jeśli wszystko jest zapisane, wymuszamy ponowne odczytanie konfiguracji przez Supervisor.
1 2 | supervisorctl reread supervisorctl update |
Pozostaje jeszcze uruchomić nowo utworzone procesy.
1 | supervisorctl start all |
Od tego momentu Supervisor nadzoruję kolejkę w aplikacji Laravel.
Znane mi błędy
Podczas pierwszej styczności z Supervisorem nie ustrzegłem się problemów. Oto kilka z nich.
ERROR (no such file)
Upewnij się, że ścieżki w pliku konfiguracyjnym w wywoływanej komendzie są poprawne. Popełniłem literówkę w części odwołującej do pliku artisan, ale warto też dodać bezwzględną ścieżkę do php – tak jak w przykładzie powyżej.
unix:///tmp/supervisor.sock no such file
W tym przypadku winna była ścieżka do pliku supervisor.sock. Upewnij się, gdzie się znajduje. Musiałem ją podmienić w głównym pliku konfiguracyjnym na /run/supervisor/supervisor.sock.
Tagi: kolejki • Laravel • PHP • queues • Supervisor