Назад | Перейти на главную страницу

Несколько версий 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 file или какие-либо шаги, которые потребуются, если мне не нужно переименовывать файлы.

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

Хорошо, вы хотите запустить несколько версий 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)

В целях тестирования я хотел настроить свой 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;
}

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