Solucionar problemas al actualizar a Apache 2.4 en ArchLinux

¡Ha llegado Apache 2.4 a ArchLinux! Es un cambio importante y requiere nuestra intervención manual para hacer que nuestro servidor LAMP vuelva a funcionar sin problemas.

Con la actualización, tenemos nuevos archivos httpd.conf, php.ini y magic, por lo que primero debemos hacer un respaldo de nuestros viejos archivos:

sudo mv /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.old
sudo mv /etc/httpd/conf/magic /etc/httpd/conf/magic.old
sudo mv /etc/php/php.ini /etc/php/php.ini.old

Entonces, renombramos los nuevos archivos:

sudo mv /etc/httpd/conf/httpd.conf.pacnew /etc/httpd/conf/httpd.conf
sudo mv /etc/httpd/conf/magic.pacnew /etc/httpd/conf/magic
sudo mv /etc/php/php.ini.pacnew /etc/php/php.ini

Apache viene con una serie de Módulos de MultiProcesamiento (Multi-Processing Modules o MPMs) que son responsables de conectar con los puertos de red de la máquina, acceptar las peticiones, y generar los procesos hijo que se encargan de servirlas. En el “nuevo” Apache 2.4 se usa el event MPM (previamente se usaba el prefork, que era más lento y consumía más memoria), que proporciona escalabilidad y buen soporte para alto tráfico de sitios web.

Por lo anterior, hay dos posibles soluciones: Volver a habilitar el prefork, o hacer los cambios necesarios para que el event MPM funcione adecuadamente.

Solución 1: Regresar a mod_mpm_prefork

Si no quieres romperte la cabeza con la migración a las novedades de Apache 2.4, lo que necesitas es volver a habilitar mod_mpm_prefork. Para ello, vamos a abrir el archivo /etc/httpd/conf/httpd.conf

sudo vim /etc/httpd/conf/httpd.conf

… y ahí, reemplazaremos la línea

LoadModule mpm_event_module modules/mod_mpm_event.so

con

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

Además, debemos incluir dos líneas adicionales, muy conocidas por nosotros. La primera debemos colocarla en la lista de carga de módulos (LoadModule list) después de LoadModule dir_module modules/mod_dir.so:

LoadModule php5_module modules/libphp5.so

La segunda, al final de la lista de configuraciones adicionales (Include list):

Include conf/extra/php5_module.conf

Y reiniciamos Apache para reflejar los cambios:

sudo systemctl restart httpd.service

Solución 2: Usar el nuevo mod_mpm_event

Si queremos aprovechar todas las bondades y novedades de Apache 2.4, ésta es la solución que debemos seguir.

Como primer paso, vamos a instalar php-fpm desde los repos oficiales:

sudo pacman -S php-fpm

Adicionalmente, instalaremos mod_proxy_handler desde AUR (esperemos que pronto lo agreguen a los repos oficiales):

yaourt -S mod_proxy_handler

En el archivo /etc/php/php-fpm.conf, descomentar la línea (quitar ; del principio):

listen = 127.0.0.1:9000

y comentar la línea (agregar ; al principio):

listen = /run/php-fpm/php-fpm.sock

En el mismo archivo, también debemos descomentar la línea:

listen.allowed_clients = 127.0.0.1

En el archivo /etc/httpd/conf/httpd.conf, agregar al final:

LoadModule proxy_handler_module modules/mod_proxy_handler.so
<FilesMatch \.php$>
    SetHandler "proxy:fcgi://127.0.0.1:9000/"
</FilesMatch>
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

Finalmente, en el archivo /etc/php/php.ini debemos asegurarnos de que la siguiente línea está habilitada (descomentada):

cgi.fix_pathinfo=1

Reiniciar los daemons involucrados:

sudo systemctl restart php-fpm.service
sudo systemctl restart httpd.service

¿Y MySQL / MariaDB? Al usar el nuevo archivo php.ini, debemos volver a decirle a PHP de la existencia del servidor de base de datos. Vamos a abrir el archivo /etc/php/php.ini con tu editor favorito …

sudo vim /etc/php/php.ini

… y descomentar (eliminar el ; al inicio) las siguientes líneas:

extension=mysqli.so
extension=mysql.so
extension=pdo_mysql.so

Finalmente, reiniciemos Apache y MariaDB para aplicar los cambios realizados.

sudo systemctl restart httpd.service
sudo systemctl restart mysqld.service

Fuentes: 1, 2, 3.

28 thoughts on “Solucionar problemas al actualizar a Apache 2.4 en ArchLinux”

  1. Como siempre, la mejor referencia en el mundo #Arch :)

    Una pregunta de ignorante nada más, ¿por qué si lo que se actualiza es Apache tengo que tocar el php.ini?

    Es que en mi caso cuando intento hacer

    sudo mv /etc/php/php.ini.pacnew /etc/php/php.ini

    El resultado es:
    mv: no se puede efectuar `stat’ sobre «/etc/php/php.ini.pacnew»: No existe el fichero o el directorio

    De lo otro ha andado todo bien, pero como no he podido con esa parte no sé si seguir con lo de MaríaDB

    Abrazos.

    1. Pongo algún dato de lo que tengo instalado, porque puede que ya tuviera la última versión de ambos y no precisara renombrar la versión anterior de php:

      [pablo@archie ~]$ httpd -v
      Server version: Apache/2.4.7 (Unix)
      Server built: Feb 26 2014 21:31:48

      [pablo@archie ~]$ php -v
      PHP 5.5.10 (cli) (built: Mar 5 2014 17:41:10)
      Copyright (c) 1997-2014 The PHP Group
      Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies

      Abrazos.

  2. Genial. Anexo a la consulta de @Pablo Cardozo:disqus , me gustaría saber si cada vez que inicio el demonio apache, debo hacer lo mismo con el de php-fpm. No uso enabled con ninguno, por eso.

    P/D: mismos pasos para Debian (con sus análogos)? Estoy leyendo las fuentes, porque entre Manjaro en mi notebook, Ubuntu en la PC y Debian en la VPS debo prepararme! jaja.

    Saludos!

  3. noooooo mi mayor miedo se hizo realidad :(, voy a probarlo en una maquina virtual antes de hacer cambios en el servidor, todo saldrá bien. gracias por la información, siempre útil gespadas.

  4. ahhhh hubiera venido a leer aqui primero XD ayer la pase integrando el pacnew con los archivos anteriores. voy a recuperarlos del repo de arch y hacer esto mejor :D logre hacer que funcionara pero con el prefork, y owncloud no me jala, espero con esto obtener mejores resultados. como siempre genial referencia!

    1. y no eh? Al configurar todo como lo sugieres, me sigue apareciendo este error:

      Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP.

      Regresare a pre-fork por ahora y seguiré investigando, está raro… habra alguna configuracion extra de PHP que deba moverse? o algun modulo/version de PHP diferente que deba instalarse?

  5. Yo ahora mismo estoy algo liado, porque justo estaba instalando Apache+PHP siguiendo tu anterior tutorial y me daba un error. Justo he visto que acababas de publicar esto para la versión 2.4 (que es la que se me ha instalado) y me sigue dando el mismo problema.

    Aplico la configuración tal y como pones aquí http://gespadas.com/archlinux-systemd-lamp, pero al reiniciar Apache me da un fallo. Si hago systemctl status httpd.service me sale lo siguiente:

    Unit httpd.service has begun starting up.
    mar 09 01:48:33 archy apachectl[10348]: [Sun Mar 09 01:48:33.810491 2014] [:crit] [pid 10350:tid 140129220675456] Apache is ru
    mar 09 01:48:33 archy apachectl[10348]: AH00013: Pre-configuration failed
    mar 09 01:48:33 archy systemd[1]: httpd.service: control process exited, code=exited status=1
    mar 09 01:48:33 archy systemd[1]: Failed to start Apache Web Server.
    — Subject: Unit httpd.service has failed
    — Defined-By: systemd
    — Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel

    — Unit httpd.service has failed.
    ___________________________________________

    He mirado en la wiki de ArchLinux pero la configuración es la misma que ya pusiste en tu anterior entrada. Googleando he visto gente con el mismo problema y la solución que le recomienda la gente es recompilar una versión de PHP distinta a la estandar preparada para Apache, aunque entiendo que eso es lo que hace el paquete php-apache -_-

    A ver si tu me puedes iluminar un poco el camino, porque la verdad es que he llegado a un punto muerto (eso digo ahora, pero pienso insistirle a esto mañana xD)

    Gracias, saludos

  6. Respondo en general a todos los que han dejado comentarios y dudas: ¡He actualizado el post con instrucciones adicionales! He realizado algunas pruebas y todo parece ya estar funcionando sin problemas.

    1. A mí me sigue sin funcionar. Estoy probando un server en Digital Ocean, en el cual hay que instalar todo, y cuando termino todos los pasos me da este resultado:

      [root@hanoi ~]# systemctl status httpd.service
      httpd.service – Apache Web Server
      Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
      Active: failed (Result: exit-code) since Wed 2014-03-12 01:07:39 UTC; 25s ago
      Process: 4782 ExecStart=/usr/bin/apachectl start (code=exited, status=1/FAILURE)
      Main PID: 3947 (code=exited, status=0/SUCCESS)
      CGroup: /system/httpd.service

      Mar 12 01:07:39 hanoi systemd[1]: Starting Apache Web Server…
      Mar 12 01:07:39 hanoi apachectl[4782]: [Wed Mar 12 01:07:39.733275 2014] [:crit] [pid 4784:ti…HP.
      Mar 12 01:07:39 hanoi apachectl[4782]: AH00013: Pre-configuration failed
      Mar 12 01:07:39 hanoi systemd[1]: httpd.service: control process exited, code=exited status=1
      Mar 12 01:07:39 hanoi systemd[1]: Failed to start Apache Web Server.
      Mar 12 01:07:39 hanoi systemd[1]: Unit httpd.service entered failed state.
      Hint: Some lines were ellipsized, use -l to show in full.

      Si alguien tiene alguna idea me pegan el aviso, desde ya muchas gracias.

  7. Ups he encontrado un problema si tienen sus archivos en el document root funcionan bien, pero trabajan con enlaces simbolicos marca un error proxy_fcgi:error :( y mi mayoria de desarrollos son enlaces :(

    1. En mis últimas actualizaciones (pacman -Syyu) he visto que han estado actualizando apache y demás paquetes relacionados… habrá que ser pacientes para que todo quede estable.

      1. Milagrosamente ya me funciono usando el antiguo php.ini, entonces el problema es

        cgi.fix_pathinfo=1 espero que apache lo solucione

  8. Funciona perfectamente!! He probado con la solución 2 y me ha funcionado a la primera. Sólo una pregunta, es necesario tener instalado php-apache o con tener php-fpm y php es suficiente?

  9. Una pregunta compa! Si el Apache es de nueva instalación, la configuración del tutorial de LAMP es suficiente, no?

  10. Muchas gracias por la información, me he pasado todo el día viendo como configurarlo; hace poco tuve que formatear y crei que haciendo lo del post de instalación y configuración y luego pasarme a este se solucionaria y ese fue mi error. Hasta que por fin pude hacerlo pongo los pasos por si alguien los necesita.

    Segui los pasos de http://gespadas.com/archlinux-systemd-lamp hasta el paso 3, luego de este post use el paso 2 y me regrese al otro para instalar mysql.

    En pocas palabras solo la parte de la configuración de php fue la que no hice porque eso da problemas con el apache, hay que hacer la configuración mod_mpm_event.

    saludos!

    1. Es verdad. En caso de que hayan actualizado desde Apache 2.2 a 2.4, hay que ‘deshacer’ lo hecho en el punto 3 explicado en ese post. Podemos hacerlo comentando estas líneas en el archivo ‘httpd.conf’ (añadiendo un # al inicio):

      LoadModule php5_module modules/libphp5.so
      Include conf/extra/php5_module.conf
      MIMEMagicFile conf/magic

      Además, como observación adicional, recomiendo verifiquen en ese mismo archivo los Loadmodule porque muchos de los que estaban descomentados en el antiguo archivo de Apache 2.2 ahora vienen comentados y podrían no funcionarles sus páginas si utilizaban alguno de ellos (personalmente, descomente mod_expires, mod_ssl, mod_rewrite y mod_deflate, y mis sistemas funcionan de diez).
      Si no les carga alguna página, vean los errores en el error_log para saber cual Loadmodule les falta habilitar (ahora el log se encuentra en /var/log/hhtpd, aunque pueden ver la dirección donde está ejecutando en la consola:

      grep ErrorLog /etc/httpd/conf/httpd.conf

      Con paciencia que a mas de uno les van a surgir sus casos particulares. Compartan para ayudar. Y no tiren la toalla, hay que hacer funcionar ese Apache 2.4! :)

      1. Comentando las líneas que has sugerido (en ‘httpd.conf’), arrancó Apache. Gracias Sres. Ivan Gabriel y Gregorio Gespadas. Saludos desde Argentina.

  11. a mi me funciono por lo menos apache y php , sin embargo no puedo iniciar phpmyadmin , ingreso a ver los log y me aparere: ” client denied by server configuration: /usr/share/webapps/phpMyAdmin”, me podras ayudar con este problema porfa

  12. amigo feliz dia …hace tiempo me funciono estos pasos.. por cuestiones del destino me ha tocado reinstalar manjaro. pero quiero seguir trabajando con

    mod_mpm_event
    pero en los paquetes yaourt ya no se encuentra el mod_proxy_handler… como pudiese resolver en ese caso sin volver al mod_mpm_prefork.. gracias …

  13. olá gracias, muy buenno post.
    no meu raspberry instalei bem o Yaourt, mas quando faço yaourt -S mod_proxy_handler
    tenho erro, o yaourt não encontra este modulo.

    podes ajudar-me?
    muchas gracias

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>