web-dev-qa-db-ja.com

PHPからnginxまでの複数のバージョン

EDIT:将来の参照用

PHP 5.5.12を使用して、LEMPスタックでUbuntu 14.10を実行しています。レガシーWordPressを必要とするサイトPHP 5.3.3いくつかのWPかなり最近のバージョンのPHPを使用するサイト、すべてローカルマシンのnginxで実行されているサイト

私の手は仮想マシンとサンドボックスに縛られています。私が操作できるのはnginxだけなので、この質問です。私は人々のセキュリティ上の懸念を理解していますが、これらのサイトをローカルで実行する必要があります。最新のPHP/WP。

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

PHP 5.3.3を手動でコンパイルしてphp-fpmをインクルードしましたが、これは私が入手した中で最も遠いものです。

効果的には、誰かにもう少し詳しく説明してほしい this 答え。 「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/var/nginx/sites-enabled/testsite1の間でsymリンクされた個別のファイルの個別のサーバーブロックを使用して、各サイトを設定しました。したがって、var/nginx/sites-availableには、

 testsite1
 testsite2
 testsite3
 ...

ideally以下のようなものが可能かどうか疑問に思っていました(これは、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;)を使用する必要があります(ただし、すべての提案を受け入れています)。

4
myol

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

しかし、私はあなたの投稿で与えられたSF質問リンクについて説明したいと思います。

その答えは、confnginxを変更する方法を提供しています。これは、質問者がnginxのバックグラウンドを持っていると想定しています。

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

サーバーに別のPHP=バージョンをインストールし、php-fpm.confportを変更したとします。

すべての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を介して処理され、php29001に移動します

これは簡単な例です。高度な場合は、2つの異なるフォルダー(たとえば、/home/php55/home/php56)をphpファイルを保存してから、nginx.confを編集できます。

あなたの編集した質問について

異なるバージョンのスクリプトを処理するために異なるサーバーを追加したい場合は、nginxがロードバランサーになる可能性があるので、それを実行できることを確認してください。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スクリプトの別のバージョンの結果を簡単に切り替えることができます。さらに、(* nix環境の場合)NFSを使用して、このディスクをマウントすることができます。場合、ファイルを2つのフォルダーに手動で配置する必要はありません。

Fastcgiの受け渡し方法については、Socketの代わりにPORTを使用することをお勧めします。

TCP=ポートが同じマシン上でもネットワークスタック全体を使用するため、Unix Socketの方がパフォーマンスが優れています。

ただし、節約する時間はごくわずかであり、さらに、トラフィックの多い時間にソケットを使用すると、この問題に直面する可能性があります。

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

さらに、TCPポートを使用すると、nginxとphp-fpmを別々のサーバーに配置した場合に、より迅速に管理できます。

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

[〜#〜]編集済み[〜#〜]

ホスト名と一致するように/etc/hostsを変更することを忘れないでください(nginx.confのserver_name)

11
Mark

テストの目的で、同じサーバーセクションの異なる場所で異なる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;
}

これが他の誰かを助けることを願っています:)

5
juanra