[How to] Correr NGINX en un NodeJS Azure Worker Role

No hace mucho empecé a jugar con nginx para correr django y nodejs dentro del mismo server, haciendo uso de su propiedad de proxy inverso. Ésta es solo una de sus características, pero hablar de nginx daría para muchos artículos, y además, hay documentación oficial del producto.

Estas pruebas las venía realizando dentro de mi maquina de desarrollo, nunca he probado o trabajado con nginx en un entorno productivo, así que, para tratar de llevar un poco más allá estas pruebas me decidí a desplegar el nginx dentro de un worker role que me respondiera las solicitudes al nodejs y demás.

Vale aclarar que existen más formas de hacerlo, como haciendo deploy de una imagen de maquina virtual que ya tenga el nginx o creando una maquina virtual de Ubuntu e instalando y configurando el servidor.

1. Crear el NodeJS Azure Cloud Service

Sobre este tema ya se escribió un tutorial completo en el sitio de azure, pero los pongo aquí para que se entienda.

1.1-  Abrimos el Azure Power Shell con privilegios de administrador, ubicamos el directorio en que vamos a trabajar y ejecutamos el comando New-AzureServiceProject testnginx

image

1.2- Ahora, dentro de la carpeta que creó el comando anterior agregamos un Azure Worker Role con el comando Add-azurenodeworkerrole

image

1.3- Ya con esto podemos probar que está funcionando, haciendo uso del comando start-azureemulator y navegando en el browser a la dirección indicada.

2. Descargar e iniciar nginx

2.1- Lo primero que haremos será revisar que es lo que han hecho estos comandos que ejecutamos en el paso uno. Para ello usaré Sublime Text (aunque no hace falta usar editores complejos, con el File explorer y notepad es suficiente)

image

De entrada vemos la carpeta WorkerRole1, ésta contiene un par de .cmd, .js y un .ps1. Para ver como interactúan estos archivos solo hace falta revisar el ServiceDefinition.csdef. En este ubicaremos el Startup y cada una de sus Tasks. Estas tareas llaman a cada uno de los .cmd que ya habíamos visto antes. Y estos .cmd ejecutarán las tareas que tengan programadas, como por ejemplo, descargar nodejs.exe. Viendo esto podemos darnos cuenta por donde es el camino y empezaremos a realizar todas las tareas de scripting que necesitemos.

2.2- Agregaremos una Task al Startup del Role, esta tarea llamará a un archivo setup_nginx.cmd:

image

De hecho, esta será la única modificación que haremos sobre el ServiceDefinition. Queda así:

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="testnginx" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WorkerRole name="WorkerRole1">
    <Startup>
      <Task commandLine="setup_worker.cmd &gt; log.txt" executionContext="elevated">
        <Environment>
          <Variable name="EMULATED">
            <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
          </Variable>
          <Variable name="RUNTIMEID" value="node" />
          <Variable name="RUNTIMEURL" value="" />
        </Environment>
      </Task>
      <Task commandLine="node.cmd .\startup.js" executionContext="elevated" />
      <Task commandLine="setup_nginx.cmd" executionContext="elevated" taskType="background" />
    </Startup>
    <Endpoints>
      <InputEndpoint name="HttpIn" protocol="tcp" port="80" localPort="80"/>
    </Endpoints>
    <Runtime>
      <Environment>
        <Variable name="PORT">
          <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/Endpoints/Endpoint[@name='HttpIn']/@port" />
        </Variable>
        <Variable name="EMULATED">
          <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
        </Variable>
      </Environment>
      <EntryPoint>
        <ProgramEntryPoint commandLine="node.cmd .\server.js" setReadyOnProcessStart="true" />
      </EntryPoint>
    </Runtime>
  </WorkerRole>
</ServiceDefinition>

2.3- En la carpeta WorkerRole1 agregaremos el archivo setup_nginx.cmd con el siguiente código:

@echo off
powershell -c "Set-ExecutionPolicy Unrestricted"
powershell .\download_nginx.ps1

Este código lo único que haremos es llamar al script downloadnginx.ps1

2.4- En la carpeta WorkerRole1 agregamos un archivo llamado download_nginx.ps1 con el siguiente código:

$current = [string] (Get-Location -PSProvider FileSystem)
$webclient = New-Object System.Net.WebClient
$url = "http://nginx.org/download/nginx-1.6.0.zip"
$file = "$current\nginx.zip"
$webclient.DownloadFile($url,$file)

$shell_app=new-object -com shell.application
$zip_file = $shell_app.namespace($file)
$destination = $shell_app.namespace($current)
$destination.Copyhere($zip_file.items())
Remove-Item nginx.zip

$firewallFile = "$current\nginx-1.6.0\nginx.exe"
netsh advfirewall firewall add rule name="nginx" dir=in action=allow program="$firewallFile" enable=yes
cd "nginx-1.6.0"
& ".\nginx.exe"

Este código se divide en tres secciones. La primera crea un webclient apuntando a la dirección de descarga de la ultima versión estable de nginx, la descarga y la deja en la carpeta “current”. La segunda sección hace un unzip de los archivos y borra el .zip. La tercera y ultima sección del script agrega una regla en el firewall y ejecuta el nginx.exe

2.5- Por ahora (aún no vamos a correr nodejs dentro del nginx) cambiaremos el puerto del nodejs al 1337. Esto en el archivo server.js:

image

2.6- Si ejecutamos el comando start-azureemulator y navegamos al localhost veremos algo como:

image

3- Desplegar en la nube

Sobre esto también se ha escrito documentación en el sitio oficial pero la transcribiré aquí para no perder el hilo de la historia.

3.1- Lo primero será agregar el Azure Account con el comando Add-Azureaccount

3.2- Descargamos el publication settings con el comando Get-AzurePublishSettingsFile

3.3- Importamos el archivo que habíamos descargado con el comando Import-AzurePublishSettingsFile "path donde esta el archivo"

3.4- publicamos con el comando Publish-AzureServiceProject -ServiceName nombre_del_servicio_en_la_nube -Location "East US" -Launch

Espero les sea de utilidad.

Hasta el próximo post.

Anuncios
[How to] Correr NGINX en un NodeJS Azure Worker Role

Un comentario en “[How to] Correr NGINX en un NodeJS Azure Worker Role

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s