この記事では、Apache+PHPを実行しているサーバーをプロセスを中断せずにNginx+PHP-fpmに移行した方法を説明します。
シナリオ
[イントロをスキップ]
2020年、パンデミックの最初の数日間、次の検疫に備えて会議が開かれました。計画は、現在の学生全員を完全な遠隔教育に移行し続けることでした。何人の生徒を追加で期待すべきか尋ねたところ、彼らはダブルについて話しました。次に、私の提案は、ハードウェアリソース(RAMおよびCPUコア)を複製することでした。理由は次のとおりです。
- 幸いなことに、ハードウェアリソースの観点から、この種の成長に十分な余地があります。
- 検疫はわずか2週間、最大で1か月で終了します。その後、生徒はプレゼンテーションに戻り、私はそれらの追加のリソースを取り戻します。
最初の検疫の最初の2週間で、ハードウェアリソースをどんどん増やす必要があり(ただし、それらを複製することはできませんでした)、そのソリューションでは不十分であることがわかりました。最初の1か月後、毎日試験が近づき、covid19の危機が夏まで続くと脅迫されたため、私は本物のを考えなければなりませんでした。 解決。また、このソリューションはダウンタイムを最小限に抑えて実行する必要があります …すでに十分な数のmoodleクラッシュがありました。
繰り返しになりますが、幸運なことに、RAMとCPUコアの数Gbsがまだ利用可能です。本番環境の1つのMoodleのコピーを使用して、小さな新しいVM(1コアと1 GBのRAM)をセットアップし、動作するまでテストしました。それを行う設定を取得したら、ダウンタイムなしで変更を加えることができます。最後の変更は、Apacheのシャットダウンとnginxの開始です
インストール
Nginx
FreeBSDでの私の以前の投稿のいくつかを読んだ場合、私はバイナリパッケージよりもポートを好むので、nginxrunをインストールするには:
# cd /usr/ports/www/nginx
# make install clean

PHP-fpm
Apache内でphpコードを実行するデフォルトの方法は、mod_phpモジュールを有効にすることです。 PHP用のnginxロード可能モジュールは(少なくとも私が知っている限り)ないため、fastCGIProcessManagerを有効にする必要があります。デフォルトのオプションを使用してPHPをインストールした場合は、おそらくすでにそれを持っていますが、再確認してください:
[/usr/ports/www/nginx]# cd ../../lang/php74
[/usr/ports/lang/php74]# make config

FPMが選択されていない場合は、FPMを選択して、次のコマンドを実行します。
[/usr/ports/lang/php74]# make install clean
構成
PHP-Fpm
ファイル/usr/local/etc/php-fpm.d/www.confが存在しない場合は、www.conf.defaultをコピーして作成し、編集します。
[/usr/ports/lang/php74]# cd /usr/local/etc/php-fpm.d/
[/usr/local/etc/php-fpm.d/]# cp www.conf.default www.conf
[/usr/local/etc/php-fpm.d/]# ee www.conf
関連するオプションまで下にスクロールします:
user/group
:apacheと同じユーザーとグループである必要があります。wwwforme。listen
:ローカルでのみphpを提供しているため、unixソケットを使用しています:/var/run/php-fpm.sock
;-
pm
:dynamic
は問題ありませんが、このパラメータを微調整して調整する必要がある場合があります。ファイル内のコメントを見てください。
最後に、php-fpmを有効にして起動しましょう:
[/usr/local/etc/php-fpm.d/] /usr/local/etc/rc.d/php-fpm enable
[/usr/local/etc/php-fpm.d/] /usr/local/etc/rc.d/php-fpm start
Nginx
nginx.confファイルは、apacheのhttpd.confと同じ大きさ(または同じ数の部分に分割)である可能性があります。特に、複数のVirtualHostがある場合、関連するオプションは次のとおりです(少なくとも私にとっては):
user
:apacheプロセスと同じユーザー(例:www。 ) -
worker_process
:これはCPUコアの数と一致する必要があります -
client_max_body_size
:post_max_size
の値と一致する必要があります およびupload_max_size
php.iniで。 root
:DocumentRoot
に等しい Apache httpd.confのVirtualHostから、つまり/ usr / local / www /- 次のセクションを追加して、phpコードをphp-fpmサービスに送信する方法をnginxに指示します。
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 120;
fastcgi_send_timeout 120;
}
nginx.confサンプルファイルの他のオプションは、ほとんど自明です。もちろん、微調整できることは他にもたくさんありますが、これで魔法がかかります。
最後に、nginxを有効にし、apacheを停止し、nginxを開始します(この順序で、またはnginxはhttp / httpsポートでリッスンできます):
# /usr/local/etc/rc.d/nginx enable
# /usr/local/etc/rc.d/apache24 stop
# /usr/local/etc/rc.d/nginx start
問題が発生した場合
まだapacheを無効にしていないことに注意してください。何か問題が発生した場合は、nginxを停止し、apache24を起動して、すでに正常に機能していることがわかっていることを確認してください。
# /usr/local/etc/rc.d/apache24 stop ; /usr/local/etc/rc.d/nginx start
すべてが期待どおりに機能していることを確認したら、apacheを無効にできます。