Migrar una web con Drupal 8 a un virtual host local de apache

Migrar una instalación ya funcionando de Drupal 8 desde la web a un servidor local en nuestro equipo es ligeramente más complicado que con otras versiones de Drupal, la forma de hacerlo que a mí me ha funcionado es la siguiente:

Partimos de un equipo en el que tenemos instalado linux Mint 18.1, pero estas instrucciones podrían valer también para cualquier distribución linux, cambiando convenientemente las rutas de los ficheros.

Instalamos el servidor web:

sudo apt-get install apache2

Para comprobar que funciona, accedemos con un navegador a la dirección http://localhost  y deberíamos ver la página raíz del servidor apache

Instalamos PHP, que en esta versión de Linux Mint (18.1) es el PHP 7.0, y algunos módulos de php que nos serán necesarios:

sudo apt-get install php7.0 php7.0-mysql libapache2-mod-php7.0 php7.0-cli php7.0-cgi php7.0-gd php7.0-curl php7.0-gd php7.0-intl php7.0-imap php7.0-mcrypt php7.0-pspell php7.0-recode php7.0-snmp php7.0-sqlite3 php7.0-tidy php7.0-xmlrpc php7.0-xsl php-pear php-imagick php-apcu

Comprobamos que PHP funciona creando como root el fichero /var/www/html/info.php con una única línea que ponga

<?php phpinfo(); ?>

Reiniciamos el servidor web

sudo service apache2 restart

Accedemos a la dirección http://localhost/info.php y deberíamos de ver la página de información de PHP

Habilitamos el  módulo rewrite

sudo a2enmod rewrite

Instalamos MySQL

sudo apt-get install mysql-client mysql-server

Aseguramos la instalación de MySQL con el script

sudo mysql_secure_installation

Instalamos y configuramos SSL, para ello creamos una carpeta

sudo mkdir /etc/apache2/ssl

Nos situamos en ella y y ejecutamos el comando de creación de un certificado autofirmado (en este comando y en las instrucciones siguientes habrá que cambiar «misitio» por el nombre de nuestra web)

cd /etc/apache2/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/misitiossl.key -out /etc/apache2/ssl/misitiossl.crt

Se nos hará una serie de preguntas, acerca de nuestra identidad etc. Cuando termine el comando, cambiamos los permisos de los ficheros creados en el directorio

sudo chmod 600 *

Ahora configuramos el host virtual en Apache, para ello creamos el directorio al que copiaremos los ficheros de nuestra web, y luego creamos el fichero de configuración del host virtual

sudo mkdir -p /var/www/misitio
sudo vim /etc/apache2/sites-available/misitio.conf

En este fichero tenemos que tener el siguiente contenido:

<VirtualHost *:80>
 ServerName www.misitio.local
 DocumentRoot /var/www/misitio

RedirectMatch 301 (.*) https://www.misitio.local$1
</VirtualHost>

<VirtualHost _default_:443>

ServerName www.misitio.local
 ServerAlias misitio.local
 ServerAdmin webmaster@localhost

DocumentRoot /var/www/misitio

ErrorLog ${APACHE_LOG_DIR}/misitio-error.log
 CustomLog ${APACHE_LOG_DIR}/misitio-access.log combined

SSLEngine on
 
 SSLCertificateFile /etc/apache2/ssl/misitiossl.crt
 SSLCertificateKeyFile /etc/apache2/ssl/misitiossl.key

<Directory "/var/www/misitio">
 Options FollowSymLinks
 AllowOverride All
 Require all granted
 </Directory>

<FilesMatch "\.(cgi|shtml|phtml|php)$">
 SSLOptions +StdEnvVars
 </FilesMatch>

<Directory /usr/lib/cgi-bin>
 SSLOptions +StdEnvVars
 </Directory>

BrowserMatch "MSIE [2-6]" \
 nokeepalive ssl-unclean-shutdown \
 downgrade-1.0 force-response-1.0
 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

</VirtualHost>

Modificamos el fichero /etc/hosts añadiendo una línea en la que apuntamos a nuestro host virtual. Para ello incluimos en este fichero una línea al principio que ponga:

127.0.0.1      www.misitio.local

Copiamos los ficheros de la web que queremos migrar a la carpeta /var/www/misitio, creamos en nuestro MySQL local una base de datos ideńtica a la que tenemos en la base de datos de la web, y creamos el usuario con el que se accede a ella desde el sitio web. Para ello podemos usar adminer, phpmyadmin, etc. Si en vez de migrar una web estamos creando una web desde cero, pues entonces usamos el método habitual de instalación de una web Drupal, usando la dirección de nuestro host virtual como inicio del proceso.

Solamente si estamos haciendo una migración, una vez que tenemos los ficheros transferidos y la base de datos configurada, accedemos al fichero:

sudo vim /var/www/misitio/sites/default/settings.php

y modificamos la parte correspondiente a los host de confianza, incluyendo la dirección de nuestro host virtual. Buscamos trusted_host_patterns y el fichero debería de quedar tal que así:

$settings['trusted_host_patterns'] = array(
 '^www\.misitio\.com$', 
 '^www\.misitio\.local$'
);

Y ya debería funcionar todo, accediendo a la página https://www.misitio.local deberíamos de ver la página principal de nuestra nueva web en local. La primera vez que accedamos a ella nos saltará una advertencia de seguridad en el navegador porque estamos usando un certificado autofirmado, por lo que deberemos de añadir una excepción de seguridad para poder acceder las siguientes veces sin que salte este aviso.

Este post está basado en gran parte en lo que se explica en: https://kreationnext.com/support/how-to-install-drupal-8-with-apache-mysql-and-ssl-on-ubuntu-15-10/

Activar xdebug en XAMPP

Después de instalar XAMPP en Windows, para poder hacer debug de una aplicación en PHP con Netbeans hay que hacer unos pequeños cambios en el php.ini que viene por defecto. A partir de este momento consideraremos <xampp_home> el directorio donde hayamos instalado XAMPP, por ejemplo «c:\xampp»

Abrimos el fichero <xampp_home>\php\php.ini

Al final del mismo encontraremos la parte que se refiere a Xdebug. Tendremos que descomentar, es decir, quitar el «;» (las líneas que comienzan con un «;» son consideradas comentarios) de las líneas siguientes:

zend_extension = «C:\xampp\php\ext\php_xdebug.dll»

xdebug.remote_enable = 1
xdebug.remote_handler = «dbgp»
xdebug.remote_host = «127.0.0.1»

Ojo: también tendremos que poner el remote_enable a «1», que por defecto viene a «0». De forma que esas líneas del fichero nos quedan así:

xdebug_php_ini

Reiniciamos el servidor Apache y ya podemos hacer debug de programas PHP en Netbeans

(Tomado de la entrada: http://www.wikihow.com/Configure-XDebug-in-XAMPP-%281.7.2/Later%29-on-Windows )

Cómo habilitar las clean url de Drupal en el directorio de usuario de Apache2 en Debian/Ubuntu y Fedora

  1. Habilitar el módulo mod_rewrite de Apache. En Debian/Ubuntu hay que lanzar el comando: sudo a2enmod rewrite. En Fedora ese módulo ya viene habilitado por defecto.
  2. Editar el fichero /etc/apache2/mods-enabled/userdir.conf en Debian/Ubuntu cambiando la linea con AllowOverride FileInfo AuthConfig Limit Indexes de forma que solo tenga AllowOverride All. En Fedora dicho fichero está en /etc/httpd/conf.d/userdir.conf
  3. Editar el fichero .htaccess de nuestro directorio de Drupal descomentando la linea con la opción RewriteBase y dejándola como  RewriteBase /~MiUsuario/miDirectorioDrupal/
  4. Reiniciar Apache. En Debian/Ubuntu con el comando: sudo service apache2 restart y en Fedora con: sudo service httpd restart

Este procedimiento me ha funcionado con Ubuntu 14.04 con Drupal 8, y también en Fedora 23 con Drupal 7

En esta entrada recojo mi experiencia personal tras seguir las indicaciones de:
http://tolocalhost.blogspot.com.es/2013/04/enabling-drupal-clean-url-in-apache2.html

¿Un virtual host de Apache no funciona sin conexión a internet?

Logo de Apache http ServerCuando he intentado acceder a un host virtual local de Apache montado en mi Linux Mint en un momento en que estaba sin conexión a internet, he visto que el navegador era incapaz de mostrarme correctamente las páginas, continuamente intentaba buscarlas en un internet al que no tenía acceso, en vez de resolver correctamente a la máquina local, que es donde están.

Buscando por internet veo que es un problema que proviene de la configuración del navegador. Para resolverlo hay que entrar en la página about:config de Firefox, en ella buscar la línea que pone network.dns.disableIPv6 y modificarla para que ponga False. Una vez hecho ésto, ya podemos trabajar en los host virtuales en local aunque no tengamos conexión a internet.

Solución encontrada aquí y aquí.

 

Error «.htaccess: Options not allowed here» en Apache2

Este error me ha aparecido en el log de Apache cuando he intentado acceder a una réplica en mi directorio de usuario de una página hecha en Drupal. Para solucionarlo he tenido que editar el archivo «/etc/apache2/sites-available/000-default.conf» añadiendo las lineas

<Directory /home/mi_usuario/public_html/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>

Y reiniciar el servicio con «sudo service apache2 restart»

Quitar el arranque automático de apache y mysql

Una vez instalado nuestro entorno de desarrollo LAMP, si nuestro equipo es viejito es posible que, para ahorrar recursos, queramos que los servicios apache y mysql no se inicien automáticamente en el arranque, sino arrancarlos manualmente cuando los necesitemos. En las distribuciones basadas en Debian el procedimiento sería como sigue:

(Entrada modificada el 19/8/2015 siguiendo las indicaciones de este blog, que están basadas en este otro blog. Las instrucciones que tenía mi entrada anteriormente eran incorrectas, muchas gracias a ambos por haberme sacado de mi error.)

Para el servidor Apache:
Ejecutar:
sudo update-rc.d apache2 disable
De esta manera se deshabilita el servicio y por lo tanto su arranque automático.
Para volver a habilitar el servicio:
sudo update-rc.d apache2 enable
No es recomendable usar el comando
sudo update-rc.d -f apache2 remove
porque lo que hace este comando es modificar los directorios /etc/rc0.d, /etc/rc1.d, etc. hasta el /etc/rc6.d (uno para cada uno de los niveles de ejecución) borrando los enlaces simbólicos que controlan el arranque de los servicios. Por ejemplo, si listamos el contenido del directorio /etc/rc6.d después de hacer el comando remove veremos que han desaparecido los ficheros /etc/rc6.d/K01apache2 y /etc/rc6.d/K01mysql. Si quisiéramos recuperar los ficheros borrados, habría que lanzar el comando:
sudo update-rc.d apache2 defaults

Tenemos que tener en cuenta que es posible que cuando posteriormente se instale una actualización de apache, nuévamente nos encontremos con que éste vuelve a arrancarse automáticamente en el inicio. En este enlace comentan que la forma de evitar ésto es lanzando el comando:
sudo update-rc.d apache2 stop 80 0 1 2 3 4 5 6 .
Pero yo no lo he probado.

Para el servicio de mySQL:
En este caso hay que editar el fichero /etc/init/mysql.conf y modificar la línea con
start on runlevel [2345]
para dejarla de la manera siguiente:
start on (never and runlevel [2345])

Para arrancar estos servicios, ejecutamos:
sudo service apache2 start
sudo service mysql start

Habilitar url’s limpias en Drupal 7 en un directorio de usuario de Apache (userdir)

Para habilitar las urls limpias en un Drupal 7 instalado en un directorio de usuario de Apache (con el módulo mod_userdir activado), tendremos que hacer lo siguiente

Verificar que tenemos habilitados los módulos de Apache ‘mod_rewrite’ y ‘mod_userdir’. Para ello comprobaremos que en el fichero /etc/httpd/conf/httpd.conf están descomentadas las líneas
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule userdir_module modules/mod_userdir.so

Indicar en nuestro fichero .htaccess dónde está instalado Drupal, modificando el fichero ~/public_html/drupal7test/.htaccess. Buscamos la linea con RewriteBase y la descomentamos, poniendo a continuación el directorio en el que tenemos instalado Drupal, en mi caso la línea queda así:
RewriteBase ~/public_html/drupal7test

Permitir la actuación del módulo mod_rewrite en nuestro directorio de usuario; para ello modificaremos el fichero /etc/httpd/conf/extra/httpd-userdir.conf de forma que quede activado el AllowOverride:

UserDir public_html
<Directory "/home/*/public_html">
  AllowOverride All
  Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
  <Limit GET POST OPTIONS>
    Order allow,deny
    Allow from all
  </Limit>
  <LimitExcept GET POST OPTIONS>
    Order deny,allow
    Deny from all
  </LimitExcept>
</Directory></code>

Más información sobre las url’s limpias en la página de Drupal.

Las instrucciones anteriores sirven literalmente para Archlinux, si se hace en otra distribución de Linux es muy posible que los directorios donde se ubiquen los ficheros de configuración sean distintos. Para localizarlos, deberemos utilizar el comando (como root):
find /etc -name <nombre del fichero>

PHP no funciona en userdir

Es una tontería, pero puede dar lugar a algún que otro dolor de cabeza: a veces por defecto la instalación de php tiene desactivada la ejecución en los directorios personales (por ejemplo en Ubuntu) por lo que si después de hacer una instalación de apache2 y php5 habilitas el módulo userdir, y generas un fichero php con la función phpinfo() o cualquier otro script de php, lo más seguro es que te aparezca una página en blanco, en vez de ver la información esperada.
La solución es fácil, basta con editar el fichero
/etc/apache2/mods-available/php5.conf
Al final del mismo verás que hay una parte que indica que hay que comentar unas lineas para que los scripts de php funcionen en un directorio de usuario. Esa parte tiene que quedar así:
# Running PHP scripts in user directories is disabled by default
#
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
#<IfModule mod_userdir.c>
# <Directory /home/*/public_html>
# php_admin_value engine Off
# </Directory>
#</IfModule>

Y eso es todo. Después de reiniciar el servidor Apache (service apache2 restart) los scripts de php ya funcionan.
También se podría poner la directiva a «On», pero si lo hacemos así, entonces no podríamos ponerla a «Off» en los ficheros .htaccess si en algún momento queremos hacerlo.

Configurar Selinux para un VirtualHost de Apache en Centos 6

Para que al utilizar un host virtual en Apache (por ejemplo localdev) cuyas páginas se encuentren en un directorio dentro de la carpeta del usuario (por ejemplo en public_html) no tengamos problemas de seguridad con Selinux, tenemos que realizar lo siguiente:

1) Instalar paquetes necesarios

Una instalación por defecto de Centos 6 a partir del CD Live configura Selinux en modo enforcing pero no instala algunos paquetes que vienen bien. En una consola como root hacemos:
#yum install policycoreutils-python setroubleshoot

2) Activar Selinux (en caso de que no lo tengamos ya activado)

Editar (como root) el fichero /etc/selinux/config dejándolo así:

SELINUX=enforcing
SELINUXTYPE=targeted

Tenemos que tener en cuenta que si no lo teníamos activado y modificamos este fichero para activarlo, es necesario reiniciar el equipo, porque hace falta que se haga de nuevo un «relabel» del sistema de ficheros.

3) Crear el host virtual en Apache

Modificar el fichero /etc/httpd/conf/httpd.conf descomentando la línea:
NameVirtualHost *:80 y añadiendo al final de dicho fichero:

DocumentRoot ~user/public_html
Servername localdev

4) Modificar el /etc/hosts

Modificamos la línea del host local incluyendo el nuevo host virtual (en este caso localdev) dejándola más o menos así:
127.0.0.1 localhost localhost.localdomain localdev

5) Configurar el contexto de Selinux y los permisos de la carpeta

Tenemos que lanzar como root los siguientes comandos en una consola.
Para cambiar el contexto Selinux de la carpeta del host virtual al necesario para que lo utilice el servidor web:
#chcon -R -v -u system_u -r object_r -t httpd_sys_content_t ~user/public_html

Para permitir al servidor web que lea el contenido de la carpeta home de los usuarios:
#setsebool -P httpd_enable_homedirs 1

Para que la configuración de Selinux se mantenga después de un «relabel» del sistema de ficheros:
# semanage fcontext -a -t httpd_sys_content_t "~user/public_html

Para que no haya problemas de permisos de acceso a las páginas web:
#chmod -R 755 ~user/public_html

(Los dos primeros comandos pienso que habría también que utilizarlos si en vez de crear un host virtual lo que se hace es utilizar el módulo userdir de Apache.)

6) Reiniciamos Apache y probamos nuestra página de inicio.

http://localdev/index.html

(Esta entrada es una versión resumida de este post, en el que se explica todo con más detalle)