Uno de los grandes problemas a los que se enfrenta un programador novato es a configurar un entorno de desarrollo por eso una de las soluciones mas populares es XAMPP, es una gran alternativa sobre todo si estamos comenzado ya que instala todo junto y viene listo para usar, sin embargo la gran desventaja es que estos entornos están muy lejos ser un entorno que se asemeje a un servidor de producción, ademas de nos ata ciertas versiones de PHP o de base de datos.
Por otro lado el mundo del desarrollo ha cambiado, no solo se necesitan el stack de Apache, PHP y MySQL, actualmente están mezclando otros tipos de base de datos tanto SQL como NoSQL, herramientas, librerías y frameworks varios.
La mejor manera de obtener un entorno todo en uno lo mas similar a producción posible es utilizar Linux en Docker, es la mejor solución tanto si utilicemos Windows, Mac o incluso Linux porque permite reproducir en diferentes computadoras exactamente el mismo entrono de desarrollo y en este articulo veremos como crear un entorno MultiPHP para Apache y Nginx con MySQL y PostgresSQL al mismo tiempo.
Contents
Descargando
Lo primero que debemos hacer es descargar el repositorio con el Dockerfile y todos los archivos necestarios, eso lo podemos hacer de la siguiente forma:
cd /tmp/ git clone https://github.com/alvarodeleon/docker-httpd.git cd docker-httpd
Construyendo la imagen
Para construir la imágenes solo necesitamos correr el comando bulid que generara la imagen base del contenedor, este proceso puede demorar un largo largo dato dependiendo de la velocidad de conexión y el rendimiento del pc donde corra
sh ./build
El comando build iniciara la creación de la imagen para lo cual descargara un par de GB desde los repositorios de CentOS asi que no lo corran usando datos moviles o similar, están avisados.
Creando contenedor
Comando create
Junto con los archivos de creación de la imagen se añadio un script para crear automáticamente el contenedor con un nombre determinado en una ruta con la estructura
sh ./create NombreContenedor /ruta/proyecto/
docker start NombreContenedor && docker attach NombreContenedor
Reparando base de datos
Como el almacén da datos de MySQL esta ubicado fuera del contenedor al iniciar no va a exitir los archivos y en caso que existan va a ser necesario reparar los permisos para que el servidor funcione correctamente, eso lo podemos hacer fácilmente con el comando:
mysql_repair
Seleccionando servidor web Apache o Nginx
Por defecto vienen instalados tanto Nginx como Apache, ambos deshabilitados para que seleccionemos el que mas nos interesa, para eso simplemente ejecutamos:
Apache
systemctl enable httpd systemctl start httpd
Nginx
systemctl enable nginx systemctl start nginx
Directorios
En la carpeta del proyecto /ruta/proyecto/ encontraremos diferentes carpetas
apache | Aquí se colocaran los archivos de configuración de Apache de cada sitio, dentro del contenedor apunta a /etc/httpd/sites.d/ |
nginx | Aquí se colocaran los archivos de configuración de Ngnix de cada sitio dentro del contenedor apunta a /etc/nginx/conf.d/ |
html | Es la carpeta donde se almacenan los proyectos, dentro del contenedor apunta a /var/www/html/ |
backup | Dentro del contenedor apunta /mnt/backup/ permite generar backup fuera del contendor |
disk | Dentro del contenedor apunta /mnt/disk/ permite compartir archivos entre el contenedor y el pc |
mysql | Es la carpeta donde físicamente se almacena, queda por fuera del contenedor para poder utilizar los mismos datos entre diferentes contenedores |
Crear un Virtualhost sitio con PHP en Apache
Dentro del directorio apache (es decir /ruta/proyecto/apache) en el pc anfitiron creamos un archivo que debe terminar en .conf , por ejemplo example.com.conf y agregamos el siguiente contenido:
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com DocumentRoot "/var/www/html/example.com/" DirectoryIndex index.php index.phtml index.html index.htm <FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9073" </FilesMatch> </VirtualHost>
Luego para cambiar la version de PHP simplemente modificamos la linea por la que necesitemos:
SetHandler "proxy:fcgi://127.0.0.1:9073"
Las versiones disponibles son:
#PHP 5.4 SetHandler "proxy:fcgi://127.0.0.1:9054" #PHP 5.5 SetHandler "proxy:fcgi://127.0.0.1:9055" #PHP 5.6 SetHandler "proxy:fcgi://127.0.0.1:9056" #PHP 7.0 SetHandler "proxy:fcgi://127.0.0.1:9070" #PHP 7.1 SetHandler "proxy:fcgi://127.0.0.1:9071" #PHP 7.2 SetHandler "proxy:fcgi://127.0.0.1:9072" #PHP 7.3 SetHandler "proxy:fcgi://127.0.0.1:9073" #PHP 7.4 SetHandler "proxy:fcgi://127.0.0.1:9074" #PHP 8.0 SetHandler "proxy:fcgi://127.0.0.1:9080" #PHP 8.1 SetHandler "proxy:fcgi://127.0.0.1:9081"
Luego de creado y ajustado la versión de PHP que se necesites ejecutamos:
service httpd restart
Crear un Virtualhost sitio con PHP en Nginx
Para el caso de crear un virtualhost para Nginx, es similar, solo que esta vez el fichero va en el directorio nginx en por ejemplo /ruta/proyecto/nginx y dentro colocaremos un fichero .conf por ejemplo example.com.conf
server { listen 80; listen [::]:80; server_name example.com; root /var/www/html/example.com; index index.php index.html index.htm index.nginx-debian.html; location / { try_files $uri $uri/ =404; } location ~ \.php$ { try_files $uri =404; #Version de PHP fastcgi_pass 127.0.0.1:9073; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_buffer_size 128k; fastcgi_buffers 256 4k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; #php.ini fastcgi_param PHP_VALUE " memory_limit=512M; upload_max_filesize=64M; post_max_size=64M; max_input_vars=10000; max_execution_time=120; max_input_time=120; error_reporting=E_ALL; "; } location ~ /\.ht { deny all; } }
Al igual que en el caso de Apache, ahora con Nginx también bastara una linea para ajustar la versión de PHP deseada:
#PHP 5.4 fastcgi_pass 127.0.0.1:9054; #PHP 5.5 fastcgi_pass 127.0.0.1:9055; #PHP 5.6 fastcgi_pass 127.0.0.1:9056; #PHP 7.0 fastcgi_pass 127.0.0.1:9070; #PHP 7.1 fastcgi_pass 127.0.0.1:9071; #PHP 7.2 fastcgi_pass 127.0.0.1:9072; #PHP 7.3 fastcgi_pass 127.0.0.1:9073; #PHP 7.4 fastcgi_pass 127.0.0.1:9074; #PHP 8.0 fastcgi_pass 127.0.0.1:9080; #PHP 8.1 fastcgi_pass 127.0.0.1:9081;
Luego de creado y ajustado la versión de PHP que se necesites ejecutamos:
service httpd restart
Conclusión
Como vemos podemos montar un entorno completo en relativamente pocos minutos, lo que lleva mas tiempo es la descarga de los repositorios sin embargo una vez que tengamos creada la imagen, la creación de los siguientes contenedores sumamente rápido, al ser un entorno Linux tenemos la posibilidad de instalar todas las herramientas y paquetes que necesitemos, a su vez también sirve de practica para perder el miedo a la consola y ganar experiencia con la misma algo que hoy día todo programador necesita. Si crees que se necesita agregar algún paquete mas por defecto o tienes cualquier sugerencia puedes dejármelo en el campo de comentarios.
Administrador de Sistemas, Programador, Docente y ahora resulta que también Blogger (peor es ser tictoker). Más de 20 años de experiencia en computación atendiendo nabos y resolviendo problemas, los cuales si no fuera por estos nabos, no habrían ocurrido en primer lugar. Escribo más que nada sobre tecnología y herramientas en general, además de algunos artículos con opiniones tan subjetivas como irrelevantes, así que si no te gustan, mejor madura y superalo.
Hola
Me gusta tu artículo, y he intentado llevarlo a la práctica, pero me he encontrado un problema nada más esperar: dices que hay que ejecutar el comando sh ./build, pero este, yo al menos, no lo tengo.
Me podrías explicar esto un poco mejor. Gracias
Hola Juan Carlos
Muchas gracias por tu comentario, el comando sh ./build es un script bash que esta incluido en el repositorio mismo, igualmente si no usas Linux/Mac o algun emulador bash en Windows puedes ejecutar el comando de todas maneras directamente desde la consola de tu sistema, dentro de la carpeta del proyecto clonado ejecutas:
Saludos