scieee AI-readable full text Open interactive document viewer

Gestión de horarios y accesos de un gimnasio

Martínez García, Héctor

Full text

! PROYECTO(FINAL(DE(CARRERA( Gestión(de(Horarios(y( Accesos(de(Un(Gimnasio( ( Alumno:(Héctor(Martínez(García( Directora:(Sara(Blanc(Clavero( ( ( Ingeniería(Técnica(en(Informática(de(Sistemas( 28(de(Septiembre(de(2011( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 2( Índice! ( 1.U(Introducción(.............................................................................................................................(6( 2.U(Objetivos(..................................................................................................................................(8( 3.U(Conceptos(clave(.....................................................................................................................(10( 4.U(Elementos(del(sistema(...........................................................................................................(12( 5.U(Servidor(..................................................................................................................................(14( 5.1.U(Sistema(Operativo(...........................................................................................................(15( 5.2.U(Servidor(Web(..................................................................................................................(16( 5.2.1.U(Posibles(configuraciones(..........................................................................................(17( 5.2.2.U(Servidor(Web(Apache(..............................................................................................(18( 5.2.2.1U(Formas(de(obtener(Apache(................................................................................(19( 5.2.2.2U(Estructura(de(directorios(...................................................................................(22( 5.2.2.3U(Iniciar(y(detener(Apache(....................................................................................(23( 5.2.2.4U(Ficheros(de(configuración(..................................................................................(26( 5.2.2.5U(Módulos(Apache(................................................................................................(29( 5.2.3.U(Trabajando(con(PHP(.................................................................................................(45( 5.2.3.1.U(Instalación(de(PHP(............................................................................................(46( 5.2.3.2.U(Configurar(PHP(..................................................................................................(48( 5.2.4U(Monitorización(..........................................................................................................(50( 5.2.4.1.UEntorno(de(desarrollo(........................................................................................(51( 5.2.4.2.UEntorno(de(producción(......................................................................................(57( 5.2.5.U(Optimización(del(servidor(Apache(...........................................................................(68( 5.2.5.1.U(Elección(del(hardware(.......................................................................................(68( 5.3.USistema(de(Base(de(datos(................................................................................................(70( 5.3.1.U(Instalación(MySQL(....................................................................................................(71( 5.3.2.U(Herramienta(phpMyAdmin(......................................................................................(73( 5.3.2.1U(Instalación(..........................................................................................................(73( 5.3.2.1U(Utilización(..........................................................................................................(76( 5.4.U(Seguridad(........................................................................................................................(79( 5.4.1.U(Conceptos(de(seguridad(web(...................................................................................(79( 5.4.1.1.U(Aseguramiento(del(servidor(web(......................................................................(79( 5.4.1.2.U(Aseguramiento(de(la(información(en(tránsito(..................................................(80( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 3( 5.4.1.3.UAseguramiento(del(equipo(del(cliente(...............................................................(80( 5.4.2.U(Usuario(y(grupo(para(Apache(...................................................................................(81( 5.4.3.U(Permiso(de(los(distintos(directorios(.........................................................................(81( 5.4.4.U(Replicación(y(Copias(de(Seguridad(...........................................................................(82( 5.4.5.U(Escaneo(de(información(.......................................................................................(83( 6.UAplicación(Web(.......................................................................................................................(89( 6.1.U(Usabilidad(.......................................................................................................................(89( 6.1.1.U(El(espacio(en(pantalla(..............................................................................................(91( 6.1.2.U(Zonas(visuales(..........................................................................................................(93( 6.1.3.U(Creación(de(contenidos(...........................................................................................(95( 6.1.4.U(Controles(para(la(web(..............................................................................................(95( 6.1.5.U(Legibilidad(del(contenido(.........................................................................................(96( 6.1.6.U(Ubicación(del(usuario(.............................................................................................(102( 6.1.7.U(Accesibilidad(de(los(usuarios(con(discapacidades(visuales(....................................(103( 6.2.U(Requisitos(de(la(aplicación(............................................................................................(104( 6.2.1.U(Captura(de(requisitos(.............................................................................................(104( 6.2.2.U(Especificación(de(requisitos(...................................................................................(106( 6.2.2.1.U(Requisitos(de(información(..............................................................................(107( 6.2.2.2.U(Requisitos(funcionales(....................................................................................(109( 6.3.U(Análisis(..........................................................................................................................(109( 6.3.1.U(Mapa(conceptual(...................................................................................................(110( 6.3.2.U(Escenarios(..............................................................................................................(111( 6.3.2.1.U(Vista(Anónimo(.................................................................................................(111( 6.3.2.2.U(Vista(Registrado(..............................................................................................(112( 6.3.2.3.U(Vista(Administrador(........................................................................................(113( 6.3.3.U(Primeros(bocetos(...................................................................................................(114( 6.3.4.U(Esquemas(jerarquía(contenidos(.............................................................................(115( 6.3.5.U(Esquemas(jerarquía(operaciones(...........................................................................(116( 6.3.6.U(Diagramas(clases(....................................................................................................(117( 6.4.U(Diseño(...........................................................................................................................(118( 6.4.1.U(Arquitectura(3(niveles(............................................................................................(118( 6.4.2.U(Capa(de(presentación(............................................................................................(119( 6.4.2.1.U(Bocetos(específicos(.........................................................................................(120( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 4( 6.4.2.2.U(Escenarios(completos(.....................................................................................(127( 6.4.2.3.U(Partes(de(la(interfaz(........................................................................................(129( 6.4.3.U(Capa(negocio(..........................................................................................................(132( 6.4.4.U(Capa(persistencia(...................................................................................................(136( 6.4.5.U(Patrones(de(diseño(................................................................................................(138( 6.4.5.1.UNavegación(......................................................................................................(138( 6.4.5.2.UPie(de(página(....................................................................................................(139( 6.4.5.3.UHerramientas(de(Login(.....................................................................................(140( 6.4.5.4.UAcordeones(......................................................................................................(141( 6.4.5.5.UInserción(de(datos(............................................................................................(142( 6.4.5.6.UPáginas(de(error(...............................................................................................(143( 6.4.5.7.U(Camino(navegacional(......................................................................................(144( 6.4.5.8.U(Pestañas(..........................................................................................................(145( 6.5.U(Implementación(............................................................................................................(146( 6.5.1.U(Tecnologías(interfaz(...............................................................................................(146( 6.5.2.U(Tecnologías(aplicación(...........................................................................................(148( 6.5.2.1U(Lado(del(cliente(................................................................................................(148( 6.5.2.2U(Lado(del(servidor(..............................................................................................(150( 6.5.3.U(Tecnologías(contenidos(.........................................................................................(151( 6.6.U(Seguridad(......................................................................................................................(152( 6.6.1.U(OWASP(TOP(2010(..................................................................................................(152( 6.6.1.1U(Injection(...........................................................................................................(153( 6.6.1.2.U(Cross(Site(Scripting(..........................................................................................(153( 6.6.1.3U(Broken(Authentication(and(Session(Management(..........................................(154( 6.6.1.4.U(Insecure(Direct(Object(Reference(...................................................................(155( 6.6.1.5U(Cross(Site(Request(Forgery(..............................................................................(155( 6.6.1.6U(Security(Misconfiguration(................................................................................(156( 6.6.1.7.U(Failed(to(Restrict(URL(Access(..........................................................................(156( 6.6.1.8.U(Unvalidated(Redirects(and(Forwards(..............................................................(157( 6.6.1.9.U(Insecure(Cryptographic(Storage(......................................................................(157( 6.6.1.10U(Insufficient(Transport(Layer(Protection(.........................................................(158( 6.6.2.U(Validación(de(la(entrada(de(datos(..........................................................................(159( 6.6.3.U(Ocultar(ciertos(contenidos(a(los(buscadores(.........................................................(159( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 5( 6.6.4.U(Scripts(CGI(y(Documentos(SSI(................................................................................(160( 6.6.5.U(Análisis(de(vulnerabilidades(Nikto(.........................................................................(161( 6.7.USistema(de(Accesos(........................................................................................................(162( 6.7.1.UIntroducción(............................................................................................................(162( 6.7.2.UTecnologías(de(toma(de(datos(................................................................................(163( 6.7.2.1.U(Manual(............................................................................................................(164( 6.7.2.2.U(Código(de(Barras(.............................................................................................(164( 6.7.2.3.U(Tecnología(RFID(..............................................................................................(165( 6.7.2.3.U(Tecnologías(biométricas(.................................................................................(166( 6.7.2.4.U(Tecnologías(banda(magnética(.........................................................................(167( 6.7.2.5.U(Tarjetas(con(chip(.............................................................................................(167( 6.7.3.UPosibles(configuraciones(.............................................................................................(168( 6.7.3.1U(Todo(en(uno(implementado(con(Arduino(............................................................(168( 6.7.3.2UPC(independiente(con(lector(USB(.........................................................................(170( 6.7.4.UElementos(...................................................................................................................(171( 6.7.5.UFuncionamiento(..........................................................................................................(172( 7.UEvaluación(.............................................................................................................................(174( 7.1.U(Resultados(finales(.........................................................................................................(174( 7.2.U(Posibles(mejoras(...........................................................................................................(191( 7.2.1.U(Servidor(Web(.........................................................................................................(191( 7.2.2.U(Aplicación(Web(......................................................................................................(192( 7.2.3.U(Sistema(de(accesos(................................................................................................(192( 8.UAgradecimientos(...................................................................................................................(194( 9.UBibliografía(............................................................................................................................(195( 9.1.URecursos(onUline(............................................................................................................(195( 9.2.URecursos(bibliográficos(..................................................................................................(198( ( ! ( ( ( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 6( 1.$!Introducción! ( En( la( actualidad( nos( encontramos( en( el( año( 2011,( y( tras( unas( décadas( de( la( creación( de( Internet(y(su(estandarización(por(todo(el(mundo,(estamos(viviendo(una(nueva(revolución.(Los( dispositivos(móviles(con(conexión(a(Internet(están(creciendo(a(un(ritmo(frenético.(Internet(es( el( lugar( donde( vamos( a( buscar( nuestra( información,( y( también( donde( queremos( realizar( nuestras(gestiones(cotidianas.( Todo(ese(auge(viene(debido(al(afán(de(disponer(de(la(información(requerida,(sea(cual(sea(el( sitio(en(que(estemos.(Esto(mediante(un(dispositivo(Smartphone,(Tablet(o(portátil(conectados(a( Internet(resulta(de(lo(más(sencillo(y(práctico.(Por(ello(para(los(negocios(de(corte(tradicional( también(es(realmente(importante(disponer(de(un(espacio(virtual(donde(un(potencial(cliente( pueda(encontrar(toda(esa(información(y(que(pueda(interactuar(potenciando(la(flexibilidad(en( la(gestión(la(comunicación(virtual.(Deberemos(por(lo(tanto,(mostrar(qué(somos,(quién(somos(y( a(qué(nos(dedicamos.( Una(vez(el(usuario(ya(ha(calmado(sus(ansias(de(información,(necesita(pasar(al(siguiente(paso:( La(comunicación.(La(cuestión(es(bien(clara,(si(yo(dispongo(de(un(canal(de(comunicación((como( es(internet),(por(qué(debo(utilizar(otro(para(comunicarme((teléfono,(presencia(en(el(negocio,( etc.).( Por( un( motivo( estamos(hablando(de(pura(usabilidad,(por(ejemplo(a(nadie( le(gustaría( tener(que(bajarse(del(coche(para(pagar(un(peaje.(Por(otro(lado(está(la(cuestión(económica,(si( yo( pago(una( cierta(cantidad( por(tener( Internet,( voy(a( intentar(sacarle(el( máximo( provecho( reduciendo(el(consumo(de(otros(que(me(cuestan(un(dinero.(Y(por(último(está(el(tiempo,(ese( gran( desconocido( de( muchos( de( nosotros( en( esta( época,( por( ejemplo,( estoy( leyendo( una( noticia(en(Internet(y(recuerdo(que(no(he(reservado(hora(para(el(médico.(Sencillo,(me(conecto( al(servicio(pertinente(y(efectúo(la(reserva.(No(he(tenido(que(desplazarme(a(ningún(sitio,(ni( esperar(ninguna(cola.( Uno(de(los(problemas(de(este(campo(es(la(dificultad(de(cazar(las(tendencias(a(tiempo(antes(de( que(alguien(ya(haya(realizado(algo(similar.(Ello(es(debido(a(que(en(el(mercado(tradicional,(la( mercadotecnia( está( basada( en( costosos( y( laboriosos( estudios( de( mercado( que( pueden( alargarse( meses( y( años( completos.( En( cambio,( en( el( mercado( de( Internet( este( tiempo( es( mucho( más( valioso.( Sin( embargo( los( usuarios( son( muy( receptivos( en( este( campo,( probablemente( más( que( en( ningún( otro,( y( uniéndolo( a( las( grandes( posibilidades( que( disponemos,(es(realmente(fácil(crear(un(servicio(innovador((aunque(no(sea(a(nivel(global).( Todas(estas(novedades(que(eran(impensables(hace(unos(años,(hoy(por(hoy(son(realidad,(y(no( es(sino(una(tendencia(al(alza.(Numerosos(son(los(estudios(que(han(verificado(que(en(el(mundo( de(los(servicios(y(las(compras(onUline(existe(más(demanda(que(oferta.(Aquí(tenemos(un(campo( suficientemente( amplio(como(para(experimentar(con(infinidad(de( sectores(comerciales.(Los( límites(únicamente(los(va(a(poner(la(propia(tecnología(y(el(usuario.(Es(por(tanto(la(innovación( uno(de(los(aspectos(más(importantes(que(debemos(tener(en(cuenta(en(este(campo(de(las(TICs.( Para(los(que(hemos(tenido(el(placer(de(conocer(el(nacimiento(y(la(expansión(de(Internet,(es( una( experiencia( única( que( ninguna( otra( generación( posterior( tendrá( la( posibilidad( de( vivir.( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 7( Hemos(visto(el(paso(del(analógico(al(digital,(de(nuestra(vida(en(el(mundo(a(nuestro(mundo(en( Internet,( de( la( consulta( de( enciclopedias( en( papel( a( la( consulta( de( grandes( bases( de( datos( online.( La( información( nos( ha( invadido,( ahora( no( podemos( escapar( de( ella( porque( está( en( todas(partes.(La(posibilidad(de(calmar(nuestra(curiosidad(nos(ha(vuelto(más(curiosos(todavía,( ahora(podemos(aprender(conocimientos(sobre(campos(en(los(que(antes(era(imposible.(( Con(todo(ello(debemos(ver(a(Internet(como(una(herramienta(capaz(de(lograr(ayudarnos(de( forma(que(antes(no(podíamos,(pero(siempre(debemos(recordar(que(esto(es(sólo(una(extensión( de(nuestro(propio(conocimiento.(( Por(mi(parte(el(consejo(que(hagamos(todos(un(uso(responsable(Internet,(de(forma(que(todo( sean(ventajas,(y(no(tengamos(que(lamentarnos(de(nada.(Ayudar(a(que(Internet(sea(cada(vez( más(rico(en(conocimientos(aportando(nuestro(propio(conocimiento(para(que(otros(puedan( aprovecharlo.( Por(todos(estos(motivos(y(por(alguno(más(que(puede(que(olvide,(se(pensó(en(realizar(dicho( Proyecto( Final( de( Carrera( (en( adelante( PFC)( en( el( ámbito( de( las( Aplicaciones( Web.( Espero( algún( día( pueda( resultar( de( utilidad( para( alguien( la( cantidad( ingente( de( horas( que( se( han( dedicado(tanto(a(la(elaboración(de(esta(memoria,(como(al(desarrollo(de(la(propia(aplicación.( Sería(sin(duda(la(garantía(de(que(todo(el(trabajo(ha(valido(la(pena.( Agradezco(también(la(elección(de(este(PFC(que(me(ha(hecho(reconsiderar(mi(futuro(laboral( una(vez(titulado(como(Ingeniero(Técnico(en(Informática(de(Sistemas.(Dicha(carrera(va(a(ser( orientada(hacia(este(mundo(tan(competitivo(y(en(constante(evolución.(Por(ello(presento(este( PFC(como(el(principio(de(lo(que(espero(que(sea(una(brillante(carrera(profesional(en(la(que( pueda(dar(solución(a(multitud(de(los(problemas(con(los(que(ahora(se(encuentran(particulares(y( empresas.( ( ( ( ( ( ( ( ( ( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 8( 2.$!Objetivos! ( El( objetivo( principal( de( este( Proyecto( Final( de( Carrera( es( desarrollar( un( conjunto( de( metodologías(que(permitan(desarrollar(una(aplicación(web(de(gestión(de(un(gimnasio(con(una( serie( de( particularidades( que( lo( hacen( distinto( al( resto.( Entre( esas( particularidades( se( encuentra(la(reserva(online(a(través(del(sitio(web(de(las(distintas(actividades(ofertadas(por(el( gimnasio,(permitiendo(un(gestión(de(cobros(en(concordancia(con(el(consumo(efectuado.(Otra( particularidad(a(tener(en(cuenta(es(la(gestión(del(sistema(de(accesos(a(las(instalaciones,(ya(que( se(realizarán(mediante(tarjetas(RFID(para(identificar(a(los(distintos(socios.( Las(pretensiones(para(llegar(a(decidir(estas(u(otras(características(han(sido,(por(una(parte,(la( posibilidad(de(desarrollar(un(servicio(de(forma(estándar(para(que(pudiera(ser(implantado(en( multitud( de( lugares( diferentes.( Por( ello( se( ha( procurado( que( este( sistema( sea( totalmente( modular(al(resto(de(la(aplicación,(ya(que(de(esta(forma(tanto(el(sistema(de(reservas,(como(el( de( control( de( accesos,( podrían( ser(implantado( en( un( sitio( web( ya( existente( con( el( menor( número(de(cambios(posible.(Esto(implica(que(un(mismo(producto(puede(ser(reutilizado(con( una( tasa( de( esfuerzo( baja,( lo( que( implica( aunque( el( costo( de( desarrollo( sea( el( mismo,( conforme(vaya(siendo(más(utilizado(su(costo(será(más(bajo((tanto(de(implantación,(como(de( mejora(y(adaptación).(A(la(larga,(debido(a(su(bajo(coste,(podrá(ser(implantado(por(empresas( que(jamás(pensaron(que(podían(permitirse(una(aplicación(de(este(calibra.( Otro(de(los(motivos(para(elegir( este( tipo( de( gestión( de( horarios( de( un( gimnasio( ha( sido( la( propia( comodidad( del( usuario,( ya( que( debemos( romper( todas( las( barreras( posibles( entre( nuestra(empresa(y(el(cliente.(Así(por(tanto,(si(el(medio(natural(donde(se(desarrolla(la(gente(es( Internet,(nosotros(deberemos(ir(un(paso(por(delante(y(tener(una(presencia(en(dicho(terreno.(Y( si(además( de(la( presencia,(el(cliente(puede(tener( las( mismas( posibilidades(que( otro(cliente( tiene(estando(en(las(mismas(instalaciones,(mejor(todavía.(Ese(es(por(tanto(el(objetivo(en(ese( sentido,(intentar(que(la(aplicación(web(sea(lo(más(parecido(posible(a(la(oficina(que(se(puede( encontrar( en( las( instalaciones( de( nuestro( gimnasio,( y( dar( al( cliente( todas( las( facilidades( posibles(para(informarse(y(usar(nuestros(servicios.( Otro(factor(a(resaltar(es( el(tema( económico.(Esta(aplicación(pretende(ayudar( tanto( cliente,( como(al(gimnasio(a(hacer(un(mejor(uso(de(sus(recursos(financieros.(Por(parte(del(cliente(se( rompe( el( modelo( clásico( de( negocio( en( los( gimnasios,( este( es( a( grandes( rasgos( bonos( mensuales( baratos,( pero( precios( diarios( caros.( De( esta( forma( se( aseguraban( el( factor( psicológico(que(te(hacía(adquirir(el(bono(mensual,(ya(que(con(el(mismo(dinero(que(te(costaba( ir( una( semana( podías( ir( todo( un( mes.( Evidentemente,( que( alguien( disponga(de( un( bono( mensual(no(implica(que(vaya(a(hacer(un(uso(efectivo(de(él.(Lo(que(aquí(se(plantea(es(romper( ese( negocio( y( que( el( cliente( pague( por( el( uso( que( realmente( dé( a( las( instalaciones( del( gimnasio.(Así(se(evitará(pagar(ese(mes(al(que(no(fuimos(ningún(día,(o(pagar(el(bono(mensual( cuando(únicamente(fuimos(un(par(de(horas,(o(pagar(más(cuando(se(hace(un(uso(intensivo.( Por(parte(del(gimnasio(se(pueden(encontrar(ventajas(también(en(el(aspecto(económico.(Una( de(ellas(tiene(que(ver(con(la(mejor(utilización(de(los(recursos(materiales(de(los(que(disponen( las(instalaciones.(Esto(es(así(porque(es(muy(difícil(predecir(cuando(va(a(venir(más(o(menos( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 9( gente,(y(a(qué(actividades(mostrarán(mayor(interés.(De(esta(forma(se(pretende(ir(un(paso(por(( delante,(reservando(directamente(las(actividades(que(desean(los(clientes(en(unas(horas(y(días( determinados.( Las( ventajas( a( priori( son( muchas,( ya( que( se( puede( saber( qué( salas( están( ocupadas(y(cuáles(libres,(y(de(esta(forma(destinar(estas(a(otros(usos(o(actividades.(También(es( posible( realizar( un( mayor( aprovechamiento( de( los( profesores( que( efectúan( las( distintas( actividades,(ya(que(tienen(determinadas(las(horas(de(inicio(y(fin(de(cada(actividad.(El(objetivo( por(lo(tanto(es(aprovechar(al(máximo(las(instalaciones(que(se(tienen,(para(sacar(el(máximo( beneficio(posible.( A(decir(verdad(lo( más( importante( de( todo( este( sistema( es( la( información( que( el( mismo( es( capaz(de(generar.(Las(ventajas(para(el(empresario(parecen(no(tener(fin:(estadísticas(sobre(las( horas(de(mayor(afluencia,(días(en(los(que(se(efectúan(más(reservas,(profesores(que(atraen(a( más(gente(a(sus(clases,(actividades(que(mejor(consideración(tienen(entre(los(alumnos,( etc.( Toda( esta( información( puede( ser( reutilizada( en( beneficio( del( propio( gimnasio( y( todo( su( ecosistema((tanto(trabajadores,(como(usuarios,(directivos,(etc.)( Todo(lo(comentado(hasta(aquí(vienen(a(ser(las(motivaciones(generales(de(la(aplicación(que( aquí( se( describe,( pero( profundizando( más( en( el( propio( proyecto( se( extraen( objetivos( más( específicos.(Uno(de(ellos(es(la(usabilidad,(por(lo(que(se(ha(hecho(un(estudio(de(los(avances(que( ha(logrado(este(campo(para(lograr(acercarse(al(usuario(de(forma(más(clara(y(transparente,(de( forma(que(nuestra(aplicación(sea(fácil(de(utilizar(e(intuitiva(para(los(no(expertos.( Otro(objetivo(que(se(ha(tenido(en(cuenta(ha(sido(la(seguridad(en(Internet.(Se(ha(hecho(otro( estudio(sobre(la(forma(de(proteger(las(aplicaciones(web,(así(como(las(vulnerabilidades(más( importantes(existentes(ahora(mismo(en(internet(y(la(forma(de(evitar(caer(en(ellas(en(nuestro( código.( Este( factor( es( importante( para( lograr( la(tan( ansiada( credibilidad( que( necesita( una( aplicación(web(a(los(ojos(de(las(personas(que(lo(utilizan(y(tienen(almacenados(en(ella(sus(datos( personales.( En(cuanto(a(la(propia(aplicación(web,(se(ha(pretendido(en(todo(momento(diseñar(un(sistema( sencillo(pero(altamente(configurable,(que(permita(a(los(administradores(cierta(flexibilidad(a(la( hora( de( agregar( nuevas( noticias,( modificar( las( instalaciones,( añadir( nuevos( usuarios,( profesores,(etc.(Por(lo(tanto(podríamos(decir(que(la(aplicación(es(totalmente(autogestionable,( ya(que(una(vez(implantada(en(el(sistema(destino(ya(no(serán(necesarios(ningún(programador( y/o(diseñador(para(el(mantenimiento(de(la(aplicación.( También(se(ha(tenido(especial(cuidado(en(la(preparación(del(servidor,(que(será(el(entorno(de( producción(en(el(cual(funcionará(nuestra(aplicación(web.(Es(por(ello(que(este(es(un(punto(en(el( que(debemos(poner(especial(atención(tanto(en(su(instalación,(como(en(su(configuración.(Se( tiene( especial( interés( en( que( sea( un( sistema( plenamente( funcional,( escalable( y( seguro( en( todos(los(sentidos.( Podríamos( resumir( por( lo( tanto( que( se( pretende( dar( una( vuelta( de( tuerca( al( modelo( de( negocio(de(los(gimnasios,(haciendo(una(propuesta(de(un(modelo(importado(de(otros(mercados( como( puede( ser( el( de( los( hoteles.( Para( ello( se( ha( pretendido( siempre( usar( tecnologías( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 16( recurriremos( a( un( sistema( operativo( “de( uso( doméstico”( para( que( las( operaciones( que( se( describen( sean( comprendidas( con( mayor( rapidez,( por( lo( que( vamos( a( descartar( todas( las( opciones(“profesosionales”.(Esto(reduce(las(opciones(a(3:(Windows,(Linux(y(Mac(OS(X.(( De(entre(ellas(nos(quedaremos(con(Linux(por(ser(la(más(flexible(en(cuanto(a(la(personalización( del(mismo,(en(cuanto(a(la(libertad(de(elección(de(la(distribución(a(utilidad,(su(libertad(de(uso( sin(necesidad(de(pagos,(su(orientación(a(servidores,(su(fiabilidad(y(estabilidad,(la(gran(cantidad( de(documentación(disponible(y(su(relativamente(poca(especialización.( En( el( mundo( Linux( podemos( optar( por( gran( cantidad( de( distribuciones,( desde( las( que( se( distribuyen( gratuitamente,( hasta( las( que( pueden( llegar( a( costar( miles( de( dólares.(Entre( las( opciones(que(deberíamos(tener(en(cuenta(se(encuentran(Debian,(Red(Hat(Enterprise(Linux,( Fedora,(SuSE,(Gentoo,(CentOS,…( De(entre(todas(ellas(vamos(a(optar(por(una(gratuita,(con( un(ciclo(de(desarrollo(largo(entre( versión(y(versión(para(asegurar(tanto(la(estabilidad,(como(los(problemas(de(actualización(entre( versiones.(Los(principales(son(Debian(y(CentOS((que(proviene(de(las(fuentes(de(Red(Hat)( Las(imágenes(de(los(sistemas(operativos(se(pueden(encontrar(aquí:( Debian:(http://www.debian.org( CentOS:(http://www.centos.org( ( ( 5.2.$!Servidor!Web! ( De(entre(todos(los(procesos(que(van(a(llevarse(a(cabo(en(el(servidor,(el(más(determinante(de( todo(ellos(es(el(servidor(web.(Esta(será(la(pieza(clave(de(todo(nuestro(entramado,(por(lo(que( deberemos( prestar( especial( atención( tanto( a( la( elección,( como( a( la( configuración( de( dicho( elemento.( Al(igual(que(en(el(mercado(de(los(sistemas(operativos(de(servidor,(en(el(caso(de(los(servidores( web(deberemos(ver(las(opciones(de(las(que(podemos(disponer.(Esta(decisión(afortunadamente( será( más( sencilla( ya( que( disponemos( de( pocas( opciones,( aunque( no( por( ello( las( opciones( deben(ser(de(menor(calidad,(ya(que(es(un(mercado(muy(maduro.( En(primer(lugar(vamos(a(comprobar(las(opciones(que(nos(da(el(mercado,(y(las(características( de(cada(uno.(La(compañía(Netcraft(nos(ofrece(en(su(web(los(datos(de(penetración(de(mercado( de(cada(servidor(web,(los(cuales(se(muestran(a(continuación((concretamente(del(año(2010)(:( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 17( ( ( Los(datos(del(gráfico(hablan(por(sí(solos,(ya(que(la(opción(mayoritaria(agrupa(a(más(de(la(mitad( de(los(servidores(web(del(mundo.(Dicha(opción(es(Apache(con(su(servidor(httpd,(que(logra(casi( el(triple(servidores(que(la(segunda(opción(en(el(mercado.(La(segunda(opción(es(el(servidor(de( Microsoft((IIS).(El(resto(de(opciones(son(prácticamente(despreciables(ya(que(el(porcentaje(de( ellos(es(muy(bajo.( Hay( que( decir( que( en( este( análisis( únicamente( aparecen( servidores( web( genéricos,( que( aunque( no( son( los( únicos( que( existen( en( el( mercado,( encajan( perfectamente( con( nuestros( requerimientos.(En(principio(cualquiera(de(ellos(podría(servirnos,(pero(vamos(a(analizarlos(más( a(fondo(en(el(siguiente(apartado.( ( 5.2.1.$!Posibles!configuraciones! ! ! 1. Apache( Este(servidor(web(es(el(servidor(web(más(utilizado(desde(abril(del(1996,(y(en(realidad(se(refiere( a(un(proyecto(llamado(“httpd”(de(la(Apache(Software(Fundation,(cuya( última( versión( en( el( momento(de(redactar(este(documento(era(la(2.2((aunque(existe(una(versión(preliminar(de(la( versión(2.3)( Apache( utiliza( varias( licencias( para( publicar( tanto( el( software( como( la( documentación( del( mismo.( Actualmente( la( versión( de( la( licencia(es( la( “Apache( License,( versión( 2.0”( que( es( 59,35%( 22,22%( 6,62%( 5,85%( 0,51%( Mercado%Servidores%Web%Año%2010% Apache( Microsop( nginx( Google( lighqpd( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 18( compatible( con( la( licencia( GPL.( Permite( ser( utilizado( para( cualquier( propósito,( distribuirlo,( modificarlo,(y(distribuir(dichas(modificaciones,(pero(no(obliga(a(que(las(versiones(derivadas(de( este(software(deban(ser(distribuidas(usando(la(misma(licencia.( Este(servidor(puede(ser(utilizarlo(en(diversos(sistemas(operativos(modernos,(incluyendo(todas( las(versiones(de(UNIX((BSD,(Solaris,(…),(Linux,(y(Windows(NT(entre(otros.( Su( arquitectura( modular( permite( el( uso( de( módulos( para( extender( o( reducir( sus( funcionalidades,(lo(que(permite(una(gran(flexibilidad.( Aunque(su(configuración(pueda(ser(complicada((ya(que(no(existe(aplicación(gráfica),(existen( gran( cantidad( de( documentación( tanto( en( los( manuales( oficiales,( como( en( páginas( relacionadas(con(el(software(libre.( ( 2. Microsoft( Este(servidor(es(conocido(como(IIS((Internet(Information(Server)(y(actualmente(forma(parte(de( la( familia( de( sistemas( operativos( para( servidor( de( Windows( (2000( Server,( 2003( y( 2008),( aunque(existe(una(versión(limitada(para(Windows(XP.( Al( igual( que(Apache,( el( servidor( IIS( tiene( una( estructura( modular( que( permite( añadirle( funcionalidades( para( procesar( documentos( dinámicos( como( ASP,( PHP,( etc.(En( cuanto( a( las( opciones( que( vienen( incluidas( por( defecto( en( la( versión( 7.0( se( encuentra( IIS,( Visual( Web( Developer,(SQL(Server,(.NET(Framework(y(Silverlight(Tools.( Su(configuración(se(realiza(mediante(una(aplicación(gráfica,(por(lo(que(ésta(se(simplifica(mucho( con(respecto(a(Apache.(A(pesar(de(esto(las(configuraciones(son(mucho(menos(personalizadas,( y(se(dedican(a(personalizar(temas(mucho(más(superfluos.( La(configuración(típica(en(cuanto(al(contenido(dinámico(es(usar(el(lenguaje(ASP(o(ASP.NET,( aunque( también( puede( extenderse( mediante( extensiones( para( que( sea( capaz( de( procesar( ficheros(PHP(o(Perl.( Aunque(IIS(no(tiene(un(coste(implícito(ya(que(se(distribuye(gratuitamente,(si(que(tenemos(que( tener(en(cuenta(que(habrá(que(costear(el(precio(de(la(licencia(del(sistema(operativo(Windows( Server,(cuyo(precio(empieza(en(los(999(dólares(estadounidenses.( ( 5.2.2.$!Servidor!Web!Apache! ( En(el(desarrollo(del(presente(proyecto(se(va(a(utilizar(el(servidor(web(Apache,(por(lo(que(en(los( siguientes( apartados( se( va( a( dejar( de( nombrar( el( servidor( IIS.( Por( este( motivo,( todos( los( ejemplos( a( partir( de( este( momento( se( van( a( realizar( utilizando( el( servidor( Apache,( concretamente(la(versión(2.2( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 19( Se(intentará(dar(una(visión(global(de(todos(los(aspectos(de(este(servidor,(ya(que(pueden(ser(de( vital( importancia( a( la( hora( de( pulir( ciertos( detalles( que( pueden( ser( importantes( para( el( funcionamiento(de(nuestra(aplicación.( Entre( los( aspectos( que( se( van( a( tratar( empezaremos( en( primer( lugar( la( forma( de( obtener( Apache,(que(como(hemos(visto(en(el(apartado(anterior(está(disponible(bajo(la(licencia(Apache,( que(permite(el(uso(y(distribución(libre(de(la(aplicación.( Una( vez( obtenido,( el( siguiente( paso( será( conseguir( que( todo( ese( entramado( de( ficheros( consiga(realizar(la(función(que(de(él(necesitamos.(Dicho(paso(será(la(instalación,(de(la(cual(hay( diversas(variantes(dependiendo(del(método(elegido.( También(se(va(a(realizar(un(análisis(de(los(distintos(directorios(que(forman(la(instalación(de( Apache,(haciendo(especial(hincapié(en(los(contenidos(y(funciones(que(desarrollan(cada(uno(de( ellos.( Si(todo(ha(ido(correctamente,(deberemos(aprender(a(iniciar(y(detener(Apache(para(empezar(a( disfrutar(del(servidor.(Veremos(cómo(iniciarlo(automáticamente(para(que(se(arranque(al(inicio( de(nuestro(servidor.( Un( aspecto( fundamental( serán( los( ficheros( de( configuración,( donde( podremos( personalizar( nuestra( instalación( para( que( funcione( acorde( a( nuestros( requisitos,( tanto( de( funcionalidad( como(de(seguridad(y(personalización.( Como(se(ha(comentado(en(apartados(anteriores,(Apache(puede(extender(sus(funcionalidades( mediante(distintos(módulos.(Estas(funcionalidades(son(las(que(se(verán(en(este(apartado,(así( como(la(forma(de(cargar(e(instalar(los(diferentes(módulos.( ( 5.2.2.1%&Formas&de&obtener&Apache& ( Para(conseguir(Apache(tenemos(varias(opciones(dependiendo(de(nuestras(necesidades(y(de(los( conocimientos(que(tengamos.(Existe(desde(la(versión(personalizada(para(nuestra(distribución( preparada( para( funcionar,( hasta( la( versión( que( incluye( únicamente( el( código( fuente( que( deberemos(compilar(para(lograr(que(funcione.( En(primer(lugar(vamos(a(comentar(la(opción(más(sencilla(de(instalar,(y(por(lo(tanto(más(rígida( en( cuanto( a( personalización( y( configuración.( Se( trata( de( instalar( el( paquete( que( incluye( nuestra(distribución,(que(suele(encontrarse(en(los(repositorios(oficiales.(La(instalación(en(este( caso(es(realmente(sencilla,(ya(que(podemos(tener(instalado(Apache(con(un(par(de(clicks(o(en( un(único(comando.( En(mi(caso(mi(máquina(corre(una(versión(de(Ubuntu,(si(usa(otra(distribución(mis(palabras(le( resultarán(igualmente(familiares,(pero(deberá(adaptar(el(proceso(a(su(distribución.(Este(es(el( ejemplo(a(seguir(en(Debian(y(Ubuntu:( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 20( ( ( Hay(que(decir(que(en(este(ejemplo(únicamente(instalaría(el(servidor(web(Apache,(y(dejaría(de( lado(el(servidor(de(base(de(datos(y(el(modulo(php.(Para(ello(habría(que(instalar(también(mysqlU server,(php5,(libapache2UmodUphp5,(php5Umysql.( Otra(opción(sería(realizar(la(instalación(a(partir(de(los(binarios(disponibles(en(el(sitio(web(de( Apache.(Desgraciadamente(no(existe(una(versión(en(este(formato(para(sistemas(Linux,(por(lo( que(no(se(ajusta(a(nuestros(requisitos.(La(instalación(en(este(caso(consistiría(en(descargar(los( binarios(de(la(web(de(Apache,(descomprimir(el(fichero(proveniente(de(la(descarga,(y(ejecutar( el(binario.( La(opción(que(nos(permite(un(mayor(grado(de(personalización(es(compilar(Apache(a(partir(del( código(fuente(que(podemos(encontrar(en(la(web(oficial.(El(lugar(concreto(en(el(que(se(puede( encontrar( es( http://apache.org/download.cgi,( donde( podremos( encontrar( las( distintas( versiones( (evitaremos( versiones( Alpha( y( Beta).( Elegiremos( aquellas( descargas( denominadas( con(“Unix(Source”.( El(primer(paso(será(descomprimir(todos(los(ficheros(que(se(encuentran(en(el(comprimido(que( nos(hemos(descargado((En(nuestro(caso(con(la(versión(.tar.gz).(Para(ello(desde(la(consola(nos( situaremos( en( el( directorio( donde( se( encuentra( el( comprimible( y( ejecutamos( el( siguiente( comando((importante(sustituir(las(x(por(la(versión(concreta(que(corresponde(con(el(nombre( del(fichero):( ( ( ( Esto( creará( un( nuevo( directorio,( en( cuyo( interior( tendremos( el( contenido( del( fichero( que( acabamos(de(descomprimir.(Para(acceder(deberemos(cambiar(de(directorio(con(el(comando(cd( y(a(continuación(el(nombre(del(directorio.(Si(hacemos(un(listado(con(el(comando(ls(podemos( ver(el(siguiente(resultado:( ( ( Cabe(destacar(sobre(todo(el(script(“configure”(que(será(el(que(usaremos(a(continuación.(Si( # sudo apt-get install apache2 $ tar xzvf httpd-x.x.xx.tar.gz PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 21( deseamos(utilizar(la(configuración(por(defecto(simplemente(deberemos(ejecutarlo,(pero(hay( que(destacar(que(acepta(diversos(parámetros(que(permiten(personalizar(la(instalación(en(base( a(nuestras(necesidades.(Esto(resultará(familiar(para(aquellos(acostumbrados(al(mundo(Unix(/( Linux.( El(otro(script(llamado(“buildconf”(se(usará(en(el(caso(de(que(nuestra(distribución(haya(sido( descargada(de(un(CVS(((sistema(de(control(de(versiones().(Si(no(tiene(muy(claro(que(es(un(CVS,( probablemente(es(que(no(lo(haya(usado(para(descargar(Apache,(aun(así(si(desea(más( información(será(interesante(buscarla(en(la(documentación(oficial(de(Apache.( Como(hemos(empezado(a(comentaren(párrafos(anteriores,(para(preparar(la(compilación(con( las(opciones(por(defecto,(el(comando(que(deberemos(ejecutar(será(el(siguiente:( ( ( ( El(proceso(durará(un(par(de(minutos,(dependiendo(de(la(máquina(sobre(la(que(se(ejecute.(Hay( que(mencionar(algunas(opciones(de(personalización(alternativas(al(comando(anterior.(Como( hemos( dicho( esta( personalización( se( realiza( mediante( parámetros.( A( continuación( vamos(a( mostrar(algunos:( Para(modificar(el(directorio(donde(Apache(será(instalado,(hay(que(utilizar(el(parámetro(UUprefix( de(la(siguiente(forma:(./configure(UUprefix=directorio( Es( posible( que( nos( interese( desactivar( algunas( de( las( características( o( módulos( que( están( activados( por( defecto.( La( lista( módulos( es( la( siguiente:( mod_actions,( mod_alias,( mod_asis,( mod_auth,( mod_autoindex,( mod_access,( mod_cgi,( mod_cgid,( mod_charset_lite,( mod_dir,( mod_env,( mod_imagemap,( mod_include,( mod_log_config,( mod_mime,( mod_negotiation,( mod_setenvif,(mod_status,(mod_userdir.(La(forma(de(desactivarlos(será(con(el(modificador(UU disableUnombreModulo.(Por(ejemplo:(UUdisableUmod_autoindex.( (También(es(posible(indicar(el(caso(contrario,(activar(un(módulo(de(los(que(no(están(activados( por( defecto.( Para( lo( cual( habrá( que( modificar( el( parámetro( “disable”( por( “enable”.( Por( ejemplo,(para(incluir(el(módulo(“expires”(añadiremos(UUenableUexpires.( Debido(al(gran(número(de(posibilidades(que(existen(a(la(hora(de(efectuar(la(configuración,(no( se(van(a(tener(en(cuenta(todas.(En(cualquier(caso,(si(todo(ha(ido(correctamente(estaremos(en( condiciones(de(comenzar(con(la(compilación.(Para(ello(ejecutaremos(el(comando(siguiente:( ( ( ( Esto(compilará(todas(las(partes(de(Apache,(y(ahora(sólo(quedará(ejecutar(la(instalación.(Para( ello(bastará(con(ejecutar(el(comando(siguiente:( $ ./configure $ make PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 22( ( ( En(este(punto(ya(tendremos(Apache(instalado(y(podremos(cargar(en(el(navegador(la(dirección( http://localhost(para(comprobar(que(todo(ha(ido(correctamente.( ( 5.2.2.2%&Estructura&de&directorios& ( Apache( dispone( de( una( estructura( de( directorios( específica(que( se( encuentra( a( partir( del( directorio( donde( se( encuentra( instalado.( Este( directorio( puede( ser( distinto( en( cada( distribución,(y(en(mi(caso(se(encuentra(en(/etc/apache2.(Si(usted(ha(realizado(el(proceso(de( compilación(puede(modificar(esta(ruta(a(su(voluntad,(indicando(la(ruta(en(el(atributo(prefix(en( el(script(de(“configure”.( ( Aquí( puede( verse( una( representación( de( la( estructura( típica( de( directorios( que( representa( Apache( una( vez( instalado(a(partir(del(código(fuente.( A( continuación( se( hace( una( breve( explicación(del( contenido( y(utilidad(de( cada(uno(de(los(directorios.( ( ( ( ( ( ( ( Algunos(de(los(directorios(que(se(puede(encontrar(son(los(siguientes:( • Include:(Contiene(archivos(de(cabecera(que(son(necesarios(si(desarrollar(aplicaciones( web(integradas(con(Apache.( • Lib:(Contiene( las( librerías( que( necesita( Apache( y( sus( utilidades( para( ejecutarse( correctamente.( $ make install apache( include( lib( bin( conf( htdocs( icons( log( cgiUbin( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 23( • Bin:(Contiene(todos(los(programas(ejecutables(que(se(distribuyen(con(Apache,(como( ab,(apachectl,(httpd,(htdigest…( • Conf:(Aquí(se(encuentran(los(ficheros(de(configuración(de(Apache.(Estos(son(los(que( deberemos(modificar(para(ejecutar(Apache(a(nuestro(gusto.( • Htdocs:(Aquí(se(encuentra(la(raíz(de(documentos(que(usará(Apache(como(directorio(de( publicación.(Este(directorio(puede(ser(modificado(en(los(ficheros(que(configuración.( • Icons:(Este(directorio(contiene(distintos(iconos(que(se(utilizan(para(listar(directorios(en( el(caso(en(que(no(exista(un(archivo(predeterminado.( • Logs:(Es(el(lugar(donde(se(encuentran(todos(los(registros(de(los(sucesos(que(ocurren( en( el( servidor.( Puede( configurarse( a( nuestro( gusto( para( decidir( qué( tipo( de( información(se(guardará.( • CgiSbin:(Si(utilizamos(scripts(CGI,(éste(es(el(lugar(donde(deberán(ubicarse(este(tipo(de( aplicaciones.( Este( directorio( puede( modificarse( también( en( los( ficheros( de( configuración.( ( Esta( estructura( es( común( a( todas( las( configuraciones( instaladas( por( el( modo( manual( (configuración,(compilación(e(instalación),(pero(puede(verte(modificada(en(los(casos(en(los(que( la( instalación( proviene( de( un( paquete( personalizado.( Aunque( la( función( de( los( distintos( directorios(será(la(misma,(lo(que(cambiará(será(la(ubicación(de(los(mismos.( Por( ello( si( su( instalación( ha( sido( realizada( desde( los( repositorios( utilizando( un( paquete( específico(para(su(distribución(debería(informarse(de(la(localización(de(sus(directorios(en(los( documentos(distribuidos(con(su(paquete(Apache(o(en(la(web(oficial(de(su(distribución.( ( 5.2.2.3%&Iniciar&y&detener&Apache& ( Una(vez(Apache(ya(está(correctamente(instalado(en(nuestro(sistema,(podemos(arrancarlo(para( hacer(las(primeras(pruebas.(Por(defecto,(el(servidor(se(distribuye(con(una(configuración(básica( que(permite(que(lo(utilicemos(desde(el(mismo(momento(de(instalarlo.( Esta(configuración(no(suele(ser(del(agrado(de(ningún(administrador,(debido(a(la(carencia(de( funcionalidades(por(un(lado,(y(por(motivos(de(seguridad(por(otro.(Por(lo(tanto(habrá(multitud( de(opciones(que(podremos(configurar(para(adecuarnos(a(nuestro(ecosistema(incluyendo(todas( las(opciones(posibles(tanto(de(rendimiento,(seguridad,(directorios,(etc.( En( el( directorio( bin( comentado( en( el( apartado( anterior,( se( encuentra(un( binario( llamado( apachectl,(que(será(el(encargado(de(arrancar(Apache.(En(mi(distribución(concreta(este(binario( se(encuentra(en(la(ruta(/usr/sbin,(pero(suele(ser(común(que(esta(ruta(se(encuentre(en(el(PATH( del( sistema,( por( lo( que( probablemente( no( debamos( conocerla,( ya( que( será( el( sistema( el( encargado(de(buscar(el(ejecutable.( Por(lo(tanto(para(iniciar(Apache(será(tan(sencillo(como(ejecutar(lo(siguiente:( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 24( ( ( ( Es(posible(que(si(los(binarios(provienen(de(una(distribución,(éstos(sean(capaces(de(ejecutarse( como( servicio,( por( lo( que( debería( evitarse( iniciarlo( de( la( forma( que( se( ha( comentado( anteriormente.(En(Debian(/(Ubuntu,(debe(ejecutarse(el(siguiente(comando:( ( ( ( En(un(entorno(de(producción,(Apache(debería(ejecutarse(al(iniciar(la(máquina,(ya(que(en(caso( de(reinicio(el(tiempo(de(parada(debería(ser(el(mínimo(posible.(Esto(es(porque(en(un(reinicio( automático(no(haría(falta(loguearnos(con(nuestro(usuario(y(contraseña(para(que(Apache(siga( funcionando,(si(no(que(en(el(arranque(ya(comenzaría(a(funcionar.(Otro(motivo(es(que(puede( que(en(un(entorno(de(producción(deseemos(que(el(servidor(no(se(ejecute(un(entorno(gráfico,( por(lo(que(si(es(incluido(en(el(nivel(3(esto(no(será(necesario.( ( ( ( Se(puede(comprobar(una(vez(iniciado(el(servidor,(si(este(efectivamente(se(ha(iniciado(cargando( la(URL(http://localhost(en(nuestro(navegador.(El(resultado(debería(ser(similar(al(siguiente(en( un(sistema(recién(instalado:( ( ( ( Otra(opción(para(comprobar(si(todo(ha(ido(correcto(es(ejecutar(el(siguiente(comando:( #apachectl start #service apache2 start # ln –s /etc/rc.d/init.d/httpd /etc/rc.d/rc3.d/httpd ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 25( ( ( ( Esto(da(un(listado(de(los(procesos(que(están(actualmente(corriendo(en(el(sistema((que(es(el( resultado(de(la(orden(“ps”)(y(filtra(aquellos(que(se(llamen(httpd.(En(el(caso(de(mi(distribución( el(proceso(se(llama(“apache2”.(El(proceso(de(filtrado(se(realiza(mediante(el(comando(grep.( Aquí(se(puede(ver(un(ejemplo(del(resultado(que(podemos(esperar:( ( ( ( ( ( ( ( ( De(un(motivo(similar(al(proceso(de(inicio(de(Apache,((para(detener(Apache(habrá(que(tener(en( cuenta(si(estamos(ejecutándolo(mediante(un(binario,(o(como(un(servicio.( Para(el(caso(de(que(estemos(ejecutándolo(como(un(binario,(el(comando(será(el(siguiente:( ( ( ( Como(apunte,(decir(que(en(caso(de(que(no(nos(encontremos(en(el(directorio(bin(de(Apache,( deberemos(añadir(dicho(directorio(en(el(PATH(del(sistema.( Si(por(el( contrario(se(está(ejecutando( como(un(servicio,(deberemos(hacerlo(de(la(siguiente( forma:( ( ( Ya( hemos( visto( los( dos( comandos( básicos( de( Apache,( que( son( el( inicio( y( la( detención( del( mismo,(pero(hay(un(tercer(comando(que(acepta,(que(es(el(reinicio.(Para(ello,( simplemente( sustituiremos(en(los(comandos(anteriores(el(argumento(“stop”(por(“restart”.( Una(vez(visto(que(Apache(funciona(correctamente,(podemos(comprobar(los(registros(que(el( propio(Apache(almacena(en(los(ficheros(de(log.(Podemos(encontrar(uno(que(se(encarga(de(los( #ps aux | grep httpd #apachectl stop #service apache2 stop PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 32( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_access.html( ( Mod_actions:(Permite( la( ejecución( de( scripts( CGI( cuando( ocurre( una( petición( multimedia.( Puede(detectarla(mediante(un(tipo(MIME(o(un(manejador(instalado.(Este(módulo(dispone(de( dos(directivas:( Action tipo_MIME scipt:(Utilizaremos( esta(directiva(para(asociar(un(script(a( un( tipo(MIME(determinado.(Vamos(a(suponer(que(cada(vez(que(exista(una(solicitud(de(un(fichero( HTML,(deseamos(ejecutar(un(determinado(script.(Ejemplo:(Action(text/html(/cgiUbin/script( Script método script:(En(este(caso(asociaremos(la(acción(con(una(solicitud(HTTP( como(pueden(ser(GET,(POST,(PUT(o(DELETE.(Ejemplo:(Script(POST(/cgiUbin/script( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_actions.html( ( Mod_alias:(Permite(direccionar(mediante(una(URL(un(contenido(que(se(encuentra(fuera(del( árbol( de( directorio( de( publicación.( También( permite( añadir( un( directorio( de( scripts( CGIs( y( multitud(de(redirecciones.( Alias URL-ruta ruta:(Asocia(una(ruta(del(sistema(de(ficheros(para(que(sea(accesible( desde(el(exterior.(Para(los(usuarios(externos(será(totalmente(transparente,(ya(que(no(se(podrá( diferenciar( si( pertenece( al( árbol( de( DocumentRoot( o( no.( Ejemplo:( Alias( /data/(( “/www/datos/”.( En( este( ejemplo( http://localhost/data(corresponderá( a( la( ruta( local( /www/datos/( Redirect [código] URL-antigua URL-nueva:(Permite(redirigir(una(solicitud( de(una(URL(en(otra.(Adicionalmente(permite(especificar(un(código(de(error(que(será(devuelto( en( la( respuesta( del( servidor.( Es( útil( si( ha( movido( su( web( de( dominio( o( ha( movido( alguna( sección(de(su(web.(Ejemplo:(Redirect(/servicios(http://urlUalternativa/servicios( ScriptAlias alias ruta:(Cuando( el( destino( es( una( carpeta( que( va( a( ser( un( conjunto( de( scripts( CGI( que( van( a( ser( ejecutados.( Por( lo( demás( funciona( igual( que( Alias.( Ejemplo:(ScriptAlias(/cgiUbin/((/var/www/cgi( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_alias.html( ( Mod_asis:%Permite( devolver( a( Apache( un( fichero( sin( especificar( las( cabeceras( que( le( corresponden.( El( tipo( MIME( anunciado( es( httpd/sendUasUis.( Este( módulo( no( dispone( de( directivas.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_asis.html( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 33( Mod_auth:(Usado(para(crear(un(sistema(de(autenticación(que(permita(proteger(el(acceso(a( distintos(recursos.(Los(usuarios(y(grupos(se(guardan(en(un(fichero(de(texto(plano.(Vamos(a(ver( las(dos(únicas(directivas(de(las(que(dispone:( AuthUserFile fichero:(Permite( el( acceso( únicamente( a( los( usuarios( que( están( incluidos( en( el( fichero( especificado.( Para( crear( el( fichero( la( primera( vez( ejecutaremos( el( comando( “htpasswd( –c( fichero( usuario”,( y( para( las( siguientes( veces( “htpasswd( fichero( usuario”.(Suele(especificarse(dentro(de(un(ámbito(específico(como(puede(ser(“<Directory>”.( Ejemplo:(AuthUserFile(/etc/apache2/usuariosAceptados( AuthGroupFile fichero:(El(funcionamiento(es(muy(similar(a(la(directiva(anterior,( pero( especificando( el( grupo( que( tiene( permitido( el( acceso.( Ejemplo:( Ejemplo:( AuthUserFile( /etc/apache2/gruposAceptados( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_auth.html( ( Mod_auth_anon:(A( la( hora( de( crear( un( control( de( acceso,( es( posible( habilitar( un( usuario( anónimo(con(sus(respectivos(datos(para(permitir(acceder(a(zonas(restringidas.(Vamos(a(ver(las( directivas(más(importantes:( Anonymous usuario:(Este( será( el( nombre( (o( nombres)( de( usuario( con( el( que( será( posible( validarse( para( obtener( los( permisos( de( un( usuario( anónimo.( Ejemplo:( Anonymous( anonimo(invitado( Anonymous_LogEmail On|Off: Permite(registrar(la(contraseña(que(ha(introducido( el( usuario( para( poder( loguearse( en( el( caso( de( usar( un( nombre( de( los( especificados( en( la( directiva(anterior.(Esto(es(así(porque(está(pensado(para(que( la(contraseña(sea(el(email(del( usuario.(Ejemplo:(Anonymous_LogEmail(On( Anonymous_MustGiveEmail On|Off:(Si(esta(directiva(está(activada(prohibirá(que( un(usuario(anónimo(se(loguee(sin(contraseña,(y(lo(obligará(a(especificar(su(email(en(el(campo( de(contraseña.(Ejemplo(Anonymous_MustGiveEmail(On( Anonymous_VerifyEmail( On|Off:( Cuando( especificamos( que( el( usuario( debe( introducir( su( email(en(el(campo(contraseña,(activando(esta(directiva(podremos(activar(la(validación(de(este( campo.( Básicamente( se( trata( de( comprobar( que( existan( los( símbolos( “@”( y( “.”.( Ejemplo:( Anonymous_VerifyEmail(On( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_auth_anon.html( ( Mod_auth_digest:(Este(tipo(de( autentificación(es(una(alternativa(a(mod_auth,(que(permite( que(los(datos(de(acceso(sean(almacenados(en(una(base(de(datos.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_auth_digest.html( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 34( ( Mod_autoindex:(Cuando( no( se( especifica( un( fichero( dentro( del( directorio( que( se( solicita( y( además(no(existe(un(documento(por(defecto((como(por(ejemplo(index.html),(este(módulo(se( encarga(de(generar(un(listado(con(los(recursos(disponibles(en(ese(directorio.(El(resultado(es( similar(al(comando(ls(de(Unix,(o(dir(de(Windows.(Las(directivas(de(este(módulo(sirven(para( modificar(ciertos( aspectos(del(listado(como(pueden(ser(los(iconos(o( textos(alternativos.(En( lugar( de( explicar( estas( directivas,( que( pueden( ser( consultadas( en( la( URL( que( aparece( a( continuación,( se( va( a( mostrar( un( ejemplo( de( cómo( activar( un( listado( para( un( directorio( concreto.( <Directory /var/www/documentos> Options + Indexes </Directory> Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_autoindex.html( ( Mod_cache:(En(ocasiones(por(cuestión(de(rendimiento(o(capacidad(del(ancho(de(banda(puede( ser( recomendable( guardar( ciertos( documentos( en( el( disco( del( servidor,( de( forma( que( al( solicitar( estos( recursos( puedan( ser( enviados( al( cliente( con( la( mayor( brevedad( posible.(Se( resumen(las(directivas(más(importantes:( CacheDefaultExpire segundos:(Especifica( el( tiempo( predeterminado( en( segundos( que(un( contenido( quedará( guardado( en( la( caché( por( defecto.( No( afectará( a( documentos(que(no(dispongan(de(fecha(de(última(modificación(o(fecha(de(creación.(Ejemplo:( CacheDefaultExpire(86400( CacheDisable ruta-URL:(Impide(que(todos(los(documentos(que(cuelguen(de(esta( ruta(sean(almacenados(en(caché.(Ejemplo:(CacheDisable(/documentos( CacheEnable tipo ruta-URL:(Habilita( la( caché( para( los( documentos( de( la( ruta( especificada.( Es( posible( especificar( el( tipo( de( manejador( que( controlará( la( caché.Ejemplo:( CacheEnable(mem(/manual( CacheMaxExpire segundos:(Especifica(el(tiempo(predeterminado(en(segundos(que( un(contenido(quedará(guardado(en(la(caché(como(máximo.(Incluso(si(el(documentos(cacheado( dispone( de( su( propia( fecha( de( caducidad,( se( seguirá( aplicando( esta( directiva.( Ejemplo:( CacheDefaultExpire(86400( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_cache.html( ( Mod_cgi:(Permite(ejecutar(scripts(CGI(para(generar(documentos(dinámicos(o(ejecutar(diversas( acciones(en( el(servidor.(CGI(es( una( especificación(de( una(interfaz,(y( permite(usar(cualquier( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 35( lenguaje( siempre( y( cuando( dispongamos( del( intérprete( o( compilador( necesario.(Vamos( a( resumir(a(continuación(la(directiva(más(importante:( ScriptLog fichero: Si(especificamos(un(fichero(en(esta(directiva,(obligaremos(a(que( Apache(registre(todos(los(errores(que(sean(provocados(por(la(ejecución(de(scripts(CGI.(Ejemplo( ScriptLog(logs/cgi_log( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_cgi.html( ( Mod_cgid:(En(el(caso(del(módulo(anterior,(el(coste(que(tiene(la(creación(de(nuevos(procesos( cada( vez( que( se( ejecuta( un( script( CGI( es( altísimo.( Este( módulo( intenta( reducir( este( costo( creando(un(demonio(encargado(de(ejecutar(los(scripts.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_cgid.html( ( Mod_charset_lite:%Este( es( un( módulo( experimental( y( debe( usarse( con( cautela.( Permite( especificar( una( codificación( de( caracteres( para( los( recursos( que( sirve( el( servidor.(Estos( se( pueden( especificar( en( ámbitos( <Directory>( dentro( del( fichero( de( configuración( de( Apache.( Vamos(a(resumir(a(continuación(la(directiva(más(importante:( CharsetDefault charset:(Especifica(el(juego(de(caracteres(con(que(se(devolverá(el( contenido.(Ejemplo:(CharsetDefault(ISOU8859U1( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_charset_lite.html( ( Mod_dav:%Permite( añadir( soporte( al( protocolo( WebDAV,( para( crear,( modificar,( eliminar( y( copiar(recursos(en(un(servidor(remoto.(Puede(ser(muy(útil(para(que(un(editor(de(un(sitio(web( introduzca(contenido(en(el(mismo(sin(necesidad(de(tener(permisos(sobre(el(código(fuente.( Dav On|Off:(Permite( activar( o( desactivar( dicho( protocoloto( en( el( ámbito( en( que( sea( especificado.(Hay(que(tener(especial(cuidado(con(esto(último.(Ejemplo:(Dav(On( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_dav.html( ( Mod_dav_fs:(Necesita(de(Mod_dav(para(funcionar,(ya(que(actúa(como(soporte(de(este(último( para(poder(proporcionarle(acceso(al(sistema(de(ficheros.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_dav_fs.html( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 36( Mod_deflate:%Este(módulo(proporciona(un(filtro(a(la(hora(de(enviar(el(contenido(a(los(clientes.( El(objetivo(es(comprimir(todo(el(contenido(antes(de(enviarlo(a(través(de(la(red,(sacrificando( rendimiento(del(servidor(para(conseguir(un(mejor(rendimiento(de(la(red.(Se(puede(especificar( qué(tipos(de(fichero(pueden(ser(comprimidos(y(en(qué(ámbitos.( SetOutputFilter DEFLATE:(Activa(la(compresión(a(todos(los(documentos(que(estén( contenidos( en( el( ámbito( en( el( que( se( ha( especificado( la( directiva.( Ejemplo:( SetOutputFilter( DEFLATE( AddOutputFilterByType DEFLATE tipoMIME:(Restringe( la( compresión( de( documentos( únicamente( a( aquellos(tipos( MIME( especificados( en( esta( directiva.( Ejemplo:( AddOutputFilterByType(DEFLATE(text/html(text/plain(text/xml.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_deflate.html( ( Mod_dir:%Por(un(lado(permite(redirigir(al(directorio(adecuado(cuando(se(intenta(acceder(a(un( recurso( directorio( en( el( que( no( se( ha( especificado( la( barra( final.( Por( otro( lado( permite( especificar(los(ficheros(por(defecto(que(se(intentarán(cargar(cuando(se(especifique(la(ruta(de( un(directorio.( DirectoryIndex fichero:(Buscará(el(fichero((o(ficheros)(especificado(para(devolverlo( al(cliente(en(el(caso(de(que(el(recurso(que(haya(solicitado(sea(un(directorio.(En(caso(de(indicar( varios,(se(procesarán(en(el(orden(en(que(están(escritos.(Esta(directiva(no(tiene(aplicación(en(el( caso(de(que(Indexes(esté(activado.(Ejemplo:(DirectoryIndex(index.html( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_dir.html( ( Mod_disk_cache:(Este(módulo(implementa(un(manejador(disco.(Necesita(de(mod_cache(para( funcionar.(Uno(de(sus(usos(más(importantes(es(al(usar(Apache(como(proxy.(Estas(son(algunas( de(sus(directivas(más(importantes:( CacheDirLevels niveles:(Indica( el(número( de( niveles( de( subdirectorios( máximo( pueden( ser( almacenados( en( la( caché.( Este( número( no( debe( ser( mayor( que( 20.( Ejemplo:( CacheDirLevels(3( CacheMinFileSize bytes:(Indica(el(número(de(bytes(que(debe(tener(un(documento( como(mínimo(para(poder(ser(almacenado(en(la(caché.(Ejemplo(CacheMinFileSize(64( CacheRoot ruta:(Especifica(la(ruta(donde(serán(almacenados(en(disco(los(ficheros(que( permanezcan(almacenados(en(la(caché.(Ejemplo:(CacheRoot(/var/cache( CacheSize KBytes: Sirve(para(especificar(cuál(es(el(número(máximo(de(KBytes(que( debe(ocupar(en(disco(la(caché.(Ejemplo:(CacheSize(1000000( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_disk_cache.html( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 37( Mod_dumpio:%Para(la(depuración(de(errores(de(entrada(/(salida(se(puede(habilitar(el(fichero( de( registro( de( errores( para( que( sean(almacenados(todos( los( posibles( errores(que( puedan( ocurrir.(Su(configuración(es(muy(sencilla:( DumpIOInput On|Off:(Habilita( la( depuración( de( errores( de( entrada.( Ejemplo:( DumpIOInput(On( DumpIOOutput On|Off: Habilita( la( depuración( de( errores( de( entrada.( Ejemplo:( DumpIOOutput(On( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_dumpio.html( ( Mod_echo:(Este( módulo( actúa( como( un( servidor( de( echo.( Todo( lo( que( sea( tecleado( será( reenviado.( ProtocolEcho on|off:(Simplemente(activa(o(desactiva(el(protocolo.(( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_echo.html( ( Mod_env:(La( funcionalidad( que( implementa( este( módulo( es( la( de( permitir( el( acceso( y( la( modificación( de( las( variables( de( entorno.( Estas( variables( serán( accesibles( por( parte( de( las( páginas(SSI(y(los(script(CGI.( PassEnv variable [variable]:(Especifica(las(variables(que(podrán(ser(accedidas( por(las(páginas(SSI(y(los(scripts(CGI.(Ejemplo:(PassEnv(LD_LIBRARY_PATH( SetEnv variable valor:(Da( un( valor( a( una( nueva( variable( o( modifica( una( ya( existente.(Ejemplo:(SetEnv(SPECIAL_PATH(/foo/bin( UnsetEnv variable [variable]:(Elimina(una(o(más(variables(para(que(no(sean( accesibles(a(las(páginas(SSI(ni(a(los(scripts(CGI.(Ejemplo:(UnsetEnv(LD_LIBRARY_PATH( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_env.html( ( Mod_expires:(Este( módulo( permite( configurar( los( campos( “Expires”( y( “maxUage”( de( la( cabecera(HTTP.(Esto(puede(ser(útil(por(ejemplo(para(ahorrar(ancho(de(banda(de(nuestra(red.( ExpiresActive On|Off:(Habilita( las( cabeceras( “Expires”( y( “CacheUcontrol”( de( los( documentos(servidos.(En( caso(de( ser(activadas(se(fijará(el(criterio(elegido(en(las(siguientes( directivas.(Ejemplo(ExpiresActive(On( ExpiresByType tipoMIME <codigo>segundos:(Establece( un( tiempo( de( expiración(para(los(documentos(que(pertenecen(a(un(determinado(tipo(MIME.(Esta(directiva( sobreescribe(a(ExpiresDefault.(Ejemplo:(ExpiresByTipe(text/html(M604800( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 38( ExpiresDefault <codigo>segundos:(Establece( un( tiempo( de( expiración( cualquier( tipo( de( documento.( Esta( directiva( puede( ser( sobreescrita( por( ExpiresByType.( Ejemplo:(ExpiresDefault((M604800( En(cuanto(al(código(que(se(ha(mencionado(en(las(últimas(dos(directivas,(debe(especificarse( una(“A”(para(especificar(el(acceso(al(documento,(y(una(“M”(para(la(modificación(del(mismo.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_expires.html( ( Mod_ext_filter:(La(utilidad(que(presta(es(pasar(el(cuerpo(de(la(respuesta(a(través(un(programa( externo( antes( de( que( sea( entregado( al( cliente.( Los( programas( no( es( necesario( que( estén( implementados( para( funcionar( con( Apache,( ya( que( está( pensado( para( que( los( programas( externos(lean(de(la(entrada(estándar(y(escriban(por(la(salida(estándar.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_ext_filter.html( ( Mod_file_cache:(Ofrece(almacenamiento(en(caché(para(servir(ficheros(que(no(necesitan(ser( atendidos( por( controladores( de( contenido( especial.( Este( módulo( debe( ser( utilizado( con( cuidado.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_file_cache.html( ( Mod_headers:(Nos( proporciona( instrumentos( para( controlar( y( modificar( las( solicitudes( y( respuestas( HTTP.( Es( posible( tanto( añadir,( como( modificar,( como( eliminar( todas( aquellas( cabeceras(que(creamos(convenientes.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_headers.html( ( Mod_include:%Este( módulo( sirve( para( analizar( los( documentos( de( servidor( SSI( (Server( Side( Includes).(Está(implementado(como(un(filtro(de(salida,(ya(que(la(intercepta(para(procesar(los( comandos(contenidos(en(dichos(ficheros.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_include.html( ( Mod_info:(Permite(conocer(detalles(sobre(cómo(está(configurado(el(servidor,(qué(directivas( están(activadas,(qué(módulos(están(instalados.(No(se(encuentra(compilado(en(el(servidor(por( defecto,(por(lo(que(deberemos(instalarlo(por(separado.( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 39( ( ( ( ( Este(ejemplo(permite(que(a(través(de(la(ruta(http://localhost/serverUinfo(podamos(acceder(a( una( página( con( la( información( del( servidor( al( completo.( Si( desea( modificar( los( permisos( modifique( la( línea( “Allow( from”,( añadiendo( los( lugares( desde( los( cuales( desea( autorizar( el( acceso(a(esta(información.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_info.html( ( Mod_isapi:(Esta(opción(únicamente(está(disponible(para(la(versión(para(Windows(de(Apache.( Su( utilidad( es( permitir( cargar( extensiones( ISAPI( escritos( por( terceros( para( añadir( nuevas( funcionalidades(a(nuestro(servidor.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_isapi.html(( ( Mod_ldap:(Permite(que(el(servidor(realice(conexiones(a(servidores(LDAP,(puede(utilizarse(para( verificación(de(credenciales(de(acceso,(o(alojamiento(de(ficheros.(A(pesar(de(que(dispone(de( gran(cantidad(de(directivas(aquí(no(se(van(a(comentar.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_ldap.html( ( Mod_log_conf:(Es(el(encargado(de(llevar(el(registro(de(las(peticiones(que(registra(el(servidor( web.(Permite(configurar(al(detalle(cual(es(el(formato(que(tendrán(los(registros(que(queden( guardados(en(el(fichero(log.(Hay(que(tener(especial(atención(con(los(permisos(que(se(le(aplican( a( este( fichero,( ya( que( puede( ser( un( gran( riesgo( de( seguridad( si( no( es( tratado( convenientemente.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_log_config.html( ( Mod_log_forensic:%Es(un(registro(similar(al(anterior,(pero(mucho(más(estricto,(ya(que(por(cada( petición( registra( antes( y( después( de( procesar( la( solicitud.( Existe( un( script( llamado( “check_forensic”(que(permite(comprobar(si(el(formato(de(log(configurado(es(correcto(antes(de( reiniciar(el(servidor.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_log_forensic.html( ( <Location /server-info> SetHandler server-info Order deny,allow Allow from 127.0.0.1 </Location> PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 40( Mod_logio:(La( funcionalidad( de( este( módulo( es( el( registro( en( el( log( de( las( operaciones( de( entrada(y(salida.(Además(registra(también(el(número(de(bytes(enviados(/(recibidos(en(cada( petición.(Este(módulo(requiere(mod_log_config.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_logio.html( ( Mod_mem_cache:%Este(módulo(por(el(momento(es(todavía(experimental(por(lo(que(hay(que( utilizarlo(con(cuidado.(Su(función(es(proveer(un(administrador(de(memoria(para(los(ficheros( que(se(van(a(almacenar(en(la(caché.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_mem_cache.html( ( Mod_mime:%Sirve(para(asociar(una(extensión(de(fichero(a(un(tipo(de(fichero,(al(lenguaje(del( juego( de( caracteres( y( la( codificación( apropiada.( Esta( información( es( utilizada( por( el( cliente( para( la( negociación( del( tipo( de( contenido.( Por( ejemplo( lo( usaremos( para( indicar( que( los( ficheros(con(extensión(.gif(pertenecen(al(tipo(MIME(image/gif.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_mime.html( ( Mod_mime_magic:%En(los(casos(en(los(que(mod_mime(no(pueda(concretar(cuál(es(el(tipo( MIME(del(fichero( que(se( va(a(servir,(este(módulo(leerá( los(primeros(bytes(del(fichero(para( intentar(averiguarlo(y(que(se(pueda(anunciar(correctamente(su(tipo(MIME.(Hay(que(tener(en( cuenta( que( si( este( módulo( se( ejecuta( constantemente( el( rendimiento( del( servidor( se( verá( afectado(seriamente,(por(lo(que(deberemos(intentar(que(el(módulo(mod_mime(sea(capaz(de( averiguar(el(tipo(MIME(de(la(mayor(cantidad(de(ficheros(posible.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_mime_magic.html( ( Mod_negotiation:(Permite(la(negociación(de(contenido,(para(permitir(servir(a(los(clientes(el( contenido( que( mejor( se( adapte( a( sus( necesidades( en( el( caso( de( haber( varios( documentos( disponibles.( Entre( los( parámetros( con( los( que( trabaja( este( módulo( están( el( tipo( MIME,( el( idioma(en(el(que(se(encuentran(escritos,(o(la(codificación(utilizada.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_negotiation.html( ( Mod_proxy:(Con(este(módulo(se(puede(crear(un(servidor(proxy(válido(para(tratar(peticiones( HTTP( 1.0,( HTTP( 1.1,( HTTPS( y( FTP.( Las( funcionalidades( del( almacenamiento( en( caché( son( proporcionadas( por( mod_cache.( A( través( de( las( directivas( de( este( módulo( podemos( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 41( configurar(opciones(como(el(sitio(del(que(será(proxy,(los(permisos,(los(tiempos(de(espera,(el( máximo(número(de(conexiones,(el(tamaño(de(los(buffers…( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_proxy.html( ( Mod_proxy_connect:(Implementa(la(petición(“CONNECT”(de(HTTP(bajo(una(conexión(a(través( de(un(proxy((normalmente(bajo(conexiones(encriptadas(SSL).(Para(que(este(módulo(funcione( es(necesario(que(en(el(servidor(se(encuentre(activado(el(módulo(mod_proxy.(No(dispone(de( directivas(que(permitan(configurarlo.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_proxy_connect.html( ( Mod_proxy_ftp:%Implementa(el(soporta(para(conexiones(FTP(a(través(de(proxy.(Para(que(este( módulo( funcione( es( necesario( que( en( el( servidor( se( encuentre( activado( el( módulo( mod_proxy.(No(dispone(de(directivas(que(permitan(configurarlo.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_proxy_ftp.html( ( Mod_proxy_http:%Implementa(el(soporta(para(conexiones(FTP(a(través(de(proxy.(Para(que(este( módulo( funcione( es( necesario( que( en( el( servidor( se( encuentre( activado( el( módulo( mod_proxy.(No(dispone(de(directivas(que(permitan(configurarlo.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_proxy_http.html( ( Mod_rewrite:%Mediante(expresiones(regulares(es(capaz(de(utilizar(un(motor(incorporado(para( la( reescritura( de( URLs.( Las( reglas( que( se( pueden( crear( para( reescribir( las( URLs( son( muy( potentes(y(permiten(una(gran(cantidad(de(posibilidades.(Es(capaz(de(establecer(condiciones(en( base( a( las( variables( de( entorno,( los( encabezados( HTTP,( y( un( gran( número( de( parámetros( diferentes.(Además(la(reescritura(de(URLs(puede(encadenarse(hasta(que(nosotros(queramos,( unida(con(un(número(infinito(de(reglas,(nos(da(unas(posibilidades(difíciles(de(imaginar.( Cuando( el( servidor( recibe( una( petición,( automáticamente( esta( la( pasas( al( módulo( mod_rewrite.(A(partir(de(este(momento,(se(buscará(en(las(reglas(disponibles(si(existe(una( expresión(regular(que(coincida(con(la(URL(a(la(que(está(realizando(la(petición(el(usuario.(Si(al( menos(una(de(ellas(coincide(se(le(aplicará(la(regla(de(reescritura,(que(dará(como(resultado(una( URL( nueva( que( será( la( que( se( pasará( al( motor( de( Apache( para( que( devuelva( el( contenido( correspondiente(al(cliente.( Más(información:(http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 48( Para( ello( iremos( al( directorio( de( publicación( del( servidor( web( y( crearemos( un( nuevo( documento( al( que( podemos( llamar( “php.php”.( El( contenido( de( este( documento( será( el( siguiente:( ( ( ( ( Ahora(deberemos(cargar(el(documento(que(acabamos(de(crear(en(nuestro(navegador,(para( ello( deberemos( cargar( la( dirección( http://localhost/php.php(y( obtendremos( un( resultado( como( el( que( aparece( en( la( siguiente( imagen.( Ello( será( síntoma( de( que( la( instalación( ha( funcionado(correctamente,(pero(además(nos(permitirá(conocer(datos(sobre(la(configuración( de(todo(lo(relativo(con(la(instalación(PHP.( ( ( ( ( 5.2.3.2.%&Configurar&PHP& ( Aunque( PHP( viene( con( una( configuración( por( defecto,( en( ocasiones( puede( ser( interesante( modificarla( según( las( necesidades( de( nuestra( aplicación.( Los( motivos( de( más( peso( para( modificar( dicha(configuración( son( los( relativos( a( la( seguridad( de( nuestro( sistema,( la( compatibilidad(con(el(código(de(las(aplicaciones(que(se(ejecuten,(o(el(rendimiento(del(servidor.( <?php phpinfo(); ?> PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 49( Para(la(configuración(del(intérprete(de(PHP,(existe(un(fichero(de(texto(plano(llamado(php.ini,( que( puede( encontrarse( en( el( directorio( donde( está( instalado( PHP.( Al( igual( que( ocurría( en( Apache,(esta(es(la(principal(forma(de(configurar(las(directivas.( A(continuación(se(repasarán(las(directivas(más(importantes(que(deberemos(tener(en(cuenta:( register_globals:(En(versiones( anteriores( de( PHP( al( procesar( un( formulario,( los( campos( se( convertían( en( variables( globales,( con( el( riesgo( que( puede( conllevar( si( alguna( coincide( en( nombre(con(alguna(registrada(con(anterioridad.(Es(aconsejable(desactivar(esta(características,( ya(que(en(las(nuevas(versiones(de(PHP(se(aconseja(utilizar(las(variables(superglobales($_POST(y( $_GET.( display_errors:(Por(defecto(cuando(en(nuestra(aplicación(se(produce(un(error,(el(motor(PHP(lo( muestra(por(la(salida(estándar((impreso(en(pantalla).(Esta(funcionalidad(es(interesante(en(un( entorno(de( desarrollo(para( poder(tener(una( mejor(idea( del( error( que(ha( ocurrido,(y( poder( subsanarlo.(Por(otra(parte,(no(es(aconsejable(en(un(servidor(de(producción,(ya(que(revelaría( detalles(importantes(del(funcionamiento(de(nuestra(aplicación.( log_errors:(Es( aconsejable( que( los( errores( que( se( producen( en( nuestras( aplicaciones( sean( registrados(en(un(fichero(log(para(poder(ser(analizados(en(un(futuro(por(el(administrador(o( desarrollador(del(sitio.(Esto(se(hace(para(redirigir(los(errores(a(quien(realmente(puede(sacarles( partido,(ya(que(a(un(usuario(poco(le(importa(qué(tipo(de(error(interno(ha(ocurrido.( error_log:(Indica(un(nombre(de(fichero(al(que(se(enviarán(los(errores(generados(en(caso(de( tener(activada(la(directiva(anterior.(También(es(posible(enviarlos(al(log(de(registro(del(sistema( especificando(“syslog”.( error_reporting:(Indica(el(grado(de(reporte(de(los(errores(que(llevará(a(cabo(el(motor(PHP.(Es( posible( especificar( que( reporte( también( las( advertencias,( ya( que( por( defecto( únicamente( reporta(los(errores.( magic_quotes_gpc:(Sirve( para( escapar( caracteres( especiales( en( los( datos( de( entrada(del( usuario.(Su(objetivo(es(ofrecer(una(mayor(comodidad(al(desarrollador(a(la(hora(de(programar( una(aplicación,(pero(su(uso(es(desaconsejable(por(motivos(de(compatibilidad.(De(todas(formas( si(su(base(de(datos(y(el(resto(de(su(aplicación(es(compatible(puede(utilizarla.( variables_order%=%“GPCS”:(Al(especificarlo(de(esta(forma,(PHP(no(genera(la(matriz($_ENV(que( se(utiliza(para(almacenar(las(variables(de(entorno.(La(alternativa(es(utilizar(la(función(getenv()( para(recuperar(las(variables(de(entorno.( short_open_tag=%On:%Permite(usar(en(los(scripts(etiquetas(abreviadas(<?(…(?>.(Si(el(valor(es( off,(la(forma(<?php(…(?>(o(<script>.(Aconsejable(dejarlo(a(off( precision%=%10:(máximo(de(posiciones(decimales(visualizadas(por(pantalla.( zlib.output_compression%=%Off:(Habilita(la(compresión(mediante(la(librería(zlib(de(los(datos(de( salida(del(script.( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 50( disable_functions%=%:(Permite(deshabilitar(las(funciones(PHP(indicadas(en(esta(directiva.(Si(va(a( inhabilitar(varias,(debe(separarlas(con(punto(y(como(“;”.( max_execution_time%=%30:(Fija(el(máximo(de(segundos(que(va(a(estar(ejecutándose(un(script( antes(de(ser(finalizado.(Previene(errores(en(el(código(que(puedan(provocar(bucles(infinitos.( log_errors_max_len% =% 1024% :(Especifica( el( tamaño( máximo( en( bytes( del( fichero( error_log.( Puede(especificar(0(si(no(desea(límite.( ignore_repeated_errors%=%Off%:(Ignora(errores(repetidos(en(el(fichero(de(anotaciones.( memory_limit%=%8M:(Fija(el(tamaño(de(memoria(máximo(que(puede(utilizar(un(script(durante( su(ejecución.(También(evita(errores(de(código.( post_max_size%=%8% M% :(Podemos(especificar(el(tamaño(máximo(de(los(datos(aceptados(por( método(POST.( default_charset%=%“isoS8859S1”%:(Será(el(código(de(caracteres(enviado(por(PHP(en(la(cabecera( de(salida.( default_mimetype% =% “text/html”% :(Será( el( tipo( MIME( que( se( enviará( por( defecto( en( la( cabecera(de(salida.( file_uploads%=%On%:(Indica(si(se(desea(habilitar(o(deshabilitar(la(subida(de(ficheros(mediante( HTTP( upload_tmp_dir%=%:(Directorio(donde(se(guardarán(de(forma(temporal(los(archivos(subido(al( servidor(mediante(PHP( upload_max_filesize%=%2M%:(Indica(el(tamaño(máximo(de(los(ficheros(que(pueden(subirse(al( servidor( extension% =% :(Permite( indicar( las( extensiones( que( desea( que( cargue( PHP( en( el( proceso( de( arranque( ( ( ( 5.2.4$!Monitorización! ( Uno(de(los(aspectos(más(importantes(una(vez(tenemos(implantado(nuestro(servidor,(es(ser( capaces( de(recabar( ciertos( datos(sobre( el( funcionamiento( habitual(de(todo(el(sistema(para( comprobar(que(no(se(dan(situaciones(anómalas.(A(pesar(de(que(esta(situación(es(deseable(en( un(entorno(de(producción,(esto(no(significa(que(no(deba(usarse(en(un(entorno(de(desarrollo.( Por(un(lado(será(importante(en(el(entorno(de(desarrollo(antes(de(la(publicación(de(nuestro( sitio,( para( comprobar( si( los( requisitos( de( nuestra( aplicación( son( aceptables,( o( si( por( el( contrario(deberíamos(seguir(optimizando(nuestra(aplicación.(También(son(útiles(para(conocer( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 51( las(advertencias(y(errores(que(provoca(nuestra(aplicación,(y(que(de(otro(modo(no(seríamos( capaces(de(descubrir.(Para(ello(se(aplicarán(distintos(tests(tanto(unitarios(como(peticiones(al( servidor(web(para(comprobar,(por(ejemplo,(el(número(de(conexiones(que(es(capaz(de(aceptar( el(servidor,(o(el(tiempo(medio(de(procesamiento(de(cada(solicitud.( Por(otro(lado(será(importante(en(un(entorno(de(producción,(cuando(nuestra(aplicación(ya(se( encuentre(publicada(y(los(usuarios(ya(hagan(un(uso(continuado(de(la(misma.(Aquí(son(varias( las(opciones(que(se(nos(plantean,(entre(las(cuales(se(incluyen(los(registros(de(accesos(y(errores( del(servidor,(e(informes(sobre(los(usuarios(que(acceden(a(nuestra(aplicación.(Aquí(deberemos( dejar(de(realizar(pruebas(de(rendimiento(puesto(que(puede(afectar(a(la(calidad(de(nuestra( aplicación(y( al(funcionamiento(de(la(misma,( pudiendo( provocar(fallos(y(falta(de( servicio(de( nuestros( clientes.( Todas( estas( pruebas( deberán( realizarse( en( un( entorno( aislado( que( podríamos(considerar(como(entorno(de(desarrollo.( Todas( estas( informaciones( son( muy( importantes( para( conocer( las( limitaciones( de( nuestro( servicio((unión(de(las(limitaciones(del(servidor(y(de(las(limitaciones(de(la(aplicación)(y(el(uso( real( que( se( le( da( a( nuestro( servicio.( Esto( nos( permitirá( definir( mejor(los( objetivos( que( desearemos( conseguir,( tanto( en( el( momento( presente,( como( en( vistas( a( futuras( actualizaciones.( (También(es(importante(por(razones(de(marketing(y(valor(de(mercado,(ya(que(si(conocemos( mejor( a( nuestro( usuario( medio,(podemos(conseguir( segmentar( mejor( dependiendo( de( los( clientes( a( los( cuales( nos( dirigimos,( ya( que( razones( culturales,( ideológicas( o( de( idiomáticas( pueden( ser( suficientes( para( que( un( cliente( acabe( con( una( posible( relación( comercial( con( nuestra(empresa.( ( 5.2.4.1.%Entorno&de&desarrollo& ( Modulo%mod_info% Este(módulo(nos(ofrece(una(gran(cantidad(de(datos(sobre(la(configuración(actual(del(servidor,( permitiendo( acceder( a( esta( información( de( un( modo( cómodo( a( través( una( página( web( accesible(desde(el(navegador.(Este(módulo(no(está(compilado(por(defecto(por(defecto(en(la( instalación(estándar,(por(lo(que(deberemos(añadirlo(a(la(compilación(o(bien(instalarlo(como( módulo(dinámico.(((estos(pasos(han(sido(explicados(en(apartados(anteriores()( Partiendo(de(la(suposición(de(que(el(módulo(ya(está(compilado(y(configurado,(pasemos(a(la( configuración( del( mismo.( Para(lo( cual(deberemos(abrir(el(fichero(de( configuración(y( añadir( algunas(líneas:( ( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 52( ( ( ( ( ( ( ( Estas( directivas(habilitan( la( información( del( servidor( en( la( localización( “serverUinfo”( del( servidor,(por(lo(que(la(dirección(completa(a(la(que(deberemos(acceder(para(su(consulta(será( por(lo(tanto(http://localhost/serverUinfo.(Por(otro(lado,(se(han(deshabilitado(todos(los(accesos( desde( el( exterior( de( la( máquina,( permitiendo( acceder( únicamente( desde( el( propio( equipo( local.(Si(queremos(habilitar(más(equipos(para(que(puedan(acceder(a(este(informe(deberemos( incluirlos(en(la(lista(“Allow(from”.( Recuerde(reiniciar(el(servidor(para(que(las(modificaciones(surjan(efecto.( En(la(imagen(siguiente(se(puede(apreciar(un(ejemplo(de(un(servidor(ejecutando(las(directivas( anteriores:( ( ( ( <Location /server-info> SetHandler server-info Order deny,allow Deny from all Allow from 127.0.0.1 </Directory> PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 53( Módulo%mod_status% De( igual( manera( que( en( el( caso( anterior,( el( módulo( mod_status( ofrece( una( serie( de( informaciones(en(la(ventana(del(propio(navegador,(accesible(a(través(de(una(URL.(Este(módulo( tampoco(está(compilado(por(defecto.( Parte(de(la(información(que(podemos(recabar(de(este(módulo(son(los(momentos(de(último( inicio(y(reinicio,(número(de(peticiones,(número(de(bytes(enviados(y(recibidos,(estado(de(los( procesos(hijos,(porcentaje(de(utilización(de(los(recursos(hardware(del(servidor( ( ( ( ( ( ( ( ( ( En( el( código( anterior( no( se( ha( comentado( el( uso( de( la(directiva( “ExtendedStatus”( nos( proporciona( un( grado( de( información( mayor(que( el( que( viene( activado( por( defecto.( Si( no( activáramos(esta(directiva,(algunos(de(los(datos(que(se(han(indicado(en(el(párrafo(anterior(no( serían(mostrado(en(nuestro(informe.( Esto(habilita(la(información(del(servidor(en(la(localización(“serverUstatus”(del(servidor,(por(lo( que( la( dirección( completa( a( la( que( deberemos( acceder( será( por( lo( tanto( http://localhost/serverUstatus.(Por(otro(lado,(se(han(deshabilitado(todos(los(accesos(desde(el( exterior(de(la(máquina,(permitiendo(acceder(únicamente(desde(este(equipo(local.(Si(queremos( habilitar(más(equipos(para(que(puedan(acceder(a(este(informe(deberemos(incluirlos(en(la(lista( “Allow(from”.( Volver(a(recordar(que(para(que(los(cambios(sean(efectivos(habrá(que(reiniciar(Apache.(Esto(es( un(ejemplo(de(lo(que(se(podrá(ver(una(vez(configurado:(( ExtendedStatus on <Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 127.0.0.1 </Directory> PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 54( ( ( ( Test%ab%(apache%benchmark)% Uno(de(los(datos(fundamentales(que(debemos(tener(en(cuenta(a(lo(hora(de(implantar(nuestro( servicio( es( conocer( cual( es( la( carga( máxima( que( sería( capaz( de( soportar( todo( nuestro( entramado.(El(objetivo(de(conocer(este(dato(es,(por(un(lado(conocer(las(posibles(limitaciones( que(puede(tener(nuestro(hardware(para(tener(en(cuenta(las(actualizaciones(más(convenientes( de(los(componentes(del(servidor.(Por(otro(lado,(sería(la(posible(mejora(del(rendimiento(de( nuestra( aplicación,( ya( que( es( posible( que( nuestra( aplicación( no( sea( todo( lo( eficiente( que( debería(ser(para(servir(todas(las(peticiones.( Se(ha(hablado(tanto(de(una(actualización(hardware(como(software,(pero(evidentemente(estos( procesos(dependerán(de(los(resultados(arrojados(por(dicho(test.(Estos(resultados(dependerán( enormemente(de(los(requisitos(de(los(que(conste(nuestra(aplicación,(ya(que(no(es(lo(mismo(un( sitio(con(alta(carga,(que(uno(con(baja(carga.(Ni(uno(con(número(de(visitas(altas,(que(una(con( bajas.( Por( lo( tanto,( lo( importante( es( definir( unos( requisitos( de( disponibilidad( y( tratar( de( alcanzarlos,(comprobando(su(aplicación(desde(esta(herramienta.( A(pesar(de(que(existen(multitud(de(herramientas,(tanto(de(software(libre(como(privativas,(en( este(proyecto(se(va(a(optar(por(utilizar(Apache(Benchmark.(Dicha(herramienta(se(incluye(con(la( distribución( del( propio( servidor( Apache,( con( la( misma( licencia( de( utilización( y( distribución.( Podemos(probar(el(comando(escribiendo(“ab”(en(el(terminal.(En(caso(de(que(el(sistema(no( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 55( encuentre(el(comando,(probablemente(es(que(la(ruta(no(se(encuentre(en(el(path,(por(lo(que( deberemos(ejecutarlo(colocándonos(en(el(directorio(bin(de(Apache.( Vamos(a(ver(ahora(las(distintas(opciones(que(podemos(manejar(con(esta(herramienta:( ( ( Uso:%ab%[opciones]%[http[s]://]hostname[:port]/path% Las(opciones(son(las(siguientes:(( Un(peticiones(((((Número(de(peticiones(que(se(van(a(llevar(a(cabo( Uc(peticiones(Número(de(peticiones(que(se(envían(al(mismo(tiempo( Ut(tiempo(Número(de(segundos(máximos(que(se(esperarán(a(las(respuestas( Ub(tamaño(((Tamaño(en(bytes(del(búffer(TCP(par(enviar(/(recibir( Up(postfile((((((Fichero(que(contiene(los(datos(a(enviar(mediante(POST.(Recordar(usar(UT( Uu(putfile(((((((Fichero(que(contiene(los(datos(a(enviar(mediante(PUT.(Recordar(usar(UT( UT(tipoMIME(((((Tipo(MIME(de(el(contenido(que(se(va(a(enviar(por(ejemplo:( ((((((((((((((((((( ('application/xUwwwUformUurlencoded'( (((((((((((((((( Por(defecto('text/plain'( Uv(verbosity(Muestra(una(mayor(cantidad(de(información(por(pantalla( Uw((((((((((((((Imprime(el(resultado(en(tablas(HTML( Ui(((((((((((((((Use(HEAD(en(lugar(de(GET((esto(es(pedir(la(cabecera,(en(lugar(del(documento)( Ux(atributo(Cadena(a(insertar(en(los(atributos(de(la(tabla( Uy(atributo(Cadena(a(insertar(en(los(atributos(de(la(fila( Uz(atributo(Cadena(a(insertar(en(los(atributos(de(celda(o(encabezado( UC(atributo( Añade(una(cookie,(por(ejemplo.('Apache=1234.((se(puede(repetir)( UH(attribute(Añade(una(línea(de(cabecera(aleatoria,(por(ejemplo:('AcceptUEncoding:(gzip'( (((((((((((((((((((((Se(inserta(después(de(todas(las(líneas(de(cabecera(normales.( UA(attribute(Añade(Autenticación(Básica(WWW,(los(atributos(son(usuario(y(password( UP(attribute(Añade(Autenticación(para(el(proxy,(los(atributos(son(usuario(y(password(( UX(proxy:port(Dirección(del(servidor(Proxy(y(puerto(a(usar( UV( ( Únicamente(muestra(el(número(de(versión( Uk( ( Usa(conexiones(HTTP(1.1( Ud( ( No(muestra(porcentajes(en(la(tabla(guardada( US( ( No(muestra(estimaciones(confidenciales,(ni(advertencias( Ug(fichero(La(salida(se(genera(en(formato(gnuplot( Ue(fichero(La(salida(se(genera(en(formato(CSV(( Ur( ( No(sale(del(socket(si(ha(recibido(algún(error( Uf(protocolo( Especifica(el(protocolo(SSL/TLS((SSL2,(SSL3,(TLS1,(o(ALL)( ( Dada( la( gran( cantidad( de( opciones( que( hay( vamos( a( ilustrar( mejor( esta( utilidad( con( un( ejemplo.( En( nuestro( supuesto( queremos( ver( el( comportamiento( de( nuestro( servidor( realizando(1000(peticiones,(50(de(ellas(de(forma(simultánea.(Esto(significa(que(si(ya(hay(50( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 56( peticiones(procesándose,(hasta(que(no(acabe(una(de(ellas(no(podrá(procesarse(la(siguiente.(La( dirección( que( se( va( a( solicitar( es( http://192.168.0.196/actividades.php.(El(comando(que( deberemos(usar(para(el(ejemplo(será:( ( ( Hay(que(decir(que(la(elección(del(recurso(que(se(ha(solicitado(en(el(ejemplo(anterior(no(es(una( casualidad,(ya(que(contiene(una(mezcla(de(código(html(y(php(que(debe(ser(ejecutado(por(el( servidor(en(el(momento(que(se(realiza(la(petición(por(parte(del(cliente.(En(este(caso(también( tiene(una(carga(adicional(que(debe(subsanar(el(servidor(de(base(de(datos,(ya(que(se(encarga( de(mostrar(todas(las(tuplas(de(la(tabla(“actividades”(por(pantalla.( Una(vez(ejecutado(el(comando,(la(respuesta(puede(tardar(un(tiempo,(dependiendo(de(los( valores(que(hayamos(introducido.(El(resultado(obtenido(es(el(siguiente:( ( ( Total(de(peticiones,(tiempo( empleado,(errores( Datos(del(documento( Datos(del(servidor( Mejor(tiempo,(peor( tiempo(y(media( Estadísticas(varias( Porcentaje(de(finalización(en( distintos(espacios(de(tiempo( $ ab -n 1000 -c 50 http://192.168.0.196/actividades.php PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 57( ( Ahora(vamos(a(pasar(a(analizar(las(distintas(informaciones(que(nos(proporciona(esta( herramienta,(ya(que(a(primera(vista(son(un(tanto(confusas(y(no(deja(suficientemente(claro(qué( indica(cada(valor.( Como(algunos(datos(parecen(obvios,(no(se(van(a(explicar.(Estos(datos(aparecen(rotulados(en(la( imagen(anterior(como(“datos(del(servidor”(y(“datos(del(documento”.(Del(siguiente(apartado(la( mayoría(son(los(datos(que(hemos(introducido(nosotros(como(parámetros(al(ejecutable,(pero( aparece(el(primer(dato(importante(aparece(como(“Time(taken(for(tests”(y(nos(indica(el(tiempo( máximo(que(se(ha(necesitado(para(llevar(a(cabo(la(totalidad(de(las(peticiones.( En(el(siguiente(apartado(vemos(datos(como(el(total(de(datos(transferidos,(el(total( perteneciente(únicamente(a(documentos(HTML,(el(número(de(respuestas(por(segundo,(el( número(de(respuestas(por(segundo(cuando(están(activas(todas(las(conexiones(simultáneas,((y( la(tasa(de(transferencia.(Los(datos(más(relevantes(de(este(apartado(son(el(tiempo(que( tardamos(en(recibir(una(respuesta((que(nos(ayudará(a(evaluar(si(debemos(optimizar(nuestro( sistema,(tanto(en(hardware(como(en(software),(y(el(ratio(de(transferencia(ya(que(nos(permite( evaluar(la(configuración(TCP/IP(y(la(red(en(general.( En(el(apartado(de(los(tiempos(de(conexión(podemos(analizar(más(a(fondo(el(desglose(de(los( tiempos(que(han(tardado(en(realizarse(las(distintas(fases(de(la(prueba.(Estas(fases(son(la( conexión,(el(proceso,(y(el(tiempo(de(espera.(A(su(vez(nos(indica(el(tiempo(mínimo(y(máximo( registrado,(y(la(media.( El(último(apartado(indica(los(porcentajes(de(finalización(en(los(distintos(espacios(de(tiempo,(y( puede(ser(el(apartado(más(difícil(de(comprender.(Básicamente(el(ejemplo(anterior(indica(que( el(50%(de(las(peticiones(han(acabado(en(578ms,(el(66%(han(acabado(en(664ms,(75%(en( 719ms,(y(así(sucesivamente(hasta(llegar(al(100%.( ( 5.2.4.2.%Entorno&de&producción& % Registro%de%logs% Uno( de( los( datos( más( valiosos( que( disponen( los( administradores( de( sistemas( es( la( propia( información( que( se( va( generando( mediante( el( uso( continuo( de( los( propios( sistemas.(Esta( información( se( genera( en( el( transcurso( de( distintos( eventos( que( van( ocurriendo,( como( peticiones,(accesos(comunes,(errores,(peticiones(incorrectas,(etc.( La( primera( reflexión( a( la(que(podemos( llegar(es(que( para( que( se(puedan( analizar,(primero( deberán(ser(creados,(y(no(sólo(eso,(si(no(que(deberán(estar(en(un(formato(adecuado(para(ser( procesado(más(tarde,(y(deberá(incluir(tantos(datos(como(necesitemos(para(disponer(de(datos( suficientes(para(el(análisis.( La(primera(directiva(que(podemos(analizar(es(“LogLevel”,(que(está(incluido(en(el(núcleo(del( servidor( Apache,( por( lo( que( no( deberemos( instalar( nada( para( comenzar( a( utilizarla.( Su( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 64( ( ( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 65( Mantenimiento%logs% No(vamos(a(negar(que(el(uso(de(logs((es(un(gran(avance(para(el(administrador(del(servidor,( pero( tenemos( que( tener( en( cuenta( que( no( es( oro( todo( lo( que( reluce( y( tenemos( también( algunos(inconvenientes(que(deberemos(tener(en(cuenta.( Uno(de(ellos(es(el(mantenimiento(que(deberemos(tener(de(los(registros,(ya(que(estos(pueden( crecer( indefinidamente( y( llegar( a( ser( realmente( grandes,( pudiendo( provocar( problemas( de( espacio(en(disco,(cuotas,(o(muchos(otros.(La(solución(a(este(problema(es(la(rotación(de(los( registros.( Las(dos(herramientas(más(importantes(se(llaman(rotatelog(que(viene(incluida(con(la(propia( distribución(de(Apache,(y(logrotate(que(estará(disponible(en(nuestro(sistema(Linux.( A(continuación(vamos(a(utilizar(un(ejemplo(de(cada(herramienta.(En(primer(lugar(vamos(a(ver( rotatelog,(suponiendo(que(deseamos(rotar(los(registros(cada(24(horas.(Para(ello(utilizaremos(la( siguiente(directiva:( ( El(primer(parámetro(se(refiere(a(la(ruta(donde(se(encuentra(el(ejecutable(“rotatelogs”,(que( suele(estar(en(el(directorio(bin(de(nuestra(distribución(de(Apache,(el(segundo(indica(la(ruta( donde(se(encuentra(el(directorio(que(almacena(los(logs,(y(el(tercero(el(tiempo(que(transcurrirá( entre(rotaciones(expresado(en(segundos.( Por(último(vamos(a(analizar(logrotate(que(debería(venir(instalada(en(nuestra(distribución,(para( comprobarlo( simplemente( ejecutarlo( a( ver( si( reconoce( el( comando( (en( caso( de( aparecer( ejecutar(“aptUget(install(logrotate”).( Esta(herramienta(puede(utilizarse(con(cualquier(demonio(que(genere(logs,(por(lo(que(no(es( exclusivo(para(Apache.(Puede(comprobar(si(existe(una(configuración(específica(para(nuestro( servidor(mediante(el(siguiente(comando:(( ( ( ( En(caso(de(que(ya(exista(una(configuración(veremos(una(imagen(como(la(siguiente:( TransferLog “| /ruta/de/rotatelogs /var/log/apache2 86400” $ cat /etc/logrotate.d/apache2 PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 66( ( % % Podemos(modificar(tanto(el(lugar(donde(se(encuentran(los(logs(de(Apache,(como(las(distintas( opciones(entre(las(que(se(encuentran(los(permisos,(la(compresión,(el(transcurso(de( tiempo( entre(rotaciones,(etc.( % % Google%Analytics% Google(Analytics(es(una(herramienta(onUline(que(nos(permite(conocer(una(gran(cantidad(de( datos( sobre( la( audiencia( de( nuestro( sitio(web,( lo( que( nos( permite( conocer( la( afluencia(de( tráfico(entre(otros(muchos(datos.( Es(importante(que(antes(de(tratar(con(un(determinado(colectivo(de(potenciales(clientes((en( adelante(target)(recolectemos(los(datos(suficientes(para(intentar(ser(atractivos(a(sus(ojos.(De( esta(forma(intentaremos(amoldarnos(a(sus(gustos(y(preferencias(para(intentar(captar(mejor(su( atención.(Todo(esto(está(muy(bien(pero(no(serviría(de(nada(si(no(hacemos(un(seguimiento(a( nuestra(campaña(de(marketing.( Ahí(es(donde(entra(en(juego(esta(herramienta.(En(la(imagen(que(se(puede(ver(a(continuación,( se(observa(un(rápido(resumen(de(algunos(datos(de(una(web(de(ejemplo.(En(este(resumen(se( pueden(ver(gráficos(que(permiten(visualizar(los(datos(más(importantes(como(pueden(ser(el( número(de(visitas(de(los(últimos(30(días(o(el(origen(de(nuestras(visitas.( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 67( ( ( En(el(panel(superior(podemos(ver(precisamente(el(número(de(visitantes(únicos(diario(durante( los(últimos(30(días((valor(que(se(puede(modificar(en(la(esquina(superior(izquierda).(Esto(nos( permite(ver(los(días(de(la(semana(tanto(de(mayor,(como(de(menor(afluencia(de(visitantes.(Es( importante( a( la(hora( de( efectuar( campañas( de( marketing,( ya( que( estamos( analizando( las( conductas(de(nuestros(visitantes.( En(el(segundo(panel(se(pueden(visualizar(una(serie(de(valores(que(referidos(al(intervalo(de( tiempo(elegido(más(arriba.(El(primero(es(el(índice(numérico(de(visitas(a(nuestro(sitio(que(nos( ofrece(un(valor(aproximado(de(la(visibilidad(de(nuestro(sitio.(También(aparecen(las(páginas( vistas,(que(a(diferencia(del(valor(anterior(cuenta(el(número(de(visitas(a(las(distintas(páginas(de( nuestro(sitio(aún(siendo(realizadas(por(el(mismo(visitante.(Las(páginas(por(visita(nos(ofrece(una( idea(del(interés(que(genera(nuestra(página(en(los(visitantes(una(vez(que(estos(ya(han(entrado.( Otros(valores(importantes(son(el(porcentaje(de(rebotes(que(son(básicamente(las(personas(que( han(salido(de(nuestra(web(sin(efectuar(ninguna(acción,(el(promedio(de(tiempo(en(el(sitio(y(el( porcentaje(de(visitas(nuevas.( El(tercer(panel(está(separado(a(su(vez(en(dos,(en(los(que(se(muestran(las(fuentes(del(tráfico(y(la( visión(general(del(contenido.(Las(fuentes(de(tráfico(se(dividen(en(motores(de(búsqueda,(que( son( aquellas( visitas( que( provienen( de( algún( buscado,( sitios( web( de( referencia,( que( son( aquellas( visitas( que( provienen( de( un( enlace( de( cualquier(página,( y( tráfico( directo( que( son( principalmente( aquellos( usuarios( que( escriben( la( dirección( en( la( barra( de( direcciones( o( en( marcadores.(El(apartado(de(visión(general(del(contenido(muestra(el(top(5(de(los(documentos( más(visitado(indicando(el(número(de(visitas(y(el(porcentaje(sobre(el(total(del(sitio(web.( El(último(panel(también(está(dividido(en(el(panel(de(visitas(y(el(gráfico(de(visitas(por(ubicación.( El( primero( no( nos( ofrece( una( información( muy(distinta( a( la( del( primer( panel,( salvo( por( la( posibilidad(de(ver(el(informe(completo.(El(segundo(ofrece(un(contenido(muy(importante(y(es( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 68( las( visitas( por( ubicación( donde( podemos( ver( cual( es( el( público( que( más( afluencia( tiene( en( nuestro(sitio.( A(pesar(de(que(nos(parezca(que(de(un(simple(vistazo(tenemos(todos(los(datos(necesarios,(esto( es(sólo(el(principio,(ya(que(en(cada(apartado(existe(un(enlace(para(ampliar(más(información(y( ver(un(detalle(pormenorizado(de(cada(uno(de(los(aspectos(que(analiza(este(software.(Se(van(a( analizar(los(apartados(que(más(nos(pueden(interesar(para(el(transcurso(de(nuestro(proyecto.( ( 5.2.5.$!Optimización!del!servidor!Apache! ( 5.2.5.1.%&Elección&del&hardware& ( CPU% La(elección(de(la(CPU(depende(del(tipo(de(utilización(que(tenga(nuestro(servidor(Apache,(ya( que( a( priori( no( es( una( de( las( decisiones( cruciales( que( afecten( al( rendimiento( en( primera( instancia.(Si(nuestra(aplicación(son(mayormente(páginas(estáticas,(la(CPU(no(va(a(ser(un(factor( determinante.(Si(por(el(contrario,(nuestra(aplicación(está(compuesta(mayormente(por(páginas( dinámicas,(si(que(se(necesitará(una(CPU(potente.( Existen( CPUs( específicas,( especialmente( diseñadas( para( su( uso( en( servidores.( Dichas( CPUs( cuentan( con( mayores( tamaños( de( caché,( alto( rendimiento,( comunicación( con( otros( procesadores,(mayor(número(de(núcleos,(alta(velocidad(en(los(buses,(etc.(Todo(esto(hace(que( estén( enfocados( para( tareas( de( alto( procesamiento.( Ejemplos( de( estas( CPUs( preparadas( específicamente(para(servidores(son(Intel(Xeon(y(AMD(Opteron.( ( Memoria% A( la( hora( de( elegir( la( memoria( RAM( debemos( tener( en( cuenta( que( nuestra( necesidad( de( rendimiento( puede( venir( tanto( por( falta( de( velocidad,( como( por( falta( de( cantidad.( Si( necesitamos(velocidad,(deberemos(adecuarnos(a(los(buses(utilizados(por(la(placa(base(y(por(la( CPU.( Si( nuestra( necesidad( viene( por( la( cantidad,( simplemente( deberemos( instalar( más( capacidad,(ya(que(las(placas(bases(a(actuales(suelen(aceptar(gran(cantidad(de(esta.( El(tipo(de(memoria(actuales(más(importantes(es(DDR(3,(basado(en(la(tecnología(SDRAM.(Esta( es(la(mejor(combinación(para(procesadores(mutinúcleo((2,(4(u(6(núcleos).(El(tamaño(máximo( teórico(de(fabricación(de(estos(módulos(es(de(16(GiB.( Es( importante( el( uso( de( herramientas( específicas(a(la( hora( de( contabilizar( la( cantidad( de( memoria(que(necesitaremos(instalar(en(nuestro(servidor.(En(el(caso(de(sistemas(Unix/Linux( existen(herramientas(como(“top”(que(permite(analizar(el(uso(de(memoria(física(y(de(memoria( virtual( en( un( momento( determinado.( La( idea( es( realizar( distintas( pruebas( de( rendimiento( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 69( efectuando(peticiones(y(midiendo(el(comportamiento(de(la(memoria(del(sistema.(Un(ejemplo( de(captura(de(esta(herramienta(se(puede(ver(en(la(siguiente(imagen:( ( ( ( Disco%Duro% El(disco(duro(es(el(elemento(que(malgasta(más(cantidad(de(tiempo(en(el(acceso(a(los(datos( almacenados(en(él,(ya(que(es(el(dispositivo(más(lento.(Por(ello,(es(uno(de(los(elementos(a(los( que(debemos(prestarle(más(interés(a(la(hora(de(su(elección.(Dentro(de(las(tecnologías(por(las( que( podemos( decantarnos( deberemos( interesarnos( por( SATA( o( SCSI,( ya( que( ofrecen( velocidades( de( transferencia( más( altas.( En( cuanto( a( la( tecnología( interna( más( rápida( se( encuentran(los(discos(SSD(que(evitan(el(uso(de(partes(móviles((y(por(lo(tanto(la(velocidad(de( acceso(es(prácticamente(instantánea),(si(no(podemos(permitirnos(esta(tecnología((debido(a(su( alto(precio(y(baja(capacidad),(deberemos(tener(en(cuenta(que(la(velocidad(de(rotación(sea(al( menos(de(10.000(rpm.( Un(servidor(de(hosting(suele(usar(gran(cantidad(de(capacidad(en(datos(almacenados,(entre(los( que(se(incluye(el(propio(sistema(operativo,(los(distintos(servidores,(la(propia(aplicación(web,( imágenes,(videos,(infografías,(etc.( Por( ello( es(importante( tenerlo( en( cuenta(para(elegir(una( capacidad(adecuada(a(nuestros(requisitos.( Otro( aspecto( a( tener( en( cuenta( viene( dado( por( la( capacidad( de( recuperación( de( los( datos( almacenados(en(los(discos(duros.(Hay(que(prestar(especial(atención(en(este(aspecto(ya(que(los( discos(duros(son(puntos(habituales(de(fallos(dada(su(gran(fragilidad.(Lo(más(habitual(es(el(uso( de(sistemas(RAID(que(permita(la(replicación(por(hardware(de(toda(la(información(de(forma( transparente.(Existen(diversos(tipos(de(RAID(que(podemos(usar,(por(lo(que(deberemos(elegir( uno(que(nos(ofrezca(un(precio(y(características(adecuadas(a(nuestras(necesidades.( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 70( 5.3.$Sistema!de!Base!de!datos! ( No(existe(un(sistema(de(base(de(datos(único,(ni(uno(específico(que(tengamos(que(usar(para( nuestro( proyecto( en( particular.( Esto( quiere( decir( que( en( el(mercado( disponemos( de( gran( cantidad(de(alternativas(que(nos(pueden(servir(de(plataforma(para(implementar(nuestra(base( de(datos.( Para(la(gestión(de(todos(los(datos(que(va(a(necesitar(nuestro(sistema(web(vamos(a(necesitar( dos( elementos( diferenciados.( El( primero( va( a( ser( la( propia( información( que( va( a( ser( almacenada(en(el(formato(de(la(base(de(datos(que(elijamos.(Por(otro(lado(tendremos(el(SGBD( (sistema( gestor( de( base( de( datos)( que( será( el( software( encargado( de( administrar( nuestras( peticiones(y(llevarlas(a(cabo,(consultando(o(modificando(los(datos(almacenados.( A(decir(verdad(esta(no(es(la(única(forma(de(almacenar(los(datos(que(puede(necesitar(nuestra( aplicación.( Otra( posibilidad,( aunque( ya( en( desuso,( sería( el( almacenamiento( en( ficheros( de( texto(plano,(el(problema(de(esta(solución(sería(la(duplicidad(de(registros.( La( ventaja( de( un( SGBD( con( respecto( a( otro( tipo( de( soluciones( para( almacenar( grandes( cantidades(de(datos,(es(que(la(gestión(de(los(recursos,(permisos,(concurrencia,(etc.(es(llevada(a( cabo(totalmente(por(el(SGBD.( Para(lograr(este(objetivo,(los(SGBD( proponen(una( serie(de(interfaces(de( programación( que( permiten(al(usuario((o(software(de(terceros)(realizar(todo(tipo(de(operaciones,(encargándose( de( mantener( la( integridad,( confidencialidad( y( seguridad.( Por( ello( se( define( la( siguiente( estructura(de(acceso(a(los(datos(almacenados:( ( ( ( Llegados( a( este( punto( y( habiendo( recalcado( la( necesidad( de( utilización( de( un( SGBD,( el( siguiente(paso(es(ver(qué(puede(ofrecernos(el(mercado(y(decidirnos(por(uno(de(ellos(para(la( utilización(en(nuestra(aplicación.( La(diferenciación(más(importante(que(podemos(hacer(en(estos(momentos(y(dado(el(carácter( de(este(proyecto(fin(de(carrera,(es(la(condición(de(libre(o(no(libre.(Existen(numerosos(SGBD( cuyo( uso( es( completamente( libre( (aunque( algunos( demuestran( ciertas( carencias( para( usos( concretos)( como( pueden( ser( MySQL,( PostgreSQL,( Firebird,( SQLite,( Apache( Derby.( En( el( extremo(opuesto(y(en(su(condición(de(noUlibres(podemos(mencionar(MySQL,(dBase,(Informix,( Microsoft(SQL(Server,(Oracle(y(Paradox.(( Usuario( Programa( de( aplicación( Gestor(de( Base(de( Datos( Base(de( Datos( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 71( Dada(la(gran(cantidad(de(documentación(disponible(para(gestionar(MySQL,(y(las(facilidades( disponibles(para(su(trabajo(junto(a( Apache,(en( este( proyecto(se(ha( optado( por( este( SGBD.( Aunque(probablemente,(si(desde(un(punto(de(vista(objetivo(tuviera(que(escoger(uno(de(la(lista( anterior( elegiría( PostgreSQL( ya( que( es( dirigido( completamente( por( una( comunidad( de( desarrolladores(ajena(a(cualquier(empresa(o(interés(comercial.( A( pesar( de( todo( ello,( con( una( aplicación( bien( desarrollada( y( estructurada( por( capas,( la( adopción(de(un(SGBD(u(otro(implicaría(diferencias(muy(pequeñas.(Tanto,(que(la(migración(de( uno(a(otro(podría(significar(únicamente(el(cambio(de(código(de(una(única(u(dos(funciones(en( todo(la(aplicación.( Entre(principales(características(de(MySQL(está(el(amplio(soporte(para(distintos(lenguajes(de( programación,(alto(rendimiento(gracias(al(uso(de(hilos(por(parte(del(kernel,(gran(escalabilidad( gracias(a(soporte(de(grandes(bases(de(datos(y(gran(cantidad(de(comandos(para(gestionar(las( bases(de(datos((chequeo,(optimización,(reparación…)( ( 5.3.1.$!Instalación!MySQL! ( La( instalación( de( MySQL( puede( de( realizarse( de( diversas( formas( (como( ya( se( ha( visto( con( Apache(y(PHP).(Una(permite(la(descarga(del(código(fuente(para(su(compilación(e(instalación,(la( otra(opción(es(descargarse(un(paquete(preparado(para(funcionar(en(nuestra(distribución(en( concreto.( La( elección( entre( una( u( otra( queda( a( nuestro( criterio,( existiendo( los( mismos( argumentos(que(en(casos(anteriores.( Para(realizar(una(instalación(desde( el(código( fuente,( el( primer(caso( es( descargar( la( versión( desde( el( sitio( web( oficial:( http//dev.mysql.com/downloads.( El( fichero( descargado( es( un( comprimido( tar( con( la( forma( mysqlUVERSION.tar.gz.( Aunque( no( se( ha( probado( tal( configuración( se( han( extraído( las( siguientes( indicaciones( del( sitio( web( oficial( (http://dev.mysql.com/doc/refman/5.0/es/quickUinstall.html):( ( ( ( ( ( ( ( ( $ groupadd mysql $ useradd -g mysql mysql $ gunzip < mysql-VERSION.tar.gz | tar -xvf - $ cd mysql-VERSION $ ./configure --prefix=/usr/local/mysql $ make $ make install $ cp support-files/my-medium.cnf /etc/my.cnf $ cd /usr/local/mysql $ bin/mysql_install_db --user=mysql $ chown -R root . $ chown -R mysql var $ chgrp -R mysql . $ bin/mysqld_safe --user=mysql & PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 72( ( ( ( Para( nuestro( caso( en( particular( se( va( a( utilizar( los( paquetes( predeterminados( de( nuestra( distribución( que( se( pueden( encontrar( en( los( repositorios.( Para( ello( debemos( ejecutar( el( comando:( ( ( Durante(el(proceso(de(instalación(se(nos(solicitará(establecer(una(contraseña(para(el(usuario( root( de( MySQL.( Es( importante( recordar( esta( contraseña( para( futuros( trabajos( de( administración:( ( ( Todavía( queda( un( paso( importante( para( finalizar( la( instalación( de( MySQL,( y( es( instalar( el( módulo( para( PHP( para( que( las( consultas( que( realicen( dichas( aplicaciones( ataquen( directamente( contra( el( SGBD.( Para( ello,( y( suponiendo( que( no( lo( hayamos( instalado( antes,( instalaremos(el(siguiente(paquete:( ( ( ( Si(has(instalado(PHP(desde(las(fuentes,(asegúrate(de(haberlo(compilado(con(la(opción(mysql(( ((UUwithUmysql().(Como(último(paso(queda(comprobar(si(dicho(módulo(está(activado(o(no,(para( ello( comprobaremos( el( fichero( de( configuración( de( php( (en( mi( caso( $ sudo apt-get install mysql-server $ sudo apt-get install php5-mysql PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 73( /etc/php5/apache2/php.ini)( que( la( línea( con( el( contenido( “extensión=mysql.so”( no( esté( comentada(con(un(#(al(principio.( ( 5.3.2.$!Herramienta!phpMyAdmin! ( Para(facilitar(la(gestión(de(la(base(de(datos(vamos(a(utilizar(una(herramienta(de(software(libre( llamada(phpMyAdmin.(Dicha(herramienta(funciona(a(través(de(nuestro(servidor(web,(puesto( que(está(escrita(en(PHP.(Algunas(de(las(operaciones(más(utilizadas(son(el(manejo(de(la(base(de( datos,(tablas,(campos,(relaciones,(índices,(usuarios,(permisos,(etc.( Otra( ventaja( que( podemos( obtener( mediante( la( utilización( de( esta( herramienta,( es( que( podemos( ejecutar( cualquier( sentencia( SQL( directamente( en( la( interfaz.( De( esta( forma( podemos(comprobar(cuáles(son(sus(resultados(antes(de(implementarla(en(nuestra(aplicación.( Su(uso(es(realmente(intuitivo,(basado(en(una(interfaz(web(extremadamente(sencilla.(Además( está(traducido(a(una(gran(cantidad(de(idiomas(entre(los(que(se(encuentra(el(español,(catalán,( vasco(y(gallego.( Los(requisitos(que(debemos(tener(en(cuenta(para(instalar(nuestra(aplicación(son(los(siguientes:( • PHP(versión(5.2(o(superior,(con(soporte(de(sesión,(extensión(SPL(y(soporte(JSON.( • MySQL(5.0(o(superior.( • Navegador(web(con(cookies(activadas.( Además(es(posible(que(necesitemos(alguna(extensión(adicional(para(hacer(uso(de(la(totalidad( de(las(funciones(de(la(herramienta.(Para(ello(deberemos(consultar(la(siguiente(URL(de(la(web( oficial:(http://www.phpmyadmin.net/localized_docs/es/Documentation.html#require( ! 5.3.2.1%&Instalación& ( Para(la(instalación(de(esta(herramienta(vamos(a(explicar(dos(métodos(distintos((ambos(muy( sencillos):( % Método%1:%Repositorios%de%nuestra%distribución% Las(distribuciones(Linux(están(preparadas(para(su(uso(como(servidor(web,(por(lo(que(muchas( de( ellas( ya( disponen( en( sus( repositorios( de( todos( los( paquetes( necesarios,( tanto( para( la( instalación(de(los(mismos,(como(para(su(gestión.(Entre(ellos(se(encuentra(esta(herramienta.( Su( instalación( es( muy( sencilla,( ya( que( únicamente( deberemos( escribir( en( la( terminal( el( comando(de(instalación(para(que(esta(quede(funcionando(correctamente.(Dicho(comando(es( el(siguiente((para(Debian/Ubuntu(y(derivados)(:( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 80( En(caso(de(no(disponer(de(recursos(suficientes(que(nos(permitan(implantar(una(solución(como( la( comentada( anteriormente,( una( solución( es( usar( un( sistema( de( virtualización( que( nos( permita(aislar(cada(servicio(en(una(máquina(virtual(diferente.( Otra( buena( técnica( para( asegurar( el( correcto( funcionamiento( de( los( servidores( y( la( información( contenida( en( ellos( es( restringir( el( acceso( a( los( administradores.( Aquí( cabría( mencionar(tanto(los(accesos(que(se(realizan(de(forma(física(como(remota.(En(el(primer(caso( tendría(que(ver(con(limitar(el(acceso(al(lugar(donde(está(ubicado(el(servidor(y(registrar(todos(y( cada(uno(de(los(accesos,(incluyendo(fechas,(horas,(tareas(realizadas,(etc.(En(el(segundo(caso( podría( limitarse( el( número( de( usuarios( que( inician( sesiones( interactivas( en( el( servidor,( y( siempre(usar(métodos(seguros(como(SSH(o(túneles(VPN.( ( ( 5.4.1.2.%&Aseguramiento&de&la&información&en&tránsito& ( Este( es( el( apartado( que( parece( más( susceptible( a( priori,( ya( que( depende( tanto( de( la( infraestructura( del( servidor,( como( la( del( usuario,( como( de( todos( aquellos( proveedores( de( servicios(por(los(cuales(pasen(todos(los(datos.( Una(parte(importante(son(las(técnicas(criptográficas(que(sean(utilizadas(en(la(conexión(que(se( mantiene(entre(el(cliente(y(el(servidor.(De(forma(estándar(se(utiliza(en(protocolo(HTTP(que( funciona(por(el(puerto(80,(pero(este(protocolo(no(es(demasiado(seguro(cuando(se(trata(de( enviar(datos(personales,(contraseñas,(cuentas(bancarias…(Para(solucionar(este(tema,(se(puede( utilizar( el( protocolo( HTTPS( que( funciona( por( el( puerto( 443( que( sirve( precisamente( para( asegurar(los(datos(que(viajan(entre(el(servidor(y(el(cliente,(utilizando(para(ello(protocolos(SSL(o( TLS.( Uno( de( los( ataques( más( peligrosos( son( los( ataques( DoS,( ya( que(permite( la( inutilización( de( nuestro(servidor(sin(que(podamos(poner(remedio(alguno.(El(motivo(más(común(de(este(tipo(de( ataque(son(una( sobrecarga(de(peticiones(al(servidor,(realizado(desde(Internet.(La(forma(de( solucionarlo(es(muy(complicada,(y(suele(pasar(por(utilizar(servidores(redundantes(y(sistemas( de(respaldos.( ( 5.4.1.3.%Aseguramiento&del&equipo&del&cliente& ( Los(primeros(sitios(web(aparecieron(como(simples(contenedores(de(información,(cuya(única( interacción(con(el(cliente(era(la(solicitud(de(nuevas(páginas(mediante(el(uso(de(los(distintos( enlaces(para(solicitar(nuevas(páginas.(( Con(el(tiempo(fueron(apareciendo(nuevas(tecnologías(que(permitían(suplir(esta(carencia.(Entre( estas(tecnologías(se(encuentran(Java,(ActiveX,(Flash,(plugins,(etc.( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 81( Las(páginas(web( por(sí(solas(son(estáticas(y( permiten(poca(interacción(entre(el(cliente(y(el( servidor,( pero( a( menudo( se( utilizan( tecnologías( que( permiten( precisamente( aumentar( esta( interacción.(Entre(ellas(se(encuentran(Java,(ActiveX,(Flash,(plugins,(etc.( A(menudo(estas(tecnologías(tienen(problemas(de(seguridad(que(afectan(directamente(a(los( usuarios,(por(lo(que(el(camino(que(se(está(siguiendo(es(disminuir(su(utilización(como(ya(ha( pasado(con(Java(y(ActiveX(cuya(utilización(es(prácticamente(simbólica(y(en(sitios(web(antiguos.( Como(desarrolladores((web,(podemos(reducir(el(uso(de(estas(tecnologías,(procurando(seguir(la( mayor( cantidad( de( estándares( posibles( como( pueden( ser( JavaScript,( uso( del( DOM,( Ajax,( y( algunas(otras(tecnologías(más.(( Por( otro( lado( podemos( extraer( mediante( JavaScript( algunas( características( del( agente( del( usuario(como(pueden(ser(sistema(operativo,(navegador(utilizado,(plugins(instalados…(De(esta( forma(podremos(dinamizar(en(cierta(forma(el(contenido(que(sirvamos(al(cliente,(para(de(esta( forma( evitar( posibles( fallos( de( seguridad( debidos( al( uso( de( versiones( con( fallos( conocidos.( ( ( 5.4.2.$!Usuario!y!grupo!para!Apache! ( Apache( dispone( de( su( propia( jerarquía( de( directorios,( que( comienzan( en( la( raíz( que( sería( ServerRoot,( y( sobre( la( cual( cuelgan( distintos( directorios( como( se( han( visto( anteriormente( como(son(“includes”,(“bin”,(“htdocs”,(“cgiUbin”,(etc.( Es(importante(asignar(permisos(adecuados(a(este(árbol(de(directorios(para(asegurarnos(que( ente(cualquier(problema(el(visitante(no(disponga(de(más(permisos(de(los(que(debería(tener( para(intentar(evitarnos(los(máximos(problemas(disponibles.( Los(dos(puntos(a(tener(en(cuenta(son(el(usuario(que(ejecuta(el(servidor(Apache,(que(será(el( propietario( del( proceso,( y( por( lo( tanto( heredará( todos( sus( permisos.( Y( por( otra( parte,( los( permisos(disponibles(en(el(árbol(de(directorios(del(servidor((y(también(fuera(de(este)(( Hay(que(tener(en(cuenta(también(que(si(disponemos(de(una(persona(encargada(de(editar(el( contenido,(deberá(disponer(de(permisos(al(directorio(de(publicación((probablemente(llamado( “htdocs”(o(“www”).(Los(desarrolladores(de(scripts(CGI(deberán(disponer(también(de(permisos( al( directorio( cgiUbin.( Puede( ser( por( lo( tanto( buena( disponer( de( los( distintos( directorios( en( ubicaciones(diferentes,(evitando(que(todos(estén(dispuestos(en(forma(de(árbol.( ( 5.4.3.$!Permiso!de!los!distintos!directorios! ( Nuestra(instalación(de(Apache(es(uno(de(los(puntos(que(deberemos(tener(en(cuenta(a(la(hora( de(establecer(un(entorno(seguro(ante(posibles(ataques(o(intrusiones.( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 82( La(recomendación(general(es(utilizar(un(usuario(y(un(grupo(específico(para(ser(utilizado(por( Apache.( Este( usuario/grupo( deberá( poseer( el( UID/GID( del( demonio( que( ejecuta( Apache.( Además(del(ejecutable(también(es(importante(tener(en(cuenta(los(permisos(de(los(distintos( directorios(que(utiliza(Apache,(y(que(han(sido(vistos(en(apartados(anteriores.( El(directorio(donde(se(encuentra(instalado(Apache(debería(ser(accesible(solamente(al(usuario( root,(ya(que(el(debe(ser(el(único(que(debe(configurar(o(controlar(el(proceso(Apache.(( Para(el(directorio(de(publicación((conocido(también(como(“htdocs”)(deberemos(establecer(un( usuario( o( grupo( que( dispongan( de( permisos( suficientes( para( modificar( su( contenido.( Este( usuario/usuarios(estarán(destinados(a(su(uso(por(parte(de(los(webmasters(de(nuestro(sitio.(A( este(directorio(también(deberá(tener(permisos(de(lectura(el(propio(usuario(de(Apache(para( que(sea(capaz(de(servir(el(contenido(de(las(peticiones(que(llegan(al(servidor.( De(forma(similar(al(caso(anterior,(el(directorio(donde(se(encuentran(los(scripts(CGI(deberán(ser( accesibles(únicamente(a(los(usuarios(encargados(de(desarrollar(los(mismos,(además(del(propio( usuario(de(Apache((importante(que(tenga(permisos(de(ejecución).( En(cuanto(al(directorio(donde(se(encuentran(los(logs,(deberá(ser(accesible(únicamente(por(el( usuario(root((con(permisos(totales(700).( ( 5.4.4.$!Replicación!y!Copias!de!Seguridad! ( Mantener(la(integridad(de(nuestro(sitio(web,(es(una(tarea(que(requiere(determinadas(tareas( de(mantenimiento.(La(opción(más(segura(y(efectiva(es(mantener(nuestro(sistema(web(en(un( clúster(de(alta(disponibilidad(que(permita(balancear(la(carga(de(nuestros(servidores(de(forma( dinámica.(Esta(opción(tiene(el(inconveniente(de(necesitar(grandes(cantidades(de(dinero(para( poder(llevarla(a(cabo.( Otra( opción( más( económica( es( disponer( de( un( servidor( que( sea( capaz( de( ejecutar( nuestra( aplicación(en(caso(de(detectar(una(alerta(en(un(tiempo(mínimo,(sustituyendo(de(esta(forma(a( nuestro( servidor( principal.( Esta( opción( requiere( la( activación( manual( de( este( servidor( replicado.( Por( otra( parte( es( necesario( que( las( bases( de( datos( estén( completamente( sincronizadas(para(que(no(estemos(utilizando(una(versión(de(esta(antigua(que(puede(disponer( de(datos(inconsistentes.( Las(copias(de(seguridad(son(otro(tema(imprescindible(para(mantener(la(integridad(de(nuestro( sitio(ante(posibles(errores(imprevisibles.(También(hay(que(tener(en(cuenta(que(según(la(Ley( Orgánica( de( Protección( de( Datos,( este( apartado( dispone( de( una( específica( legislación( que( deberemos(tener(en(cuenta(a(la(hora(de(planificar(nuestro(sistema(de(copias(de(seguridad.(Los( apartados( que( deberemos( respaldar( en( nuestro( caso( serán,( por( un( lado( el( directorio( de( publicación(de(Apache(donde(se(incluyen(tanto(los(documentos(html,(php,(imágenes,(etc.(Por( otro(lado(deberemos(respaldar(la(base(de(datos(completa,(ya(que(realmente(es(allí(donde(se( encuentran(almacenados(los(datos(que(utiliza(nuestra(aplicación.( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 83( ( 5.4.5.%&Escaneo&de&información& ( El(objetivo(de(esta(operación(es(realizar(un(escaneo(de(puertos(de(la(máquina(a(analizar(para( averiguar(qué(tipo(de(servicios(está(ofreciendo.( Nmap( (Network( Mapper)( es( una( de( las( herramientas( más( importante( en( cuanto( a( la( exploración(de(redes(y(auditoría(de(seguridad.(Podemos(usarlo(libremente(gracias(a(su(licencia( GPL,( estando( disponible( para( prácticamente( cualquier( plataforma( en( la( dirección( (http://nmap.org).( Nuestro(objetivo(de(determinar(qué(puertos(y(servicios(están(activos(en(las(máquinas(de(una( red,( lo( llevaremos( a( cabo( con( esta( herramienta,( con( la( que( podemos( hacer( barridos( automatizados.(A(pesar(de(que(existen(herramientas(gráficas(que(hacen(de(frontUend(para(esta( aplicación,( aquí( se( va( a( mostrar( únicamente( la( herramienta( en( modo( consola.( Si( está( interesado(en(las(herramientas(gráficas(pueden(interesarle(NmpaFE(o(Zenmap.( ¡(ATENCIÓN(DEBE(USTED(SER(ADMINISTRADOR(PARA(USAR(ESTA(HERRAMIENTA!( ( ( ( Aquí(podemos(ver(un(ejemplo(de(un(escaneo(de(puertos(al(servidor(web(del(departamento( DSIC(de(la(UPV,(se(puede(apreciar(que(la(orden(tiene(la(forma(“nmap maquina_destino”( Entre(la(información(más(relevante(que(podemos(encontrar(es(un(lista(de(los(puertos(de(los( que(ha(recibido(alguna(contestación.(En(este(caso(aparecen(7(puertos(distintos,(de(los(cuales( aparece(el(número(de(puerto,(el(protocolo(de(la(capa(de(transporte,(el(estado(y(el(servicio(que( se(está(ejecutando.( En(cuanto(al(estado(que(figura(en(nmap(se(debe(considerar(lo(siguiente:( • Open:(Se(está(ofreciendo(dicho(servicio(en(el(puerto(que(se(menciona( • Close:(En(el(momento(del(escaneo(está(cerrado,(pero(puede(ser(abierto(en(un(futuro( • Filtered:(El(paquete(no(ha(llegado(al(destino,(seguramente(por(algún(firewall(o(router( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 84( • No(filtered:(No(está(filtrado,(pero(Nmap(no(puede(saber(si(está(abierto(o(cerrado( • Open|filtered:(No(responde(a(la(petición,(por(lo(que(no(se(puede(determinar(su(estado( • Close|filtered:(Es(posible(que(el(puerto(esté(cerrado(o(filtrado( El(ejemplo(visto(anteriormente(es(el(más(básico(de(la(potente(herramienta(Nmap.(En(este(caso( vamos(a(usar(la(opción(“-A”(para(el(siguiente(ejemplo,(que(ofrece(un(ejemplo(más(detallado.( ( ( ( En(este(caso(podemos(apreciar(que(Nmap(ha(determinado(las(versiones(de(los(servidores(que( ofrecen(los(distintos(servidores.(En(este(caso(el(dato(importante(es(el(servidor(http(y(https,(que( corre(Apache(2.2.3(modificado(para(RedHat.( Luego( vemos( un( dato( también( muy( importante( que( es( el( tipo( de( dispositivo( y( el( sistema( operativo( que(puede( ejecutar( el( servidor( destino.( En( este( caso( vemos( que( dice( que( las( condiciones(del(test(no(son(las(ideales,(y(únicamente(puede(determinar(que(se(trata(de(Linux( entre(la(versión(2.6.13(y(la(2.6.28( Otra(forma(de(conseguir(información(sobre(un(servidor(web(es(solicitar(un(recurso(inexistente,( de(forma(que(si(el(administrador(no(ha(implementado(una(página(de(error(específica,(puede( devolvernos( un( error( como( el( que( sigue,( en( el( que( aparece( la( versión( del( servidor:( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 85( ( ( Otro(lugar(dónde(suele(aparecer(más(información(de(nuestro(servidor(web(es(en(las(cabeceras( http( que( el( servidor( envía( al( cliente( en( cada( petición.( Con( el( comando( “curl( –I”( podemos( recuperar(todas(esas(cabeceras(para(poderlas(analizar:( ( ( ( Ahora( vamos( a( ver( cómo( podemos( reducir( estos( riesgos,( ya( que( estamos( ofreciendo( demasiada( información( que( un( posible( atacante( puede( usar( en( nuestra( cuenta.( ( En(primer(lugar(intentaremos(reducir(el(número(de(servicios(prestados(por(el(servidor,(como( ya(se(ha(comentado(anteriormente(hay(que(separar(en(la(medida(de(lo(posible(los(servicios(en( diferentes( servidores.( Otra(opción(basada(en(ofuscar(la(información(se(trataría(de(interponer(firewalls(entre(la(red(de( destino(y(el(servidor.(El(objetivo(de(esta(configuración(es(que(Nmap(detecte(que(el(puerto(está( filtrado,(y(tanto(los(paquetes(que(envíe(como(los(que(reciba(pueden(ser(alterados.( En(la(siguiente(fase(vamos(a(ver(las(opciones(que(tenemos(para(silenciar(los(errores(cuando( intentamos(acceder(a(recursos(inexistentes(en(nuestro(servidor.( En(primer(lugar(vamos(a(tratar(el(error(que(aparece(cuando(se(intenta(acceder(a(un(recurso( inexistente.( Lo( que( se( va( a( hacer( es( sustituir( la( página( de( error( del( servidor( por( otra( que( crearemos(nosotros.( Aunque( el( ejemplo( que( se( da( aquí( es( únicamente( para( ocultar( el( servidor( que( estamos( utilizando,(si(hacemos(hincapié(en(la(usabilidad(para(el(usuario,(ésta(página(debería(tener(más( funciones(como(mostrar(un(mapa(del(sitio,(un(campo(de(buscar(o(alguna(sugerencia(para(guiar( al(usuario(a(encontrar(lo(que(realmente(buscaba(cuando(encontró(el(error.( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 86( En( primer( lugar( tendremos( que( crear( dicha( página( y( copiarla( en( nuestro( directorio( de( publicación(del(servidor(web((en(mi(caso(/var/www).(En(este(caso(se(ha(llamado(“404.html”(y( tiene(el(siguiente(contenido:( ( ( ( ( Ahora( hay( que( configurar( el( servidor( web( Apache( para( indicarle( que( cuando( encuentre( un( error(404(redirija(a(esta(página(que(acabamos(de(mostrar.(Para(ello(deberemos(modificar(el( fichero( de( configuración( (en( mi(caso(/etc/apache2/apache2.conf)(,( añadiéndole( la(siguiente( línea:( ( ( Hay( que( recordar( que( después( de( realizar( cualquier( modificación( en( el( fichero( de( configuración,(hay(que(reiniciar(Apache(para(que(estos(cambios(surjan(efecto.( Para( comprobar( el( resultado( de( la( página( de( error,( simplemente( deberemos( solicitar( un( recurso(inexistente((en(este(caso(la(página(“noexiste”):( ( ( ( Podemos(ver(perfectamente(como(el(nombre(del(servidor(y(la(versión(ha(desaparecido,(siendo( reemplazado(por(la(página(que(hemos(creado.( Otra(opción(alternativa(a(lo(anterior(sería(usar(una(directiva(de(Apache(que(permite(eliminar(la( firma(que(aparece(en(la(parte(inferior(del(mensaje(de(error.(Dicha(directiva(es(ServerSignature.( Para(ello(debería(establecerse(a(Off:( ( ( ( <html><head><title>Recurso(no(encontrado</title></head>( <body>ERROR(404(U(Recurso(no(encontrado</body></html>( ErrorDocument(404(/404.html( ServerSignature Off PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 87( El(resultado(que(podemos(ver(después(de(la(inclusión(de(esta(directiva(es(el(siguiente:( ( ( Ahora(vamos(a(eliminar(la(máxima(información(posible(que(aparece(en(las(cabeceras(HTTP(que( el(servidor(envía(al(cliente.(Para(ello(vamos(a(fijarnos(en(el(ejemplo(de(la(siguiente(imagen.(En( primer(lugar(en(el(campo(“Server”(veremos(que(aparece(algo(del(estilo(“Apache/2.2.6”,(lo(que( vamos(a(intentar(es(eliminar(el(número(de(versión(de(este(campo.( Apache(dispone(de(una(directiva(llamada(ServerTokens(que(permite(modificar(la(información( que(aparece(en(el(campo( Server.(A( continuación(se(muestra(las(diferentes(posibilidades(de( configuración(de(esta(directiva:( ( ( ( ( ( ( ( Para(seguir(analizando(las(cabeceras(HTTP(que(nos(devuelve(Apache,(vamos(a(ver(un(campo( llamado(“XUPoweredUBy”.(En(la(siguiente(imagen(se(puede(ver(el(ejemplo,(en(el(que(se(muestra( claramente(y(con(todo(lujo(de(detalles(la(versión(de(PHP(utilizada(en(el(servidor((en(este(caso( PHP/5.3.5U1ubuntu7.2)( ServerTokens(Prod(à((Mostraría(Server:(Apache( ServerTokens(Min(à((Mostraría(Server:(Apache/2.2( ServerTokens(OS(à((Mostraría(Server:(Apache/2.2((Unix)( ServerTokens(Full(à((Mostraría(Server:(Apache/2.2((Unix)(PHP/5.0( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 88( ( ( Esta(parte(no(corresponde(estrictamente(a(Apache,(si(no(que(es(una(configuración(propia(de( PHP.(En(primer(lugar(deberíamos(localizar(el(fichero(de(configuración(de(PHP,(en(mi(caso(se( encontraba( en( /etc/php5/apache2/php.ini).( La( directiva( a( modificar( sería( expose_php,( y( quedaría(de(la(siguiente(forma:( ( ( ( Después(de(esta(modificación(habría(que(reiniciar(Apache(para(hacerse(efectivos(los(cambios( (sudo service apache2 restart).(Una(vez(reiniciado,(podremos(realizar(otra(petición( de(cabeceras(para(ver(la(diferencia:( ( ( ( Hemos(dejado(para(el(final(la(parte(más(complicada,(que(corresponde(a(evitar(la(identificación( del(sistema(operativo(del(servidor(por(parte(de(Nmap((recordemos(nmap –A).( ( ( ( Huella(PHP( expose_php = Off( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 89( 6.$Aplicación!Web! ( Una(vez(que(tenemos(claro(todo(el(tema(del(servidor,(significará(que(tenemos(preparado(el( entorno(de(ejecución(para(que(nuestra(aplicación(pueda(ser(ejecutada(correctamente.(En(este( apartado(empezaremos(a(definir(toda(la(aplicación(web(que(vamos(a(desarrollar,(teniendo(en( cuenta(todos(los(aspectos(que(hemos(comentado(anteriormente.( Hay(que(recalcar(que(la(aplicación(web(no(es(únicamente(la(presentación(que(verá(el(usuario( final((que(está(compuesta(por(la(parte(estática(y(la(dinámica),(si(no(también(por(toda(la(lógica( que(va(detrás(para(crear(todos(los(datos(dinámicos(y(para(almacenar(los(datos.( Empezaremos( definiendo( los( requisitos( de( la( aplicación,( esta( parte( vendrá( definida( por( los( clientes(a( los( que(va( destinada( la(aplicación.( Como( en(el( caso( de(este( proyecto,(no( hay(un( cliente(fijo(y(determinado,(se(hará(una(previsión(de(los(requisitos(informándose(a(través(de( personas(relacionadas(con(el(mundo(del(gimnasio.( A(partir(de(todas(estas(informaciones(definiremos(de(formalmente(los(requisitos,(haciendo(una( especial(diferenciación(entre(los(requisitos(de(información(y(los(funcionales.(Los(primeros(se( refieren(a(toda(la(información(que(se(muestran(a(los(distintos(usuarios(dependiendo(de(sus( roles,(y(los(segundos(a(los(procesos(que(pueden(llevar(a(cabo,(también(dependiendo(de(su(rol( dentro(del(sistema.( Una(vez(definidos(todos(los(requisitos,(pasaremos(a(analizar(todos(ellos(y(elaborar(los(distintos( mapas( conceptuales( y( esquemas( sobre( todos( los( procesos( de( nuestra( aplicación.(Aquí( empezaremos(a(crear(los(primeros(bocetos(de(la(interfaz(de(usuario,(y(los(diagramas(de(clase.( A(partir(de(esta(fase(se(analizarán(las(distintas(capas(de(nuestra(aplicación,(desde(la(interfaz(de( usuario,(hasta(la(parte(del(almacenamiento(de(los(datos.(Se(hará(hincapié(en(cada(una(de(ellas( mostrando( los( distintos( procesos( que( se( llevan(a( cabo( en( cada( uno( de( ellos.( También( se( mostrarán(los(distintos(patrones(de(diseño(utilizados(en(distintas(webs(que(nos(ayudarán(a( desarrollar(un(diseño(coherente(y(funcional.( El( último( apartado( será( la( implementación( del( sistema,( decidiendo( las( tecnologías( más( convenientes( para( el( desarrollo( de( nuestra( aplicación.( Entre( la( distintas( tecnologías( que( debemos(elegir(estarán(las(de(la(interfaz,(la(aplicación(y(los(contenidos.( ! ! 6.1.$!Usabilidad! ( Partiendo( de( la( base( de( que( los( usuarios( pueden( ser( o( no( expertos( en( la( navegación( por( Internet,(tenemos(que(pensar(en(facilitarle(el(uso(de(nuestra(aplicación.( De( esta( forma( intentaremos( aumentar( la( intuición,( permitiendo( al( usuario( una( mejor( experiencia(en(nuestra(aplicación(y(transmitir(una(mayor(confianza(al(usuario.( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 96( Un(ejemplo(muy(ilustrativo(serían(estos(3(ejemplos(de(botones,(que(proporcionarían(acceso(a( una(misma(acción.( ( ( ( Aquí(se(aprecia(claramente(cómo(al(usuario(le(puede(ser(más(sencillo(entender(unos(botones( que( otros( con( respecto( al( texto( que( coloquemos,(cuando( en( realidad( se( trata( de( la( misma( acción.( Sin(necesidad(de(rizar(tanto(el(rizo,(el(usuario(puede(que(ni(siquiera(sea(capaz(de(distinguir(qué( elementos(de(la(página(nos(ofrecen(una(acción(o(una(navegabilidad(y(cuáles(no.( ( ( ( ( En(la(imagen(podemos(ver(como(aparecen(marcados(con(números(varios(textos(en(color(azul.( Aquí(el(usuario(puede(tener(dudas(sobre(cuáles(son(realmente(enlaces(y(cuáles(no.(En(este( ejemplo(sólo(son(enlaces(los(números(4(y(5,(el(resto(son(cabeceras(o(resaltados.( ( 6.1.5.$!Legibilidad!del!contenido! ( Uno(de(los(aspectos(más(importantes(a(la(hora(de(ofrecer(un(contenido(a(nuestros(usuarios,(es( ofrecérselos(en(un(formato(lo(más(coherente(posible,(con(el(objetivo(de(reducir(al(mínimo(el( esfuerzo(que(debe(hacer(el(usuario(a(la(hora(de(leer(nuestro(contenido.( Actividades( Oferta(de(actividades( Ofer.(Actv.( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 97( El( tipo( de( letra( es( uno( de( los( factores( más( importantes( para( aumentar( la( legibilidad( del( contenido(de(nuestro(sitio(web.(Aquí(tenemos(que(tener(en(cuenta(es(que(nuestro(website( puede(ser(accedido(a(través(de(diversos(medios,(aquí(vamos(a(tener(los(medios(visuales(como( son(la(pantalla(y(el(impreso.(Hay(que(matizar(que(para(cada(caso(puede(ser(más(interesante( usar(una(tipografía(u(otra,(ya(que(unas(mejoran(la(lectura(más(que(otras.( En(el(caso(de(la(legibilidad(en(la(pantalla(se(intentará(utilizar(un(tipo(de(letra(cuyo(tamaño(sea( adecuado(para(lectura(en(pantalla(y(sea(suficientemente(regular.(El(tipo(de(letra(más(adecuado( son(las(llamadas(“sansUserif”,(estas(carecen(de(los(pequeños(remates(que(se(encuentran(en(las( terminaciones(de(las(letras.(Un(ejemplo(claro(son(Verdana,(Arial(e(Impact.(Como(se(puede(ver( este( tipo( de( tipografías( son( muy( regulares,( que( es( precisamente( lo( que( pretendíamos.( En( cuanto(al(tamaño,(Verdana(sería(una(opción(muy(válida,(ya(que(su(espaciado(es(aceptable(para( la(lectura(en(pantalla.(A(continuación(podemos(ver(unos(ejemplos(de(fuentes(sansUserif:( ( ( ( ( Si(por(el(contrario,(deseamos(una(correcta(legibilidad(en(papel,(deberemos(utilizar(un(tipo(de( letra(que(nos(permita(mantener(una(mejor(guía(visual(a(lo(largo(del(texto.(Un(ejemplo(de(ello,( son(las(fuentes(“serif”,(que(poseen(unos(trazos(horizontales(o(diagonales(en(las(terminaciones( de(las(letras(que(pretenden(crear(una(línea(horizontal(por(la(que(desplazar(la(vista(con(mayor( facilidad.(Entre(los(ejemplos(más(representativos(son(Times(New(Roman(y(Georgia.(Como(se( puede(ver(las(terminaciones(de(este(tipo(de(letras(permiten(mantener(mejor(la(guía(de(la(línea( que(estamos(leyendo(en(ese(momento,(evitando(un(esfuerzo(al(ojo(que(permite(leer(de(forma( más(cómoda(y(durante(más(tiempo,(ya(que(evita(la(monotonía.(A(continuación(se(pueden(ver( unos(ejempos(de(fuentes(“serif”:( ( ( ( ( Para(acabar(de(profundizar(en(el(tema(de(las(tipografías(se(muestra(a(continuación(un(ejemplo( de(ambos(tipos(de(tipografías.(Si(desea(profundizar(más(en(el(estudio(de(las(fuentes,(consulte( el(estándar(DIN(16518.( ( ( ( ( Verdana((((((Arial Impact( Times New Roman (Georgia( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 98( ( ( ( ( ( ( Un( tema( relacionado( con( las( tipografías( tiene( que( ver( con( la( plataforma( sobre( la( que( está( accediendo(el(navegador.(Ahora(mismo( podríamos(decir(que(las(plataformas(más( utilizadas( para(acceso(a(nuestros(sitios(son(Windows,(MacOS(X,(Linux(para(ordenadores(personales,(y( Android,(iOS(y(Blackberry(para(dispositivos(portátiles.( Debemos(tener(en(cuenta(que(no(todos(estos(sistemas(operativos(vienen(por(defecto(con(las( mismas(fuentes(instaladas,(por(lo(que(es(posible(detectar(incompatibilidades(en(este(aspecto.( Existe(un( proyecto(llamado(“Core(fonts(for(the(Web”( que( pretendía(precisamente(crear(un( conjunto(de(tipos(de(letra(que(fuera(capaz(de(reproducirse(de(forma(estándar,(y(fuera(capaz(de( reproducirse(en(todo(tipo(de(plataformas.(Sería(interesante(usar(estas(tipografías,(bien(como( opción(principal,(o(bien(como(secundaria(en(caso(de(que(la(primera(no(se(encuentre(instalada( en(el( sistema.( Dichas( fuentes(son:(Andale(Mono,(Arial,(Arial(Black,(Comic( Sans(MS,( Courier( New,(Georgia,(Impact,(Times(New(Roman,(Trebuchet(MS,(Verdana(y(Webdings.( En(la(siguiente(tabla(se(presenta(a(modo(de(resumen(una(clasificación(sobre(las(tipografías(en( relación(con(las(diferentes(plataformas(en(las(que(se(encuentran.(Un(color(verde(indica(que(se( encuentra(en(prácticamente(la(totalidad(de(los(equipos(con(ese(sistema,(y(amarillo(que(no(lo( son(tanto.(Indiferentemente(de(su(color,(todas(son(aceptadas(como(seguras(para(la(web.( ( Fuente( Windows(9x(/(XP( Win(Vista(/(7( Mac(OS(X( Linux(/(Unix( Cambria( ( ( ( ( Constantia( ( ( ( ( Times(New(Roman( ( ( ( ( ( Times( ( ( ( ( Georgia( ( ( ( ( Andale(Mono( ( ( ( ( Arial( ( ( ( ( Arial(Black( ( ( ( ( A(((A( san( serif( sansUserif( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 99( Calibri( ( ( ( ( Candara( ( ( ( ( Century(Gothic( ( ( ( ( Corbel( ( ( ( ( Helvetica( ( ( ( ( Impact( ( ( ( ( Trebuchet(MS( ( ( ( ( Verdana( ( ( ( ( Comic(Sans(MS( ( ( ( ( Consolas( ( ( ( ( Courier(New( ( ( ( ( Courier( ( ( ( ( ( ( Para( hacer( atractiva( la( lectura( del( contenido( que( se( ofrece( en( el( sitio( web,( es( importante( prestar(especial(interés(al(contraste(visual(que(se(crea(entre(los(diferentes(elementos.(Entre( estos(elementos(se(encuentran(los(bloques(de(texto,(imágenes,(menús,(enlaces(y(títulos.(Si( pusiéramos(en(nuestro(sitio(únicamente(un(texto(con(suma(monotonía(visual,(sería(fácil(que(la( mayoría(de(los(usuarios(rechazara(leer(nuestro(sitio.(En(primer(lugar,(porque(es(necesario(que( el( usuario( sea( capaz( de( diferenciar( las( distintas( partes( del( contenido( para( facilitarle( así( el( acceso( a( la( parte( de( la( información( de( la( que( realmente( está( interesado.( Por(ello(es(importante(también(no(abusar(de(colores(y(resaltados,(ya(que(el(usuario(no(podría( diferenciar( las( partes( importantes,( al( igual( que( ocurría( en( el( caso( anterior.( Los( consejos( más( habituales( suelen( ser( diseñar( sitios( sencillos( visualmente( hablando,( con( contenido(bien(organizado,(separando(los(bloques(visualmente,(seguir(un(esquema(repetitivo( en(la(maquetación,(y(resaltando(únicamente(las(partes(realmente(importantes.( ( ( ( ( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 100( ( ( ( ( ( ( (Contenido(mal(organizado(((((((((((((Contenido(bien(organizado( ( Otra( parte( importante( para( la( legibilidad( del( contenido( son( todos( aquellos( aspectos( relacionados(con(las(alineaciones(y( los( márgenes.(Los(márgenes( añaden(en(mayor(o(menor( medida( comodidad( al( leer,( ya( que( ayudan( a( separar( el( cuerpo( del( texto( de( la( zona( que( lo( rodea.(Los(bloques(de(texto(pueden(clasificarse(en(alineados(a(izquierda,(alineados(a(derecha,( centrado,(o(justificado.( Texto% justificado:(El( texto( justificado( se( encuentra( alineado( tanto( a( la( izquierda( como( a( la( derecha(creando(un(bloque(de(texto(homogéneo.(Se(busca(la(máxima(simetría(y(formalidad.(Su( funcionamiento(se(basa(en(modificar(la(separación(entre(palabras(para(crear(esta(estructura( visual.(Es(muy(difícil(conseguir(la(justificación(en(resoluciones(bajas(como(puede(ser(un(cuadro( de(texto(pequeño,(o(un(web(diseñado(para(móviles,(y(además(se(pierde(claridad(en(la(lectura( en(pantalla.( ( ( ( ( ( ( ( ( Texto% alineado% a% izquierda:% El( texto( alineado( a( la( izquierda( es( la( opción( que( aporta( más( legibilidad(a(una(página(web,(dado(que(el(margen(izquierdo(es(constante(en(todo(el(bloque(de( texto.(Se(puede(apreciar(que(al(alinear(al(margen(izquierdo,(el(derecho(pierde(su(justificación.(( ( ( ( El( texto( justificado( se( encuentra( alineado( tanto( a( la( izquierda( como( a( la( derecha( creando( un( bloque( de( texto( homogéneo.( Se( busca( la( máxima( simetría( y( formalidad.(Su(funcionamiento(se( basa( en( modificar( la( separación( entre( palabras( para( crear( esta( estructura(visual.( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 101( ( ( ( ( ( ( Texto%alineado%a%la%derecha:%El(contenido(en(este(tipo(de(bloques(aparece(alineado(al(margen( derecho.(Como(se(puede(apreciar(este(tipo(de(bloque(aporta(poca(claridad(en(su(lectura.(Esto( se( debe( porque( en( la( escritura( occidental,( las( frases( se( leen( desde( la( izquierda( hacia( la( derecha,(lo(que(provoca(confusión(al(intentar(buscar(el(inicio(de(cada(nueva(línea.(( ( ( ( ( ( ( Texto%centrado:(Este(tipo(de(texto(hace(un(reparto(igualitario(del(espacio(destinado(al(margen( izquierdo(como(al(margen(derecho.(Esto(provoca(que(el(texto(aparezca(en(el(centro(del(bloque( de(contención.(La(guía(visual(también(se(pierde(al(ser(confuso(encontrar(el(principio(de(cada( nueva(línea.( ( ( ( ( ( ( ( La(longitud(de(cada(línea(también(es(otro(factor(importante(que(deberemos(tener(en(cuenta(a( la(hora(de(ofrecer(una(mejor(legibilidad(a(los(futuros(usuarios(del(sitio(web.( El(texto(alineado(a(la(izquierda(es( la(opción(que(aporta(más( legibilidad(a(una(página(web,( dado(que(el(margen(izquierdo(es( constante(en(todo(el(bloque(de( texto.(Se(puede(apreciar(que(al( alinear(al(margen(izquierdo,(el( derecho(pierde(su(justificación.( El(contenido(en(este(tipo(de( bloques(aparece(alineado(al( margen(derecho.(Como(se(puede( apreciar(este(tipo(de(bloque( aporta(poca(claridad(en(su( lectura.(( Este(tipo(de(texto(hace(un(reparto( igualitario(del(espacio(destinado( al(margen(izquierdo(como(al( margen(derecho.(Esto(provoca( que(el(texto(aparezca(en(el(centro( del(bloque(de(contención.(La(guía( visual(también(se(pierde(al(ser( confuso(encontrar(el(principio(de( cada(nueva(línea.( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 102( A( una( distancia( normal( de( lectura,( el( ojo( es( capaz( de( observar( de( forma( correcta( unos( 8( centímetros(de(ancho,(por(lo(que(evitaremos(superar(demasiado(esa(distancia.(Esta(regla(no( sólo(es(aplicable(a(los(medios(digitales,(sino(también(a(medios(tradicionales(como(el(papel,(por( lo(que(deberá(tenerse(en(cuenta(para(las(hojas( de(estilo(que( se(apliquen( para(imprimir(las( distintas(páginas(web(de(las(que(se(componga(nuestro(sitio.( Hay(diversas(teorías(sobre(cuál(es(el(número(de(palabras(adecuado(que(debe(haber(en(cada( línea,( pero( a( grandes( rasgos( indican( que( deben( estar( entre( 12( y( 20( palabras.( Esto( es( tan( relativo(porque(hay(muchos(otros(factores(que(influyen(en(el(resultado(como(por(ejemplo(el( interlineado,(ya(que(cuanto(mayor(sea(mayor(legibilidad(aportará.( ( 6.1.6.$!Ubicación!del!usuario! ( Tenemos(que( prever(que( el(usuario(no( siempre(va(a( seguir(el(camino( que( nosotros(hemos( previsto,(ya(sea(por(haber(accedido(a(través(de(un(buscador,(o(porque(la(tenga(guardada(en( marcadores,(o(porque(alguien(la(comparta(a(través(de(las(redes(sociales(o(blog.(Por(ello(es( posible(que(el(usuario(en(ocasiones(se(pueda(necesitar(saber(dónde(se(encuentra,(para(lo(cual( daremos(soluciones(en(este(apartado.( Es(importante(que(la(web(tenga(un(logotipo(fácilmente(reconocible(o(muestre(claramente(el( nombre( de( la( web( en( la(que( nos( encontramos,( para( así( facilitar( esta( labor( a( los( nuevos( usuarios.( Para( aquellos( que( ya( estén( nuestro( sitio,( deberemos( ofrecerles( una( navegación( constante,( manteniendo( una( serie( de( elementos( comunes( a( todas( las( páginas.( Esto( ayuda( a( dar( coherencia( e( indicarle( al( usuario( que( realmente( se( continúa( en( la( misma( página,( y( es( fácilmente(implementable(mediante( una(zona(del(sitio(que(sea( común( a(todas( páginas.( Las( páginas(de(inicio(pueden(ser(una(excepción(ya(que(el(cometido(no(es(el(mismo(que(el(resto(de( páginas,( y( aquellas( en( las( que( aparezcan( formularios( pueden( ser( otra( excepción,( evitando( mostrar(elementos(innecesarios(para(intentar(evitar(distracciones(innecesarias.( Además(de(que(sepa(que(se(encuentra(en(nuestro(sitio(web,(deberemos(indicarle(en(qué(lugar( de(él(se(encuentra.(Para(ello(habrá(que(darle(alguna(indicación(resaltada(de(la(sección(donde( se(encuentra(en(un(lugar(claro(donde(el(usuario(pueda(verlo.( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 103( ( ( ( 6.1.7.$!Accesibilidad!de!los!usuarios!con!discapacidades!visuales! ( ( Independientemente( de( que( nuestra( web( esté( enfocada( específicamente( a( un( público( mayoritariamente(con(discapacidades(visuales,(debemos(intentar(ofrecer(a(este(colectivo(una( experiencia(tan(satisfactoria(como(a(cualquier(otro(usuario.( Una(discapacidad(visual(puede(definirse(según(la(OMS(como(“cualquier(restricción(o(carencia( (resultado(de(una(deficiencia)(de(la(capacidad(de(realizar(una(actividad(en(la(misma(forma(o( grado(que(se(considera(normal(para(un(ser(humano”.( En(este(caso(nos(centraremos(sobretodo(en(las(visuales,(y(debemos(tener(en(cuenta(que(una( discapacidad( visual( no( es( únicamente( una( ceguera,( sino( que( puede( ser( cualquier( tipo( de( limitación(que(le(impida(ver(de(forma(correcta.( Uno( de( los( aspectos( más( importantes( es( conseguir( que( el( diseño(sea( lo( más( claro( y( ligero( posible,( evitando( para( el( usuario( todo( tipo( de( confusiones.( A( decir( verdad( este( esta( recomendación(es(para(el(diseño(de(la(web(en(general,(ya(que(los(usuarios(“videntes”(actúan( fijándose(únicamente(en(los(aspectos(que(creen(más(importantes.( Para( usuarios( totalmente( invidentes( existen( sintetizadores( que( son( capaces( de( leer( el( contenido(de(la(página(web(en(la(que(está(el(usuario.(Por(ello(es(importante(mostrar(contenido( adicional(en(formato(texto(para(todas(las(imágenes(de(nuestro(sitio,(al(menos(aquellas(que( sean(suficientemente(importantes(como(para(aportar(algo(al(usuario.(Esto(se(realiza(mediante( etiquetas(alt(y(title(de(los(elementos(<img>.( Zona%común% Cabecera%sección% PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 104( Es( conveniente( también( no( redactar( textos( excesivamente( largos( puesto( que( dificulta( la( lectura,( ya( que( para( un( usuario( común( es( normal( extraer( información( sin( leer( todo( el( contenido,(pero( para(un(usuario( con(deficiencia(visual(esto( es( tremendamente(complicado.( También(lo(será(si(debe(esperar(a(que(el(sintetizador(lea(la(parte(en(la(que(está(interesada,(que( probablemente(esté(al(final(de(todo(el(texto.( Para( facilitar( la( lectura( de( las( páginas( con( gran( cantidad( de( textos,( se( recomienda( utilizar( encabezados( h1,( h2,( …( para( separar( el( texto( en( las( distintas( partes.( Esto( facilita( el( reconocimiento( de(estos( textos( por( un( sintetizador,( ya( que( es( posible( que( nombrara( los( distintos(encabezados(al(usuario(hasta(que(este(escogiera(uno(de(ellos(para(su(lectura.( En(el(caso(de(los(usuarios(invidentes,(la(solución(pasa(por(ofrecer(un(contenido(que(pueda(ser( entendible(por(un(ordenador,(ya(que(probablemente(nuestro(sitio(web(sea(procesado(por(un( sintetizador(capaz(de(leer(el(contenido(para(que(sea(entendible(por(el(usuario.( Para(los(usuarios(con(menor(grado(de(discapacidad(visual,(el(propio(navegador(es(capaz(de( ampliar( ciertas( partes( de( la( página( mediante( una( combinación( de( teclas.( Para( facilitar( la( experiencia( de( esta( utilidad,( debe( evitarse( codificar( todos( los( tamaños( absolutos.( Esto( es( aplicable(al(fichero(CSS,(y(debe(configurarse(en(relación(a(un(porcentaje.(Si(estamos(hablando( de(un(tamaño(de(contenedor,(se(establecerá(un(porcentaje(sobre(el(propio(contenedor(en(el( que(se(encuentra.(En(caso(de(que(estemos(hablando(de(tamaño(de(fuente,(los(estableceremos( en(relación(al(tamaño(de(fuente(predeterminada.( ( 6.2.$!Requisitos!de!la!aplicación! ( Cuando(vamos(a(definir(la(especificación(de(requisitos(de(nuestra(aplicación(deberemos(tener( en(cuenta(todos(aquellos(objetivos(para(los(cuales(va(a(ser(desarrollada.(Ver(cuáles(son(las( funciones(que(debe(cumplir,(los(requisitos(a(tener(en(cuenta,(y(las(características(que(deberá( tener.( El( objetivo( de( la( especificación( de( requisitos( es( ajustarse( a( las( necesidades( que( el( cliente( espera(de(la(aplicación,(y(en(caso(de(no(ajustarse(a(ellos,(poder(rectificar(a(tiempo(antes(de( empezar(a(desarrollar(la(aplicación.( ( 6.2.1.$!Captura!de!requisitos! ( Parece(lógico(que(el(primer(paso(deber(ser(capturar(las(necesidades(del(cliente(para(continuar( todo(el(proceso(a(partir(de(este(punto.(En(este(caso(el(problema(es(que(este(documento(es( parte(de(un(proyecto(académico(en(el(cuál(no(hay(un(cliente(propiamente(dicho.(Lo(que(se(ha( hecho( es( proponer( un(modelo( de( negocio( diferenciado(de( los( ya( existentes,( y( empezar( a( especificar(los(requisitos(poniéndose(siempre(en(el(lugar(del(cliente.( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 105( Para(paliar(este(hecho,(a(pesar(de(no(tener(un(cliente(propiamente(dicho,(habría(que(realizar( una( captura( de( requisitos.( Deberemos( en( primer( paso( identificar( todas( aquellas( personas( relacionadas(con(el(mundo(de(los(gimnasios((que(es(el(que(corresponde(a(este(PFC)(que(nos( puedan( aportar( información( sobre( los( procesos( que( se( llevan( a( cabo( en( este( tipo( de( organizaciones.( Para( la( captura( de( requisitos( existen( diversas( técnicas( que( nos( permiten( ir( recopilando( la( mayor( cantidad( posible( de( información,( procesos( que( se( desarrollan,( opiniones,( mejoras( posibles,(y(en(general(todos(aquellos(datos(que(puedan(ayudarlos(a(modelar(nuestro(sistema( de(información.( Una(de(estas(técnicas(que(podemos(utilizar(en(este(proceso(es(realizar(una(serie(de(entrevistas( con( algunos( trabajadores( o( directores( de( algún( gimnasio( al( que( tengamos( acceso.( Esta( entrevista(debe(estar(totalmente(preparada(de(antemano,(teniendo(en(cuenta(el(tipo(de(cargo( que(dispone(en(la(organización,(preparando(las(preguntas(que(van(a(realizarse((dependiendo( del( cargo( de( la( persona( entrevistada),( intentando( acotar( las( respuestas( para( que( el( entrevistado( no( se( vaya( por( las( ramas( y( documentar( todos( los( resultados( para( extraer( posteriormente(la(mayor(cantidad(posible(de(información.( Podemos(hacer(una(plantilla(para(ir(completando(los(distintos(datos(que(tenemos(que(tomar( del(entrevistado,(veremos(un(ejemplo(en(la(siguiente(tabla:( ( Pregunta% Respuesta% Nombre(y(Apellidos( ( Cargo(que(ocupa(en(el(centro( ( Edad( ( ¿Qué( tareas( realiza( habitualmente( en( su( trabajo?( ( ¿Cuáles( de( ellas( se( realizan( con( un( equipo( informático(y(cuáles(no?(( ( ¿Qué( software( utiliza( para( la( realización( de( dichas(tareas?( ( ¿Cómo( establece( comunicación( la( empresa( con(usted?( ( ¿Cómo(establece(usted(comunicación(con(los( usuarios?( ( ¿Qué( tareas( realizan( habitualmente( los( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 112( ( La( parte( del( menú( navegacional( será( la( encargada( de( crear( la( conexión( entre( las( distintas( vistas,(ya(que(permitirá(navegar(a(cualquiera(de(ellas.(Se(ha(procurado(que(posea(enlaces(a(los( apartados(más(relevantes(del(sitio(web,(sin(sobrecargarlo(demasiado,(e(intentando(por(otra( parte(que(la(importancia(de(todos(los(enlaces(sea(similar.( Otra(parte(importante(de(la(vista(Anónimo(es(la(parte(de(la(operación(Login.(Esta(parte(será(la( encargada(de(mostrar(un(formulario(donde(el(usuario(podrá(indicar(su(nombre(de(usuario(y( contraseña(para(poder(acceder(al(sitio(con(un(nivel(de(privilegios(diferente,(y(con(la(posibilidad( de(ejecutar(acciones(en(su(propio(nombre((como(puede(ser(reservar(una(actividad)( ( ( ( ( 6.3.2.2.%&Vista&Registrado& ( A( la( vista( registrado( se( accederá( una( vez( el( usuario( haya( realizado( un( inicio( de( sesión( satisfactorio.(Ésta(será(la(vista(que(permita(realizar(la(mayor(parte(de(las(acciones(a(un(usuario( común,( ya( que( éstas( van( asociadas( a( una( determinada( cuenta( de( usuario( (como( efectuar( reservas(en(las(instalaciones,(consultar(los(datos(del(usuario(y(modificarlos)( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 113( ( La(parte(de(la(vista(Registrado(posee(un(apartado(destinado(a(ver(la(información(propia(de(la( cuenta(del(usuario(que(será(la(encargada(de(mostrar(y(modificar(nuestros(datos,(y(otro(para( que(el(cliente(pueda(ver(de(un(vistazo(las(reservas(que(ha(realizado(y(que(están(próximas(a(la( fecha(actual.( La(operación(de(Login(del(usuario(anónimo(queda(reescrita(por(la(operación(Logout,(ya(que(un( usuario(registrado(no(tendrá(que(volver(a(hacer(login(hasta(que(no(haga(un(logout.( 6.3.2.3.%&Vista&Administrador& ( A( la( vista( Administrador( se( accederá( cuando( se( haya( iniciado( sesión( con( un( usuario( que( dispongo( de(privilegios( de( administrador( en( nuestra( aplicación.( El( método( de( acceso( es( el( mismo(que(el(usuario(registrado(común.( ( ( La( vista( Administrador( contendrá( un( conjunto( de( actividades( que( serán( de( utilidad( al( administrador(a(la(hora(de(añadir(contenidos(nuevos(y(efectuar(un(mantenimiento(completo( del( sitio( web.( Algunas( de( las( acciones( que( podrá( realizar( serán( la( inserción,( modificación( y( eliminación(de(actividades,(inserción(de(noticias,(modificación(de(instalaciones,(etc.( La(operación(Logout(permite(al(usuario(administrador(cerrar(su(sesión(y(volver(a(ser(usuario( anónimo.(Para(volver(a(realizar(operaciones(de(administración(deberá(hacer(login(nuevamente( con(su(usuario.( ( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 114( 6.3.3.$!Primeros!bocetos! ( Hablar( de( cómo( debe( ser( la( estructura( de( una( página( web( puede( resultar( un( concepto( demasiado( abstracto( para( explicar( a( otras( personas,( y( mucho( menos( para( discutir( con( un( cliente(acerca(del(formato(más(conveniente(que(deberíamos(adoptar.( Esta(situación(puede(darse(en(una(reunión(del(equipo(de(desarrollo(en(la(que(sea(conveniente( tomar(decisiones(sobre(cuáles(son(los(requisitos(visuales(de(una(determinada(página,(y(cuál( debe(ser(la(forma(más(adecuada(de(llevarlo(a(cabo.(Otra(posible(situación(es(en(la(fase(en(que( el(cliente(nos(presenta(la(especificación(de(requisitos(en(las(primeras(fases,(dónde(deberemos( mostrar(al(cliente(un(prototipo(de(la(idea(del(cliente,(para(que(pueda(comprobar(si(se(adecúa(a( sus(requisitos((y(poder(hacer(modificaciones(sobre(él)( ( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 115( Parece(importante(por(lo(tanto(crear(una(representación(gráfica(que(permita(poner(en(común( las(ideas(del(equipo,(permitiendo(valorar(las(posibles(ideas(y(realizar(modificaciones(de(una( forma(lo(más(colaborativa(posible.(Este(aspecto(es(particularmente(importante((también(en(la( relación(con(el(cliente,(ya(que(la(carencia(de(un(vocabulario(técnico(puede(impedir(poner( algunos(puntos(en(común(con(el(equipo(de(desarrollo.( (Este(tipo(de(representación(se(conoce(también(como(wireframe,(y(pretende(ser(una(guía(que( permita( mostrar( el( esqueleto( de( una( página( web( de( una( forma( lo( más( visual( posible,( sin( prestar(excesiva(atención(a(los(detalles,(pero(dejando(clara(la(disposición(de(los(elementos(que( la(forman,(como(los(contenidos,(los(menús(de(navegación,(las(acciones(que(se(pueden(realizar,( los(contenidos(multimedia,(etc.( Estas( representaciones( pueden( realizarse( perfectamente( al( modo( tradicional( con( papel( y( bolígrafo,(pero(tienen(la(desventaja(de(ser(menos(flexibles(a(modificaciones(que(una(versión( informatizada.(Para(el(desarrollo(del(presente(proyecto(se(usará(un(software(destinado(a(crear( este(tipo(de(representaciones,(en(este(caso(se(ha(optado(por(una(herramienta(onUline(llamada( Cacoo.( En( próximos( apartados( se( realizará( un( diseño( más( exhaustivo( de( todos(y( cada( uno( de( los( apartados(que(conforman(nuestro(sitio(web.(Aquí(lo(único(que(se(pretende(es(mostrar(una( vista(general(de(cual(será(su(forma.( ( 6.3.4.$!Esquemas!jerarquía!contenidos! ( Es( importante( establecer( una( jerarquía( de( contenidos,( mostrando( los( lugares( aproximados( donde(estos(irán(localizados(una(vez(esté(desarrollada(la(aplicación.(Este(esquema(será(usado( posteriormente( en( futuros( apartados( del( proceso( de( desarrollo( con( el( fin( de( acabar( de( modelar(las(distintas(páginas.( Aquí(no(se(pone(interés(al(diseño(o(colocación(de( las(distintos(contenidos,(simplemente(se( pretende( poner( de( manifiesto( los( contenidos( que( aparecerán( en( cada( apartado((página( de( nuestro(sitio(web).( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 116( ( ( ( 6.3.5.$!Esquemas!jerarquía!operaciones! ( Me(modo(similar(al(apartado(anterior,(también(es(importante(analizar(qué(operaciones(se(van( a(poder(realizar(en(cada(una(de(las(distintas(páginas.(Hay(que(recalcar(que(aquí(no(se(hace( distinción(entre(las(operaciones(a(las(que(tiene(acceso(cada(tipo(de(usuario,(para(ello(hay(que( consultar(los(escenarios.( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 117( ( ( 6.3.6.$!Diagramas!clases! ( El( diagrama( de( clases( es( un( diagrama( perteneciente( al( estándar( UML( que( pretende( dar( respuesta( a( las( clases( utilizadas,( sus( atributos,( y( las( relaciones( existentes( entre( ellos.( La( finalidad(de(este(diagrama(es(mostrar(la(estructura(del(sistema(que(se(va(a(desarrollar.(Dicho( diagrama(es(utilizado(en(el(proceso(de(análisis(y(diseño(de(los(sistemas.( Cada( entidad( es( representada( como( un( caja,( que( es( la( representación( para( cada( clase.( La( propia( entidad( dispone( de( una( serie( de( atributos( o( propiedades,( que( serán( representadas( dentro( de( la( misma( caja.( Dicha( representación( pretende( indicar( que( dichas( propiedades( pertenecen(a(esa(clase(en(concreto.( También(es(posible(describir(las(operaciones(que(es(posible(realizar(con(ese(objeto,(y(suele( diferenciarse(de(las(propiedades(por(aparecer(una(línea(horizontal(de(separación(entre(ambas,( y(escribirse(con(el(símbolo(()(al(final.(En(este(proyecto(se(ha(pretendido(orientar(la(estructura( de(3(niveles,(por(lo(que(se(ha(evitado(usar(esta(forma(de(definir(métodos((a(pesar(de(que(es( perfectamente(válida).( Para(la(realización(de(este(diagrama(es(conveniente(la(utilización(de(un(software(específico,( que(permita(entre(otras(cosas(definir(el(tipo(de(datos(de(los(atributos.(También(permite(una( modificación( más( rápida,( y( es( interesante( para( definir( otro( tipo( de( diagramas( a( partir( del( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 118( diagrama(de(clases.(En(este(caso(se(ha(utilizado(uno(llamado(Moskitt,(gratuito(y(disponible( para(Linux,(MacOS(X(y(Windows.( ( ! 6.4.$!Diseño! ( Para(el(desarrollo(de(la(fase(de(diseño(utilizaremos(los(documentos(que(se(han(generado(en(la( fase(de(análisis.(En(este(caso(habrá(que(añadirle(los(aspectos(técnicos(que(permitirán(llevar(a( cabo(la(implementación(del(sistema(completo.( Esta(fase(tiene(como(objetivo(principal(documentar(la(forma(de(resolver(los(problemas(que(se( han(estudiado(en(la(fase(de(análisis.(( En(caso(de(que(el(desarrollo(vaya(a(ser(llevado(a(cabo(por(un(equipo(de(desarrollo,(esta(fase( implicará(la(participación(activa(de(todo(el(equipo.(( ( 6.4.1.$!Arquitectura!3!niveles! ( En( toda( implementación( software( de( proyectos( de( cierta( envergadura( es( conveniente( la( utilización(de(una(separación(entre(diversas(capas.(La(separación(principal(viene(entre(la(capa( de(diseño(y(la(de(la(lógica(de(diseño.( La(motivación(de(esta(separación(por(capa(viene(dada(por(la(necesidad(de(adelantarse(a(las( posibles(modificaciones(o(mejoras(del(código.(Si(en(un(momento(dado(es(necesario(un(cambio( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 119( en(el(código,(deberá(identificarse(a(qué(capa(corresponde(dicha(modificación.(El(siguiente(paso( será(realizar(la(modificación(únicamente(en(esa(capa,(utilizando(la(interfaz(de(programación(de( la(capa(inferior.( De( esta( forma( ayudaremos( a( mantener( un( código( más( amigable( para( el( programado,( con( mayor( facilidad( para( comprenderlo,( con( un( mantenimiento( menos( costoso,(y( además( permitiendo(realizar(nuevos(métodos(en(menos(tiempo.( En(la(gráfico(inferior(puede(verse(la(separación(en(capas(de(la(arquitectura(escogida(para(este( proyecto,(concretamente(un(diseño(en(tres(capas:( ( ( ( En(primer(lugar(la(capa(de(persistencia(se(encarga(de(los(accesos(a(la(base(de(datos,(por(lo(que( su(implementación(depende(de(la(tecnología(de(base(de(datos(utilizada.(Ésta(se(encargará(de( realizar( las( conexiones( a( la( base( de( datos( y( de( ejecutar( las( consultas,( inserciones,( modificaciones(y(borrados.( En(la(capa(de(lógica(se(encuentran(los(distintos(métodos(que(se(encargan(de(toda(la(lógica(de( negocio,(estos(son(aquellos(que(se(encargan(de(procesar(los(datos(para(establecer(acciones( con( ellos.( Dichos( datos( son( extraídos( a( través( de( los( métodos( que( proporciona( la( capa( de( persistencia.( La(capa(de(presentación(se(encuentra(en(la(cumbre(de(toda(la(arquitectura,(y(se(encarga(de( mostrar(al(usuario(todos(los(datos(una(vez(han(sido(procesados(por(la(lógica(de(negocio.(La( utilidad(de(esta(capa(es(presentación(de(todos(los(datos,(y(la(interacción(con(el(usuario.( ( 6.4.2.$!Capa!de!presentación! ( La( capa( de( presentación( se( encarga( de( todos( aquellos( aspectos( que( tienen( que( ver( con( la( propia(visualización(de(la(interfaz(de(la(aplicación.(Uno(de(los(apartados(serán(los(bocetos(del( diseño(que(cada(uno(de(los(apartados(presentados(en(el(mapa(conceptual.(Además(será(crucial( Capa(de( presentación( Capa(de(lógica( Capa(de(persistencia( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 120( definir( las( vistas( de( cada( uno( de( ellos( especificando( los( contenidos( que( incluirá.( Habrá( apartados( comunes( a( todas( las( páginas( que( se( definirán( de( modo( general.( Por( último( se( incluirán(los(patrones(de(diseño(utilizados(en(la(industria(de(la(ingeniería(web(para(resolver( ciertos(problemas(de(interfaz(que(pueden(aparecer(al(intentar(diseñar(una(aplicación(web.( ( 6.4.2.1.%&Bocetos&específicos& ( Una(vez(ya(se(ha(realizado(el(primer(boceto(general(de(nuestra(interfaz,(y(ya(están(declaradas( las(distintas(vistas(que(va(a(tener(nuestra(aplicación,(es(hora(de(empezar(a(definir(las(diseñar( los(bocetos(de(cada(uno(de(los(distintos(apartados.( Como(el(boceto(general(ya(está(diseñado,(a(partir(de(este(punto(se(va(a(obviar(el(diseño(ya( realizado.(La(parte(mostrada(en(los(siguientes(apartados(muestra(únicamente(la(parte(que(se( muestra( en( el( contenedor( principal,( esto( es( para( simplificar( los( bocetos( de( los( distintos( apartados.( % % Instalaciones% El(apartado(“Instalaciones”(mostrará(dos(zonas(claramente(diferenciadas.(En(la(zona(izquierda( aparecerá(el(plano(del(gimnasio(con(las(distintas(estancias(representadas(en(él.(En(la(parte( derecha(aparecerá(una(imagen(fija,(junto(con(una(indicación(sobre(el(uso(de(la(página.(Sobre(el( plano( de( la( parte( izquierda(se( podrá( hacer( click( sobre( una( de( las( distintas( estancias( que( aparecen.(Una(vez(realizada(dicha(acción,(la(imagen(de(la(zona(derecha(cambiará(para(mostrar( ahora(una(imagen(de(la(estancia(en(la(que(se(ha(hecho(click.(A(su(vez(también(aparecerá(un( pequeño(comentario(sobre(la(estancia.( ( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 121( ( ( Actividades% En( el( apartado( “Actividades”( (aparecerán( dos( zonas( claramente( diferenciadas,( siendo( la( imagen(de(la(parte(derecha(totalmente(estática,(mostrando(una(imagen(fija.(La(parte(izquierda( muestra( una( estructura( en( forma( de( acordeón( donde( se( podrán( seleccionar( las( distintas( actividades( haciendo( click( en( su( respectivo( nombre.( Una( vez( que( se( ha( seleccionado( una( actividad(aparecerá(un(apartado(con(el(grado(de(actividad(que(exige(su(realización(y(un(botón( donde( poder( conseguir( más( información.( Este( botón( llevará( a( otra( página( diferente( donde( únicamente(aparecerá(información(sobre(esa(actividad.( ( ( ( Detalle%Actividad% En( el( apartado( “Detalle( actividad”( aparecerá( la( únicamente( la( información(relativa( a( la( actividad(que(ha(sido(seleccionada.(Aquí(también(aparecen(dos(zonas(bien(diferenciadas,(una(a( la(parte(izquierda(y(otra(a(la(derecha.(En(la(zona(derecha(aparecerá(una(imagen(representativa( de(la(actividad(seleccionada.(En(la(parte(izquierda(aparecerán(distintos(conceptos(como(son(el( nombre(de(la(actividad,(la(descripción(de(la(misma,(y(los(horarios(en(los(que(está(disponible(su( reserva.( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 128( • Instalaciones( ( ( • Actividades( ( ( • Detalle(Actividad( ( ( ( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 129( 6.4.2.3.%&Partes&de&la&interfaz& ( En(uno(de(los(apartados(anteriores(se(ha(visto(el(boceto(general(de(la(aplicación,(y(después(se( han( empezado( a( diseñar( los( conceptos( específicos( únicamente( de( los( contenidos.( Pero( si( prestamos(atención(hay(una(parte(que(ha(quedado(sin(mencionar,(y(son(precisamente(todos( aquellos(apartados(que(no(son(propiamente(el(contenido.(Entre(ellos(podemos(mencionar(la( zona(de(login,(la(cabecera(o(el(pie(de(página.( ( Zona%login( ( Esta(zona(tiene(varias(finalidades(dependiendo(del(momento(en(el(que(nos(encontremos.(En( un(primer(término(sirve(de(puerta(de(entrada(al(sistema(para(los(usuarios(anónimos,(ya(que(es( el(lugar(dónde(se(debe(introducir(el(nombre(de(usuario(y(contraseña.(Aquí(podemos(ver(un( ejemplo:( ( ( ( Una( vez( el( usuario( ya( se( haya( logueado,( se( puede( dar( el( caso( de( que( el( usuario( sea( administrador,( o( sea( un( cliente( común.( Ambos( casos( están( diferenciados( tanto( en( la( parte( gráfica,(como(en(la(gráfica.(A(continuación(vamos(a(ver(el(usuario(administrador:( ( ( ( Vamos(a(describir(todos(los(elementos(de(izquierda(a(derecha.(En(primer(lugar(veremos(un( icono( con( un( engranaje,( en( realidad( es( un( enlace( hacia( la( página( de( configuración.( A( continuación(aparece(un(mensaje(de(bienvenida(personalizado(con(el(nombre(del(usuario(que( ha(iniciado(sesión.(Por(último(aparece(un(enlace(para(poder(desconectarse(de(la(sesión,(en( cuyo(caso(volveremos(al(punto(de(inicio.( Ahora(vamos(con(el(caso(del(usuario(común:( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 130( ( ( En(este(caso(únicamente(se(van(a(comentar(las(diferencias(con(la(interfaz(que(aparece(en(el( mensaje(del(administrador.(Y(básicamente(la(diferencia(sólo(es(una,(concretamente(el(icono( del(engranaje(ha(cambiado.(También(ha(cambiado(el(enlace(al(que(apuntaba,(que(ha(pasado(a( apuntar(a(un(apartado(en(el(que(el(usuario(puede(ver(y(modificar(información(propia.( ( Zona%cabecera% ( Esta( zona( es( bastante( sencilla( y( comprende( la( parte( superior( de( la( web,( conocida( como( “cabecera”.(Una(de(las(motivaciones(de(esta(zona(es(ofrecer(al(usuario(una(coherencia(entre( las( distintas( páginas( que( componen( el( sitio,( para( que( sepa( en( todo( momento( que( no( ha( abandonado(nuestra(web.(Por(otro(lado,(refuerza(la(marca(de(nuestro(negocio(incluyendo(en( todo(momento(el(logotipo(de(nuestra(empresa(en(la(parte(izquierda.( El(resto(de(la(cabecera(permanecerá(sin(contenido(a(excepción(de(la(parte(derecha,(donde( aparecerá(la(zona(de(login(mencionada(en(el(apartado(anterior.( ( ( ( Zona%pie%pagina% ( Esta( zona( está( reservada( para( los( temas( legales( relacionados( con( el( propio( sitio( web,( en( nuestro( caso( se( da( información( de( quien( es( el( responsable( del( sitio,( adjuntando( un( enlace( hacia( su( sitio( web( personal.( También( sirve( como( promoción( para( quien( ha( diseñado( y( programado(el(sitio.( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 131( Este( apartado( también( esta( relacionado( con( el( posicionamiento( para( buscadores,( ya( que( intercambiando(enlaces(entre(el(propio(sitio(y(el(sitio(web(del(desarrollador(se(pueden(mejorar( los(resultados(de(las(búsquedas(en(los(distintos(buscadores.( ( ( ( Zona%camino%navegacional% ( La(zona(del(camino(navegacional(depende(totalmente(de(la(página(concreta(del(sitio(en(la(que( se(encuentre(el(usuario.(Esto(es(así(ya(que(muestra(el(lugar(donde(se(encuentra(actualmente(el( usuario,( precedido( del( camino( que( se( ha( tomado( para( llegar( a( la( lugar( actual.( Todos( los( caminos(que(preceden(a(la(situación(actual(son(enlaces(que(llevan(a(sus(respectivos(lugares.( La(motivación(de(esta(zona(es(que(el(usuario(tenga(una(idea(clara(de(donde(se(encuentra(en(el( momento( actual,( pero( además( que( recuerde( los( pasos( que( ha( tomado( desde( el( punto( de( partida.(Esto(ayuda(a(volver(a(puntos(anteriores(en(caso(de(que(desee(volver(sobre(sus(pasos.( ( ( ( Zona%menú%navegacional% ( Este(apartado(va(a(ser(el(más(importante(en(cuanto(al(tema(de(navegación(de(refiere,(ya(que( va(a(permitir(al(usuario(moverse(por(los(distintos(apartados(del(sitio(web.(Es(importante(que( esta(zona(esté(visible(en(todo(momento,(en(una(zona(muy(visible(para(que(el(usuario(pueda( verlo(en(caso(de(que(necesite(navegar(hacia(otro(apartado(la(web.( Deberá( tener( un( estilo( visual( que( permita( diferenciarlo( de( las( zonas( inmediatamente( colindantes,( con( el( objetivo( de( que( destaque( sobre( el( resto( del( contenido,( y( sea( visible( rápidamente(por(el(usuario.( ( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 132( 6.4.3.$!Capa!negocio! ( En(esta(capa(se(desarrollan(todos(aquellos(métodos(que(sirven(para(dotar(de(funcionalidad(a( nuestro( sitio,( como( pueden( ser( las( funciones( de( login,( logout,( modificación( de( datos( personales…( La( otra( funcionalidad( de( esta( capa( es(proporcionar(los( datos( necesarios( que( requiera(la(capa(superior,(este(es(el(ejemplo(de(listar(actividades,(listar(instalaciones,(etc.( ( Login%de%usuario% Entrada( Nombre(de(Usuario,(Password( Proceso( • Comprobar(que(los(campos(no(estén(vacío((de(lo(contrario(dar(un(error)( • Comprobar(que(el(usuario(realmente(existe( • Comprobar(que(la(cuenta(no(esté(deshabilitada( • Comprobar(que(realmente(sea(esa(su(password( Salida( Login(correcto,(usuario(no(existe,(contraseña(incorrecta,(falta(algún(dato( ( Logout%del%usuario% Entrada( Ninguna( Proceso( • Finalizar(la(sesión(en(el(servidor( Salida( Ok,(Error( ( Listar%actividades% Entrada( Ninguna( Proceso( • Obtener(todas(las(actividades(de(la(Base(de(Datos( Salida( Lista(de(actividades,(Error( ( Modificar%actividad% Entrada( objeto(Actividad( Proceso( • Extraer(el(id(del(objeto(Actividad( • Modificar(dicho(registro(en(la(base(de(datos( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 133( Salida( Ok,(Error( ( Crear%nueva%actividad% Entrada( objeto(Actividad( Proceso( • Guardar(dicho(registro(en(la(base(de(datos( Salida( Ok,(Error( ( Listar%horarios%de%actividad% Entrada( Id(de(actividad( Proceso( • Obtener(todas(las(horarios(de(la(Base(de(Datos(de(esa(actividad( Salida( Lista(de(actividades,(Error( ( Modificar%horario% Entrada( objeto(Horario( Proceso( • Extraer(el(id(del(objeto(Horario( • Modificar(dicho(registro(en(la(base(de(datos( Salida( Ok,(Error( ( Crear%nuevo%horario% Entrada( objeto(Horario( Proceso( • Guardar(dicho(registro(en(la(base(de(datos( Salida( Ok,(Error( ( Listar%usuarios% Entrada( Ninguna( Proceso( • Obtener(todos(los(usuarios(de(la(Base(de(Datos( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 134( Salida( Lista(de(usuarios,(Error( ( Modificar%usuario% Entrada( objeto(Usuario( Proceso( • Extraer(el(id(del(objeto(Usuario( • Modificar(dicho(registro(en(la(base(de(datos( Salida( Ok,(Error( ( Nuevo%usuario% Entrada( objeto(Usuario( Proceso( • Guardar(dicho(registro(en(la(base(de(datos( Salida( Ok,(Error( ( Modificar%contraseña% Entrada( idUsuario,(contraseña(antigua,(contraseña(nueva( Proceso( • Se(extrae(el(registro(de(dicho(usuario(en(la(base(de(datos( • Se(crea(un(objeto(Usuario(con(dichos(datos( • Se(modifica(la(contraseña(de(ese(objeto( • Se(guarda(dicho(objeto(en(la(Base(de(Datos( Salida( Ok,(Error( ( Listar%profesores% Entrada( Ninguna( Proceso( • Obtener(todos(los(profesores(de(la(Base(de(Datos( Salida( Lista(de(profesores,(Error( ( ( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 135( Modificar%profesor% Entrada( objeto(Profesor( Proceso( • Extraer(el(id(del(objeto(Profesor( • Modificar(dicho(registro(en(la(base(de(datos( Salida( Ok,(Error( ( Nuevo%profesor% Entrada( objeto(Profesor( Proceso( • Guardar(dicho(registro(en(la(base(de(datos( Salida( Ok,(Error( ( Listar%noticias% Entrada( Ninguna( Proceso( • Obtener(todas(las(noticias(de(la(Base(de(Datos( Salida( Lista(de(noticias,(Error( ( Modificar%noticia% Entrada( objeto(Noticia( Proceso( • Extraer(el(id(del(objeto(Noticia( • Modificar(dicho(registro(en(la(base(de(datos( Salida( Ok,(Error( ( Nueva%noticia% Entrada( objeto(Noticia( Proceso( • Guardar(dicho(registro(en(la(base(de(datos( Salida( Ok,(Error( ( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 136( Modificar%instalación% Entrada( objeto(Instalacion( Proceso( • Extraer(el(id(del(objeto(Instalacion( • Modificar(dicho(registro(en(la(base(de(datos( Salida( Ok,(Error( ( Geolocalización% Entrada( Ninguna( Proceso( • Comprobar(si(el(navegador(soporta(esta(característica( • Extraer(la(latitud( • Extraer(la(longitud( Salida( Latitud(y(longitud(donde(se(encuentra(el(usuario( ( Navegación%hasta%el%gimnasio% Entrada( Posición( del( usuario( (latitud( y( longitud),( y( posición( del( gimnasio( (latitud( y( longitud)( Proceso( • Cargar(un(mapa(con(la(API(de(Google(Maps( • Cargar(la(posición(del(usuario(como(origen(de(la(ruta( • Cargar(la(posición(del(gimnasio(como(destino(de(la(ruta( • Calcular(la(ruta(desde(el(origen(al(destino( Salida( Latitud(y(longitud(donde(se(encuentra(el(usuario( ( ( 6.4.4.$!Capa!persistencia! ( Una(vez(llegados(a(este(punto,(ya(deberíamos(tener(claro(qué(sistema(gestor(de(base(de(datos( vamos( a( utilizar(en( nuestro( proyecto,( ya( que( el( desarrollo( de( esta( capa( está( íntimamente( relacionado(con(él.(Esto(es(así(puesto(que(cada(SGBD(que(utilicemos(nos(proporcionará(una( interfaz( de( programación( (API)( distinta( a( otro( SGBD.( Dicha( API( nos( proporcionará( diversos( métodos(que(utilizaremos(en(esta(capa(para(operaciones(de(consulta,(inserción,(modificado(o( borrado(de(las(distintas(tablas.(( En(la(siguiente(ilustración(se(puede(apreciar(el(esquema(EntidadURelación(de(la(BBDD:( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 137( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( Id( Nombre( Descripción( gradoActividad( visible( personas( ( Vv( Actividades( Nombre( valor( Config( Usuario( cantidad( Deudas( Id( id_actividad( hora_inicio( hora_final( dia( monitor( nivel( ( Turnos_actividades( Id( Nombre( Descripción( imagen( visible( ( Vv( Instalaciones( Id( titular( subtitular( texto( imagen( fecha( visible( Noticias( Id( Nombre( Apellidos( abreviatura( ( Vv( Profesor( Id( id_usuario( id_actividad( id_horario( fecha( accedido( ( dsd( Reservas( Id( actividad( nivel( dia( hora( duración( profesor( ( Turnos_actividad es( User( pass( privs( email( nif( teléfono( rfid( Users( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 144( Es(posible(que(en(el(transcurso(de(la(navegación(por(el(sitio,(el(usuario(llegue(a(una(página(que( no(exista.(Puede(que(sea(una(página(antigua,(o(que(el(usuario(no(la(recuerde(bien(al(teclear(la( URL( de( forma( manual.( Se( pretende( que( además( del( error,( se( proporcione( información( de( utilidad(sobre(el(sitio(para(ayudar(al(usuario(a(encontrar(aquello(que(buscaba.( ( Solución( Ofrecer( páginas( de( error( personalizadas( con( un( mapa( que( permita( saber( la( estructura( de( nuestro(sitio,(un(buscador(por(si(el(usuario(sigue(sin(intuir(dónde(se(encuentra(el(recurso(que( estaba( solicitando.( Adicionalmente( se( podría( capturar( la( URL( introducida( para( ofrecer( sugerencias(al(usuario(del(recurso(que(buscaba.( ( Ejemplo( ( ( ( 6.4.5.7.%&Camino&navegacional& ( Intención( En(el(transcurso(de(la(navegación(por(el(sitio(que(vamos(a(diseñar,(debemos(ofrecer(al(usuario( una(referencia(del(lugar(donde(se(encuentra,(y(de(los(lugares(a(través(de(los(que(ha(llegado.( Esto( ayuda( a( ofrecer( una( mejor( experiencia,( permitiendo( situarse( mejor( al( usuario,( y( referenciando(los(lugares(por(los(que(ha(pasado.( ( Solución( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 145( En(cada(apartado(puede(aparecer(el(camino(que(se(ha(seguido(antes(de(llegar(a(ese(elemento.( Este(camino(aparecerá(en(forma(de(enlace(para(permitir(al(usuario(volver(sobre(sus(pasos(en( cualquier( momento,( y( diferenciando( visualmente(de( algún( modo( (negrita,( resaltado,( coloreado…)( el( lugar( en( el( que( se( encuentra( en( la( actualidad.( En( esta( última( referencia( no( incluiría(ningún(enlace,(ya(que(se(trataría(de(la(misma(página.( ( Ejemplo( En( la( web( española( del( portal( eBay( podemos( encontrar( un( ejemplo( perfecto( de( camino( navegacional.(Este(se(utiliza(en(el(momento(de(ir(navegando(por(las(distintas(categorías(para( encontrar(los(artículos(por(parte(del(usuario.(En(todo(momento(el(usuario(puede(navegar(por( las(categorías(inmediatamente(superiores.( ( ( ( 6.4.5.8.%&Pestañas& ( Intención( En(nuestro(sitio(puede(ser(interesante(separar(distintos(tipo(de(contenido(mediante(un(menú( navegacional,( en( el( que( se( permita( que( los( usuario( puedan( acceder( a( los( recursos( más( importantes.( Sería( interesante( sugerir( gráficamente( que( existe( un( elemento( físico( que( se( encarga(de(separarlos(como(en(la(realidad(podría(hacerlo(un(archivador(de(carpetas.( ( Solución( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 146( Mediante( la( implementación( de( pestañas( ayudamos( al( usuario( a( crear( la( idea( de( que( son( contenidos(distintos(y(que(por(lo(tanto(es(conveniente(que(dispongan(de(una(cierta(separación( física.(Además(se(implementará(en(distintos(colores,(de(forma(que(la(pestaña(en(la(que(nos( encontremos(ofrezca(una(distinción(visual(que(permita(distinguir(nuestra(ubicación(actual.( ( Ejemplo( ( ( 6.5.$!Implementación! ( 6.5.1.$!Tecnologías!interfaz! ( Para(la(interfaz(se(va(a(usar(un(documento(HTML(carente(de(todo(tipo(de(estilos.(La(idea(es( que(dicho(documento(defina(únicamente(las(estructuras(que(permitan(identificar(los(distintos( bloques(y(contenidos(de(la(página.(Llegados(a(este(punto,(desarrollaremos(un(fichero(de(estilos( que(será(un(documento(CSS,(donde(iremos(asignando(estilos(a( cada(una(de(las(estructuras( identificadas(en(el(documento(HTML.( ( ( ( ( ( ( <html>( <body>( <div(id=”#cont”>Ejemplo</div>( <div(id=”#cont2”>( ((((<img(src=”portada.jpg”>( </div>( </body>( </html>( Ejemplo(HTML( #cont({( (((((marginUtop:(10px;( (((((backgroundUcolor:(#FF1245( }( #cont2(img({( ((((((width:(100px;( ((((((height:(100px;( }( Ejemplo(CSS( +( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 147( ( ( Como(se(puede(ver(en(el(ejemplo(anterior(el(documento(HTML(declara(dos(contenedores(“div”( con( identificadores( “cont1”( y( “cont2”.( En( ningún( momento( se( hace( mención( a( colores,( tamaños,( márgenes,( etc.( En( el( ejemplo( CSS,( se( puede( ver( como( aparecen( las( definiciones( anteriores(con(una(serie(de(estilos(definidos(en(su(interior.( Para( hacer( que( el( archivo( CSS( se( asocie( a( nuestro( documento( HTML( tendremos( que( especificarlo(en(dicho(documento(mediante(la(siguiente(línea(en(el(apartado(“<head>”:( ( ( ( Este(método(de(definir(estilos(a(nuestros(sitios(web(es(el(recomendado(por(el(W3C(a(partir(de( la( versión( HTML( 4( para( el( mejor( cumplimiento( de( los( estándares.( Las( etiquetas( HTML( que( aparecían( en( versiones( anteriores( del( lenguaje( para( definir( los( distintos( estilos( de( cada( elemento,(están(obsoletas.( Otra(de(las(ventajas(que(proporciona(esta(tecnología(es(la(posibilidad(de(intercambiar(distintas( visualizaciones(de(una(misma(página,(con(el(simple(hecho(de(intercalar(un(archivos(de(estilos( CSS(u(otro.(Supongamos(que(deseamos(que(nuestra(página(sea(vista(en(distintos(dispositivos( móviles,(o(en(navegadores(que(no(cumplen(los(estándares(al(100%.(Otra(utilización(sería(para( el( cambio( del( estilo( de( la( página( en( momentos( especiales( como( podrían( ser( navidades,( aniversarios,(rebajas…( A(continuación(se(puede(ver(un(esquema(del(funcionamiento(de(esta(tecnología,(intercalando( distintos(archivos(de(estilos(CSS(sobre(un(mismo(documento(HTML.( ( ( ( <link(href="ficheroCSS.css"(rel="stylesheet"(type="text/css">( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 148( 6.5.2.$!Tecnologías!aplicación! ( Para(el(desarrollo(de(esta(parte(de(la(aplicación(existe(una(limitación(importante(que(tiene(que( ver(con(el(lugar(donde(se(ejecuta(el(código(de(la(aplicación.(Concretamente(tenemos(un(tipo( de(código(que(se(encarga(de(la(interacción(con(el(navegador(en(un(primer(nivel,(cuyo(código( será(ejecutado(en(el(propio(navegador.(El(lenguaje(elegido(para(que(se(ejecute(de(forma(nativa( en(el(navegador((sin(necesidad(de(añadidos)(se(denomina(JavaScript.(En(un(segundo(término( tenemos(otro(tipo(de(código(que(es(ejecutado(en(el(propio(servidor(,(y(que(será(el(encargado( de( devolver( al( cliente( los( documentos( dinámicos( generados( a( partir( de( los( parámetros( recabados.(El(lenguaje(utilizado(es(PHP.( Para( desarrollar( mejor( ambas( partes,( se( ha( desarrollado( la( explicación( en( dos( apartados( diferentes:( ( 6.5.2.1%&Lado&del&cliente& ( Este( apartado( implica( siempre( una( dificultad( adicional,( ya( que( no( podemos( controlar( la( configuración(del(navegador(del(cliente,(por( lo(que(nuestra(aplicación( siempre(puede( tener( ciertas(incompatibilidades(que(no(somos(capaces(de(controlar.( El( navegador( siempre( ha( sido( el( instrumento( encargado( de( mostrar( el( contenido( de( la( navegación,( bien( siendo( texto( o( contenido( multimedia,( y( el( encargado( de( realizar( la( interacción(de(la(navegación(mediante(los(enlaces.(Por(tanto(las(funciones(que(podía(realizar(el( navegador(eran(un(tanto(limitadas.( Esto(se(intentó(solventar(intentando(incluir(alguna(forma(de(que(poder(ejecutar(código(dentro( del( propio( navegador.( Estos( son( generalmente( lenguajes( de( script( que( forman( parte( del( contenido(de(la(página(y(son(capaces(de(interactuar(con(los(distintos(elementos(que(la(forman.( ( ( ( Funcionamiento(JavaScript( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 149( A(lo(largo(de(la(historia(de(Internet,(las(tecnologías(del(lado(del(cliente(han(ido(evolucionando( con(soluciones(como(JavaScript,(VBScipt,(ActiveX,(Applets(Java(y(elementos(Flash.((Los(mayores( problemas( que( han( surgido( siempre( han( sido( las( incompatibilidades( entre( los( distintos( navegadores.(Por(un(lado(unos(estaban(implementados(únicamente(en(ciertos(navegadores( (VBScript(y(ActiveX(para(Internet(Explorer),(y(otros(por(la(necesidad(de(tener(instalados(ciertos( plugins(para(la(correcta(ejecución(del(código((Applets(Java(y(elementos(Flash).( Actualmente( podemos( decir( que( la( tecnología( más( compatible( y( que( mayor( auge( está( teniendo(en(los(últimos(tiempos(es(JavaScript.(Hay(que(decir(que(aunque(el(lenguaje(existe( desde(hace(muchos(años,(es(ahora(cuando(están(surgiendo(nuevas(aplicaciones(gracias(a(la( jerarquía(de(objetos(del(navegador((DOM),(a(la(lucha(actual(de(todos(los(navegadores(por(la( compatibilidad(con(los(estándares(del(W3C,(y(al(desarrollo(de(motores(JavaScript(capaces(de( ejecutar(códigos(más(complejos(en(menos(tiempo.( Por( tanto( parece( obvio( que( para( este( proyecto( utilizaremos( el( lenguaje( JavaScript,( y( la( jerarquía(de(objetos(del(navegador((DOM).(Todo(ello(respetando(los(estándares(fijados(por(el( W3C,( que( es( la( encargada( de( redactar( las( especificaciones( para( las( distintas( tecnologías( utilizadas(en(el(ámbito(de(la(Web.( Entre(las(utilidades(de(este(lenguaje(se(encuentra(la(de(posibilidad(de(interacción(con(cualquier( elemento(de(las(páginas.(Ejemplos(de(ello(puede(ser(la(consulta(de(los(datos(introducidos(por( el( cliente( en( los( formularios,( ejecución( de( acciones( asociadas( a( eventos( como( clicks,( modificación(de(la(visualización(de(elementos,(etc.( Otro(aspecto(a(tener(en(cuenta(en(el(uso(del(código(en(el(lado(del(cliente(es(el(uso(de(los( distintos(frameworks,(que(no(son(más(que(librerías(a(modo(de(APIs(que(podemos(utilizar(para( programar(nuestras(aplicaciones.(Usar(este(tipo(de(desarrollo(tiene(múltiples(ventajas(como(la( mayor(facilidad(de(escribir(código,(una(mayor(compatibilidad,(comunicación(mediante(AJAX,( validación(de(formularios(y(manejo(de(eventos.(Los(frameworks(más(importantes(son(JQuery,( Dojo(Toolkit,(Prototype(y(Mootools.( A( continuación( podemos( ver( un( ejemplo( de( un( script( escrito( en( JavaScript( implementado( dentro(de(un(documento(HTML(mediante(las(etiquetas(<script></script>:( ( ( ( ( ( Ejemplo(JavaScript( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 150( 6.5.2.2%&Lado&del&servidor& ( ( En(el(caso(del(código(que(se(ejecute(en(el(lado(del(servidor(no(disponemos(de(los(problemas( que(se(comentaban(en(el(apartado(anterior,(ya(que(todo(el(código(se(ejecuta(en(el(lado(del( servidor,(por(lo(que(seremos(nosotros(los(encargados(de(configurar(el(entorno(en(el(que(se(va( a(ejecutar(el(código.( La( cantidad( de( tecnologías( que( podemos( utilizar( para( la( programación( de( este( código( es( prácticamente(infinita(y(ahora(veremos(por(qué.(Por(un(lado(hay(tecnologías(específicas(que( están(diseñadas(para(la(ejecución(de(código(en(un(servidor(web,(los(ejemplos(más(conocidos( de(estas(tecnologías(son(PHP,(ASP.NET,(JSP(y(Servlets(de(Java.(Estas(son(las(tecnologías(más( recomendadas( a( la( hora( de( implementar( el( código.( Debemos( tener( en( cuenta( que( nuestro( servidor(debe(ser(compatible(con(el(tipo(de(tecnología(empleada.( Por(otro(lado(está(el(uso(de(lenguajes(genéricos(mediante(el(uso(de(la(tecnología(CGI.(Esto(se( trata(de(el(navegador(es(capaz(de(redireccionar(la(entrada(a(un(programa(estándar,(y(la(salida( del(programa(al(navegador(para(que(el(cliente(pueda(visualizarlo.(Estos(programas(son(los(que( pueden(estar(escritos(en(cualquier(lenguaje,(siempre(y(cuando(dispongamos(de(el(programa( compilado( o( un( intérprete( que( sea( capaz( de( entenderlo.( Por( lo( tanto( podremos( utilizar( lenguajes(tan(variopintos(como(Perl,(C(o(Bash.( Para( nuestro( proyecto( vamos( a( utilizar( PHP( funcionando( mediante( un( módulo( del( servidor( Web(Apache.(En(el(apartado(del( Servidor(Web(están(explicados(todos(los(pasos(necesarios( para(la(creación(del(entorno(que(permita(ejecutar(nuestro(código.(Ahora(vamos(a(pasar(a(ver( un(poco(en(qué(consiste(este(lenguaje:( ( ( ( En(primer(lugar(es(un(lenguaje(de(script(interpretado.(Esto(quiere(decir(que(el(código(no(hay( que(compilarlo,(si(no(que(se(interpreta(en(tiempo(de(ejecución.(Además(el(código(puede(ser( incrustado( en( el( propio( documento( HTML,( por( lo( que( su( uso( será( menos( traumático( si( ya( Funcionamiento(PHP( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 151( sabemos( programar( documentos( estáticos.( Su( inclusión( se( realiza( mediante( las( etiquetas( específicas((<?php(y(?>)(que(delimitan(el(código(PHP(del(resto(del(HTML.( El(siguiente(ejemplo(muestra(un(documento(HTML(5,(en(el(cual(podemos(ver(las(etiquetas(que( delimitan(el(código(PHP.(Este(código(simplemente(muestra(el(mensaje(‘Esto(es(código(PHP’(en( el(navegador:( ( ( ( ( 6.5.3.$!Tecnologías!contenidos! ( En( este( apartado( se( tienen( en( cuenta( todas( aquellas( tecnologías( que( sirven( para( ofrecer( cualquier( tipo( de( información( en( nuestro( sitio( Web.( Aquí( se( incluye( gran( cantidad( de( información(de(los(cuales(algunos(pueden(ser(estáticos,(y(otros(generados(de(forma(dinámica.( Los(contenidos(generados(de(forma(estática(suelen(estar(incluidos(en(el(propio(código(HTML( ya(que(este(no(va(a(variar(en(el(tiempo.(Si(por(el(contrario(son(generados(de(forma(dinámica,( deberán(ser(creados(mediante(algún(tipo(de(tecnología(de(programación((bien(en(el(lado(del( cliente(o(bien(en(el(lado(del(servidor).( Otro( tipo( de( clasificación( que( puede( establecer( es( mediante( el( tipo( de( contenido( que( se( ofrezca:( por( un( lado( existe( el( contenido( de( tipo( texto( (entre( el( que( se( pueden( encontrar( resúmenes,(descripciones,(títulos,(explicaciones,(noticias,(etc…),(también(tenemos(contenidos( en( forma( de( imágenes( (como( pueden( ser( iconos,( logotipos,( ilustraciones,( etc…),( vídeos( en( formato(streaming((como(explicaciones(de(los(distintos(ejercicios)( Es(importante(que(el(servidor(conozca(el(tipo(contenido(que(vayamos(a(servir.(Para(ello(ya(se( ha( hablado( de( los( tipos( MIME,( los( cuales( tienen( que( ser( devueltos( al( cliente( para( que( el( navegador(sea(capaz(de(entenderlo.(A(continuación(se(muestran(algunos(de(los(tipos(MIME( más(importantes:( ( Tipo%MIME% Extensión% text/html( html(htm( Ejemplo(código(PHP( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 152( image/jpeg( jpeg(jpg( image/gif( gif( application/xls( xls( application/msword( doc( application/pdf( pdf( application/rtf( rtf( image/png( png( application/xUjavascript( js( application/xUshockwaveUflash( swf( application/xUtroffUmsvideo( avi( image/xUicon( ico( audio/mpeg3( mp3( image/BMP( bmp( ( ( 6.6.$!Seguridad! ( 6.6.1.$!OWASP!TOP!2010! ( “The( OWASP( Fundation”( es( una( asociación( sin( ánimo( de( lucro( de( carácter( mundial( cuyo( objetivo(es(ofrecer(de(manera(libre(y(abierta(una(serie(de(herramientas,(documentos,(foros(y( otro(material(didáctico(acerca(del(desarrollo(y(mantenimiento(de(aplicaciones(web(seguras.( Dicha(fundación(dispone(de(gran(cantidad(de(información(actualizada(disponible(en(su(sitio( web((www.owasp.org)(sobre(los(riesgos(que(se(deben(tener(en(cuenta(sobre(la(seguridad(de( aplicaciones(web.(Tanto(la(documentación,(como(el(software(que(se(puede(encontrar(en(su( web(son(totalmente(gratuitos(y(libres,(bajo(una(licencia(de(software(libre.( Con(cierta(frecuencia(esta(fundación(publica(una(lista(de(los(10(mayores(riesgos(a(los(que(están( expuestas(las(aplicaciones(web.((Para(cada(uno(de(estos(riesgos(se(hace(un(informe(en(el(cual( se(explica(cual(es(el(grado(de(dificultad(para(ser(llevado(a(cabo,(el(impacto(que(puede(tener,(la( capacidad(para(ser(detectado,(las(formas(de(evitarlo,(ejemplos,(etc.( PFC(Aplicación(Web(Gestión(Gimnasio(–(Héctor(Martínez(García( ( ( 153( Hay( que( decir( que( este( listado( llamado( “OWASP( Top( 10( Application( Security( Risks”( es( actualmente(el(documento(más(importante(en(cuestión(de(seguridad(de(aplicaciones(web,(por( lo(que(aquí(se(van(a(exponer(los(10(riesgos(comentados(en(la(versión(del(documento(que(data( de(2010.( ( 6.6.1.1%&Injection& ( Este(tipo(de(ataque(permite(al(usuario(la(ejecución(de(consultas(o(comandos(en(el(servidor( debido(a(que(la(aplicación(ha(recibido(datos(no(validados(correctamente(del(usuario.( La(forma(más(común(se(presenta(como(un(formulario(que(la(aplicación(muestra(al(usuario(para( solicitarle( ciertos( datos( que( éste( debe( rellenar.( El( usuario( enviará( en( dicho( formulario( el( ataque( en( forma( de(código( modificado( para( que( sea( capaz( de( sortear( las( protecciones( existentes((en(caso(de(haberlas).( La(aplicación(no(habrá(detectado(que(el(contenido(del(formulario(es(potencialmente(peligroso( para( la( aplicación,( y( la( enviará( al( conector( de( la( base( de( datos( o( al( intérprete( de( órdenes( correspondiente.( La( consulta( o( la( orden( se( ejecutará( en( el( servidor( con( resultados( poco( previsibles.( Los(resultados(de(la(consulta(o(de(ejecución(de(la(orden(serán(recibidos(por(la(aplicación,(quien( a(su(vez(los(mostrará(al(usuario(normalmente(incrustados(en(la(propia(página.( ( Recomendaciones% Validar(los(datos(de(entrada(usando(listas(blancas(y(expresiones(regulares.( Seguir( el( principio( de( mínimo( privilegio( en( las( conexiones( con( bases( de( datos( y( otros( componentes.( Evitar(el(uso(de(intérpretes(siempre(que(sea(posible.(En(caso(de(resultar(necesario,(utilizar(APIs( seguras.( ( 6.6.1.2.%&Cross&Site&Scripting& ( Esta(vulnerabilidad(también(conocida(como(XSS,(consiste(en(que(un(atacante(envía(scripts(en( un(campo(de(formato(texto(con(la(finalidad(de(que(estos(sean(ejecutados(por(el(intérprete(del( navegador.( El(campo(de(formato(texto(no(tiene(porque(ser(explícitamente(un(formulario(o(URL(como(en(el( ejemplo(de(las(inyecciones(vistas(anteriormente,(sino(que(puede(estar(almacenada(en(un(foro,( en(el(título(de(una(noticia,(en(la(base(de(datos,(etc.((