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