nginx를 통한 여러 버전의 PHP

nginx를 통한 여러 버전의 PHP

편집하다:나중에 참고할 수 있도록

저는 PHP 5.5.12를 사용하여 LEMP 스택과 함께 Ubuntu 14.10을 실행하고 있습니다. 나는 꽤 최신 버전의 PHP를 사용하는 일부 WP 사이트와 함께 PHP 5.3.3이 필요한 여러 레거시 WordPress 사이트를 보유하고 있으며 모두 nginx에서 실행됩니다.내 로컬 컴퓨터에서.

내 손은 가상 머신과 샌드박스에 묶여 있고, 내가 사용할 수 있는 것은 nginx뿐입니다. 따라서 이 질문입니다. 나는 사람들의 보안 문제를 이해하지만 최신 PHP/WP 버전으로 업데이트할 때 손상된 기능을 테스트할 수 있도록 이러한 사이트를 로컬에서 실행해야 합니다.

WordPress 사이트에 따라 nginx가 올바른 버전의 PHP(php-fpm 사용)를 실행하도록 하고 싶습니다. 에 따르면또 다른SF 질문, 이를 달성하는 한 가지 방법은 별도의 포트/소켓에서 다양한 PHP 버전을 실행하고 해당 포트/소켓을 사용하도록 nginx 서버 블록을 구성하는 것입니다.

나는 php-fpm을 포함하기 위해 PHP 5.3.3을 수동으로 컴파일했지만 이것이 내가 얻은 것 중 가장 먼 것입니다.

사실 누가 좀 더 자세히 설명해줬으면 좋겠어이것답변. 어떻게 해야 할지 잘 모르겠어요"다른 포트(또는 소켓)에서 php-fpm의 각 버전을 실행합니다."또는"nginx 서버 블록의 fastcgi_pass 매개변수에 적절한 포트를 구성하십시오".

내 서버 블록 중 하나는 참고용으로 다음과 같습니다.

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
 ...

그래서이상적으로는아래와 같은 것이 가능한지 궁금합니다. (이는 다른 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파일 이름을 바꿀 필요가 없는 한 파일을 편집하거나 어떤 단계를 거쳐도 괜찮습니다 .

나도믿다WordPress로 인해 포트를 통해 소켓을 사용해야 합니다 (fastcgi_pass unix:/var/run/php5-fpm.sock;)(모든 제안을 수용하지만).

답변1

좋아요, nginx를 통해 여러 PHP 버전을 실행하려면 구성 파일에 PHP 스크립트를 다른 버전 또는 확장 이름에 넣는 특정 경로가 포함되어야 합니다.

하지만 귀하의 게시물에 제공된 SF 질문 링크에 대해 설명하고 싶습니다.

그 대답은 질문자가 에 대한 배경 지식이 있다고 가정하여 conf을 수정하는 방법을 제공합니다 .nginxnginx

에 특정 포트를 제공함으로써 confnginx는 해당 FastCGI 채널을 통해 스크립트가 실행되도록 합니다.

port서버 에 다른 PHP 버전을 설치하고 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 전달 방법은 Socket 대신 PORT를 사용하는 것이 좋습니다.

우리 모두는 TCP 포트가 동일한 시스템에서도 전체 네트워크 스택을 사용하기 때문에 Unix 소켓이 더 나은 성능을 가지고 있다는 것을 알고 있습니다.

그러나 절약되는 시간은 매우 적으며, 트래픽이 많은 시간에 Socket을 사용할 때 이러한 문제가 발생할 수 있습니다.

unix:/var/run/php5-fpm.sock에 대한 연결() 실패 또는apr_socket_recv: 피어에 의한 연결 재설정(104)

또한 TCP 포트를 사용하면 nginx와 php-fpm을 별도의 서버에 배치하면 더 빠른 관리 방법을 제공할 수 있습니다.

이 글을 편집하려고 작은 노트북을 사용하고 있어서 코드가 예쁘지는 않지만 시도해 보았습니다....

편집됨

/etc/hosts호스트 이름( 의 server_name nginx.conf) 과 일치하도록 수정해야 합니다 .

답변2

테스트 목적으로 동일한 서버 섹션의 다른 위치에서 다른 PHP 버전을 사용하도록 nginx를 구성하고 싶었습니다. 마지막으로 다음과 같이 작동했습니다.

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

이것이 다른 누군가에게 도움이 되기를 바랍니다 :)

관련 정보