Podczas gdy wykorzystywany przez Linux.pl panel DirectAdmin nie posiada funkcjonalności związanej z Node.js, to umożliwiamy naszym klientom uruchamianie takich aplikacji za pomocą programu PM2, który jest domyślnie zainstalowany na naszych serwerach.
Do obsługi programu potrzebne jest połączenie do serwera przez protokół SSH. Należy więc wybrać plan hostingowy, który posiada tę funkcjonalność.
Pierwszym krokiem jest umieszczenie plików aplikacji na serwerze za pomocą FTP lub menedżera plików DirectAdmin. Powinny znaleźć się w katalogu domeny, która ma być obsługiwana przez aplikację. Nie powinny natomiast zostać wrzucone do podkatalogu "public_html" - w nim powinny znajdować się jedynie statyczne pliki .html lub .js, w przeciwnym wypadku może dojść np. do wycieku danych.
Następnie, po zalogowaniu się przez terminal należy przeprowadzić wszystkie czynności instalacyjne związane z projektem, jak instalowanie zależności przez npm.
Po przygotowaniu aplikacji można uruchomić ją poleceniem "pm2 start [nazwa_pliku]" zastępując [nazwa_pliku] ścieżką głównego pliku aplikacji. Po udanym uruchomieniu aplikacji pokaże się tabelka z listą aplikacji i najważniejszymi informacjami o nich.
Jeżeli nie wystąpiły żadne błędy w kodzie, aplikacja powinna w tym momencie już działać. Zakończenie sesji SSH nie spowoduje przerwania działania aplikacji.
PM2 to dość rozbudowany program z wieloma dodatkowymi funkcjami. Jego polecenia i opcje wraz z ich krótkimi opisami można przejrzeć po wpisaniu "pm2 -h". Z kolei "pm2 examples" służy do wyświetlenia przykładów ich użycia.
Najważniejsze polecenia PM2 to:
- pm2 start [nazwa_pliku] - uruchomienie aplikacji gdzie [nazwa_pliku] jest ścieżką głównego pliku aplikacji. Dodatkowo aplikacji można nadać własną nazwę - "pm2 start [nazwa_pliku] --name [nazwa_aplikacji]".
- pm2 list - wyświetlenie listy aplikacji użytkownika.
- pm2 logs [nazwa_aplikacji] - wyświetlenie logów aplikacji.
- pm2 flush - wyczyszczenie logów aplikacji.
- pm2 stop [nazwa_aplikacji] - zatrzymanie aplikacji.
- pm2 restart [nazwa_aplikacji] - restart aplikacji.
- pm2 reload [nazwa_aplikacji] - przeładowanie aplikacji.
- pm2 delete [nazwa_aplikacji] - zatrzymanie (jeżeli jest uruchomiona) i usunięcie aplikacji z listy.
- pm2 reset [nazwa_aplikacji] - wyzerowanie liczników PM2 dla aplikacji.
Polecenia "stop", "restart", "reload", "delete" i "reset" zamiast nazwy aplikaji przyjmują również jej id lub argument "all", który wykonuje polecenie dla wszystkich aplikacji na liście.
Port aplikacji i przekierowanie na port 80
Portem standardowo używanym przez aplikacje Node.js jest port 3000. Należy mieć na uwadze, że gdy na jednym serwerze nie jest możliwe uruchomienie więcej niż jednej aplikacji na jednym porcie - dlatego najlepiej wykorzystać jest przypadkowy port z zakresu od 3000 do 3500. Z kolei hostname aplikacji ustawiamy na localhost, czyli ip "127.0.0.1".
Domyślnie port 80 jest wykorzystywany przez serwer Apache, więc jeżeli chcemy, aby aplikacja działała w przeglądarkach internetowych bez konieczności podawania numeru portu w pasku adresowym, musimy ustawić przekierowanie w pliku .htaccess. Znajduje się on w katalogu domeny, w podkatalogu "public_html". Jeżeli nie istnieje, należy go tam utworzyć. Treść przykładowego przekierowania:
RewriteEngine On
RewriteRule ^$ http://127.0.0.1:3001/ [P,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://127.0.0.1:3001/$1 [P,L]
Plik o takiej treści (po zastąpieniu "aplikacja_node.pl" nazwą domeny obsługiwanej przez aplikację) przekieruje ruch z portu 80 na port 3001, wykorzystywany przez aplikację Node.js.
Oczywiście, przy korzystaniu z tego rozwiązania, aplikacja musi zostać odpowiednio dostosowana - na przykład korzystać z biblioteki socket.io.
Często występujące problemy
Aby aplikacja działała poprawnie konto musi mieć wyłączone ograniczenie jailed, które dla dużej liczby kont jest domyślnie włączone. Gdyby pojawiał się problem z utrzymaniem działania aplikacji po wylogowaniu się z sesji SSH trzeba zgłosić to nam, a my pomożemy z rozwiązaniem problemu.