Несколько версий PHP через nginx

Несколько версий PHP через nginx

РЕДАКТИРОВАТЬ:Для дальнейшего использования

Я использую Ubuntu 14.10 со стеком LEMP, использующим PHP 5.5.12. У меня есть несколько устаревших сайтов WordPress, которые требуют PHP 5.3.3, а также несколько сайтов WP, которые используют довольно новую версию PHP, все они работают на nginxна моей локальной машине.

Мои руки связаны в отношении виртуальных машин и песочниц, все, с чем я могу играть, это nginx, отсюда и этот вопрос. Я понимаю опасения людей по поводу безопасности, но мне нужно, чтобы эти сайты работали локально, чтобы я мог проверить сломанные функции, пока я обновляю их до последних версий PHP / WP.

Я хочу, чтобы nginx запускал правильную версию PHP (используя php-fpm) в зависимости от сайта WordPress. СогласнодругойВопрос SF, один из способов добиться этого — запустить разные версии PHP на отдельных портах/сокетах и ​​настроить блоки сервера nginx на использование соответствующего порта/сокета.

Я вручную скомпилировал PHP 5.3.3, включив в него php-fpm, но это все, чего я добился.

По сути, я хочу, чтобы кто-нибудь объяснил немного подробнее.этотответ. Я не совсем понимаю, как«запускать каждую версию php-fpm на другом порту (или сокете)»или«настройте соответствующий порт в параметре fastcgi_pass в блоке сервера nginx».

Один из моих серверных блоков выглядит так для справки

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;
    }
}

РЕДАКТИРОВАТЬ:

Я настроил каждый сайт, используя отдельный серверный блок в отдельном файле, символически связанном между /var/nginx/sites-available/testsite1и /var/nginx/sites-enabled/testsite1. Поэтому var/nginx/sites-availableсодержит;

 testsite1
 testsite2
 testsite3
 ...

ТакИдеальноМне было интересно, возможно ли что-то вроде того, что показано ниже (поскольку это похоже на то, как Apache может быть настроен с различными версиями PHP)

testsite1 - запуск старой версии 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...
}

testsite2 - запущена текущая версия 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...
}

Возможно ли это? Причина, по которой я спрашиваю, в том, что я бы предпочел избежать переименования всех моих phpфайлов для php2запуска (что делает контроль версий головной болью). Я не против редактирования файла nginx.confили любых других шагов, которые для этого требуются, пока мне не нужно переименовывать файлы.

Я такжеполагатьМне нужно использовать сокеты (fastcgi_pass unix:/var/run/php5-fpm.sock;)вместо портов из-за WordPress (хотя я открыт для всех предложений).

решение1

Итак, вы хотите запустить несколько версий PHP через nginx, тогда файл конфигурации должен включать конкретный путь, по которому вы размещаете свои PHP-скрипты с разными версиями или именами расширений.

Однако я хотел бы пояснить ссылку на вопрос SF, приведенную в вашем сообщении.

Этот ответ дает вам возможность изменить confваш nginx, что предполагает, что спрашивающий имеет опыт работы в nginx.

Указав определенный порт conf, nginx запустит скрипт через этот канал FastCGI.

Предположим, что вы установили на своем сервере другую версию PHP и изменили portфайл php-fpm.conf.

Вы хотите, чтобы все phpфайлы выполнялись в версии 5.5.0и php2файлы выполнялись в формате 5.6.0.

Пример конфигурации nginx следующий:

    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;
    }

В этом случае phpобрабатывается через порт 9000и php2отправляется в9001

Это всего лишь простой пример, для продвинутых пользователей вы можете создать две разные папки для хранения файлов PHP, например, /home/php55и /home/php56, а затем отредактировать файл nginx.conf.

ДЛЯ ВАШЕГО ОТРЕДАКТИРОВАННОГО ВОПРОСА

Если вы хотите попробовать добавить разные серверы для обработки скриптов в разных версиях, конечно, вы можете это сделать, поскольку nginx может быть балансировщиком нагрузки, он также может справиться с такого рода проблемами.

Первое применение

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;
}
}

Второе применение

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;
}
}

Используя приведенную выше конфигурацию, вы можете легко переключать различные версии результата PHP-скрипта, более того, вы можете использовать NFS (если вы находитесь в среде *nix) для монтирования диска, в этом случае вам не придется вручную помещать файлы в две папки.

Что касается метода передачи Fastcgi, я предлагаю использовать PORT вместо Socket.

Мы все знаем, что Unix Socket имеет более высокую производительность, поскольку порт TCP использует весь сетевой стек даже на одной машине.

Однако экономия времени очень мала, более того, вы можете столкнуться с этой проблемой при использовании Socket в периоды большого трафика,

connect() к unix:/var/run/php5-fpm.sock не удалось илиapr_socket_recv: Соединение сброшено узлом (104)

Кроме того, порт TCP может обеспечить более быстрое управление, если вы разместите nginx и php-fpm на отдельных серверах.

Я использую небольшой ноутбук для редактирования этого поста, поэтому коды не очень красивые, но я старался...

РЕДАКТИРОВАНО

Не забудьте изменить его /etc/hostsтак, чтобы он соответствовал вашему имени хоста (имя_сервера в nginx.conf).

решение2

Для тестирования я хотел настроить свой nginx на использование разных версий php в разных местах в одном и том же разделе сервера. Наконец, это сработало с этим:

#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;
}

Надеюсь, это поможет кому-то еще :)

Связанный контент