2GB RAM E6500 CPUで1日あたり10K以上のワードプレスビュー用にApacheを最適化


10

私はubuntuにapache / phpを備えた専用サーバーを1日あたり約10K以上のページビューでWordpressブログに提供しています。APCにW3TCプラグインがインストールされています。

しかし、時々サーバーが応答を停止するか、非常に遅くなり、私はそれを元に戻すためにApacheを再起動する必要があります。

私の設定は何ですか?

ServerRoot "/etc/apache2"
LockFile /var/lock/apache2/accept.lock
PidFile ${APACHE_PID_FILE}
TimeOut 40
KeepAlive on
MaxKeepAliveRequests 200
KeepAliveTimeout 2
<IfModule mpm_prefork_module>
  StartServers 5
  MinSpareServers 5
  MaxSpareServers 8
  ServerLimit        80
  MaxClients         80
  MaxRequestsPerChild 1000
</IfModule>
<IfModule mpm_worker_module>
  StartServers       3
  MinSpareServers    3
  MaxSpareServers    3
  ServerLimit        80
  MaxClients         80
  MaxRequestsPerChild  1000
</IfModule>
<IfModule mpm_event_module>
  StartServers       3
  MinSpareServers    3
  MaxSpareServers    3
  ServerLimit        80
  MaxClients         80
  MaxRequestsPerChild  1000
</IfModule>
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
AccessFileName .htaccess
<Files ~ "^\.ht">
  Order allow,deny
  Deny from all
  Satisfy all
</Files>
DefaultType text/plain
HostnameLookups Off
ErrorLog /var/log/apache2/error.log
LogLevel error
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
Include /etc/apache2/httpd.conf
Include /etc/apache2/ports.conf
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined
Include /etc/apache2/conf.d/
Include /etc/apache2/sites-enabled/

回答:


23

WordPressのパフォーマンスとキャッシュスタック

これは、低から中範囲の単一サーバーまたはVPSに最適なWordPressパフォーマンススタックです。私はミッドレンジを約1Gのメモリとかなり高速なドライブを備えたシングルコアとして分類しています。

あなたのボックスでは、これは1時間あたり10K以上のページビューを提供できます。

サーバースタック

  • Linux-Debian LennyまたはUbuntu
  • Nginx-リバースプロキシの静的ファイルキャッシュとして構成
  • Apache-ApacheはNginxによってオフロードされたPHPを代替ポートで処理します
  • MySql-WPで必要、最新の安定バージョンを実行していることを確認してください
  • PHP-5.2または5.3ブランチの最新の安定バージョン

PHPキャッシュ

  • APC-mmapメモリーと少なくとも128Mのshmサイズで構成します

WordPressパフォーマンスプラグインスタック

  • Nginxプロキシキャッシュインテグレーター
  • W3合計キャッシュ -ページキャッシュを拡張ディスクに設定し、ディスクに縮小し、オブジェクトとデータベースをAPCに設定します。
  • セルフホストCDN-静的ファイルを提供するためだけに設定されたサーバー上のドメインを指す4つのcnameエイリアスを作成します

Nginxは静的ファイルを非常に高速に提供するため、W3 Total Cacheでは、ページキャッシュとミニファイにディスクを使用しています。

静的ファイルを提供し、PHPをApacheに渡すようにNginxを構成する方法

Apacheを単独で使用する場合の問題は、接続が開かれ、静的ファイルであってもすべての要求でphpにヒットすることです。これは、Apacheが接続を開いたままにし、大量のトラフィックがある場合、使用されていなくても接続が停止するため、接続を無駄にします。

デフォルトでは、ApacheはデフォルトのWebポートであるポート80で要求を待機します。最初に、Apache confファイルと仮想ホストファイルを変更して、ポート8080でリッスンします。

Apache設定

httpd.conf

KeepAliveをオフに設定します

ports.conf

NameVirtualHost *:8080
Listen 8080

サイトごとの仮想ホスト

<VirtualHost 127.0.0.1:8080>
     ServerAdmin info@yoursite.com
     ServerName yoursite.com
     ServerAlias www.yoursite.com
     DocumentRoot /srv/www/yoursite.com/public_html/
     ErrorLog /srv/www/yoursite.com/logs/error.log
     CustomLog /srv/www/yoursite.com/logs/access.log combined
</VirtualHost>

ログに訪問者の実際のIPアドレスが含まれるように、mod_rpafもインストールする必要があります。そうでない場合、ログには元のIPアドレスとして127.0.0.1が含まれます。

Nginx設定

Debianでは、リポジトリを使用してインストールできますが、リポジトリにはバージョン0.6.33しか含まれていません。新しいバージョンをインストールするには、lenny backportsパッケージを追加する必要があります

$ nano /etc/apt/sources.list

この行をファイルに追加します deb http://www.backports.org/debian lenny-backports main

$ nano /etc/apt/preferences

以下をファイルに追加します。

Package: nginx
Pin: release a=lenny-backports 
Pin-Priority: 999

次のコマンドを発行して、backports.orgからキーをインポートし、パッケージを確認してシステムのパッケージデータベースを更新します。

$ wget -O - http://backports.org/debian/archive.key | apt-key add -
$ apt-get update

apt-getでインストールします

apt-get install nginx

これは、ソースからコンパイルするよりもはるかに簡単です。

Nginx confとサーバーファイルの構成

nginx.conf

user www-data;
worker_processes  4;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    access_log  /var/log/nginx/access.log;
    client_body_temp_path /var/lib/nginx/body 1 2;
    gzip_buffers 32 8k;
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;

  gzip_comp_level   6;
  gzip_http_version 1.0;
  gzip_min_length   0;
  gzip_types        text/html text/css image/x-icon
        application/x-javascript application/javascript text/javascript application/atom+xml application/xml ;



    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

次に、Nginx仮想ホスティングを設定する必要があります。私は、sites-availableディレクトリ内のファイルにリンクされた各v host symで、sites-enabledメソッドを使用したい

$ mkdir /etc/nginx/sites-available  
$ mkdir /etc/nginx/sites-enabled
$ touch /etc/nginx/sites-available/yourservername.conf
$ touch /etc/nginx/sites-available/default.conf
$ ln -s  /etc/nginx/sites-available /etc/nginx/sites-enabled
$ nano /etc/nginx/sites-enabled/default.conf

default.conf

注意:

次のファイルの静的キャッシュ設定は、Nginxプロキシキャッシュインテグレータープラグインが有効になっている場合にのみ機能します。

proxy_cache_path  /var/lib/nginx/cache  levels=1:2   keys_zone=staticfilecache:180m  max_size=500m;
proxy_temp_path /var/lib/nginx/proxy;
proxy_connect_timeout 30;
proxy_read_timeout 120;
proxy_send_timeout 120;

#IMPORTANT - this sets the basic cache key that's used in the static file cache.
proxy_cache_key "$scheme://$host$request_uri";

upstream wordpressapache {
        #The upstream apache server. You can have many of these and weight them accordingly,
        #allowing nginx to function as a caching load balancer 
        server 127.0.0.1:8080 weight=1 fail_timeout=120s;
}

WordPressサイトごとの設定(マルチサイトの場合、必要な仮想ホストは1つだけです)

server {
        #Only cache 200 responses, and for a default of 20 minutes.
        proxy_cache_valid 200 20m;

        #Listen to your public IP
        listen 80;

        #Probably not needed, as the proxy will pass back the host in "proxy_set_header"
        server_name www.yoursite.com yoursite.com;
        access_log /var/log/nginx/yoursite.proxied.log;  

        # "combined" matches apache's concept of "combined". Neat.
        access_log  /var/log/apache2/nginx-access.log combined;
        # Set the real IP.
        proxy_set_header X-Real-IP  $remote_addr;

        # Set the hostname
        proxy_set_header Host $host;

        #Set the forwarded-for header.
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location / {
                        # If logged in, don't cache.
                        if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
                                set $do_not_cache 1;
                        }
                        proxy_cache_key "$scheme://$host$request_uri $do_not_cache";
                        proxy_cache staticfilecache;
                        proxy_pass http://wordpressapache;
        }

        location ~* wp\-.*\.php|wp\-admin {
                        # Don't static file cache admin-looking things.
                        proxy_pass http://wordpressapache;
        }

        location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
                        # Cache static-looking files for 120 minutes, setting a 10 day expiry time in the HTTP header,
                        # whether logged in or not (may be too heavy-handed).
                        proxy_cache_valid 200 120m;
                        expires 864000;
                        proxy_pass http://wordpressapache;
                        proxy_cache staticfilecache;
        }

        location ~* \/[^\/]+\/(feed|\.xml)\/? {
 # Cache RSS looking feeds for 45 minutes unless logged in.
                        if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
                                set $do_not_cache 1;
                        }
                        proxy_cache_key "$scheme://$host$request_uri $do_not_cache";
                        proxy_cache_valid 200 45m;
                        proxy_cache staticfilecache;
                        proxy_pass http://wordpressapache;
        }

        location = /50x.html {
                root   /var/www/nginx-default;
        }

        # No access to .htaccess files.
        location ~ /\.ht {
                deny  all;
        }

        }

自己ホスト型CDN設定

自己ホスト型CDN confの場合、プロキシパスなしで静的ファイルを提供するように設定するだけです

server {

        proxy_cache_valid 200 20m;
        listen 80;
        server_name yourcdndomain.com;
        access_log   /srv/www/yourcdndomain.com/logs/access.log;
        root   /srv/www/yourcdndomain.com/public_html/;

 proxy_set_header X-Real-IP  $remote_addr;

      location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
                                # Cache static-looking files for 120 minutes, setting a 10 day expiry time in the HTTP header,
                                # whether logged in or not (may be too heavy-handed).

                                proxy_cache_valid 200 120m;
                        expires 7776000;
                        proxy_cache staticfilecache;
                }

location = /50x.html {
                root   /var/www/nginx-default;
        }

 # No access to .htaccess files.
        location ~ /\.ht {
          deny  all;
        }

    }

サーバーを起動します

$ /etc/init.d/apache2 restart  
$/etc/init.d/nginx start

ベンチマーク結果

Apache Benchでは、この設定は理論的には1秒あたり1833.56リクエストを処理できます

$ ab -n 1000 -c 20 http://yoursite.com/

代替テキスト


nginxが静的ファイルを処理し、apacheがphpファイルを処理することについて言及しましたが、静的ファイルブロックには「proxy_pass wordpressapache ;」があります。これは、Apacheが静的ファイルを処理しているという意味ではありませんか?
srchulo

0

これは標準のApache構成のように見えますが、HTMLのように見えるために一部が削除されているようです。

サーバーの応答が遅いときに何が起こっているのかを調査する必要があります。あなたはあなたのサーバーの仕様を言っていませんが、あなたはその専用であり、1日あたり10000kは簡単に処理されるはずだと述べています。

  • トップには何が表示されますか?
  • ボトルネックはどこですか?CPU、メモリ、I / O待機?
  • Apacheプロセスはいくつ実行されていますか?
  • netstatに表示される接続の数は?

おそらく、CPUはおそらくPHPが原因のボトルネックです。APCとWPキャッシングプラグインを使用することで、これを軽減することができます。「Prefork」の代わりにApacheの「MPM」プロセスモデルを試すこともできます。APCに十分なメモリが割り当てられていることを確認して、APCがPHPスクリプトをキャッシュし、「ミス」しないようにします。

MySQLである可能性もあります-それがCPUまたはディスクを使い果たしているかどうかを確認してください。

mod_deflateを有効にしている場合は、オフにすることを検討してください。ロード時間は短縮されますが、CPUの負荷が増加する可能性があります。試してみる価値があるかもしれません。

「siege」や「ab」などのツールを使用してサーバーのベンチマークを行い、サーバーの速度が低下する時点を特定します。

これが、Webサーバーのパフォーマンス調整に関する私のブックマークの一部です。http//articles.slicehost.com/2010/5/19/configuring-the-apache-mpm-on-ubuntu

http://www.thebuzzmedia.com/increase-wordpress-performance-on-apache-with-worker-mpm-php-and-mod_fcgid/

http://www.devside.net/articles/apache-performance-tuning

http://www.brandonturner.net/blog/2009/07/fastcgi_with_php_opcode_cache/

しかし、私の最初のアドバイスは同じままです-ボトルネックが最初に何であるかを見つけてください!それ以外の場合は、盲目的にパフォーマンスを改善しようとしています(確かに、パフォーマンスの改善は常に良いことです)。


0

また、server-statusモジュールを有効にして、そこにアクセスし、何が起こっているかを確認してください。

交換している可能性があります。これが起こっている間にvmstatをチェックアウトしましたか?80台のMaxClientの2 GBのRAMは、それぞれ25 MBです(ボックスが他に何も実行していない場合)。MaxClientsが高すぎる可能性があります。これに対する解決策は明らかです。RAMを追加するか、MaxClientsを低くします。Apacheを再起動したときにコマンドラインの応答が遅い場合、それはこの状況の1つの兆候です。

また、一部のモバイルクライアント(または低速接続の他のクライアント)に「大きな」ファイルをスプーンで送り、それにより、利用可能なすべてのApacheスロットを消費する可能性もあります。MaxClientsが少なすぎるかもしれません。server-statusを確認すると、それらのクライアントのそれぞれがその時点で何をしているかがわかります。この状況の1つの解決策は、MaxClientsを増やすことです(ただし、上記の状況になる可能性もあります)。これに対するより良い解決策は、Apacheの前にHTTPアクセラレータをインストールすることです(1つの無料オプションはperlbalです)。コマンドラインが通常の場合Apacheを再起動するときの速度は、この状況の1つの兆候です。


0

mod_statusを使用すると、複数のApacheインスタンスの内部で何が起こっているかを確認できますが、パフォーマンスが実際に低下することに注意してください。それはメモリを消費するようで、1つのケースでは、何も直接提供されないリバースプロキシのみの設定で単一プロセスのロックアップの原因であるかどうかを診断できませんでした。もちろん、これらは「ページをロードするのに永遠にかかる」とユーザーから報告されています。彼らは通常、数秒(<10)秒後にブラウザでStopを押すので、「待機するのにさらに10秒かかった」と「終了しない」の違いを理解していません。

また、正しい場所を構成しているかどうかを確認します(インスタンス/プロセスの数が表示されるため、mod_statusを使用すると簡単に確認できます)。少なくともubuntuでのストック構成には、MPMモードごとにifdefされたセクションがあり、プリフォークを実行しているときにワーカーモードを編集するのは簡単です(PHPはスレッドセーフではないというあいまいな感覚から、従来の知識から示唆されています)。

何よりもまず、rootとして実行し、最大限に活用されたリソースを監視します。メモリ、ディスク、CPU-表示されます。

もう1つ:mod_deflateを非アクティブ化するという考えは、設定が誤ったContent-Length情報のエラーになりがちではないものの、ブラウザがデータを「永久に」待機して「応答しない」という「非常に遅い」というレポートを提供することはありませんが、良いかもしれません。

ところで:1日あたり10Kの配信ページとこのマシンのメディアファイルは、すべてが1時間以内にアクセスする場合にのみ問題になります。


0

特に多くのメディアファイルをホストする場合のアドバイス:

  • メディアを専用のApache(またはそれ以上:nginx)インスタンスに移動します。PHPなし、モジュールなし、メディアを可能な限り高速で配信する裸のhttpサーバーのみ。
  • キャッシュ、キャッシュ、キャッシュ!ワードプレスでスーパーキャッシュプラグインを使用します。それは非常に役立ちます。
  • ヘッダーのApache設定を確認してください。画像およびその他の「安定した」メディアの有効期限が遠い日付に設定されていること、およびクライアントから要求されたときにApacheがHTTP 304コードを返すことを確認します
  • mod_deflateを有効にします。クライアントのパフォーマンスが低下する可能性がありますが、より速く提供されます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.