in ASP.NET

ASP.NET 5 + Kestrel + Nginx e Ubuntu: configurando um ambiente de produção

Uma das grandes mudanças no desenvolvimento do ASP.NET 5 é a de que ele é suportado em múltiplas plataformas (Windows, Linux ou Mac), além de possuir o ambiente de desenvolvimento suportado nestas plataformas, o ambiente de produção também está sendo desenvolvido para que possamos fazer deploy de nossas aplicações em ambientes diferentes, como por exemplo em um Linux.

Montei um ambiente (ASP.NET 5 + Linux) para realizar alguns testes de performance e estabilidade, a ideia deste post é mostrar um pouco o que precisei fazer para configurar e deixar o ambiente ok.

Neste ambiente executarei 4 processos do Kestrel (host da aplicação baseado no Libuv) e 1 NGINX(web server) fazendo o papel de proxy para as instâncias que estarão executando minha aplicação.

ASP.NET 5 no Linux

Existem algumas maneiras de se instalar o ASP.NET 5 no Linux, neste exemplo utilizei o DNVM (.NET Version Manager) e instalei a versão para executar com o .NET Core.

Para começar vou criar uma VM no Azure com Ubuntu 14.04

image

Nesta VM, na parte de endpoints, vou configurar mais 5 endpoints:

image

80 => Porta que executarei o NGINX

5001,5002,5003,5004 => portas que executarei as instâncias do Kestrel (deixei elas abertas somente para testes, elas podem só estar acessíveis internamente)

Com isto podemos conectar na máquina virtual e começar a configurar, para isto estou utilizando o GitBash, mas poderia utilizar algum outro client SSH (ex: ssh [email protected]).

1) A primeira configuração será atualizar os packages e instalar o “unzip” e o “curl”

sudo apt-get update
sudo apt-get install unzip curl

2) Agora vamos baixar e instalar o .NET Version Manager (DNVM)

curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh

Com o DNVM instalado será possível executar ele e ver a seguinte mensagem:

image 

Uma vez que temos o DNVM ok, vamos instalar o DNX e as dependências e para utilizar ele com o .NET Core (também é possível utilizar o DNX com o Mono).

3) Instalando os pré requisitos para utilizar o DNX com o .NET Core:

sudo apt-get install libunwind8 gettext libssl-dev libcurl4-openssl-dev zlib1g libicu-dev uuid-dev

4) Instalando o DNX para o .NET Core:

dnvm upgrade -r coreclr

5) Instalando o Libuv: a biblioteca de I/O assíncrono utilizada pelo Kestrel (web server do ASP.NET 5).

sudo apt-get install make automake libtool curl
curl -sSL https://github.com/libuv/libuv/archive/v1.4.2.tar.gz | sudo tar zxfv - -C /usr/local/src
cd /usr/local/src/libuv-1.4.2
sudo sh autogen.sh
sudo ./configure
sudo make
sudo make install
sudo rm -rf /usr/local/src/libuv-1.4.2 && cd ~/
sudo ldconfig

6) Executando a aplicação: criei um aplicação ASP.NET 5 com o Yeoman, acessei o diretório dela, restaurei os pacotes e executei ela com o DNX:

dnx web --server.urls=http://0.0.0.0:5001/

Com isto, temos o nosso website acessível na porta 5001 (que está aberta para testar)

image

image

Supervisord

Neste ambiente, vou executar 4 processos do DNX em portas diferentes e fazer o Load Balance e Proxy com NGINX. Vou utilizar um sistema de controle de processos chamado Supervisord para garantir que estes processos estejam executando em background e tolerantes a falha (mesmo que o processo morra outro seja iniciado no lugar), com este programa é possível configurar quais processos devem ser iniciados e monitorados.

7) Instalar o Supervisord e criar o arquivo de configuração

sudo apt-get install supervisor
sudo vi /etc/supervisor/conf.d/kestrel_default.conf

No conteúdo do arquivo, vamos colocar o seguinte:

[program:kestrel_default]
command=su -c "/home/rodolfo/.dnx/runtimes/dnx-coreclr-linux-x64.1.0.0-rc1-update1/bin/dnx web --server.urls=http://0.0.0.0:5001" rodolfo
directory=/home/rodolfo/WebApplicationBasic
autorestart=true
autostart=true
stdout_logfile=/home/rodolfo/WebApplicationBasic/logs/app_std_out.log
stderr_logfile=/home/rodolfo/WebApplicationBasic/app_err.log

[program:kestrel_default1]
command=su -c "/home/rodolfo/.dnx/runtimes/dnx-coreclr-linux-x64.1.0.0-rc1-update1/bin/dnx web --server.urls=http://0.0.0.0:5002" rodolfo
directory=/home/rodolfo/WebApplicationBasic
autorestart=true
autostart=true
stdout_logfile=/home/rodolfo/WebApplicationBasic/logs/app_std_out2.log
stderr_logfile=/home/rodolfo/WebApplicationBasic/app_err2.log

[program:kestrel_default2]
command=su -c "/home/rodolfo/.dnx/runtimes/dnx-coreclr-linux-x64.1.0.0-rc1-update1/bin/dnx web --server.urls=http://0.0.0.0:5003" rodolfo
directory=/home/rodolfo/WebApplicationBasic
autorestart=true
autostart=true
stdout_logfile=/home/rodolfo/WebApplicationBasic/logs/app_std_out3.log
stderr_logfile=/home/rodolfo/WebApplicationBasic/app_err3.log

[program:kestrel_default3]
command=su -c "/home/rodolfo/.dnx/runtimes/dnx-coreclr-linux-x64.1.0.0-rc1-update1/bin/dnx web --server.urls=http://0.0.0.0:5004" rodolfo
directory=/home/rodolfo/WebApplicationBasic
autorestart=true
autostart=true
stdout_logfile=/home/rodolfo/WebApplicationBasic/logs/app_std_out4.log
stderr_logfile=/home/rodolfo/WebApplicationBasic/app_err4.log

8) Atualizar os processo do Supervisord

sudo supervisorctl reread
sudo supervisorctl update

9) Comandos básicos do Supervisord

#Listar os processos configurados e o status
sudo supervisorctl

#Parar um processo
sudo supervisorctl stop kestrel_default

#iniciar um processo
sudo supervisorctl start kestrel_default

Após configurar os processos, podemos ver os status, e teremos 4 instâncias de nossa aplicação executando em diferentes portas (5001, 5002, 5003, 5004)

image

NGINX

O Kestrel não tem a intenção de ser um web server completo (com suporte a rewrite, certificados, etc) por isto, em ambientes Linux, utilizar o NGINX como proxy é uma das recomendações.

O NGINX é um web server extremante rápido, leve e completo, para este exemplo vamos utilizar ele para o proxy reverso e load balance entre os processos do Kestrel.

10) Instalando e configurando o NGINX

sudo apt-get install nginx
sudo vi /etc/nginx/sites-available/default

11) Como conteúdo do arquivo default, vamos colocar a seguinte configuração

server {
  listen 80 default_server;
  listen [::]:80 default_server ipv6only=on;
  server_name localhost;
  location /
  {
      proxy_pass http://sitedemo/;
      proxy_read_timeout 600;
      proxy_buffering off;
      proxy_set_header Connection keep-alive;
  }
}

upstream sitedemo {
        server 127.0.0.1:5001;
        server 127.0.0.1:5002;
        server 127.0.0.1:5003;
        server 127.0.0.1:5004;
}

Após isto podemos reiniciar o NGINX e temos nosso ambiente funcionando e acessível na porta 80 \o/

sudo /etc/init.d/nginx restart

image

Em outras arquiteturas de infra poderíamos configurar uma máquina para cada processo do kestrel e uma outra para a infraestrutura de NGINX, ou utilizar Docker para os processos por exemplo.

Bom espero que este post seja útil, estou a disposição para duvidas criticas e sugestões

abs

Rodolfo

  • Victor Cavalcante

    Parabéns Rodolfo, artigo muito bem redigido e pragmático.

  • Heber Ortiz

    Post excelente Rodolfo. Guardado nos favoritos para consulta sempre. Parabéns.

  • Felipe Augusto

    Excelente Rodolfo, ta ai uma combinação que eu nunca achei que viria, asp.net, linux e nginx

  • Robson Paproski

    Parabéns Rodolfo, ótimo post

  • http://fredyfx.com/ Fredy

    thank you!

  • Mateus Leonardi

    Olá Rodolfo,

    Estou tentando instalar o DNVM porém estou obtendo o erro logo no passo 2, a mensagem é: “sh: 1: 404:: not found”

    Sabe como posso resolver?

    Obrigado.

  • http://www.rodolfofadino.com.br/ Rodolfo Fadino

    Opa, mudou os utilitários, preciso atualizar o post https://www.microsoft.com/net/core#linuxubuntu

  • Alexandre Amorim

    Bom dia Rodolfo, realmente o problema do Mateus Leonardi acontece!
    Sabe se tem outro link pra instalar o DNVM
    pois o link:
    https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh
    esta fora.
    Aguem tem alguma solução?

    Abrigado.

  • Alexandre Amorim

    Bom dia Rodolfo, realmente o problema do Mateus Leonardi acontece!
    Sabe se tem outro link pra instalar o DNVM
    pois o link:
    https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh
    esta fora.
    Aguem tem alguma solução?

    Abrigado.

  • http://www.rodolfofadino.com.br/ Rodolfo Fadino

    Boa tarde Alexandre, preciso atualizar o post a parte de instalacao e utilitários mudou bastante https://www.microsoft.com/net/core#linuxubuntu