Download T em a 4: S ervidores W eb

Document related concepts
no text concepts found
Transcript
Tema 4:
Servidores Web
HTTP server:
Apache, IIS
Cabeceras +
Content of index.html
GET /index.html
1
Web Client:
Iexplorer,
FireFox
Client host
Acceso a Páginas Web en ficheros
Server host
Disco Duro
SO Unix
Open(f,“./index.html”);
Read(f);
Output
Close(f);
2
Output of Program
GET /Hello.pl
Content of index.html
GET /index.html
Web Client:
Iexplorer,
FireFox
Client host
Interfaces Web – Aplicaciones
CGI: Common Gateway Interface
HTTP server:
Apache, IIS
Server host
http://grid-nodo1.unavarra.es
CGI program
Sistema Operativo Unix
CGI Interface
exec “./Hello.pl”
Output of Program
3
4
Content-type: text/html\n\n
<font color = blue>
<H1>Hello there!</H1>
</font>
HTML
Interface Web- Aplicaciones:
CGI (II)
•CGI program in Perl, hello.pl
# Hello.pl
print "Content-type: text/html\n\n";
print "<font color = blue>\n";
print "<h1>Hello, World</h1>\n";
print "</font>\n";
•CGI program in C, hello.c -> hello.exe
#include <stdio.h>
printf("Content-type: text/html%c%c",10,10);
printf("<font color = blue>");
printf("<H1>Hello there!</H1>");
printf("</font>");
main(int argc, char *argv[]) {
}
Interface Web-Aplicaciones:
CGI (III)
{
Pid=14
Pid=13
Pid=12
6
5
printf("This script should be referenced
with a METHOD of GET.%c", 13);
exit(1);
}
cl = getenv("QUERY_STRING");
if(cl == NULL) {
printf("No query to decode.%c",13);
exit(1);
main(int argc, char *argv[]) {
char *cl;
printf("Content-type: text/html%c%c",10,10);
if (strcmp(getenv("REQUEST_METHOD"),
"GET"))
El interface CGI especifica como el proceso servidor Web comunica al proceso
externo información sobre la petición del cliente escribiendola en variables de
entorno, pe.:
REQUEST_METHOD: contiene información sobre el metodo de la petición,
QUERY_STRING: contiene un string con los datos del formulario rellenado por el
cliente,
CONTENT_TYPE: contiene el tipo de datos de la petición,
GET Hello.pl&Name=Pepe
Client
Web
Server
}
Sistema Operativo Unix
%set REQUEST_METHOD=GET
%set QUERY_STRING=“Name=Pepe”
% exec “./Hello.pl”
Cliente 1
Cliente 2
exec “./Hello.pl”
exec “./Hello.pl”
exec “./Hello.pl”
Web Server
Interface Web–Aplicacion:
CGI (IV)
1 Petición ->
1 Proceso del SO.
(aparte de los
procesos que
pueda crear el
servidor web)
Cliente 3
Sistema Operativo
Desventajas:
No
Interface simple,
hay que modificar programas.
Ventajas:
Interface Web-Aplicación:
CGI (V)
Alto tiempo respuesta: creación de procesos es
costosa.
Poca escalabilidad: 1 proceso por cliente consumen
muchos recursos.
de seguridad: acceso a shell.
Problemas
Cliente 1
Cliente 2
Cliente 3
Sistema
Operativo
Web Server
Hello(null);
Interface Web-Aplicaciones:
API de Servidor (I)
Aplicación construida sobre API
del servidor Web: Apache API,
IIS API, etc.
•Aplicación compilada con
servidor Web como libreria
dinámica .so o .dll.
•Código de aplicación cargado
con proceso servidor.
•No se crea otro proceso por
petición.
•Bugs en aplicación hacen fallar
al proceso servidor.
7
8
Cliente 3
Cliente 2
Write.php
View.php
Cliente 1 Read.php
Fork()
Web Server
Sistema
Operativo
Data
socket
Fork()
Fork()
Fork()
Apache
Web Server
10
9
Mod_php(Func);
Cada proceso:
1)Atiende petición
2) procesa script
Interface Web-Aplicaciones:
API de Servidor (II)
Pero algunas librerías
implementadas con APIs son
muy estables y muy usadas:
•mod_perl, mod_php en
Apache permite ejecutar scripts
en proceso servidor con buen
rendimiento.
•Cada petición de script perl o
php se ejecuta en el mismo
proceso del servidor que
atiende la petición (muy buen
tiempo de respuesta).
Web
Client
Accept
socket
Arquitectura Apache
Apache v1 es un servidor multiproceso:
Cada peticion es atendida por un proceso.
Pre-forking:
Inicialización servidor:
*Arrancar N procesos (pool).
*N configurable en httpd.conf.
Llega petición a “accept Socket”:
*Pedir a proceso no utilizado que
cree “data socket” y procese la
petición. (buen tiempo respuesta).
Dependiendo de la carga del servidor, el proceso
principal arranca más servidores o los mata.
Apache v2 es multihilo (en C y multiplataforma)->
consume menos recursos, pero es menos robusto.
Apache
Acceso a
aplicaciones no
eficiente (CGI) o
no robusto (API)
Inconvenientes
Acceso a ficheros
eficiente.
protocolo seguro
HTTPS eficiente.
Ventajas
Apache vs. servidor JAVA
Servidor
JAVA
Client host
12
Web Client:
Iexplorer,
FireFox
11
Lectura ficheros
Aplicaciones JAVA.
no eficiente.
Aplicaciones multihilo
Protocolo HTTPS e integradas en
servidor-> bastante
no eficiente.
eficiente.
Servlets
GET /Hello
Content of index.html
GET /index.html
Servlet es una clase JAVA que implementa el interface Servlet,
(este interface define como atender peticiones de clientes Web)
HTTP server:
Tomcat
Server host
http://grid-nodo1.unavarra.es
Servlet
Hello.class
Java Virtual Machine
Servlet Interface
Hello.doGet()
Output of Servlet
Output of Servlet
Cliente1
Cliente2
Cliente3
Hilo1
Hilo1
init()
destroy()
Hello
Hello
Sistema Operativo
Java Virtual Machine
Hello.doGet()
Hello.doGet()
Hello.doGet()
Web Server+
Contenedor
Contenedor de Servlets
•Los servlets se ejecutan en
servidores multihilo que
reconocen el interface de
Servlets: los contenedores.
•Contenedores más usados:
(TOMCAT, JBOSS,.…)
•Por cada petición de
cliente el contenedor inicia
un hilo en el que se ejecuta
el código del Servlet.
Admin
Client
Hilo1
Hilo2
Hilo3
Process
13
Hilo2
14
Java Virtual Machine Process
Hello.doGet()
Contenedor
Ciclo de Vida de un Servlet
1. Administrador despliegua
Servlet: Save As../FTP/HTTP.
2. Administrador pide a
Contenedor inicia Servlet.
Hello.init(); NO crea hilos.
3. Petición Cliente.
4. Contenedor:
1. Crea hilo, asigna a servlet.
2. llama a método Servlet.
Hello.doGet();
3. Finaliza/reutiliza hilo.
5. Vuelve a paso 3.
6. Administrador pide a
Contenedor finaliza Servlet.
Hello.destroy();
Sistema Operativo
Interface Servlet (I)
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
15
Objeto tipo respuesta,
se rellenaran sus
campos.
Objeto tipo petición,
contiene campos de
petición.
HttpServlet extiende la clase GenericServlet (también existe el interface Servlet).
Metodos de HttpServlet que se sobreescriben para programar el servicio:
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
public class HelloWorld extends HttpServlet {
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
void doGet (HttpServletRequest req, HttpServletResponse resp)
void doPost (HttpServletRequest req, HttpServletResponse resp)
void doPost (HttpServletRequest req, HttpServletResponse resp)
void doDelete (HttpServletRequest req, HttpServletResponse resp)
Escribe
Cabecera
Escribe
Cuerpo
}
Interface Servlet (II)
int pujaActual = 0;
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
pujaActual = Integer.parseInt
(request.getParameter("miPuja"));
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>Gracias!</title>
</head><body>");
out.println(“Has pujado” +pujaActual);
out.println("</body></html>");
}
16
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SubastaBMW extends HttpServlet {
Métodos de HttpServletRequest (no es necesario sobreescribir):
String getParameter(String name);
String getRemoteAddr()
String getHeader(String name)
Int getContentLength()
Boolean isSecure()
String getRemoteUser()
HttpSession getSession()
Interface HttpServletResponse:
setContentType(String name)
setContentLength(int len)
setHeader(String name, String name)
sendRedirect(jString location)
addHeader(String name,String value)
}
Interface Servlet (III)
Servlets pueden atender peticiones Web, u otros protocolos.
Metodos de Servlets (implementado por clase GenericServlet):
void init(ServletConfig config)
arranca el servlet, no se crea un hilo.
void service(ServletRequest req, ServletResponse res)
llamado por el contenedor para atender una petición, crea un hilo y llama al
método correspondiente doGet, doPost, … (no se sobreescribe)
ServletConfig getServletConfig()
Devuelve un objeto de tipo ServletConfig, que contiene parámetros de i
nicialización del servlet.
String getServletInfo()
Devuelve información sobre el servlet: autor, version, etc.
void destroy()
GET
Hilo1
init()
service()
destroy()
Contenedor
init,
destroy
New Hello()
Sistema Operativo
17
18
Hilo2
Process
Java Virtual Machine
Hello
El contenedor llama a este método para indicar al servlet que ya no
atenderá más peticiones.
Se sobreescribe para finalizar conexiones actuales de manera ordenada.
Admin
Cliente
Contenedor TOMCAT
•Tomcat 5.0 implementa
especificaciones Servlets
v2.4 y JSP 2.0.
•Compuesto de varios
componentes que permiten
multiples configuraciones.
•Contiene gestor de
aplicaciones via Web.
•Contiene un pool de threads:
•Similar al pool de
procesos de apache.
• Reutilizar threads entre
peticiones.
Aplicaciones en TOMCAT
1 Contexto -> 1 Aplicacion ./webapps/”context-name”/
Estructura directorio es:
<web-app>
<display-name>myServletWAR</display-name>
*.html, *.jsp, etc. ->
<description>This is a simple app</description>
ficheros no compilados
<servlet>
/WEB-INF/web.xml----------->
<servlet-name>myHello</servlet-name>
descriptor de despliegue
<servlet-class>HelloServlet</servlet-class>
(mapping, conf. sesiones, etc)
</servlet>
/WEB-INF/classes/ ->
<servlet-mapping>
clases de servlets
<servlet-name>myHello</servlet-name>
<url-pattern>/hello</url-pattern>
/WEB-INF/lib/ ->
</servlet-mapping>
librerias de clases JAR
</web-app>
Archivos de tipo WAR:
*contienen todos los ficheros de una aplicación.
*se instalan en directorio ./webapps/ y TOMCAT los descomprime.
19
20