Muchos desarrolladores, por comodidad, instalan WAMP o XAMPP en sus equipos para tener un entorno local de desarrollo. Sin embargo, con el paso del tiempo y tras haber trabajado con Ubuntu, el que ande una interfaz de un tercero sinceramente me toca los coj…. Pues si, te pones el entorno en 0,2 pero luego si quieres que se ejecute como servicio son todo contratiempos y uso execesivo de recursos. No es por malmeter a los señores que amablemente desarrollan WAMP y XAMPP, pero es añadir algo más entre nosotros y nuestro objetivo y que al quedarse residentes en el systray consumen más RAM y CPU.
Desgraciadamente, la cosa no es como antaño que tenias Apache 1.3 para Windows y PHP 4 se instalaba él solito y se integraba con Apache. Hoy día el abanico con Windows a 64 bit es más amplio y la Apache Foundation parece no querer malgastar el tiempo manteniendo el paquete para Windows. Así mismo, PHP tiene más posibilidades de integración con otros servidores web, como Nginx, y tampoco les merece la pena mantener instaladores.
Pero no hay problema, puedes descargarte Apache y compilartelo al gusto o descargarte versiones ya empaquetadas para Windows, como es ApacheHaus.
ADVERTENCIA: Desde aquí recomiendo encarecidamente no usar este tipo de entorno para sitios web en producción, si quieres hospedar páginas en condiciones use un sistema operativo GNU/Linux o, mejor aún, BSD.
Descarga
Es importante a tener en cuenta si vas a trabajar en un entorno de 32 ó 64 bit, ya que tanto Apache como PHP deben ser de la misma arquitectura para que este funcione como módulo. Para ejecutar PHP en modo cgi, fcgi, etc en principio no tendriamos este inconveniente.
También debes tener en cuenta que no hay disponible versión de PHP 64 bit anterior a la 5.5.
En este ejemplo vamos a utilizar Apache 2.4 y PHP 8.0 ambos en 64 bit.
Para descargar PHP entramos en windows.php.net/download/. Descargamos el/los paquete/s y lo desempaquetamos en C:\php\n.n, en este caso C:\php\8.0.
Desde ApacheHaus en apachehaus.com/cgi-bin/download.plx descargamos la versión corresponiente Apache 2.4.x con OpenSSL o LibreSSL. Los paquetes adicionales necesarios (VisualStudio) para su correcto funcionamiento los teneis en la misma página al pie. Una vez descargado todo, instalamos VS y lo desempaquetamos en C:\Apache24.
Parece obvio pero no lo es tanto: Apache y PHP deben estar alojados en la misma unidad que nuestro sistema, asi pues debeis reemplazar la unidad C: por aquella en la que se encuentre instalado Windows. En realidad se pueden alojar en distintas unidades, pero requiere tocar más la configuración.
No hay problema en cambiar los nombres de las ubicaciones, o incluso crear un subdirectorio y alojar ahí ambos. De hacer esto procura que la ruta no contenga espacios ni otros caracteres «extraños».
Puesta en marcha
Una vez que Apache y PHP están en sus respectivas carpetas le tenemos que decir a Apache cómo se ejecuta PHP con FCGI, asi pues creamos, si no está, el archivo Apache24\conf\extra\httpd-php-fcgid.conf con el siguiente contenido:
<IfModule fcgid_module> FcgidIOTimeout 3600 FcgidConnectTimeout 3600 FcgidMaxProcesses 8 FcgidOutputBufferSize 64 ProcessLifeTime 240 FcgidMaxRequestsPerProcess 900 FcgidMinProcessesPerClass 0 FcgidMaxRequestLen 2000000 MaxRequestLen 2000000 FcgidInitialEnv PATH "C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;C:/Apache24/bin;" FcgidInitialEnv SystemRoot "C:/Windows" FcgidInitialEnv SystemDrive "C:" FcgidInitialEnv TEMP "C:/php/tmp" FcgidInitialEnv TMP "C:/php/tmp" FcgidInitialEnv windir "C:/WINDOWS" </IfModule> <Directory "C:/php/tmp"> AllowOverride none Require all granted </Directory>
Verificamos que FCGI está activo en Apache24\conf\httpd.conf. Las lineas «LoadModule» e «Include» deben estar sin comentar.
# PHP FastCGI # # Edit conf/extra/httpd-fcgid.conf to match your php location # and uncomment the Include line below. # LoadModule fcgid_module modules/mod_fcgid.so Include conf/extra/httpd-php-fcgid.conf
Más adelante definiremos en los archivo vhost correspondientes la versión de PHP que vamos a usar.
Por parte de PHP, necesitais generar el archivo c:\php\n.n\php.ini. El paquete incluye 2 archivos de ejemplo con configuraciones por defecto php.ini-development y php.ini-production, así que copiad el que más se ajuste a vuestras necesidades y renombradlo a php.ini.
Importante actualizar las ruta en algunos valores de php.ini:
include_path = ".;c:\php\n.n\includes" extension_dir="c:\php\n.n\ext" upload_tmp_dir="c:\php\n.n\tmp" session.save_path="c:\php\n.n\tmp"
Muy recomendable, aunque no absolutamente necesario, es incluir Apache y PHP en la variable de entorno PATH del sistema. La forma más rápida (que no la única) para cambiarla es pulsar con el botón secundario sobre el menú inicio de Windows y elegir «Sistema», ahí en el menú a la izquierda de la ventana pulsad sobre «Configuración avanzada del sistema» y en la pestaña «Opciones avanzadas» el botón «Variables de entorno…» situado casi al pie. En el apartado «Variables del sistema» localizamos la variable «Path», la editamos y añadimos las 2 rutas adicionales C:\Apache24\bin y C:\php\8.0.
Tras cambiar el path del sistema es recomendable reiniciar Windows, para continuar con este tutorial no es necesario.
Abrimos una consola (ventana de Símbolo de sistema) como Administrador. Si teniais una ya abierta necesitais abrir una nueva ya que hemos cambiado la variable de entorno de sistema. Ahi ejecutaremos httpd -k install y saltará una alerta de seguridad del firewall de Windows. Aceptamos o no podremos acceder a las páginas alojadas.
Para iniciar o detener el servicio usaremos httpd -k start o httpd -k stop. httpd -k restart para reiniciarlo, como necesitaremos hacer cada vez que cambiemos la configuración de Apache o PHP.
IMPORTANTE: Si Skype está en ejecución el puerto 80 lo va a tener ocupado y por tanto Apache no va a poder hacer lo mismo, por ello es altamente recomendable desactivar estos puertos en las opciones de Skype. De todas formas esto es el primero que llegue ocupa, normalmente Apache al ser un servicio va a iniciarse antes que Skype y el puerto 80 será para él.
Si no sois fan de la consola recordad que Apache está ejecutandose como servicio de Windows, así que podeis gestionarlo desde el panel de servicios como cualquier otro. (Ejecutar [WIN+R]-> services.msc)
En este panel también podeis ajustar si quereis que Apache se inicie automáticamente con Windows, etc.
Pues ya con esto si abrimos un navegador y vamos a http://localhost debemos obtener esta página, si no obteneis la página por defecto de Apache entonces es que algo pasa, revisad que habeis podido hacer mal.
Apache vhosts
Por si no os habíais dado cuenta ya, tengo algunas manías personales (deformación profesional) y me gustan ciertas cosas de cierta manera, y tener los distintos sitios en los que trabajamos en carpetas está muy bien pero asignarle a cada uno su vhost es ya la leche. ¿Por qué? Pues porque se va a parecer más a al entorno real del servidor y seguramente sea menos perturbador a la hora de subirlo a su ubicación final. ¿A que no es lo mismo entrar a http://localhost/miproyecto1/ que entrar a http://miproyecto1.local? ¿¡A que no!? Tiene como más estilo, más limpieza… Y no, no se liga más por hacerlo así.
Lo primero es decirle a Windows que el dominio «miproyecto1.local» (o «miproyecto1» a secas) está en nuestro equipo local y que no lo va a encontrar en el DNS de turno (o sí, nunca se sabe qué tiene cada uno montado y cómo). Para ello editamos el archivo %WINDIR%\System32\drivers\etc\hosts (siendo %WINDIR% una variable de sistema que indica donde esta instalado Windows).
Importante saber acerca del archivo hosts que es un poco perro. Para empezar el editor que usemos debe estar ejecutándose con privilegios de administrador, y bien es sabido que en la versión 7 los cambios realizados así se los pasa por el arco del triunfo. Para evitar dolores de cabeza resulta más rápido copiar el archivo al escritorio, por ejemplo, editarlo y luego sobreescribirlo en su ubicación original, aceptando la alerta de seguridad UAC de turno.
El formato será <IP local> <dominio>, recuerda que cualquier IP de tipo 127.x.x.x apunta al equipo local o localhost. Esto no pide de comer, así que no hay problema en declarar varias nomenclaturas para un mismo proyecto, es posible que para algún proyecto multidominio sea incluso necesario.
Aprovecho para recordar que esto mismo en un sistema *nix (GNU/Linux,, BSD, etc) se realiza en /etc/hosts.
Hecho esto si abrimos el navegador y escribimos la dirección debe abrir nuevamente la página por defecto de Apache. Si quieres acceder desde otro equipo, lo sentimos mucho, deberás especificar la dirección remota y el nombre en el archivos hosts del otro equipo… Pero es posible! (O configurar un DNS doméstico)
Bien, ahora tenemos a decirle a Apache que vamos a trabajar con hosts virtuales (vhost), así que nos dirigimos a C:\Apache24\conf\httpd.conf e incluimos otra línea que cargará la configuración de cada vhost:
# Virtual hosts Include conf/extra/httpd-vhosts.conf Include conf/sites/*.conf
También importante que esté cargado el módulo corresponiente, descomentando la linea:
LoadModule vhost_alias_module modules/mod_vhost_alias.so
En la carpeta «Apache24\conf» creamos una subcarpeta llamada «sites» (o como os apetezca llamarla, mientras que el nombre coincida en httpd.conf) y en esta iremos metiendo archivos con la extensión .conf
Cada archivo puede contener la configuración de uno o más vhosts, eso como todo, al gusto del consumidor. En mi caso prefiero un archivo por proyecto y así os lo cuento.
Para desactivar un sitio/proyecto basta con cambiar la extensión del archivo o directamente borrarlo… Y reiniciar Apache, por supuesto.
Cada vhosts indica a Apache a que IP y dominio tiene que responder, puerto, en que carpeta se alojan los archivos, versión de PHP a usar… incluso permisos de acceso a archivo y otras configuraciones adicionales que puedan ser necesarias unicamente para ese vhost y que o bien no las necesitamos globalmente o bien pueda causar conflictos en otros sitios alojados.
Así que creamos el vhost por defecto para nuestro equipo. Creamos un archivo con nombre 00_default.conf (por ejemplo) con el siguiente contenido:
<VirtualHost _default_:80> ServerAdmin gustavo@local # Puerto a escuchar ServerName localhost:80 # Ubicación de los archivos DocumentRoot "C:\vhosts\default" ErrorLog logs/default.error.log CustomLog logs/default.access.log combined FcgidInitialEnv PATH "C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;C:/Apache24/bin;C:/php/8.0;" FcgidInitialEnv PHPRC "C:/php/8.0" # Configuración de la ubicación de los archivos <Directory "C:\vhosts\default"> Options FollowSymlinks MultiViews ExecCGI AllowOverride All Require all granted AddHandler fcgid-script .php FcgidWrapper "C:/php/8.0/php-cgi.exe" .php </Directory> </VirtualHost>
Y ya está! Añadiremos un <VirtualHost> por cada sitio que queramos, con sus configuraciones particulares.
SSL
Ya tenemos nuestro sitio por defecto activo. Ahora vamos a configurarlo para HTTPS.
Editamos el archivo Apache24\conf\httpd.conf y descomentamos las lineas siguientes:
LoadModule ssl_module modules/mod_ssl.so
LoadModule ssl_module modules/mod_ssl.so
<IfModule ssl_module> #Include conf/extra/httpd-ssl.conf Include conf/extra/httpd-ahssl.conf SSLRandomSeed startup builtin SSLRandomSeed connect builtin </IfModule>
Editamos el archivo Apache24\conf\extra\httpd-ahssl.conf y verificamos que existe la línea con el puerto a utilizar.
Listen 443 https
Generamos un certificado de seguridad autofirmado. Para ello necesitamos openssl, que viene incluido con Apache.
Por comodidad, creamos un archivo de proceso por lotes (Apache24\ssl\gencert.bat por ejemplo) con el siguiente contenido:
@echo off set OPENSSL_CONF=C:\Apache24\conf\openssl.cnf C:\Apache24\bin\openssl.exe req -x509 -days 365 -newkey rsa:2048 -nodes -sha256 -keyout %1.key -out %1.cert -subj "/C=ES/ST=Local/L=Local/O=Company/OU=IT/CN=%1"
Para generar un certificado, abrimos una ventana de la consola, cambiamos la ruta a Apache24\ssl\ y generamos los certificados que queramos:
gencert localhost
Ahora nos vamos a la configuración de nuestro vhost por defecto y añadimos un bloque de configuración que recoja todo lo anterior:
<VirtualHost _default_:443> DocumentRoot C:/vhosts/default ErrorLog logs/localhost.error.log CustomLog logs/localhost.access.log common SSLEngine on SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL SSLCertificateFile ssl/localhost.cert SSLCertificateKeyFile ssl/localhost.key FcgidInitialEnv PHPRC "C:/php/8.0" FcgidInitialEnv PATH "C:\\php\\8.0;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;" <Directory "C:/vhosts/default"> AllowOverride all Options FollowSymLinks MultiViews ExecCGI Require all granted AddHandler fcgid-script .php FcgidWrapper "C:/php/8.0/php-cgi.exe" .php </Directory> </VirtualHost>
Recuerda reiniciar el servicio Apache tras hacer cambios en la configuración.
Agregar un vhost para un proyecto
Ya tenemos el tinglado andando, ahora vamos a añadir la configuración para cada proyecto.
En Apache24\conf\sites\ agregamos un archivo de configuración para cada proyecto, por ejemplo 01_miproyecto1.local.conf. Este nos quedaría tal que así:
<VirtualHost *:80> ServerName proyecto1.local DocumentRoot C:\vhosts\proyecto1.local ErrorLog logs/proyecto1.local.error.log CustomLog logs/proyecto1.local.access.log common FcgidInitialEnv PHPRC "C:/php/8.0" FcgidInitialEnv PATH "C:\\php\\8.0;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;" <Directory "C:\vhosts\proyecto1.local"> AllowOverride all Options FollowSymLinks MultiViews ExecCGI Require all granted AddHandler fcgid-script .php FcgidWrapper "C:/php/8.0/php-cgi.exe" .php </Directory> </VirtualHost> <VirtualHost *:443> ServerName proyecto1.local DocumentRoot C:\vhosts\proyecto1.local ErrorLog logs/proyecto1.local.error.log CustomLog logs/proyecto1.local.access.log common SSLEngine on SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL SSLCertificateFile ssl/proyecto1.local.cert SSLCertificateKeyFile ssl/proyecto1.local.key FcgidInitialEnv PHPRC "C:/php/8.0" FcgidInitialEnv PATH "C:\\php\\8.0;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;" <Directory "C:\vhosts\proyecto1.local"> AllowOverride all Options FollowSymLinks MultiViews ExecCGI Require all granted AddHandler fcgid-script .php FcgidWrapper "C:/php/8.0/php-cgi.exe" .php </Directory> </VirtualHost>
Abrimos la consola, nos dirigimos a Apache24\ssl y ejecutamos el archivo BAT que creamos antes:
gencert miproyecto1.local
Y ya sólo queda reiniciar el servicio Apache.
Usar distintas versiones de PHP
Con esta configuración, podemos alojar distintos proyectos y que cada uno funcione con una versión de PHP diferente.
Sólo necesitas descargar las distintas versiones de PHP y alojarlas en C:\PHP, cada una en su carpeta y con su php.ini correspondiente.
Luego, en cada archivo .conf de cada proyecto sólo tienes que cambiar la versión a usar. Y, por supuesto, no te olvides de reiniciar Apache tras realizar los cambios.
Y esto es todo, espero que le sea útil la información.