Desarrollo de aplicaciones web con Drupal

Configurar entorno de desarrollo para Drupal con PHP y Netbeans en Debian/Ubuntu

PHP Apache MySQL

Por enésima vez voy a reinstalar mi sistema operativo, en este caso Debian 8 Jessie con Gnome 3, y he decidido realizar este pequeño guión para la próxima vez que tenga que hacer esta misma tarea no tener que andar buscando por ahí. Estos son los componentes que voy a instalar y configurar:

  • Apache
  • PHP
  • MySQL
  • MySQL Workbench
  • Netbeans
  • GIT
  • Composer
  • Drush
  • Exim

De camino lo publico en el blog por si puede servir de ayuda a alguien más. No es un tutorial propiamente dicho, no hay apenas explicaciones, solo una serie de pasos a seguir para configurar PHP y todos los módulos y aplicaciones necesarios para desarrollar con Drupal:

Configurar el sistema

Instalar todos los paquetes necesarios de una sola vez:

sudo apt-get install apache2 libapache2-mod-php5 memcached mysql-server mysql-client mysql-workbench git gitg php5-cli php5-common php5-gd php5-xdebug php5-curl php5 php5-dev php5-mysql php5-memcache curl node-less

Configurar PHP

Editar /etc/php5/apache2/php.ini y establecer los siguientes valores:

memory_limit = 512m
display_errors = On
post_max_size = 16
upload_max_filesize = 32m
max_execution_time = 60

Para XDebug editar el archivo /etc/php5/mods-available/xdebug.ini (que debe estar enlazado en /etc/php5/apache2/conf.d/20-xdebug.ini) y añadir debajo de la línea zend_extension=xdebug.so las siguientes líneas:

xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.max_nesting_level=256

Configurar Apache

A mi me gusta utilizar dominios locales para los sitios que estoy desarrollando, en vez de localhost/nombre para cada proyecto uso nombre.dev. Ademas de quedar más elegante que usar localhost con una carpeta para cada proyecto permite, por ejemplo, probar la web desde el móvil tecleado su dirección nombre.dev dentro de tu red local.

Para conseguir esto tu DNS debe resolver todos los dominios *.dev con la dirección IP de tu máquina en la red (mejor) o con 127.0.0.1. Esto no voy a explicar como hacerlo, ya que el DNS está en otra máquina distinta a la mía de desarrollo y se puede implementarse de formas muy distintas. En plan sencillo podrías incluir estas direcciones en tu archivo hosts apuntando a 127.0.0.1 o la la IP de tu máquina en la red:

192.168.0.60  midrupal.dev
192.168.0.60  otro-proyecto-dev
192.168.0.60  servinube.dev

Lo que si voy a explicar es como configurar Apache para que responda correctamente a estas peticiones.

Crear la carpeta WebSites en tu home y dentro de ella enlaces simbólicos a cada una de las carpetas de los distintos proyectos (raíz de cada sitio web) sin el .dev. O crear directamente la carpeta de cada proyecto Drupal dentro de WebSites.

Entramos a /etc/apache2 desde consola como root (ya que vamos a hacer varias cosas que requieren permisos) y editamos, con nano por ejemplo, el archivo apache2.conf y añadimos al final del mismo ServerName development.

Creamos el archivo sites-available/virtual-hosts.conf con el siguiente contenido:

<Directory /home/<user>/WebSites/*/>
  Options Indexes MultiViews FollowSymLinks Includes
  AllowOverride none
  Require all granted
  RewriteEngine On
  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^ index.php [L]
</Directory>  
 
<VirtualHost *:80>
  UseCanonicalName off
  VirtualDocumentRoot /home/<user>/WebSites/%-2
  ServerName %0
  LogLevel notice
  CustomLog ${APACHE_LOG_DIR}/access.log combined
  ErrorLog ${APACHE_LOG_DIR}/error.log
</VirtualHost>

Por último ejecutamos:

a2enmod rewrite && a2enmod vhost_alias && a2dissite 000-default && a2ensite virtual-hosts.conf && service apache2 reload

Con esta configuración si abrimos en el navegador http://servinube.dev la dirección se resolverá a la IP de nuestra máquina y apache buscará la raíz del sitio web en WebSites/servinube.

Drupal status page

MySQL

Para MySQL tengo un solo usuario para todos los proyectos con acceso a todas las bases de datos desde localhost. Pero primero, por comodidad, creamos el archivo ~/.my.cnf y en el tecleamos las siguientes líneas:

# the following section will be read by *all* client programs
[client]
user=root
password=<contraseña>

De esta forma al ejecutar los comandos mysql y mysqldump en la consola no nos pedirá ninguna contraseña. Mucho más cómodo.

Y una vez dentro de la consola de MySQL tecleamos:

CREATE USER 'webserver'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON * . * TO 'webserver'@'localhost';
FLUSH PRIVILEGES;

Y en el archivo settings.php de todos los Drupal configuras webserver / password como usuario para la base de datos.

GIT

Para GIT la configuración es sencilla en nuestro home creamos los siguientes dos archivos para decirle quienes somos y que archivos queremos ignorar de forma global:

.gitconfig

[core]
excludesfile = ~/.gitignore
[push]
default = matching
[user]
name = Juan M. Sosso
email = xxx@servinube.net

.gitignore

nbproject
*~

Este último es para ignorar la carpeta que Netbeans crea dentro de nuestros proyectos y los archivos de copia de seguridad que crea gedit.

Instalar drush con composer

Actualmente la forma preferida de instalar drush es con composer, anteriormente se hacía con pear. Estos son los pasos a seguir:

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer global require drush/drush:7.*
sudo ln -s /home/<user>/.composer/vendor/bin/drush /usr/bin/drush

Cuando queramos actualizar la versión ejecutamos: composer global update

NetBeans IDE para PHPInstalar Netbeans

A mi me gusta descargar la versión de PHP y no la completa con Java, porque no lo necesito. Una vez descargado el archivo netbeans-8.0.2-php-linux.sh le damos permisos de ejecución y lo ejecutamos como root, para que se instale para todos los usuarios del sistema y no solo para el nuestro. El proceso de instalación es sencillo y no es necesario cambiar ninguna de las opciones que vienen seleccionadas por defecto.

Configurar Exim solo para correo local

Es la primera vez que toco este servidor de correo, normalmente uso Postfix, pero como es el que viene instalado por defecto en Debian 8 he preferido no cambiarlo.

El objetivo es configurarlo para que envíe correos tanto desde la línea de comandos con sendmail como a través del puerto 25 SMTP estándar, pero que los deje en el mailbox de mi usuario debian. En definitiva que no se pueda escapar ningún correo al mundo real, de esta forma podemos estar tranquilos haciendo pruebas de envío con direcciones reales que no le van a llegar a los destinatarios reales.

Editamos /etc/exim4/conf.d/router/00_exim4-config_header y añadimos después de begin routers:

catch_all_outgoing:
  driver = redirect
  data = jmsosso (tu usuario debian)
  #unseen (descomentar esta línea significa que nos llega una copia pero el correo sigue su camino normal)

Luego corremos como root dpkg-reconfigure exim4-config y contestamos a todas las preguntas en orden según esta lista:

  • mail sent by smarthost; received via SMTP or fetchmail
  • servinube.local
  • 127.0.0.1 ; ::1
  • servinube.local
  • Vacío
  • Vacío
  • No
  • No
  • mbox
  • Yes

Con el comando sudo exim -bt test@example.com podemos comprobar la ruta que seguirá el envío a esa dirección. Tiene que indicar que el correo se queda en local:

R: system_aliases for jmsosso@servinube.local
R: userforward for jmsosso@servinube.local
R: procmail for jmsosso@servinube.local
R: maildrop for jmsosso@servinube.local
R: lowuid_aliases for jmsosso@servinube.local (UID 1000)
R: local_user for jmsosso@servinube.local
jmsosso@servinube.local
    <-- jmsosso@servinube.local
    <-- test@example.com
  router = local_user, transport = mail_spool

Conclusión

Trataré de ir actualizando este artículo a medida que vaya cambiando la configuración de mi entorno de desarrollo o cuando descubra nuevas cosas. También me gustaría que si hay algún paso erróneo o no he incluido alguna parte interesante me lo comentaras dejando un mensaje debajo.

Juan Miguel Sosso

Añadir nuevo comentario