Download Tema 4: Servidores Web - Ampliación Sistemas Operativos Upna

Document related concepts
no text concepts found
Transcript
Acceso a Páginas Web en ficheros
Server host
Client host
Tema 4:
Servidores Web
HTTP server:
Apache, IIS
Disco Duro
Web Client:
Iexplorer,
FireFox
SO Unix
GET /index.html
Open(f,“./index.html”);
Read(f);
Output
Close(f);
Cabeceras +
Content of index.html
1
Interface Web- Aplicaciones:
CGI (II)
Interfaces Web – Aplicaciones
CGI: Common Gateway Interface
•CGI program in Perl, hello.pl
# Hello.pl
Server host
http://grid-nodo1.unavarra.es
CGI program
2
Client host
HTTP server:
Apache, IIS
Web Client:
Iexplorer,
FireFox
Sistema Operativo Unix
print "Content-type: text/html\n\n";
print "<font color = blue>\n";
print "<h1>Hello, World</h1>\n";
print "</font>\n";
Content-type: text/html\n\n
<font color = blue>
<H1>Hello there!</H1>
</font>
GET /index.html
CGI Interface
•CGI program in C, hello.c -> hello.exe
Content of index.html
#include <stdio.h>
GET /Hello.pl
exec “./Hello.pl”
Output of Program
HTML
main(int argc, char *argv[]) {
printf("Content-type: text/html%c%c",10,10);
printf("<font color = blue>");
printf("<H1>Hello there!</H1>");
printf("</font>");
Output of Program
3
}
4
Interface Web-Aplicaciones:
CGI
(III)
El interface CGI especifica como el proceso servidor Web comunica al proceso
Interface Web–Aplicacion:
CGI (IV)
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
%set REQUEST_METHOD=GET
%set QUERY_STRING=“Name=Pepe”
% exec “./Hello.pl”
main(int argc, char *argv[]) {
char *cl;
printf("Content-type: text/html%c%c",10,10);
if (strcmp(getenv("REQUEST_METHOD"),
"GET"))
{
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);
}
Sistema Operativo Unix
Cliente 1
Pid=13
Cliente 2
Web Server
exec “./Hello.pl”
exec “./Hello.pl”
Cliente 3
Pid=14
exec “./Hello.pl”
Sistema Operativo
6
Interface Web-Aplicaciones:
API de Servidor (I)
Ventajas:
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.
Interface
simple,
No hay que modificar programas.
(aparte de los
procesos que
pueda crear el
servidor web)
Pid=12
5
Interface Web-Aplicación:
CGI (V)
1 Petición ->
1 Proceso del SO.
Desventajas:
Alto
tiempo respuesta: creación de procesos es
costosa.
Poca escalabilidad: 1 proceso por cliente consumen
muchos recursos.
Problemas de seguridad: acceso a shell.
7
Cliente 1
Hello(null);
Cliente 2
Cliente 3
Web Server
Sistema
Operativo
8
Interface Web-Aplicaciones:
API de Servidor (II)
Cada proceso:
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).
Arquitectura Apache
Apache v1 es un servidor multiproceso:
Cada peticion es atendida por un proceso.
1)Atiende petición
2) procesa script
Inicialización servidor:
*Arrancar N procesos (pool).
*N configurable en httpd.conf.
Cliente 1 Read.php
View.php
Cliente 2
Write.php
Cliente 3
Mod_php(Func);
Web Server
Apache vs. servidor JAVA
Servidor
JAVA
Inconvenientes
Ventajas
Acceso
Acceso
a
aplicaciones no
eficiente (CGI) o
no robusto (API)
Llega petición a “accept Socket”:
*Pedir a proceso no utilizado que
cree “data socket” y procese la
petición. (buen tiempo respuesta).
Data
socket
Web
Client
Accept
socket
Dependiendo de la carga del servidor, el proceso
principal arranca más servidores o los mata.
Sistema
Operativo
9
Apache
Pre-forking:
Fork()
Fork()
Fork()
Fork()
Apache
Web Server
Apache v2 es multihilo (en C y multiplataforma)->
consume menos recursos, pero es menos robusto.
10
Servlets
Servlet es una clase JAVA que implementa el interface Servlet,
(este interface define como atender peticiones de clientes Web)
a ficheros
Server host
http://grid-nodo1.unavarra.es
eficiente.
protocolo seguro
HTTPS eficiente.
Client host
Servlet
Hello.class
HTTP server:
Tomcat
Web Client:
Iexplorer,
FireFox
Java Virtual Machine
Lectura
ficheros Aplicaciones JAVA.
no eficiente.
Aplicaciones multihilo
Protocolo HTTPS e integradas en
no eficiente.
servidor-> bastante
eficiente.
11
GET /index.html
Servlet Interface
Content of index.html
GET /Hello
Hello.doGet()
Output of Servlet
Output of Servlet
12
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.
Cliente1
Cliente2
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.
Hilo1
Web Server+
Contenedor
Hilo1
Hilo2
Hilo3
Hilo1
Hello
3. Finaliza/reutiliza hilo.
Contenedor
Java Virtual Machine
Sistema Operativo
Process
Hello.doGet()
Hello.destroy();
Java Virtual Machine Process
Sistema Operativo
13
Interface Servlet (I)
Interface Servlet (II)
HttpServlet extiende la clase GenericServlet (también existe el interface Servlet).
Metodos de HttpServlet que se sobreescriben para programar el servicio:
Métodos de HttpServletRequest (no es necesario sobreescribir):
void doGet (HttpServletRequest req, HttpServletResponse resp)
void doPost (HttpServletRequest req, HttpServletResponse resp)
void doPost (HttpServletRequest req, HttpServletResponse resp)
void doDelete (HttpServletRequest req, HttpServletResponse resp)
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
Objeto tipo petición,
contiene campos de
petición.
public class HelloWorld extends HttpServlet {
Objeto tipo respuesta,
se rellenaran sus
campos.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
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>");
}
Escribe
Cabecera
Escribe
Cuerpo
}
Hello
Client
5. Vuelve a paso 3.
6. Administrador pide a
Contenedor finaliza Servlet.
Hello.doGet()
Hello.doGet()
Hilo2
init()
destroy()
1. Crea hilo, asigna a servlet.
2. llama a método Servlet.
Hello.doGet();
Hello.doGet()
Cliente3
Admin
3. Petición Cliente.
4. Contenedor:
String getParameter(String name);
String getRemoteAddr()
String getHeader(String name)
Int getContentLength()
Boolean isSecure()
String getRemoteUser()
HttpSession getSession()
14
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SubastaBMW extends HttpServlet {
int pujaActual = 0;
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
pujaActual = Integer.parseInt
(request.getParameter("miPuja"));
Interface HttpServletResponse:
setContentType(String name)
setContentLength(int len)
setHeader(String name, String name)
sendRedirect(jString location)
addHeader(String name,String value)
15
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
Contenedor TOMCAT
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()
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.
17
•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.
Hilo1
Cliente
Hilo2
GET
init()
service()
destroy()
Contenedor
init,
destroy
Admin
Hello
New Hello()
Process
Java Virtual Machine
Sistema Operativo
18
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