Tema 4: Servidores Web 1 Acceso a Páginas Web en ficheros Server host Disco Duro HTTP server: Apache, IIS SO Unix Client host Web Client: Iexplorer, FireFox GET /index.html Open(f,./index.html ); Read(f); Output Close(f); Cabeceras + Content of index.html 2
Interfaces Web Aplicaciones CGI: Common Gateway Interface Server host http://grid-nodo1.unavarra.es CGI program HTTP server: Apache, IIS Sistema Operativo Unix Client host Web Client: Iexplorer, FireFox CGI Interface GET /index.html Content of index.html exec./hello.pl GET /Hello.pl Output of Program Output of Program 3 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> HTML Content-type: text/html\n\n <font color = blue> <H1>Hello there!</h1> </font> 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>"); 4
Interface Web-Aplicaciones: CGI (III) 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, Client GET Hello.pl&Name=Pepe 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 5 Interface Web Aplicacion: CGI (IV) 1 Petición -> 1 Proceso del SO. Cliente 1 Pid=12 (aparte de los procesos que pueda crear el servidor web) Cliente 2 Cliente 3 Web Server exec./hello.pl exec./hello.pl exec./hello.pl Pid=13 Pid=14 Sistema Operativo 6
Interface Web-Aplicación: CGI (V) Ventajas: Interface simple, No hay que modificar programas. 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 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. Cliente 1 Cliente 2 Cliente 3 Web Server Sistema Operativo Hello(null); 8
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). Cliente 1 Cliente 2 Cliente 3 Read.php View.php Write.php Cada proceso: 1)Atiende petición 2) procesa script Web Server Sistema Operativo Mod_php(Func); 9 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). Web Client Dependiendo de la carga del servidor, el proceso principal arranca más servidores o los mata. Accept socket Data socket Fork() Fork() Fork() Fork() Apache Web Server Apache v2 es multihilo (en C y multiplataforma)-> consume menos recursos, pero es menos robusto. 10
Apache vs. servidor JAVA Apache Inconvenientes Acceso a aplicaciones no eficiente (CGI) o no robusto (API) Ventajas Acceso a ficheros eficiente. protocolo seguro HTTPS eficiente. Servidor JAVA Lectura ficheros no eficiente. Protocolo HTTPS no eficiente. Aplicaciones JAVA. Aplicaciones multihilo e integradas en servidor-> bastante eficiente. 11 Servlets Servlet es una clase JAVA que implementa el interface Servlet, (este interface define como atender peticiones de clientes Web) Server host http://grid-nodo1.unavarra.es Servlet Hello.class HTTP server: Tomcat Java Virtual Machine Client host Web Client: Iexplorer, FireFox Servlet Interface Hello.doGet() GET /index.html Content of index.html GET /Hello 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 Cliente3 Hilo1 Web Server+ Contenedor Hello.doGet() Hello.doGet() Hello.doGet() Hello Hilo1 Hilo2 Hilo3 Java Virtual Machine Process Sistema Operativo 13 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(); Admin Client Hilo1 init() destroy() Contenedor Hello Hello.doGet() Java Virtual Machine Sistema Operativo Hilo2 Process 14
Interface Servlet (I) HttpServlet extiende la clase GenericServlet (también existe el interface Servlet). Metodos de HttpServlet que se sobreescriben para programar el servicio: 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 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { 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>"); Objeto tipo petición, contiene campos de petición. Objeto tipo respuesta, se rellenaran sus campos. 15 Interface Servlet (II) 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) 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")); 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
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 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. Hilo1 Cliente GET init() service() destroy() init, Contenedor Hello destroy Admin New Hello() Process Java Virtual Machine Sistema Operativo 18 Hilo2
Aplicaciones en TOMCAT 1 Contexto -> 1 Aplicacion./webapps/ context-name / Estructura directorio es: <web-app> *.html, *.jsp, etc. -> 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> /WEB-INF/lib/ -> <url-pattern>/hello</url-pattern> librerias de clases JAR </servlet-mapping> </web-app> Archivos de tipo WAR: *contienen todos los ficheros de una aplicación. *se instalan en directorio./webapps/ y TOMCAT los descomprime. <display-name>myservletwar</display-name> <description>this is a simple app</description> 19 20