編集:今後の参考のために
私は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
の を修正する方法を示しています。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 ファイルを保存するための 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;
}
これが他の誰かの役に立つことを願っています :)