Instalación de servidores de aplicaciones web
Conceptos previos
Antes de empezar tenemos que tener en cuenta las siguientes cosas:
- Sistema Operativo:
- Ubuntu 16.04
- Usuarios:
- Un usuario con permisos de Root y un usuario con permisos limitados
- 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.
- Versión de apache:
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
- reiniciar
- Para comprobar que PHP está funcionando podemos hacer lo siguiente:
- desde la línea de comandos ejecutamos
:~$ sudo nano /var/www/html/prueba.php
- desde la línea de comandos ejecutamos
- 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!.
- Abrimos el archivo apache2.conf
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
- Si estás en Linux
- 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ódigoasp_tags = Off
Permite usar etiquetas estilo asp <% ... %>. Deshabilitado por defectoprecision = 14
número máximo de decimales visualizadosoutput_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 = 4096output_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 recibidosmemory_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ñoignore_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 / scriptreport_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_errormsghtml_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 variablesvariables_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 POSTauto_prepend_file =
yauto_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íoextension_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 archivosdefault_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