Cada vez que configuro un Mac nuevo para desarrollo termino haciendo lo mismo: en lugar de instalar el paquete de MAMP, prefiero montar mi entorno a mano con Homebrew. Así tengo control total sobre las versiones de Apache, PHP y MySQL, puedo trabajar con varios sitios a la vez usando virtual hosts y dominios .test locales, y no dependo de una interfaz que me esconde lo que pasa por debajo.
Esta es mi checklist personal para no tener que andar buscando comandos sueltos cada vez. La dejo aquí ordenada paso a paso por si a alguien más le sirve.
Nota: Los comandos usan las rutas de Homebrew para Apple Silicon (
/opt/homebrew). Si usas un Mac con procesador Intel, la ruta suele ser/usr/local. Sustituyeyour_userpor el nombre de tu cuenta de usuario (en mi caso,avelar).
1. Herramientas de línea de comandos de Xcode
Antes de nada necesitamos las Command Line Tools de Xcode, que traen compiladores y utilidades básicas:
xcode-select --install
2. Instalar Homebrew
Homebrew es el gestor de paquetes que usaremos para todo lo demás:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Al terminar, añadimos Homebrew al PATH de nuestra shell:
(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/your_user/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
Comprobamos que quedó bien instalado:
brew --version
brew doctor
3. Bibliotecas requeridas
Instalamos OpenSSL, necesario para varios componentes posteriores:
brew install openssl
4. Instalar Apache
macOS ya trae un Apache propio, así que primero lo detenemos y lo deshabilitamos para evitar conflictos:
sudo apachectl stop
sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null
Ahora instalamos la versión de Apache de Homebrew:
brew install httpd
Comandos útiles para gestionar el servicio:
brew services start httpd
brew services stop httpd
brew services restart httpd
5. Editores de código (opcional)
Aprovecho para instalar mis editores favoritos:
brew install --cask visual-studio-code
brew install --cask sublime-text
6. Configurar Apache
Abrimos el archivo de configuración de Apache:
subl /opt/homebrew/etc/httpd/httpd.conf
Cambia el puerto de escucha de 8080 a 80. Busca esta línea:
Listen 8080
y déjala así:
Listen 80
Cambia el DocumentRoot. Busca el término DocumentRoot; verás algo como esto:
DocumentRoot "/opt/homebrew/var/www"
Cámbialo para que apunte a una carpeta dentro de tu usuario:
DocumentRoot "/Users/your_user/Sites"
Y actualiza también el bloque <Directory> justo debajo:
<Directory "/Users/your_user/Sites">
Dentro de ese mismo bloque <Directory>, cambia el AllowOverride para permitir el uso de archivos .htaccess:
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
AllowOverride All
Habilita mod_rewrite. Viene comentado por defecto. Busca la línea y quítale la almohadilla # del principio (en Sublime puedes usar ⌘ + / para comentar/descomentar rápido):
LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
Configura el usuario y grupo con los que corre Apache:
User your_user
Group staff
Define el nombre del servidor. Busca la línea comentada de ServerName y añade localhost:
#ServerName www.example.com:8080
ServerName localhost
7. Crear la carpeta de sitios
Creamos la carpeta Sites en nuestro usuario y una página de prueba:
mkdir ~/Sites
echo "<h1>My User Web Root</h1>" > ~/Sites/index.html
8. Instalar PHP
Instalamos PHP (y, si lo necesitas, versiones adicionales para trabajar con proyectos antiguos):
brew install php
brew install php@8.1
brew install php@8.0
Comprobamos la versión activa:
php -v
Para cambiar entre versiones de PHP usamos link/unlink. Por ejemplo, para activar PHP 8.2:
brew unlink php && brew link --overwrite --force php@8.2
9. Conectar PHP con Apache
Volvemos a editar httpd.conf. Justo debajo de la línea de mod_rewrite:
LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
Añade los módulos libphp. Deja descomentado solo el de la versión que vas a usar (aquí, PHP 8.2):
#LoadModule php7_module /opt/homebrew/opt/php@7.0/lib/httpd/modules/libphp7.so
#LoadModule php7_module /opt/homebrew/opt/php@7.1/lib/httpd/modules/libphp7.so
#LoadModule php7_module /opt/homebrew/opt/php@7.2/lib/httpd/modules/libphp7.so
#LoadModule php7_module /opt/homebrew/opt/php@7.3/lib/httpd/modules/libphp7.so
#LoadModule php7_module /opt/homebrew/opt/php@7.4/lib/httpd/modules/libphp7.so
#LoadModule php_module /opt/homebrew/opt/php@8.0/lib/httpd/modules/libphp.so
#LoadModule php_module /opt/homebrew/opt/php@8.1/lib/httpd/modules/libphp.so
LoadModule php_module /opt/homebrew/opt/php@8.2/lib/httpd/modules/libphp.so
También hay que decirle a Apache que use index.php como índice de directorio. Busca este bloque:
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
y reemplázalo por este:
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
No olvides reiniciar Apache para aplicar los cambios:
brew services restart httpd
10. Validar la instalación de PHP
Creamos un archivo info.php con la función phpinfo():
echo "<?php phpinfo();" > ~/Sites/info.php
Y lo abrimos en el navegador:
http://localhost/info.php
Si ves la tabla de información de PHP, ¡todo funciona!
11. Instalar MySQL
Actualizamos Homebrew e instalamos MySQL:
brew update
brew services list
brew install mysql@8.4
Gestión del servicio:
brew services start mysql
brew services stop mysql
Ejecutamos el asistente de seguridad para poner contraseña de root y limpiar la configuración por defecto:
sudo mysql_secure_installation
Creamos un usuario administrador para trabajar cómodamente:
sudo mysql
CREATE USER 'admin'@'localhost' IDENTIFIED BY '12345678aA';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
FLUSH PRIVILEGES;
Consejo de seguridad: Cambia esa contraseña de ejemplo por una tuya, aunque sea un entorno local.
12. Virtual Hosts en Apache
Los virtual hosts nos permiten servir varios sitios con distintos dominios locales. Editamos de nuevo httpd.conf y descomentamos estas dos líneas:
LoadModule vhost_alias_module lib/httpd/modules/mod_vhost_alias.so
# Virtual hosts
Include /opt/homebrew/etc/httpd/extra/httpd-vhosts.conf
Abrimos el archivo de virtual hosts:
subl /opt/homebrew/etc/httpd/extra/httpd-vhosts.conf
Y definimos nuestros sitios. Por ejemplo, uno para localhost y otro para un WordPress con dominio .test:
<VirtualHost *:80>
DocumentRoot "/Users/your_user/Sites"
ServerName localhost
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/Users/your_user/Sites/wordpress"
ServerName grav-admin.test
</VirtualHost>
13. Dominios .test locales con Dnsmasq
Para que cualquier dominio terminado en .test apunte a nuestro equipo sin tocar el archivo hosts, usamos Dnsmasq:
brew install dnsmasq
echo 'address=/.test/127.0.0.1' > /opt/homebrew/etc/dnsmasq.conf
sudo brew services start dnsmasq
Después le decimos a macOS que resuelva los dominios .test con nuestro servidor local:
sudo mkdir -v /etc/resolver
sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/test'
14. Configurar Xdebug
Por último, instalamos Xdebug para poder depurar código PHP paso a paso:
pecl install xdebug
Editamos el php.ini de la versión que usemos:
subl /opt/homebrew/etc/php/8.2/php.ini
Y añadimos la configuración de Xdebug:
[xdebug]
zend_extension="xdebug.so"
xdebug.mode=debug
Reiniciamos Apache una última vez:
brew services restart httpd
Conclusión
Con esto tenemos un entorno de desarrollo completo en macOS —Apache + MySQL + PHP— montado a mano con Homebrew, con soporte para múltiples sitios mediante virtual hosts, dominios .test locales y depuración con Xdebug. Es un poco más de trabajo que instalar MAMP, pero a cambio tienes control total sobre cada pieza y puedes cambiar de versión de PHP en segundos.
¿Tienes tu propia forma de montar el stack en Mac? ¿Añadirías algo a esta lista? Te leo en los comentarios.
Leave a Reply