Múltiples versiones de PHP a través de nginx

Múltiples versiones de PHP a través de nginx

EDITAR:Para futura referencia

Estoy ejecutando Ubuntu 14.10 con una pila LEMP usando PHP 5.5.12. Tengo varios sitios de WordPress heredados que requieren PHP 5.3.3 junto con algunos sitios de WP que usan una versión bastante reciente de PHP, todos ejecutándose en nginx.en mi máquina local.

Tengo las manos atadas con respecto a las máquinas virtuales y los entornos sandbox, todo lo que puedo jugar es nginx, de ahí esta pregunta. Entiendo las preocupaciones de seguridad de la gente, pero necesito que estos sitios se ejecuten localmente para poder probar funciones rotas mientras los actualizo a las últimas versiones de PHP/WP.

Quiero que nginx ejecute la versión correcta de PHP (usando php-fpm) según el sitio de WordPress. De acuerdo aotroPregunta de SF, una forma de lograr esto es ejecutar las diferentes versiones de PHP en puertos/sockets separados y configurar los bloques del servidor nginx para usar el puerto/socket respectivo.

He compilado PHP 5.3.3 manualmente para incluir php-fpm pero eso es lo más lejos que he llegado.

Efectivamente quiero que alguien me explique con un poco más de detalle.esterespuesta. No puedo entender muy bien cómo"ejecute cada versión de php-fpm en un puerto (o socket) diferente"o"configure el puerto apropiado en su parámetro fastcgi_pass en su bloque de servidor nginx".

Uno de mis bloques de servidor se ve así como referencia.

server {
    listen 80;
    listen [::]:80;

    root /usr/share/nginx/html/testsite1;
    index index.php index.html index.htm;

    server_name local.testsite1.com;

    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    error_page 404 /404.html;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

EDITAR:

Configuré cada sitio usando un bloque de servidor separado en un archivo separado, vinculado simbólicamente entre /var/nginx/sites-available/testsite1y /var/nginx/sites-enabled/testsite1. Entonces var/nginx/sites-availablecontiene;

 testsite1
 testsite2
 testsite3
 ...

EntoncesidealmenteMe preguntaba si es posible algo como lo que se muestra a continuación (ya que esto es similar a cómo se puede configurar Apache con diferentes versiones de PHP)

sitio de prueba1: ejecutando una versión anterior de PHP

 server {
    listen 80;
    listen [::]:80;

    root /usr/share/nginx/html/testsite1;
    index index.php index.html index.htm;

    server_name local.testsite1.com;

    ...settings to use older PHP version...

    ...remaining nginx settings...
}

testite2 - ejecutando la versión actual de PHP

 server {
    listen 80;
    listen [::]:80;

    root /usr/share/nginx/html/testsite2;
    index index.php index.html index.htm;

    server_name local.testsite2.com;

    ...settings to use currrent PHP version (if needed)...

    ...remaining nginx settings...
}

es posible? La razón por la que pregunto es que prefiero evitar cambiar el nombre de todos mis phparchivos para php2poder ejecutarlos (lo que hace que el control de versiones sea una molestia). No me importa editar el nginx.confarchivo o cualquier paso necesario, siempre y cuando no tenga que cambiar el nombre de los archivos.

Yo tambiéncreerNecesito usar sockets (fastcgi_pass unix:/var/run/php5-fpm.sock;)sobre puertos debido a WordPress (aunque estoy abierto a todas las sugerencias).

Respuesta1

Bien, desea ejecutar varias versiones de PHP a través de nginx, el archivo de configuración debe incluir la ruta específica donde coloca sus scripts PHP en una versión o nombre de extensión diferente.

Sin embargo, me gustaría explicar el enlace de la pregunta SF que figura en su publicación.

Esa respuesta le brinda una forma de modificar confsu nginx, lo que supone que el interrogador tiene experiencia en nginx.

Al proporcionar un puerto específico en conf, nginx hará que el script se ejecute a través de ese canal FastCGI.

Supongamos que ha instalado una versión diferente de PHP en su servidor y ha modificado el portarchivo php-fpm.conf.

Desea que todos phplos archivos se ejecuten en la versión 5.5.0y php2el archivo se ejecute en 5.6.0.

Ejemplo de configuración de nginx de la siguiente manera,

    listen       8080;
    server_name  localhost;

    root   html;

    location / {
        index  index.php index.php2;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  "${document_root}${fastcgi_script_name}";
        include        fastcgi_params;
    }

    location ~ \.php2$ {
        fastcgi_pass   127.0.0.1:9001;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  "${document_root}${fastcgi_script_name}";
        include        fastcgi_params;
    }

En este caso, phpse tramita a través de puerto 9000y php2se dirige a9001

Este es solo un ejemplo simple; para usuarios avanzados, puede crear dos carpetas diferentes para almacenar archivos php, por ejemplo, /home/php55y /home/php56luego editar su archivo nginx.conf.

PARA SU PREGUNTA EDITADA

Si desea intentar agregar diferentes servidores para procesar los scripts en diferentes versiones, seguro que puede hacerlo, ya que nginx puede ser un equilibrador de carga y también puede solucionar este tipo de problemas.

Primera aplicación

server{
listen 80;
server_name php1.localhost; 

root   /home/www/php5.5;

location / {
  index  index.php;
}

location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9002; (You can change it to your private IP in the future)
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include        fastcgi_params;
}
}

Segunda Solicitud

server{
listen 80;
server_name php2.localhost; 

root   /home/www/php5.6;

location / {
  index  index.php;
}

location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9004; (You can change it to your private IP in the future)
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include        fastcgi_params;
}
}

Al usar la configuración anterior, puede cambiar fácilmente el resultado de la versión diferente del script PHP; además, puede usar NFS (si está en un entorno *nix) para montar el disco; en este caso, no necesitará colocar archivos. en dos carpetas manualmente.

En cuanto al método de paso Fastcgi, sugiero usar PORT en lugar de Socket.

Todos sabemos que Unix Socket tiene un mejor rendimiento debido a que el puerto TCP utiliza toda la pila de red incluso en la misma máquina.

Sin embargo, el tiempo que ahorra es muy poco; además, puede enfrentar este problema al utilizar Socket en un momento de mucho tráfico.

connect() a Unix:/var/run/php5-fpm.sock falló oapr_socket_recv: Conexión restablecida por par (104)

Además, el puerto TCP puede brindarle una forma más rápida de administrar si coloca nginx y php-fpm en servidores separados.

Estoy usando una computadora portátil pequeña para editar esta publicación, por lo que los códigos no son bonitos, pero lo intenté...

EDITADO

Recuerde modificar su /etc/hostspara que coincida con su nombre de host (nombre_servidor en nginx.conf)

Respuesta2

Para fines de prueba, quería configurar mi nginx para usar diferentes versiones de php en diferentes ubicaciones en la misma sección del servidor. Finalmente funcionó con esto:

#Folder to run some tests with the new php-7
location ~ "^\/test_php7.0.3\/.*\.php$" {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php7-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

#Folder to run some tests with a custom compiled version of php5.6
location ~ "^\/test_php5.6.18\/.*\.php$" {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php56-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

#The default php version:
location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Espero que esto ayude a alguien más :)

información relacionada