23
Application Server

Application Servers e Ruby

Embed Size (px)

Citation preview

Page 1: Application Servers e Ruby

Application Server

Page 2: Application Servers e Ruby

História• 1993 - NCSA (National Center for Supercomputing Applications)

cria uma especificação;

• 1997 - a especificação acaba gerando a RFC 3875;

• Nasce o formoso CGI.

Page 3: Application Servers e Ruby

Common Gateway Interface• Extensão ao sistema de web estática;

• Camada entre Web Server (ex. Apache) e o conteúdo estático;

• Webserver passa a executar /cgi-bin/index.pl e não mais /index.htm;

• Permite envio de dados em uma requisição HTTP;

• Webserver passa a criar variáveis de ambiente de acordo com a especificação, como QUERY_STRING.

Page 4: Application Servers e Ruby

CGI Code#!/usr/bin/perl print "Content-type: text/plain\r\n\r\n"; for my $var ( sort keys %ENV ) { printf "%s = \"%s\"\r\n", $var, $ENV{$var}; }

http://example.com/cgi-bin/printenv.pl/foo/bar?var1=value1&var2=with%20percent%20encoding

DOCUMENT_ROOT="C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs" GATEWAY_INTERFACE="CGI/1.1" HTTP_ACCEPT="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" HTTP_HOST="example.com" PATH_INFO="/foo/bar" QUERY_STRING="var1=value1&var2=with%20percent%20encoding" REMOTE_ADDR="127.0.0.1" REQUEST_METHOD="GET" REQUEST_URI="/cgi-bin/printenv.pl/foo/bar?var1=value1&var2=with%20percent%20encoding" SCRIPT_FILENAME=“/var/www/app/cgi-bin/printenv.pl” SCRIPT_NAME="/cgi-bin/printenv.pl" SERVER_ADDR="127.0.0.1"

Page 5: Application Servers e Ruby

CGINem tudo são flores

• A cada chamada ao script -> 1 criação de processo pelo Web Server;

• Concorrência completamente inviável;

• Trocar Perl (interpretado) por C (compilado) não é suficiente.

Page 6: Application Servers e Ruby

FastCGI• Extensão do protocolo CGI;

• Web Server inicia um processo contínuo do App Server;

• Web Server não é mais responsável pela criação do processo da aplicação;

• FastCGI inicia o papel de Application Server, com configurações específicas para otimização deste processo;

• Técnica de pré-fork é utilizada para agilizar a criação de processos de aplicação.

• Independente de linguagem, permite comunicação por API.

Page 7: Application Servers e Ruby

Mundo Ruby• Problemas com padronização na comunicação entre

App Server e Aplicação;

• A aplicação deve poder ser comunicar com todos os App Servers;

• Solução: Rack

Page 8: Application Servers e Ruby

Um pouco sobre Sockets• Técnica responsável pela comunicação entre Cliente/

Servidor;

• Modos de comunicação:

• Blocking I/O;

• Nonblocking I/O;

• Assíncrono;

• Signal-driven I/O.

Page 9: Application Servers e Ruby

SocketBlocking I/O

Page 10: Application Servers e Ruby

SocketNonblocking I/O

Page 11: Application Servers e Ruby

SocketAssíncrono

Page 12: Application Servers e Ruby

SocketSignal-driven I/O

Page 13: Application Servers e Ruby

RubyApplication Servers

• Unicorn;

• Phusion Passenger;

• Puma;

• Webrick.

Page 14: Application Servers e Ruby

Unicorn• Rack based;

• Modelo Blocking I/O para requisições;

• Múltiplos Processos pré forked;

• Single Thread;

• Necessita um proxy reverso a sua frente.

Page 15: Application Servers e Ruby

Phusion Passagenger• Rack based;

• Modelo Blocking I/O;

• Implementa um proxy reverso built-in usando Signal-driven I/O;

• Multi-threading na versão paga.

Page 16: Application Servers e Ruby

Puma• Rack based;

• Blocking I/O para requisições;

• Múltiplos processos;

• Multi-threading;

• Necessita um proxy reverso a sua frente.

Page 17: Application Servers e Ruby

Mundo afora• SCGI;

• Web server módulos;

• NodeJS;

• uWSGI

Page 18: Application Servers e Ruby

SCGI• Baseado em FastCGI;

• Implementação mais fácil;

• Importante na criação de futuros App Servers como WSGI e uWSGI.

Page 19: Application Servers e Ruby

Web server módulos• Apache, IIS, Netscape web server…

• Elimina o uso de um CGI script separado;

• Interpreta a aplicação no mesmo processo do web server;

• Processo muito pesado para ser reiniciado.

Page 20: Application Servers e Ruby

NodeJS• Nonblocking para requisições;

• Assíncrono para requisições externas;

• Multi conexões, single thread;

• Utiliza V8 Engine.

Page 21: Application Servers e Ruby

uWSGI• Baseado no WSGI (python only);

• Suporta várias linguagens (Perl, Python, Ruby…);

• Suporte a Rack Application based;

• Nonblocking para requisições;

• Assíncrono para requisições externas;

• Altamente configurável (multi thread, blocking I/O, síncrono…);

• Integrável com Nginx nativamente.

Page 22: Application Servers e Ruby

Conclusão• Não existe a melhor fórmula;

• Cada caso pede um App Server diferente;

Page 23: Application Servers e Ruby

Fim

Obrigado pela atenção! =)