Varias versiones de php simultáneamente en Ubuntu

16

Quiero poder ejecutar múltiples versiones de php en mi caja de desarrollo con Ubuntu 12.04. Lo que quiero lograr es que cuando uso localhost como dominio se use un valor predeterminado (digamos php 5.3.17). Cuando uso 547.localhost como dominio se usa php 5.4.7. He visto algunos tutoriales para que esto funcione con fastcgi, pero hasta ahora no he podido hacerlo funcionar. He visto estos tutoriales:

  1. http://dbforch.wordpress.com/2010/05/21/apache2-fastcgi-multiple-php-versions-ubuntulucid-10-04/
  2. http://www.metod.si/multiple-php-versions-with-apache-2-fastcgi-phpfarm-on-ubuntu/

Por lo que puedo ver, he hecho todo lo necesario. El problema es que php simplemente no se ejecuta. Cuando voy a http://localhost/somephpfile.phpél, solo genera la fuente del archivo php. Lo mismo para http://547.localhost/somephpfile.php.

Desglosaré los pasos que tomé con la esperanza de que alguien pueda detectar lo que me perdí.

  1. Primero instalé una pila de lámparas predeterminada usando sudo apt-get install lamp-server^ phpmyadmin. Después de esto, tenía un servidor de desarrollo en funcionamiento que ejecutaba la versión de repositorio de php.
  2. Luego usé phpfarm para crear dos instalaciones de php, una para 5.3.17 y otra para 5.4.7. La ubicación de phpfarm es /etc/php/phpfarm, por lo que los ejecutables están en/etc/php/phpfarm/inst/php-{version}/bin
  3. Luego habilito suaxec y fastcgi para apache y desactive mod_php con sudo a2enmod fastcgi actions suexec && sudo a2dismod php5
  4. A continuación, edité /etc/apache2/mods-enabled/fastcgi.confpara leer:

    <IfModule mod_fastcgi.c>   
        FastCgiIpcDir /var/lib/apache2/fastcgi  
        FastCgiWrapper /usr/lib/apache2/suexec   FastCgiConfig -idle-timeout
        110 -killInterval 120 -pass-header HTTP_AUTHORIZATION -autoUpdate  
        ScriptAlias /php-fcgi/ /var/www/cgi-bin/ 
    </IfModule>
    
  5. Luego /var/www/, creé una carpeta cgi-bin y en esta carpeta dos archivos, para cada una de las dos versiones de php de la siguiente manera (solo muestro el de 5.3.17 /var/www/php5317.fcgi):

    #!/bin/sh
    # you can change the PHP version here.
    version="5.3.17"
    # php.ini file location, */php-5.2.13/lib equals */php-5.2.13/lib/php.ini.
    PHPRC=/etc/php/phpfarm/inst/php-${version}/lib/php.ini
    export PHPRC
    
    PHP_FCGI_CHILDREN=3
    export PHP_FCGI_CHILDREN
    
    PHP_FCGI_MAX_REQUESTS=5000
    export PHP_FCGI_MAX_REQUESTS
    
    # which php-cgi binary to execute
    exec /etc/php/phpfarm/inst/php-${version}/bin/php-cgi
    
  6. El último paso fue crear hosts virtuales. Al final tengo tres archivos en /etc/apache2/sites-enabled: 000-default, php5.3.17 y php5.4.7 con los siguientes contenidos:

    defecto:

    <VirtualHost *:80>
      ServerName localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>
    

    php5.3.17:

    <VirtualHost *:80>
      ServerName 5317.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>
    

    php5.4.7:

    <VirtualHost *:80>
      ServerName 547.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php547.fcgi
      </Directory>
    </VirtualHost>
    
  7. Finalmente cambié / etc / hosts para leer

    127.0.0.1   localhost
    127.0.0.1   547.localhost
    127.0.0.1   5317.localhost
    
    # The following lines are desirable for IPv6 capable hosts
    ::1     ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    

Ahora esperaría que las cosas funcionen, pero lamentablemente no lo hacen. En lugar de que un archivo php se ejecute a través de php, solo genera el archivo sin formato.

Debe haber algo que me perdí aquí, pero he pasado por el proceso muchas veces y no puedo entender dónde sale mal.

SeeDoubleYou
fuente
Una cosa que encontré fue que si nombraba los archivos cgi como lo hiciste, no funcionaría. Intente cambiar el nombre /var/www/cgi-bin/php-cgi-5.4.7de /var/www/cgi-bin/php54.fcgi, por ejemplo, o simplemente /var/www/cgi-bin/php.fcgi. ¿Puedes comprobar si eso ayuda? Solo para la versión 5.4.7.
Lo he comprobado y desafortunadamente esto no ayuda. He cambiado el virtualhost para reflejar este cambio también, así que la línea de acción decíaAction php-cgi /php-fcgi/php547.fcgi
He actualizado la publicación para reflejar estos cambios, ya que creo que es bueno tenerlo así de todos modos
Hmm, entonces buscaré otras posibilidades. :)
Me preguntaba, probablemente no necesito las cosas de suexec ya que no necesito usuarios diferentes para cada versión de php, ¿verdad?

Respuestas:

2

En sus hosts virtuales, agregó un controlador, pero no configuró el controlador, por lo que no se procesa. Añadir:

<FilesMatch "\.php$">
    SetHandler php-cgi
</FilesMatch>

antes </Directory>en cada archivo de hosts virtuales.

usuario138869
fuente
0

Me gustó esta breve descripción paso a paso de SeeDoubleYou y quería probarla yo mismo. Lo que faltaba era

  • sudo chmod +x /var/www/cgi-bin/*
    • Como esto no se ejecutó, apache no pudo ejecutar los scripts cgi
    • Esto es necesario para la línea Action php-cgi /php-fcgi/php<version>.fcgi en el vhost.confarchivo
  • sudo apt-get install apache2-suexec-pristine libapache2-mod-fastcgi
    • faltaban el ejecutable de suexec y el módulo fastcgi, primero tenían que instalarse
    • El ejecutable suexec es necesario para la línea FastCgiWrapper /usr/lib/apache2/suexecen el fastcgi.confarchivo
  • También tuve que quitar la línea FastCgiIpcDir /var/lib/apache2/fastcgi
    • de lo contrario recibí el mensaje de error FastCgiIpcDir /var/lib/apache2/fastcgi: already defined as "/var/lib/apache2/fastcgi"

Para cualquiera que intente configurar php_admin_value y php_value a través de archivos .htaccess o vhosts: esto no es posible con FCGI. En su lugar, puede usar archivos .user.ini para establecer configuraciones específicas de directorio php.ini.

Elektropepi
fuente