nginx を介した複数のバージョンの PHP

nginx を介した複数のバージョンの PHP

編集:今後の参考のために

私はPHP 5.5.12を使用したLEMPスタックでUbuntu 14.10を実行しています。PHP 5.3.3を必要とするレガシーWordPressサイトがいくつかあり、それと並行してPHPの比較的新しいバージョンを使用するWPサイトもいくつかあり、すべてnginxで実行されています。ローカルマシン上

仮想マシンとサンドボックスに関しては私には手が回らず、使えるのは nginx だけなので、この質問をしました。セキュリティ上の懸念があることは理解していますが、これらのサイトをローカルで実行して、最新の PHP / WP バージョンに更新するときに壊れた機能がないかテストする必要があります。

WordPressサイトに応じて、nginxで正しいバージョンのPHP(php-fpmを使用)を実行したい。別のSF の質問ですが、これを実現する 1 つの方法は、異なるバージョンの PHP を別々のポート/ソケットで実行し、それぞれのポート/ソケットを使用するように nginx サーバー ブロックを構成することです。

私は PHP 5.3.3 を手動でコンパイルして php-fpm を含めましたが、それ以上は進みませんでした。

要するに、もう少し詳しく説明してもらいたいのですこれ答え。どうすればいいのかよく分からない「php-fpm の各バージョンを異なるポート (またはソケット) で実行する」または「nginx サーバー ブロックの fastcgi_pass パラメータに適切なポートを設定します」

私のサーバーブロックの1つは、参考までに次のようになります。

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私は、との間で sym リンクされた、別々のファイル内の別々のサーバー ブロックを使用して各サイトを設定しました/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

私も信じるWordPress のため、ポートではなくソケットを使用する必要があります(fastcgi_pass unix:/var/run/php5-fpm.sock;)(ただし、あらゆる提案を歓迎します)。

答え1

さて、nginx を介して複数の PHP バージョンを実行したい場合は、構成ファイルに、異なるバージョンまたは拡張子名の PHP スクリプトを配置する特定のパスを含める必要があります。

ただし、あなたの投稿に記載されている SF の質問リンクについて説明したいと思います。

この回答は、質問者が のバックグラウンドを持っていることを前提として、confの を修正する方法を示しています。nginxnginx

に特定のポートを指定するとconf、nginx はその FastCGI チャネルを介してスクリプトを実行します。

サーバーに異なるバージョンの PHP をインストールし、 を変更したとしportますphp-fpm.conf

phpすべてのファイルをバージョンで実行し5.5.0php2ファイルを で実行することを希望します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 ファイルを保存するための 2 つの異なるフォルダーを作成し/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;
}
}

2回目の申請

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 環境の場合) を使用してディスクをマウントできるため、この場合、ファイルを 2 つのフォルダーに手動で配置する必要はありません。

Fastcgi の受け渡し方法としては、Socket ではなく PORT を使用することをお勧めします。

TCP ポートは同一マシン上でもネットワーク スタック全体を使用するため、Unix ソケットの方がパフォーマンスが優れていることは周知の事実です。

しかし、節約できる時間は非常に少なく、さらに、トラフィックの多い時間帯にソケットを使用すると、この問題に直面する可能性があります。

unix:/var/run/php5-fpm.sockへのconnect()が失敗したか、apr_socket_recv: ピアによる接続のリセット (104)

さらに、nginx と php-fpm を別々のサーバーに配置すると、TCP ポートによって管理が高速化されます。

この投稿を編集するのに小さなラップトップを使用しているため、コードはきれいではありませんが、試してみました。

編集済み

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

これが他の誰かの役に立つことを願っています :)

関連情報