T em a 4: S ervidores W eb
Transcripción
T em a 4: S ervidores W eb
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