Uruchamiamy aplikację Node.js z WebSocket na serwerze Nginx

Programowanie
Uruchamiamy aplikację Node.js z WebSocket na serwerze Nginx

W tym wpisie postara się wyjaśnić jak łatwo możecie uruchomić aplikację napisaną w Node.js, która wykorzystuje WebSocket poprzez bibliotekę Socket.IO. 

Dlaczego Ngnix, Node.js i Socket.IO

Możecie zastanawiać się dlaczego właśnie taka konfiguracja, a nie standardowy LAMP. Otóż kombinacja ta staje się coraz bardziej popularna, zwłaszcza serwer Ngnix, który jest lżejszy i wydajniejszy od Apache. My do naszych celów będziemy potrzebowali serwera Ngnix w wersji 1.3.13 lub nowszej. Gdyż od tej wersji jest wspierana technologia WebSocket, która jest konieczna do pisania aplikacji działających w czasie rzeczywistym.

Większość z nas jest przyzwyczajona do pracy z serwerem Apache czy innymi serwerami www, które udostępniają aplikacje na porcie 80 lub 443. Aplikacje pisane w Node.js mogą być wystawiane na dowolnym porcie  jednak jeśli chcemy, aby pliki statyczne były obsługiwane przez serwer Ngnix do czego został stworzony, a połączenia WebSocket były obsługiwane przez aplikacje napisaną w Node.js konieczne będzie zastosowanie proxy.

Aplikacja w Node.js

Zacznijmy od aplikacji napisanej w Node.js, a konkretnie od dwóch elementów jakie będą nam potrzebne. Pierwszy to serwer, który będzie miał zaimplementowany serwer WebSocket. Następnie potrzebna będzie nam aplikacja kliencka, czyli w naszym przypadku zwykła strona html. 

Serwer

Zakładam że macie zainstalowanego node.js oraz npm, jeśli nie to polecam zacząć od instalacja Node.js z oficjalnej strony.

Następnie tworzymy sobie katalog z naszym projektem, a w nim utworzymy plik server.js o zawartości:

var io = require('socket.io').listen(5000);
 
io.sockets.on('connection', function (socket) {

  console.log('Podłączono nowego klienta');
});

console.log('Nasłuchuję na porcie 5000');

Teraz konieczne będzie zainstalowanie wymaganych pakietów, czyli w tym przypadku socket.io. Instalację rozpoczynamy poniższym poleceniem:

npm install socket.io

Kiery proces instalacji się zakończy możemy przetestować czy wszystko działa prawidłowo. W tym celu uruchamiamy naszą aplikację poleceniem:

node server

Jeśli wszystko działa prawidłowo to aplikacja powinna zostać uruchomiona na porcie 5000. 

Klient

W przypadku aplikacji klienckiej sprawa jest tak samo prosta i sprowadza się do napisania podstawowej struktury html oraz dodania biblioteki Socket.IO Client

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Klient Socket.IO</title>
</head>
<body>

<script src="/socket.io-client/dist/socket.io.js"></script>
<script>
    var socket = io('http://localhost:5000');
    socket.on('connect', function(){
        console.log('Podłączono');
    });
    socket.on('disconnect', function(){
        console.log('Rozłączono');
    });
</script>
</body>
</html>

Konfiguracja Ngnix

Mamy już serwer oraz prostego klienta do testów. Lokalnie możemy sobie bez problemów połączyć klienta z serwerem na dowolnym porcie jednak na większości serwerów możemy mieć problemy. Chcemy żeby nasza aplikacja przechodziła przez Ngnix-a, który musi w tym wypadku przekierować połączenie na nasz serwer.

Upstream

Definiujemy upstream o nazwie socket_nodes, umieszczamy tam tylko naszą aplikację.

upstream socket_nodes {
    server localhost:5000;
}

Kiedy mam już taką definicję możemy przejść do konfiguracji serwera, który będzie wykorzystywał upstream 😉

Virtual Host

Definicja serwera jest dość standardowa, ale zwróćmy uwagę na proxy_pass, który wykorzystuje zdefiniowany upstream.

server {
    server_name app.porady-it.pl;

    location / {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_pass http://socket_nodes;
    }
}

Zapisujemy zmiany i restartujemy serwer, aby nasza konfiguracja zaczęła działać.

Podsumowanie

Taka konfiguracja pozwala nam na bardzo proste zarządzanie naszymi aplikacjami pisanymi w Node.js i wystawianymi na świat. Jednak do tego potrzebujemy serwera dedykowanego, który będziemy mogli dowolnie konfigurować.