サーバが死んだので設定変えてみた

By | 2014年2月25日

昨日ママンサーバが死んだ。

昨日のポスト
いまさらgrepが10倍高速化したのはなぜか
が、思いのほうか人気が出てしまったようで、サーバの処理能力を超える負荷がかかったのが原因だ。まさかgrepの話でこんなに盛り上がるとは思っていなかった。はてなホッテントリに載ったあたりからアクセスが急増したようだ。

なので、ググって調べながら緊急対応を行った。以下にやったことを書こうと思う。

ここサイトは、DTIのVPSコース(一番安いやつ)+nginx+Wordpressで運用している。サーバの運用も慣れてないし、nginxを使うのも初めてなので、とにかくググりながら手探りで運用している。最初の設定はここに書いてあるとおり。

プロキシキャッシュの設定

これは昨日の夜にやった。

旧設定では、アクセスがあるたびにphpが実行されることになっているので効率が悪い。nginxにリバースプロキシを設定することで、よく最近参照されたコンテンツはphpを実行しなくてもキャッシュされているようにすることができる。

これについてはこのサイトが参考になった:
Nginx + WordPress proxy cache篇

詳しい仕組み等は上記リンクにかかれているので、省略して、設定ファイルだけさらしておく。(セキュリティの関係上一部編集してある)

/etc/nginx/nginx.convの一部:


http {
    include       /etc/nginx/mime.types;

    access_log	/var/log/nginx/access.log;

    sendfile        on;
    keepalive_timeout  65;
    tcp_nodelay        on;

    proxy_cache_path /var/cache/nginx/cache levels=1 keys_zone=zone:128m inactive=7d max_size=2g;
    limit_req_zone $binary_remote_addr zone=api:1m rate=1r/s;
    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

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

ここでproxy_cache_pathで、キャッシュのディレクトリを指定している。もちろん、このディレクトリは作っておかないといけない。そして、limit_req_zoneで同一IPアドレスからの連続アクセス制限をしている。

/etc/nginx/sites-enabled/mysettingsの一部:


upstream backend {
    server 127.0.0.1:8000;
}

server {
    listen 80;
    listen   [::]:80 default ipv6only=on;

    server_name  hamukazu.com;
    access_log  /var/log/nginx/front.access.log;
    error_log  /var/log/nginx/front.error.log;
    location /  {
        proxy_pass http://backend;
        proxy_cache zone;
        proxy_cache_key $scheme$proxy_host$uri$is_args$args;
        proxy_cache_valid  200 1d;
    }
    location /wp-admin {
        proxy_pass http://backend;
    }
    location /wp-login.php {
        proxy_pass http://backend;
    }
}
 
server {
    listen 8000;

    access_log  /var/log/nginx/hamukazu.access.log;
    error_log  /var/log/nginx/hamukazu.error.log;
    root  /var/www/wp;
    location /  {
        index index.php;
        if (-f $request_filename) {
            expires 30d;
            break;
        }
        if (!-e $request_filename) {
            rewrite ^.*(/wp-.*) $1 last;
            rewrite ^(.*) /index.php?q=1 last;
        }
    }
    location ~ \.css {
        add_header  Content-Type    text/css;
    }
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;
    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass_header "X-Accel-Redirect";
        fastcgi_pass_header "X-Accel-Expires";
    }
}

ここでは、80番ポートにきたリクエストをキャッシュして、8000番ポートに投げている。/wp-adminと/wp-login.phpだけは例外で、キャッシュしない設定になってる。(そうしないとクッキーの不正でログインできない)

CDNの設定

今朝、このサイトを教えてもらい、CloudFlareという無料で使えるCDNがあるというので、早速登録してみた。

おかげでちょっと寝不足。すべては太陽のせいだ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です