Konsola jest niezłym urozmaiceniem w czasach, w których przyzwyczailiśmy się, że wszystko ma graficzny interfejs. Jednak w codziennym użytkowaniu wygodniej jest, jeśli nasz serwer jest uruchamiany w postaci usługi. Ten post poświęcę kwestii hostowania node.js na platformie Windows ze szczególnym uwzględnieniem integracji z IIS.
Mamy różne sposoby uruchamiania aplikacji node.js w postaci usługi Windows:
Niewątpliwie bardzo interesującą opcją - choć dla niektórych trochę kontrowersyjną - jest hostowanie node.js na serwerze IIS. Służy temu projekt iisnode, który jest również dzieckiem Tomasza Janczuka. Na jego blogu można znaleźć wiele postów poświęconych temu zagadnieniu. Tutaj dokonam tylko krótkiego podsumowania najbardziej istotnych informacji:
- moduł dla IIS7/IIS8 (także dla wersji Express)
- dużo korzyści z hostowania na IIS, m.in
- zarządzanie procesem node.exe
- skalowalność na procesorach wielordzeniowych (czysty node.js nie wykorzystuje tego, natomiast iisnode może uruchomić kilka procesów node.exe z obsługą load balancingu)
- automatyczny recycling procesu po zmianie kodu aplikacji (operacje rozpoczęte na dotychczasowym kodzie są kończone, uruchamiany jest drugi proces z nowym kodem, który przejmuje nowe żądania)
- dostęp do logów procesu node.exe przez http (wyjście jest przekierowywane do tekstowego pliku)
- pełna integracja z debuggerem node-inspector
- minimalna modyfikacja kodu aplikacji (z reguły tylko numer portu zastępujemy zmienną środowiskową process.env.PORT)
- zalety IIS: dzielenie portów (np. kilka aplikacji na 80), bezpieczeństwo (HTTPS, autentykacja i autoryzacja), przepisywanie URL, kompresja, cachowanie, logowanie, tracing
- skupia funkcjonalności kilku pakietów node.js (cluster, supervisor, node-inspector, forever, node-static)
- konfiguracja w postaci Web.config (m.in wskazanie pliku lub grupy plików .js mających pełnić funkcję serwerową) i opcjonalnego pliku YAML (mogącego nadpisywać część informacji z Web.config)
- aplikacje obsługujace HTTPS wymagają zmiany na obsługę HTTP (IIS sam dodaje HTTPS i zarządza nim)
- obsługiwany jest node.js x86, natomiast iisnode jest dostępny w wersjach x86 i x64 (w zależności od systemu / IIS)
- hostowanie w IIS w części przypadków może spowodować spadek wydajności (dynamiczna zawartość - web api), a w innych wzrost (statyczna zawartość - CSS, obrazki, strony, skrypty itp)
- można zwiększyć przepustowość aplikacji node.js przez włączenie cachowania na IIS
- możliwość skorzystania z websocketów (na Windows 8 i Windows Server 2012)
- używany m.in przez Windows Azure, appharbor.com, discountasp.net, arvixe.com, smarterasp.net, gearhost.com, webecs.com
Instalacja
Nie sprawiła żadnego problemu. Wcześniej doinstalowałem moduł IIS do przepisywania adresów URL. Instalacja przykładów wg. wskazówek również bezproblemowa. Node.js wspierany w wersji 0.8.22 x86, co jest zgodne z projektem edge.js i sterownikiem do MS SQL Server. Aha, na systemach x64 w ustawieniach puli ASP.NET dla aplikacji node.js nie zezwalamy na uruchamianie aplikacji 32-bitowych (domyślnie tak właśnie jest, ale jak ktoś ma to włączone to niech wyłączy lub stworzy dedykowaną pulę).
Zmiany
Tutaj po krótce, co zmieniałem w przykładzie prezentowanym we wcześniejszych postach.
Port
W pliku server.ts (server.js) zmieniałem port na zmienną środowiskową process.env.PORT.
Konfiguracja
Zgodnie z zaleceniami do katalogu z aplikacją node.js dodałem plik Web.config
W handlerach informuję IIS by plik server.js nie traktował w sposób domyślny jako statyczną zawartość dla przeglądarki, tylko jego obsługę przekazał modułowi iisnode. To podstawa wszystkiego. W opcjonalnej sekcji <rewrite> konfiguruję adresy dla aplikacji, by nie zawierały słowa “server.js”. O adresach więcej w następnej sekcji.
Adresy
Po umieszczeniu aplikacji w folderze nodejs-app na IIS, zmieniłem w niej adresy endpointów tzn. np “/api/products” na “/nodejs-app/api/products”. Podobną praktykę zaobserwowałem w dostarczonych przykładach. Umieszczanie nazwy folderu IIS w kodzie aplikacji nie wydaje mi się najlepsze, ale to tylko demo. Z pewnością da się to zrobić lepiej…
Uprawnienia
Po zhostowaniu aplikacji w IIS przestał mi działać dostęp do SQL Server’a i do COM-a Outlook. Przykładowo w przypadku SQL trzeba było dodać do jego loginów konto ‘IIS APPPOOL\DefaultAppPool’. Czyli rzeczy znane z codziennej pracy pod IIS –;)
Podsumowanie
Niektóre funkcjonalności i moduły node.js częściowo dublują IIS. Ze względów wydajnościowych z reguły lepiej używać natywnych mechanizmów. IIS czasem wprowadza ograniczenia, coś narzuca. W każdym razie w zestawieniu IIS + node.js chodzi o udaną symbiozę, tak by wziąć to, co najlepsze z obu serwerów. Node.js daje łatwe pisanie serwera w JavaScript i zakłada asynchroniczność każdej operacji przy jednym wątku (asynchroniczne handlery w ASP.NET były od zawsze możliwe do pisania, ale dopiero ostatnio się popularyzują z uwagi na znaczne uproszczenia wprowadzone przez TPL i async). IIS dodaje m.in mechanizmy bezpieczeństwa, dzielenie portów, kompresję, cachowanie, szybkie udostępnianie statycznej zawartości.
I jeszcze jedno. Konfiguracja node.js + IIS jest używana przez:
Brak komentarzy:
Prześlij komentarz