Instalación de servidores de aplicaciones web

De Wiket
Salta a la navegació Salta a la cerca

Conceptos previos

Antes de empezar tenemos que tener en cuenta las siguientes cosas:

  1. Sistema Operativo:
    • Ubuntu 16.04
  2. Usuarios:
    • Un usuario con permisos de Root y un usuario con permisos limitados
  3. Actualización del sistema:
    • Antes de comenzar a instalar nada recordar actualizar el sistema
    :~$ sudo apt-get update
    :~$ sudo apt-get upgrade

Instalación del entorno de desarrollo

Hay muchos tutoriales por internet para instalar el entorno de desarrollo apache/php/mysql como por ejemplo este e incluso vídeos en Youtube como este otro, pero yo os dejo aquí un pequeño tutorial de como instalar los diferentes componentes.

Instalación de Apache

Apache es un servidor web HTTP de código abierto, si queréis saber más sobre él echar un vistazo a aquí

  • Para instalar el servidor web lo haremos desde la línea de comandos ejecutando lo siguiente:
    :~$ sudo apt-get install apache2
  • Una vez instalado podemos realizar varias comprobaciones:
    • Versión de apache: :~$ apache2 -v
    • Comprobar que apache está "levantado" y sirviendo páginas es muy sencillo solo tenemos que abrir un navegador y en la barra de dirección escribimos: #:localhost y debería aparecer algo como lo que se ve en la imagen.

Instalación de PHP

PHP es un lenguaje de programación del lado servidor orientado a ofrecer contenido dinámico en las páginas web. Si queréis saber más podéis consultar este enlace

  • Instalar PHP es tan sencillo como escribir lo siguiente en la línea de comandos de ubuntu:
    :~$ sudo apt-get install php7.0 libapache2-mod-php7.0
  • Una vez instalado tendremos que reiniciar el servidor apache para que reconozca los cambios, aquí os dejo los comandos para reiniciar, parar y arrancar el servidor apache:
    reiniciar :~$ sudo service apache2 restart
    parar :~$ sudo service apache2 stop
    arrancar :~$ sudo service apache2 start
  • Para comprobar que PHP está funcionando podemos hacer lo siguiente:
    desde la línea de comandos ejecutamos :~$ sudo nano /var/www/html/prueba.php
  • Este comando abrirá un editor de textos en donde el archivo que estamos editando se llama prueba.php y está en /var/www/, ésta es la carpeta donde se guardan las páginas y demás archivos que queremos que apache pueda servir (en Ubuntu).
  • Vamos a escribir un sencillo script para ver que funcione php, en el archivo escribimos: <?php phpinfo(); ?>, ahora con ctrl + x guardamos el archivo.
  • Por último para comprobar el funcionamiento de este primer script vamos al navegador y escribimos en la barra de direcciones localhost/prueba.php y tendríamos que ver algo como en la siguiente imagen.

Instalación de MySQL

MySQL es un sistema de gestión de base de datos relacional, si quieres más información puedes consultar MySQL

  • Para instalar MySQL procedemos igual que con los componentes anteriores, vamos a la línea de comandos y escribimos:
    sudo apt-get install mysql-server al ejecutar este comando empezará la instalación y llegado un momento aparecerá una ventana que pide una contraseña para el usuario root, introducimos la contraseña que deseemos y luego la confirmamos. Acabará la instalación y MySQL ya estará disponible.
  • Para comprobar que MySQL funciona correctamente podemos ejecutar el siguiente comando:
    mysql -u root -p si todo ha ido correctamente nos pedirá introducir la contraseña de root que habremos configurado durante el proceso de instalación y a continuación nuestro prompt cambiará a: mysql>.
  • Ahora podemos escribir una consulta sencilla para verificar que todo está OK
    mysql> SHOW databases; Cuidado de no olvidar el ";" ya que si no lo ponemos mysql interpreta que aun no hemos terminado de introducir la consulta
  • El resultado debería de ser un listado en forma de tabla que muestra las bases de datos.
  • Para salir de mysql solo tenemos que ejecutar el siguiente comando en la línea de comandos de MySQL mysql> exit
  • Por último instalaremos los paquetes necesarios para que Apache, PHP y MySQL se entiendan entre si.
    sudo apt-get install php7.0-mysql
  • Ahora modificamos el archivo php.ini para indicarle que usaremos mysql como base de datos:
    sudo nano /etc/php/7.0/apache2/php.ini esto nos abrirá el archivo php.ini ahora con ctrl + w realizamos una búsqueda en el fichero del siguiente título de sección Dynamic Extensions . En esta sección buscamos una línea como la siguiente:
    ; extension=mysql.so, lo único que tenemos que hacer ahora es eliminar el ";" NOTA: el ";" indica al archivo de configuración que es línea es un comentario por lo tanto no lo procesará, eliminando el ";" hacemos que esa línea si sea interpretada. En caso de que la línea no exista vamos al final de la sección Dynamic Extensions y la añadimos (Sin el ";").
  • Finalmente reiniciamos el servidor apache
    :~$ sudo service apache2 restart

Instalación de PhpMyAdmin

PhpMyAdmin es una aplicación web que nos permite gestionar de una manera más fácil una base de datos MySQL, si quieres saber más pues consultar PhpMyAdmin

  • Para instalar PhpMyAdmin ejecutamos el siguiente comando:
    :~$ sudo apt-get install phpmyadmin, nos preguntará que base de datos queremos usar y le tenemos que indicar MySQL y después nos pedirá la contraseña de root de MySQL (la que hemos configurado anteriormente durante el proceso de instalación de MySQL) y una contraseña para el usuario de PhpMyAdmin.
  • A continuación nos preguntará si queremos que se autoconfigure la base de datos que necesita PhpMyAdmin para funcionar, dbconfig-common , y le decimos que sí.
  • Por último una vez acabada la instalación reiniciamos el servidor apache
    :~$ sudo service apache2 restart
  • Para acceder a PhpMyAdmin abrimos un navegador y escribimos en la barra de direcciones: localhost/phpmyadmin y ya tendría que salir el login de PhpMyAdmin
  • Si por algún motivo una vez realizada la instalación al acceder desde el navegador al PhpMyAdmin no aparece un login sino un Error 404 lo más probable es que falte incluir en la configuración del apache el archivo de configuración de PhpMyAdmin. Para solucionarlo haremos lo siguiente:
    Abrimos el archivo apache2.conf :~$ sudo nano /etc/apache2/apache2.conf vamos al final del archivo y añadimos la siguiente línea: Include /etc/phpmyadmin/apache.conf, reiniciamos el servidor apache y debería funcionar!.

Otras opciones

También podemos optar por instalar XAMPP, y aquí os dejo un doc para sepáis que es ;)

Archivo php.ini

Este archivo contiene las directivas que modifican el comportamiento del interprete de PHP. Es un archivo de texto que puede abrirse con cualquier editor de texto.

  • Las directivas están formadas por un par clave-valor como por ejemplo short_open_tag = Off, cuidado!!! porque diferencia entre mayúsculas y minúsculas...
  • Las directivas que empiezan por ";" están comentadas, lo cual quiere decir que el interprete no hará caso de esa directiva, es decir, están desactivadas. Si quieres activar alguna directiva elimina el ";" de delante.
  • Cuando tengas que escribir como valor de alguna directiva una ruta ten en cuenta lo siguiente:
    • Si estás en Linux /usr/local las barras son las normales
    • Si están en Windows c:\windows las barras son invertidas
  • Cuando realices cambios en el archivo php.ini recuerda reiniciar el servidor apache para que los cambios se apliquen.
  • Problemas muy comunes en PHP es que php.ini no esté correctamente formatado, que no se encuentre en la ubicación correcta o que al modificar el archivo no guardemos los cambios...así que tenerlo al cuenta!!!

Directivas comunes

Aquí os dejo algunas de las directivas que encontraréis en el archivo php.ini con una pequeña explicación de lo que hacen. Configurar correctamente este archivo nos ahorrará muuuuuuuchos dolores de cabeza, así que hacerlo con cariño! ;)

Opciones de lenguaje

  • short_open_tag = On Permite usar en tus scripts etiquetas php abreviadas <? ... ?>, y el atajo para imprimir variables <%= $valor %>. Si el valor es off, deberas usar la forma <? php ... ?> o <script>. Se recomienda ponerlo a off para mayor portabilidad del código
  • asp_tags = Off Permite usar etiquetas estilo asp <% ... %>. Deshabilitado por defecto
  • precision = 14 número máximo de decimales visualizados
  • output_buffering = Off permite enviar cabeceras http (cookies por ejemplo) desde puntos distintos al inicio del script. Además de valores on | off puedes fijar aqui el tamaño maximo (en bytes) de las lineas http permitidas, por ejemplo: output_buffering = 4096
  • output_handler = Con esta directiva puedes redirigir toda la salida de tus scripts a una función PHP. Es preferible no habilitar esta opción y establecerla si es preciso en cada uno de tus scripts.
  • zlib.output_compression = Off habilita la libreria zlib de forma que los datos de salida del script se envian comprimidos. Puedes indicar valores off|on o precisar el tamaño del buffer (por defecto es de 4 KB).
  • ;zlib.output_handler = Si tienes activada la opción anterior, no puedes usar la directiva output_handler; con similar funcionalidad tienes zlib.output_handler.
  • implicit_flush = Off Intenta enviar al cliente el contenido de la memoria intermedia de salida. O dicho coloquialmente, "envía lo que tengas hasta ahora, en lugar de esperar a completarlo". Equivale a llamar la función flush() después de cada llamada echo o print y cada segmento html. Es desaconsejable su activación, siendo preferido usar la función flush() cuando sea necesario.
  • unserialize_callback_func= relacionado con las funciones serialize().
  • allow_call_time_pass_reference = Off Uno mas de los cambios en PHP ... tradicionalmente podías construir una función y al usarla, decidir si pasabas o no el valor de una variable por referencia (&$var). Ahora esto es desaconsejado y se recomienda especificar que los valores serán pasados por referencia en la propia declaración de la función (function blah (&$var))
  • open_basedir = Limita los archivos que se pueden abrir por PHP al árbol de directorios especificado. Cuando un script intenta abrir un archivo con, por ejemplo, fopen, se comprueba su localización. Si el fichero está fuera del árbol de directorios especificado, PHP se negará a abrirlo. Todos los enlaces simbólicos son resueltos, de modo que no es posible evitar esta limitación usando uno de ellos. El valor especial . indica que el directorio base será aquel en el que reside el script. Bajo Windows, los directorios se separan mediante punto y coma. En el resto de sistemas, con dos puntos ":". Como módulo de Apache, los senderos para open_basedir de los directorios padre se heredan ahora automáticamente. El valor por defecto es permitir abrir todos los archivos.
  • disable_functions = Con esta directiva puedes inhabilitar con carácter general determinadas funciones PHP. Basta con incluirlas separadas por punto y coma (";"). Al igual que la anterior, es independiente de Safe Mode.
  • highlight.string = #DD0000 permite especificar los colores a utilizar por el coloreador de sintaxis interno de PHP

Límites al empleo de recursos

  • max_execution_time = 30 Fija el tiempo máximo en segundos que se le permite usar a un script antes de ser finalizado por el intérprete. Así se evita que scripts mal escritos puedan bloquear el servidor.
  • max_input_time = 60 Tiempo máximo en segundos que el script puede invertir en analizar datos recibidos
  • memory_limit = 8M Fija el tamaño máximo de memoria en bytes que se permite reclamar a un script. Así se evita que script mal escritos se coman toda la memoria disponible de un

servidor.

Gestión y archivo de errores

  • error_reporting = E_ALL Fija el nivel (detalle) con el que PHP te informa de errores. Esta directiva vuelca el informe de errores en la pantalla, y su uso está desaconsejado en páginas en producción, ya que el error puede revelar información sensible. Lo recomendado es permitir mostrar errores, con el máximo detalle posible, mientras desarrollas el script PHP; y cuando está terminado y en producción, deshabilitar el mostrado de errores en pantalla y activar en su lugar el archivo de errores.

Como cada nivel de informe de error está representado por un número, puedes designar el nivel deseado sumando valores: 1 errores normales 2 avisos normales 4 errores del parser (error de sintaxis) 8 avisos de estilo no críticos El valor por defecto para esta directiva es 7 (se muestran los errores normales, avisos normales y errores de parser). Tambien puedes designar el nivel de error nominativamente: Algunas combinaciones son: error_reporting = E_ALL & ~E_NOTICE muestra todos los errores criticos, excluyendo advertencias que pueden indicar mal funcionamiento del código pero no impiden la ejecución del intérprete. error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR muestra solo errores. error_reporting = E_ALL muestra todos los errores y advertencias.

  • display_errors = Off determina si los errores se visualizan en pantalla como parte de la salida en HTML o no. Como queda dicho, es desaconsejado mostrar errores en pantalla en páginas visibles al público.
  • display_startup_errors = Off Incluso con display_errors on, por defecto PHP no muestra los errores que detecta en la secuencia de encendido. Con esta directiva puedes mostrar estos errores. Desaconsejado activarla.
  • log_errors = On Guarda los mensajes de error en un archivo. Normalmente el registro del servidor. Esta opción, por tanto, es específica del mismo.
  • log_errors_max_len = 1024 Especifica el tamaño del archivo error_log. Si tiene un valor 0 significa que no hay restricción de tamaño
  • ignore_repeated_errors = Off Si está activado, no archiva mensajes repetidos. No se consideran mensajes repetidos aquellos que no provienen de la misma linea.
  • ignore_repeated_source = Off Si está activado, considera repetidos los mensajes de error iguales, aunque provengan de distinta linea / script
  • report_memleaks = On Mostrar o no. memory leak se refiere a cuando (por error) el script no libera la memoria usada cuando ya no la necesita, y en consecuencia usa cada vez mas hasta llegar a agotarla.
  • track_errors = Off Si lo activamos, tendremos el último mensaje de error/advertencia almacenado en la variable $php_errormsg
  • html_errors = Off Si activo, no incluye etiquetas HTML en los mensajes de error.
  • docref_root = /phpmanual/ y docref_ext = .html Si tienes html_errors activado, PHP automaticamente incluye enlaces en el mensaje de error que te dirigen a la página del manual que explica la función implicada. Puedes bajarte una copia del manual y indicar su ubicación (y extensión del archivo) usando estas directivas.
  • error_prepend_string = Cadena a añadir antes de cada mensaje de error.
  • error_append_string = cadena a añadir despues del mensaje de error.
  • ;error_log = filename Nombre del fichero para registrar los errores de un script. Si se utiliza el valor especial syslog, los errores se envían al registro de errores del sistema. Como verás, esta comentado (inhabilitado) por defecto.

Gestión de datos

  • ;arg_separator.output = "&" El carácter que se empleará en las urls generadas por PHP para separar argumentos (valores pasados via url). & es el separador por defecto.
  • ;arg_separator.input = ";&" separadores que usará PHP cuando analice una url suministrada para almacenarla en variables
  • variables_order = "GPCS" Esta directiva fija el orden (precedencia) en que PHP registrará y interpretará las variables de entorno (de izquierda a derecha en el orden indicado). Los valores posibles se toman con las iniciales del método usado para asignar el valor a la variable: Get, Post, Cookie, Enviroment y Server. Fijando por ejempo el valor a "GP", hará que el PHP ignore por completo las cookies y que sobreescriba las variables recibidas por GET con las que tengan el mismo nombre y vengan por POST.
  • register_argc_argv = Off Esta directiva instruye a PHP si debe declarar las variables argv&argc (arrays predefinidos que almacenan los parámetros pasados (argv) y su numero (argc).
  • post_max_size = 8M Tamaño máximo de los datos que PHP aceptará por el método POST
  • auto_prepend_file = y auto_append_file = permiten indicar la ruta y nombre de un archivo que se añadirán antes o despues (respectivamente) de todos los archivos php que se ejecuten.

El valor especial none desconecta la adición automática de archivos. Si el script es terminado con exit(), no tendrá lugar la adición automática señalada con auto_append_file. Los archivos indicados con estas directivas se incluirán como si fuesen llamados mediante la función include(), así que se utiliza include_path.

Rutas y directorios

  • include_path = ".;c:\php\includes" Permite especificar una lista de directorios en los que las funciones require(), include() y fopen_with_path() buscaran los archivos requeridos. El formato es similar a la variable de entorno de sistema PATH: una lista de directorios separados por dos puntos en UNIX o por punto y coma en Windows. Ejemplo unix seria include_path=.:/home/httpd/php-lib y en windows include_path=".;c:\www\phplib".

El valor por defecto para esta directiva es . (sólo el directorio actual).

  • doc_root = Indica el "Directorio raíz" donde están nuestras paginas php en el servidor. Sólo se usa si no está vacío. Si PHP se configura con safe mode, no se interpretaran las páginas php situadas fuera de este directorio. Ojo con los servidores virtuales que apuntan a zonas distintas del servidor.
  • user_dir = El directorio raíz para los archivos PHP bajo el directorio inicial de un usuario (/ ~usuario). Normalmente se deja vacío
  • extension_dir = ./ En qué directorio debe buscar el PHP las extensiones dinámicas a cargar. Bajo Windows, por defecto si no pones ningún valor en esta directiva, se buscaran en c:\php\extensions\.
  • enable_dl = On Esta directiva sólo es útil en la versión del PHP como módulo del Apache.

Puede habilitar o deshabilitar para un servidor virtual o para un directorio la carga dinámica de extensiones de PHP mediante dl(). La razón principal para desactivar la carga dinámica es la seguridad. Con la carga dinámica es posible ignorar las restricciones para abrir archivos establecidas con open_basedir. El valor por defecto es permitir la carga dinámica, excepto cuando se usa safe_mode. En modo seguro, es imposible usar dl().

  • cgi.force_redirect = 1 Por defecto se activa. Es una directiva importante de seguridad que "debes" activar si ejecutas en tu apache PHP como cgi (no es necesaria si tienes PHP como modulo, o si usas como servidor el IIS de microsoft).
  • ; cgi.redirect_status_env = ; En conjunción con cgi.force_redirect y servidores distintos de Apache o iPlanet.
  • ; fastcgi.impersonate = 1; En conjunción con IIS y FastCGI

Subir archivos

  • file_uploads = On Permitir o no subir (upload) ficheros via HTTP.
  • upload_tmp_dir = Carpeta o directorio utilizable para guardar temporalmente archivos subidos por PHP. Si no se especifica, usará el designado por defecto por el servidor. El usuario que esté ejecutando el script debe tener permiso de escritura en ese directorio.
  • upload_max_filesize = 2M Tamaño máximo de archivos que pueden subirse.
  • max_file_uploads = 20 El número máximo de archivos que pueden subirse en un solo request.

Directivas relacionadas con fopen

  • allow_url_fopen = On Permite pasar urls (http, ftp) a la función fopen(), en lugar de la ubicacion fisica del archivo
  • ;from="[email protected]" define el email a usar como contraseña para ftp anonimo ;user_agent="PHP" define la "firma" que dejará PHP en el servidor remoto de donde coge los archivos
  • default_socket_timeout = 60 timeout en segundos para la apertura de sockets
  • ; auto_detect_line_endings = Off Si activo, PHP detectara automaticamente el carácter que indica fin de linea (distinto en windows, linux y windows)

Documentación detallada de todas las directivas

  • Si queréis conocer el comportamiento de cualquier otra directiva no mencionada en los apartados anteriores podéis echar un ojo a este documento.

Programación en PHP

Ahora que tenemos todo preparado para empezar a programar vamos a ello... Programación en PHP