高性能NGINXおよびPHP-FPMWebサーバーの構成
PHP-FPM(Fast Process Manager) PHPスクリプトを実行するためのFastCGIの個別の実装です。 NGINX Webサーバー(静的処理)とPHP-FPMの組み合わせを使用して、LAMPスタック(NGINX、Apache、およびmod_phpモジュール)よりも高速で高性能なWebサーバーをWebサイトに構築できます。
LEMP は、通常、WebサイトのホスティングとWebアプリケーションの公開に一緒にインストールされるツールのオープンソースソフトウェアセットです。この略語は、一連のOS Linuxを表します。 、 Nginx Webサーバー(より一般的なLAMPスタックのApacheを置き換えます)、 MySQL ( MariaDB )データベースと php 動的データを処理します。
この記事では、Linux CentOS 7を実行しているサーバーで高負荷のWebプロジェクトをホストするために、LEMPスタック(NGINX + PHP-FPM + MariaDB / MySQL)をインストールして最適化する方法について説明します。
新しくインストールしたCentOSサーバーがインストールに使用されるため、人気のあるEPELリポジトリに接続し、サーバー上のすべてのパッケージを更新します。
# yum install epel-release -y
# yum update -y
最新のNginxをインストールするには バージョン、次のコマンドを実行して開発者リポジトリに接続します:
# rpm -Uvh https://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
または、リポジトリ構成ファイルを手動で作成します( /etc/yum.repos.d/nginx.repo) 。次の行をファイルに追加します。
[nginx] name=nginx repo baseurl=https://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1
CentOS 8を使用している場合は、URLのバージョンを変更してください。
yum(またはdnf)パッケージマネージャーを使用してNginx Webサーバーパッケージをインストールします:
# yum install nginx -y
次に、 nginxを実行します systemctlを使用してスタートアップに追加します:
# systemctl start nginx
# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service
Webサーバーが実行されていることを確認するには、ブラウザでサーバーのIPアドレスを開きます。
このテストページが表示されない場合は、サーバーでfirewalldで許可されているサービス、ポート、ゾーンの設定を確認してください。
別のドメインの構成ファイルを作成しますwoshub-linux.com 。サイトと構成ファイル用に別のディレクトリを作成します:
# mkdir -p /var/www/woshub-linux.com && mkdir -p /var/www/woshub-linux.com/log
構成ファイルを開きます:
# nano /etc/nginx/conf.d/woshub-linux.com.conf
そして、それに次の内容を追加します:
server { listen 80; server_name woshub-linux.com; root /var/www/woshub-linux.com; index index.php index.html index.htm; access_log /var/www/woshub-linux.com/log/access.log main; error_log /var/www/woshub-linux.com/log/error.log; location / { return 301 https://woshub-linux.com$request_uri; } location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ { return 301 https://woshub-linux.com$request_uri; } location ~ \.php$ { return 301 https://woshub-linux.com$request_uri; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { rewrite ^ /robots.txt break; allow all; log_not_found off; access_log off; } location ~ /\.ht { deny all; } } server { listen 80; server_name www.woshub-linux.com; rewrite ^ https://woshub-linux.com$request_uri? permanent; } server { listen 443 ssl http2; server_name woshub-linux.com; root /var/www/woshub-linux.com; index index.php index.html index.htm; access_log /var/www/woshub-linux.com/log/ssl-access.log main; error_log /var/www/woshub-linux.com/log/ssl-error.log; keepalive_timeout 60; ssl_certificate /etc/letsencrypt/live/woshub-linux.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/woshub-linux.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; add_header Strict-Transport-Security 'max-age=604800'; location / { try_files $uri $uri/ /index.php?$args; } location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ { access_log off; expires max; } location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param DOCUMENT_ROOT /var/www/woshub-linux.com; fastcgi_param SCRIPT_FILENAME /var/www/woshub-linux.com/$fastcgi_script_name; fastcgi_param PATH_TRANSLATED /var/www/woshub-linux.com/$fastcgi_script_name; include fastcgi_params; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param HTTPS on; fastcgi_intercept_errors on; fastcgi_ignore_client_abort off; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } location ~ /\.ht { deny all; } } server { listen 443 ssl http2; server_name www.woshub-linux.com; rewrite ^ https://woshub-linux.com$request_uri? permanent; }
多くの一般的なCMSがデフォルトで使用するため、構成ファイルには、安全なHTTPプロトコルアクセスを使用してサイトにアクセスするための設定が含まれています。後で、無料のLet’s Encrypt証明書をインストールして構成できます(Windows ServerのIISのWebサイトにLet’s Encrypt証明書をインストールしたのと同じです)。
PHP-FPMのインストール
NginxにはPHPハンドラーが組み込まれていないため、 php-fpmをインストールする必要があります PHPスクリプトを処理するためのいくつかのPHPモジュール。
PHP-fpm は簡単で高速なPHPプロセスマネージャーです。 (Apacheとは異なり)HTTPプロトコルを使用せず、特別なFastCGIプロトコルで動作します。軽くて使いやすいFPMは、PHPリクエストをより高速に処理します。同時に、apacheを使用した構成と比較して、使用するメモリが少なくなります。次に、Nginxはより効率的に静的に戻ります。この構成では、nginxはプロキシサーバー(キャッシングおよびフロントエンドサーバー)になり、php-fpmはバックエンドとして機能します。
REMIリポジトリを使用して、新しいphpバージョンをインストールします。
# rpm -ivh https://rpms.famillecollet.com/enterprise/remi-release-7.rpm
インストール後、 /etc/yum.repos.d/remi-php74.repoを編集します ファイル:
php-fpmを実行します と人気のあるphpモジュールのインストール:
# yum install php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-opcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip
php-fpmを開始します デーモンを起動してスタートアップに追加します:
# systemctl start php-fpm
# systemctl enable php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.
サービスが開始されているかどうかを確認するには、次のコマンドを実行します。
# lsof -i:9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME php-fpm 1551 root 7u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN) php-fpm 1552 apache 9u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN) php-fpm 1553 apache 9u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN) php-fpm 1554 apache 9u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN) php-fpm 1555 apache 9u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN) php-fpm 1556 apache 9u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN)
php-fpmを実行します UNIXソケットを使用します。 「listen = 127.0.0.1:9000
」という行を削除します 」/etc/php-fpm.d/www.confから そして、以下を追加します:
listen = /var/run/php-fpm/php-fpm.sock listen.mode = 0660 listen.owner = nginx listen.group = nginx
Apache以外のユーザーとしてphp-fpmを起動するには(デフォルト)、構成ファイルで次のパラメーターを指定します。
user = nginx group = nginx
php-fpm構成ファイルを変更した後、サービスを再起動します。
# systemctl restart php-fpm
完全なガイド「LinuxへのMariaDBのインストールと最適化」は以前に公開されていたため、この手順はスキップします。これを利用してください。
Webサーバーが多数のクライアント要求(トラフィックの多いWebサイト)を処理できるようにするには、 nginxを適切に構成することが重要です。 およびphp-fpm 。
Nginx構成
/etc/nginx/nginx.confを開きます 次のようにNginx構成をファイルして変更します:
-
worker_processes 2;
—ワーカープロセスの数をサーバー上のコアの数と同じに設定します。 -
worker_connections 1024;
— 1つの作業プロセスの接続数を設定します(値を1024から4096に設定します)。 -
use epoll;
—Linuxでの最適な接続方法です -
multi_accept on;
—nginxは最大数の接続を受け入れます。
httpブロック:
-
tcp_nodelay on;
—ヘッダーとファイルの先頭を1つのパッケージで送信します。 -
tcp_nopush on;
多数の静的ファイルを含むWebプロジェクトのgzip圧縮を有効にします:
gzip on;
さまざまなファイルタイプを追加して、すべてのgooglespeedチェックに合格します。
gzip_types application/atom+xml application/javascript text/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json font/ttf application/x-font-ttf application/vnd.ms-fontobject application/font-woff application/font-woff2 application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vnd.wap.wml text/vtt text/x-component text/x-cross-domain-policy;
タイムアウト設定の変更:
-
keepalive_timeout 30;
— Webサーバーは、キープアライブ接続を閉じる前に30秒間待機します。 -
keepalive_requests 100;
1つのクライアントからのキープアライブリクエストの最大数です。 -
reset_timedout_connection on;
—応答を停止したクライアントからの接続をリセットしたくない場合は、このパラメータを有効にします。 -
client_body_timeout 10;
— Webサーバーは、接続がリセットされるまで、クライアントが要求を確認するのを10秒間待機します。 -
send_timeout 2;
—クライアントがWebサーバーの応答の読み取りを停止すると、nginxは接続をリセットします。
Webサイトが大きなファイルをアップロードするように設計されていない場合は、nginxを使用して制限を設定します:
-
client_max_body_size 2m;
—サーバーは2MBを超えるリクエストを受け付けません
プロジェクトの内容が頻繁に変更されない場合は、「 expiresmax;」を使用できます。 ’キャッシュするか、必要なファイルタイプに対応するオプションをホストの構成ファイルに追加します。例:
location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ { expires 7d; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
指定したファイルタイプのキャッシュは7日間保存されます。
変更を加えた後は、nginxを再起動することを忘れないでください。
# systemctl restart nginx
Php-fpm構成
php-fpmをインストールするときは、すぐにunixソケットに切り替えました。パフォーマンスが大幅に向上します。見積もりによると、生産性は2〜3倍になります。その他のphp-fpmパラメータは、プロジェクトごとに個別に設定する必要があります。 1,024 MBのRAMを搭載したシングルコア(vCPU)サーバーの構成例を考えてみましょう。
php-fpmに約512MBを割り当て、残りをデータベースとnginxに割り当てることができます。
構成ファイルに以下を追加します/etc/php-fpm/www.conf :
-
pm.max_children = 18
子プロセスの最大数です -
pm.start_servers = 6
起動時に作成された子プロセスの数です -
pm.min_spare_servers = 4
非アクティブなサーバープロセスの最小数です -
pm.max_spare_servers = 16
非アクティブなサーバープロセスの最大数です -
pm.max_requests = 400
は子プロセスリクエストの数であり、その後プロセスが再開されます
このWebサイトに対応する記事があるため、MariaDB設定を最適化する方法については説明していません。記事に基づいてプロジェクトのmy.cnfパラメータを設定しましたが、データベースは優れたパフォーマンス結果を示しています。
ウェブサイトを実行した後、nginx + php-fpmがリクエストを処理し、apache2+mod_phpよりもはるかに高速にウェブページを返すことが肉眼でわかります。
-
UbuntuにNginxをインストールして構成する方法
Webアプリケーションは、さまざまなクライアントにサービスを提供する手段として、過去数年にわたって広く普及してきました。 Webアプリケーションを使用すると、使用しているデバイスやオペレーティングシステムに関係なく、より多くのユーザーにリーチできます。 Webサーバーをインストールして構成できることは、Web開発者とソフトウェアエンジニアの両方にとって貴重なスキルです。 Webサーバーは、インターネットまたはネットワークを介してWebコンテンツをクライアントに配信するためのプログラムです。 UbuntuにNginxWebサーバーをインストールして構成する方法を見てみましょう。 なぜNgin
-
Linuxサーバーでトラフィックの多いWebサイト用にApacheとPHPを構成する方法
LAMPスタック(Linux、Apache、MySQL、PHP)のインストール方法に関するほとんどすべてのチュートリアルでは、PHPスクリプトの処理に組み込みのApacheモジュールを使用することをお勧めします。たとえば、Ubuntuでは、sudo apt install libapache2-mod-phpなどのコマンドを使用するときにこれを有効にします。 パッケージをインストールします。これにより、Apacheはmpm_preforkを使用するようになります。訪問者がWebサイトにアクセスするたびに、その接続を処理するための新しいプロセスが起動されます。これは、トラフィックが少ないときにう