ステータス:非推奨

この記事では、サポートされなくなったバージョンのUbuntuについて説明します。 現在Ubuntu12.04を実行しているサーバーを運用している場合は、サポートされているバージョンのUbuntuにアップグレードまたは移行することを強くお勧めします。

理由: Ubuntu 12.04は2017年4月28日に保守終了(EOL)に達し、セキュリティパッチまたはアップデートを受信しなくなりました。 このガイドはもう維持されていません。

代わりに参照してください:このガイドは参照として役立つ場合がありますが、他のUbuntuリリースでは機能しない場合があります。 可能な場合は、使用しているUbuntuのバージョン用に作成されたガイドを使用することを強くお勧めします。 ページ上部の検索機能を使用して、より新しいバージョンを見つけることができます。

序章


Apacheは、驚くほど強力で有能なWebサーバーです。 初期設定をできるだけ簡単にするために、多数のモジュールがプリインストールされています。 これにより、迅速に生産性を高める必要がある場合に、新しいプロジェクトに最適です。 ただし、サイトが大きくなると、パフォーマンスの問題が発生する可能性があります。

DigitalOceanに最初に惹かれたのは、開始するための低コストでした。 最小で最も安価な液滴には512MBのRAMが搭載されていますが、これは今日の大きなフレームワークの世界ではそれほど多くはないようです。 ただし、設定を微調整するのに少し時間がかかると、このような小さなサーバーで何ができるかに驚くでしょう。

小さいサイズの液滴の1つでApacheを実行している場合、または大きい液滴でパフォーマンスを最大化したい場合は、次のことを行う必要があります。 例ではUbuntu12.04を使用しますが、ここで示している原則は、他のバージョンのLinuxにも適用できます。

不要なモジュールをアンロードする


UbuntuおよびDebianベースのシステムでは、 /etc/apache2/mods-enabled と呼ばれるフォルダ /etc/apache2/mods-available/. mods-availableフォルダーは、特定のサーバーにインストールされているすべてのモジュールのリストであり、mods-enabledは、現在アクティブなモジュールです。

私のVPSでは、デフォルトで17のモジュールがアクティブになっています。 これは多すぎて、ほとんどは私のアプリケーションには必要ありません。 残念ながら、必要なモジュールは、他のモジュールの依存関係であるため、正確に明確でない場合があります。

私が提案するのは、現在アクティブなすべてのモジュールのリストを作成し、元に戻す必要がある場合に備えて、後で参照できるように保存することです。 次に、モジュールを1つずつ無効にし、変更するたびにApacheを再起動して、エラーが発生するかどうかを確認します。

UbuntuとDebianでは、次のコマンドでモジュールを無効にします(例としてautoindexを使用)。

sudo a2dismod autoindex

特にリソースを大量に消費するモジュールで、必要がない場合は無効にする必要があります。

  • PHP
  • SSL
  • リライト
  • Perl
  • Python
  • ラック/ルビー/乗客

これらのモジュールのいくつかはデフォルトで有効になっていないため、有効にしていない可能性があり、場合によっては、実際に必要なために有効になっています。

「書き換え」に関する簡単なメモ:このモジュールは、「エイリアス」モジュールが実際に同じように機能する場合に有効になることがよくあります。 エイリアスでうまくいく場合は、書き換えを無効にします。 リライトは、より厄介なモジュールの1つですが、Apacheにいくつかの驚くべき能力を吹き込みます。

「リライト」から「エイリアス」への切り替えは高度なトピックです(役立つドキュメントがいくつかあります)。ただし、リライトを完全にオフにできない場合でも、リライトルールの一部を次のように変換できます。エイリアス、あなたは利点を得るでしょう。

モジュールを無効にしてApache設定をリロードした後、メッセージのapacheエラーログを確認できます。 UbuntuとDebianでは、/ var / log / apache2/error.logを確認してください。

次のようなエラーが発生します。

Syntax error on line 6 of /etc/apache2/sites-enabled/site1:
Invalid command 'DAVLockDB', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.

つまり、無効にしたモジュールが必要だったということです。 この場合、モジュールはdav_fsだったので、次のコマンドで再度有効にします。

sudo a2enmod dav_fs

次に、Apacheを再起動して、次のエラーを探しました。 最小リストを整理するまでに、数回の試行が必要になる場合があります。 辛抱強く、それだけの価値があります。

Apacheからコードを移動する


PHPサイトを運営している場合、有名なmod_phpを使用している可能性が高くなります。 ルビーサイトを運営している場合、簡単な解決策はPassenger Phusion、別名mod_railsまたはmod_rackです。

これに伴う問題は、その言語のインタープリターのCコードがApacheに埋め込まれているため、すべてのページビューでより多くのメモリを使用することです。 サイトで人気のあるページが30のHTTPリクエストを引き起こす場合、そのうちの1つは動的ページ用であり、他の29は画像、css、javascriptなどの静的リソース用である可能性があります。 動的コンテンツを提供しない29のリクエストに肥大化したApacheを使い切るのはなぜですか?

違いは劇的です。 mod_phpを有効にすると、Apache子プロセスごとに100MBを超えるRAM使用量を使用する可能性があります。 デフォルトでは、Apacheサーバーで25以上のプロセスが実行されている可能性があることを考慮すると、これが問題になる理由がわかります。

これを行うために使用できるツールは次のとおりです。

  • PHPは、fastcgiプロトコルを使用する別個のプロセスであるphp-fpmの恩恵を受けることができます。

  • Pythonの場合は、uWSGIまたはgnunicornを使用します(Pythonの詳細については、このすばらしい記事をDigitalOcean で確認してください)。

  • Railsの場合は、 Unicorn を使用します(Rubyの詳細については、 Unicorn をカバーするDigitalOceanに関するこの記事を参照してください)。

この変更を行うことの欠点は、最初に物事を機能させるのが難しいことです。 場合によっては、ドキュメントは非常に優れています。 その他の場合、 cough php-fpmcoughドキュメントはまばらです。

一般的に、PHP、Python、Rubyの特別なサーバープロセスが開始され、Apacheは、埋め込まれたコードを介してこれらのリクエストを処理する方法を本能的に知るのではなく、動的コンテンツの呼び出しをこのバックエンドプロセスに転送するだけです。

これがどれほどの違いを生むかに驚かれることでしょう。 仮想サーバーからmod_phpを削除した後、Apacheプロセスのサイズは90〜120MBから10MB未満になりました。 それぞれ60MBしか使用しない2つのphpバックエンドプロセスで、すべての動的コンテンツを提供することができました。

Apacheプロセスと子の数を制限する


ほとんどのオペレーティングシステムのデフォルトのApache構成は、小規模なサーバーにはあまり適していません。25以上の子プロセスが一般的です。 各Apache子プロセスが120MBのRAMを使用する場合、VPSにはApache専用に3GBが必要になります。

1人の訪問者のWebブラウザが一度に4つのアイテムをWebサイトに要求する可能性があるため、7人または8人だけが同時にページをロードしようとすると、クラウドサーバーが過負荷になる可能性があります。 これにより、Webページは、永遠のように見える状態で常にロードされた状態でハングします。

サーバーがこれらのデッドApacheプロセスをアクティブに保ち、ユーザーが諦めた後もずっとコンテンツを提供しようとすることがよくあります。これにより、ユーザーに提供できるプロセスの数が減り、使用可能なシステムRAMの量が減ります。 これは、一般に下向きスパイラルとして知られているものを引き起こし、あなたとあなたのサイトの訪問者の両方にとって悪い経験に終わります。

あなたがすべきことは、アプリケーションに必要なRAMの量を把握し、次に残りのRAMの量を把握し、そのほとんどをApacheに割り当てることです。

たとえば、動的コンテンツを処理するphp-fpmプロセスが3つあり、それぞれが最大70MBのRAMを使用でき、MySQLサーバーが最大120MBのRAMを使用する場合、合計で330MBがアプリケーションで使用されます。 これにより、Apacheに約150MBを割り当てることができます。

Apacheの実行中に、サーバーでtopコマンドを開きます。 表示される内容を少し貼り付けて、関係のないほとんどの行を削除します。

top -bn 1
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                    
[...]
15015 www-data  20   0  232m 9644 1900 S  0.0  1.6   0:00.02 apache2                    
15016 www-data  20   0  232m 9644 1900 S  0.0  1.6   0:00.01 apache2                    
15017 www-data  20   0  232m 9644 1900 S  0.0  1.6   0:00.02 apache2                    

Apache子プロセスのRES列に注目し、そのRES値をメモします。 たとえば、十分に最適化された私の仮想サーバーでは、値は9,644です。これは、10MBのRAMを使用していないことを意味します。 Apacheを最大15の子プロセスに制限すると、最大で約150MBのRAMになるはずです。

クラウドサーバーのapache設定ファイルを編集します。これはUbuntuとDebianでは次のようになります。 /etc/apache2/apache2.conf そして、mpm_prefork_module構成のセクションを見つけます。 MaxClients行を探して15に設定し、Apacheを保存して再起動します。

Ubuntuで探すものの例を次に示します。

<IfModule mpm_prefork_module>
    StartServers          3
    MinSpareServers       3
    MaxSpareServers       5
    MaxClients           30
    MaxRequestsPerChild   0
</IfModule>

そこにあるMaxClients行を参照してください? その値をより小さな数値に変更する必要があります。

VPSが過負荷になり、一度にサービスを提供できるクライアントの最大数に達すると、VPSはそれらのクライアントにサービスを提供し、他のユーザーはすぐに障害が発生します。 その後、ページをリロードして、2回目の試行でより大きな成功を収めることができます。

これは悪いことのように聞こえますが、私を信じてください。これらの接続をすばやく閉じて、サーバーを永久に開いたままにするよりも、サーバーを正常な状態のままにしておく方がはるかに優れています。 驚くべきことに、子プロセスの数は少ないが、処理できない子プロセスの数が多いサーバーよりも応答が速いサーバーのパフォーマンスを向上させることができます。

その好例として、私が管理しているWordpressサイトは、4つのphp-fpmプロセスを使用して1GBのドロップレットでホストされており、一度に950人以上の同時ユーザーにサービスを提供できます。 これは、このWebサイトが十分に人気になった場合、1日あたり約4,200万ページのビューのピーク容量に相当します。

代替MPM構成を検討する


ほとんどのApache構成は、これまで prefork mpmを使用してきました。これはスレッドセーフであるため、PHPやその他の埋め込み言語での使用に適しています。

PHPやRailsなどの外部モジュールを取り除く場合は、 workerMPMを検討できます。これは多くの場合preforkよりも高速です。

ワーカーモジュールを有効にするには、それをインストールする必要があります。

sudo apt-get install apache2-mpm-worker

次のようなメッセージが表示されます。

The following packages will be REMOVED:
  apache2-mpm-prefork libapache2-mod-php5
The following NEW packages will be installed:
  apache2-mpm-worker
0 upgraded, 1 newly installed, 2 to remove and 2 not upgraded.
Need to get 2,284 B of archives.
After this operation, 8,718 kB disk space will be freed.
Do you want to continue [Y/n]? 

Ubuntuでは、worker mpmをインストールすると、prefork mpm がアンインストールされ、mod_phpやその他の互換性のないアドオンモジュールがアンインストールされることに注意してください。

ここでは、Apacheに対して行うことができる4つの最適化について説明しました。これにより、小さな液滴がある場合でも、アプリケーションのパフォーマンスが大幅に向上します。

本番サーバーではなく、テストドロップレットでこれを試すことを強くお勧めします。 DigitalOceanのサービスの利点は、変更をテストするために必要な時間だけ新しいドロップレットをスピンアップし、完了したらシャットダウンできることです。 時間単位の課金では、VPSに最適な構成を見つけるための低リスク、低コストの方法です。