さくらのVPS+WordPress+PHP+Nginxのまとめ2(実設定)

さくらのVPS+WordPress+PHP+Nginxのまとめに書いた通りに、ちょっと長いけどサーバを設定する手順をメモしておく。

ご参考まで。

目次

  • VPSの基本設定
  • Nginxの導入と設定
  • マルチドメイン&リバースプロクシの設定
  • NginxのログをLogwatchの対象にする
  • MySQL、PHP、PhpMyAdminの設定
  • eAcceleratorの導入

■VPSの基本設定

下記の記事通り。 基本に忠実に。

VPSでOSを再インストールしたので丁寧にメモ

■Nginxの導入と設定

※PageSpeedを組み込みたい場合は、Nginxの導入は前の記事を参照してください。

リバースプロクシ用にCachePurgeを組み込むので、Nginxはソースからビルドする。 まずライブラリ。

$ sudo yum install gcc-c++ pcre-dev pcre-devel zlib-devel make unzip

CachePurgeはダウンロードページで最新のバージョン番号を確認して、下記の赤字と置き換える。

$ cd
$ NCP_VERSION=2.3
$ wget //labs.frickle.com/files/ngx_cache_purge-${NCP_VERSION}.tar.gz
$ tar -xvzf ngx_cache_purge-${NCP_VERSION}.tar.gz

Nginxも公式サイトダウンロードページで最新バージョンを確認して、下記の赤字と置き換える。

$ NGINX_VERSION=1.6.2
$ wget //nginx.org/download/nginx-${NGINX_VERSION}.tar.gz
$ tar -xvzf nginx-${NGINX_VERSION}.tar.gz

ビルドしてインストール。

$ cd nginx-${NGINX_VERSION}/
$ ./configure --add-module=$HOME/ngx_cache_purge-${NCP_VERSION} --with-ipv6 --with-http_gzip_static_module --with-http_gunzip_module --with-http_spdy_module --with-http_stub_status_module
$ make
$ sudo make install

Nginxの設定。

$ sudo vim /usr/local/nginx/conf/nginx.conf

ココを参考にちょっと手を入れた設定はこれ。 赤字の所はそれぞれで変える&変えても良いところ。 upstreamセクションが、リバースプロクシの肝。

user  nginx;
worker_processes 2;
worker_cpu_affinity 01 10;
worker_rlimit_nofile 4096;
pid         /var/run/nginx.pid;

events {
    multi_accept off;
    worker_connections  1024;
    use epoll;
}

http {
    include       /usr/local/nginx/conf/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    log_format  backend '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent"';

    access_log  /var/log/nginx/access.log  main;
    error_log /var/log/nginx/error.log;
    server_tokens     off;
    server_name_in_redirect off;
    port_in_redirect  off;

    client_max_body_size    16m;
    client_body_buffer_size 256k;
    sendfile        on;

    keepalive_timeout  5;

    gzip_static       on;
    gzip              on;
    gzip_http_version 1.0;
    gzip_vary         on;
    gzip_comp_level   6;
    gzip_types        text/plain text/xml text/css text/javascript
                      application/xhtml+xml application/xml
                      application/rss+xml application/atom_xml
                      application/javascript application/x-javascript
                      application/x-httpd-php;
    gzip_disable      "MSIE [1-6]\.";

    proxy_cache_path  /var/cache/nginx levels=1:2
                      keys_zone=one:4m max_size=50m inactive=120m;
    proxy_temp_path   /var/tmp/nginx;
    proxy_cache_key   "$scheme://$host$request_uri";
    proxy_set_header  Host               $http_host;
    proxy_set_header  X-Real-IP          $remote_addr;
    proxy_set_header  X-Forwarded-Host   $http_host;
    proxy_set_header  X-Forwarded-Server $host;
    proxy_set_header  X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto $scheme;
    proxy_set_header  Accept-Encoding    "";
    proxy_connect_timeout 5;
    proxy_send_timeout 10;
    proxy_read_timeout 120;
    proxy_hide_header X-Pingback;
    proxy_hide_header X-Powered-By;
    proxy_hide_header Etag;
    proxy_hide_header Vary;
    proxy_cache_use_stale timeout invalid_header http_500 http_502 http_503 http_504;
    proxy_cache_lock on;
    proxy_cache_lock_timeout 5s;

    upstream backend {
        server unix:/var/run/nginx-backend.sock;
    }
    upstream phpfpm {
        server unix:/var/run/php-fpm.sock;
    }

    include /usr/local/nginx/conf/conf.d/*.conf;
}

起動スクリプトの作成。

$ sudo vim /etc/rc.d/init.d/nginx

中身はココで公開されている起動スクリプトをコピペして、自分のサイトに合わせて修正する。 Red Hat Nginx Init Scriptのスクリプトだとgrepエラーが出ちゃうので使わなかった。

Nginxの本体へのパス。

nginx=”/usr/local/sbin/nginx“
 ↓
nginx=”/usr/local/nginx/sbin/nginx

今回の設定だとUNIXソケットを使っていて、再起動時にゴミが残るので削除するようにした。 少し強引かな(笑

stop() {
??? echo -n $"Stopping $prog: "
??? killproc $prog -QUIT
??? retval=$?
??? echo
??? [ $retval -eq 0 ] && rm -f $lockfile
??? return $retval
}
   ↓
stop() {
??? echo -n $"Stopping $prog: "
??? killproc $prog -QUIT
??? rm /var/run/nginx-backend.sock
??? retval=$?
??? echo
??? [ $retval -eq 0 ] && rm -f $lockfile
??? return $retval
}

起動スクリプトに実行権を与えて、自動起動の設定と確認をしたら、Nginxを起動させて動作確認。

$ sudo chmod +x /etc/init.d/nginx
$ sudo chkconfig nginx on
$ sudo chkconfig ?list nginx
$ sudo /etc/init.d/nginx start

この画面が表示されればOK。

Welcome to nginx!画面

■マルチドメイン&リバースプロクシの設定

フロントエンドのサーバが静的にキャッシュを返して、裏方のバックエンドサーバは動的コンテンツを担当する、という理解で良いのかな?教えて偉い人。

まずバックエンドから。

$ sudo vim /usr/local/nginx/conf/conf.d/backend.conf

またもやココを参考に設定。 UNIXソケット、カスタムパーマリンクの設定も入れてます。

server {
    listen unix:/var/run/nginx-backend.sock;
    server_name  _;
    root   /var/www/nky;
    access_log  /var/log/nginx/access.backend.log backend;
    index  index.php index.html index.htm;

    gzip              off;
    gzip_vary         off;

    #カスタムパーマリンク対応
    if (!-e $request_filename) {
        rewrite ^.+?($/-.*) $1 last;
        rewrite ^.+?(/.*\.php)$ $1 last;
        rewrite ^ /index.php last;
    }

    location ~ \.php$ {
        try_files $uri =404;
        expires        off;
        fastcgi_pass   phpfpm;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_param  REMOTE_ADDR      $http_x_real_ip;
        fastcgi_pass_header "X-Accel-Redirect";
        fastcgi_pass_header "X-Accel-Buffering";
        fastcgi_pass_header "X-Accel-Charset";
        fastcgi_pass_header "X-Accel-Expires";
        fastcgi_pass_header "X-Accel-Limit-Rate";
    }
}

次はフロントエンドの設定。 これはマルチドメイン対応で作ってます。

$ sudo vim /usr/local/nginx/conf/conf.d/nky.conf

中身はコレ。 80番ポートで受けた通信をUNIXソケットでバックエンドに流しています。 画像等の変化の少ないファイルは1年、テキストやCSSも種類に応じてキャッシュ時間を変えて、その他のPHP関連はバックエンドにスルーパス。 プロクシキャッシュは5分間。

#For nakayan.jp
server {
    listen 80;
    server_name nakayan.jp;
    access_log  /var/log/nginx/access.nky.log;
    error_log   /var/log/nginx/error.nky.log;
    root   /var/www/nky;

    rewrite /wp-admin$ $scheme://$host$uri/ permanent;

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt { access_log off; log_not_found off; }
    location = /apple-touch-icon.png { access_log off; log_not_found off; }
    location ~ /\. { deny all; access_log off; log_not_found off; }

    #今回はデータ移行のためpicディレクトリが必要なので下記設定
    location ~* /(pic|wp-content|wp-admin|wp-includes) {
    #普通に新規インストールするなら下記がシンプルで良し
    #location ~* /wp-(content|admin|includes) {
        index   index.php index.html index.htm;
        if ($request_filename ~* .*\.(xml|gz)) {
            break;
            expires 1d;
        }
        if ($request_filename ~* .*\.(txt|html?|js|css|swf)) {
            break;
            expires 30d;
        }
        if ($request_filename ~* .*\.(ico|jpe?g|gif|png|wmv|flv|mpg|gz)) {
            break;
            expires 365d;
        }
        if ($request_filename ~ .*\.php) {
            break;
            proxy_pass //backend;
        }
    }

    location /feed { proxy_pass //backend; }
    location ~ .*\.php { proxy_pass //backend; }

    location / {
        set $do_not_cache 0;
        if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
            set $do_not_cache 1;
        }
        if ($request_method = POST) {
            set $do_not_cache 1;
        }

        proxy_no_cache     $do_not_cache;
        proxy_cache_bypass $do_not_cache;
        proxy_cache        one;
        proxy_cache_key    "$scheme://$host$request_uri$is_args$args";
        proxy_cache_valid  200 301 302 5m;
        proxy_cache_valid  404 5m;
        proxy_cache_use_stale  error timeout invalid_header updating
                               http_500 http_502 http_503 http_504;
        proxy_pass         //backend;
        proxy_redirect     default;
    }
}

Web公開用ファイルの設置ディレクトリを作成する。

$ sudo mkdir /var/www/nky/
$ sudo chown -R nginx.nginx /var/www/nky/

テストのために、何かHTMLファイルを置いておくこと。最後にNginxを再起動。

$ sudo /etc/init.d/nginx restart

テスト用のファイルが無事に表示されたらOK。

はい、おしまい。

■NginxのログをLogwatchの対象にする

ユーザー定義用の設定ファイルを作成する。

$ sudo vim /etc/logwatch/conf/logfiles/http.conf

下記を書いて、上書き保存して終了。

LogFile = nginx/*access.*.log
Archive = nginx/*access.*.log.*.gz
*ExpandRepeats
*ApplyhttpDate

どんな出力がされるかは、下記のコマンドで確認できる。

$ sudo logwatch ?print

■MySQL、PHP、PhpMyAdminの設定

導入~大まかな設定は下記エントリを参照。

MySQL、PHP、PhpMyAdminの導入と設定

その後の試行錯誤は下記を参照。

劇遅サーバの設定を見直したら劇的に改善した

細かい設定はココを参考に修正した。 まずはPHPの設定。

$ sudo vim /etc/php-fpm.d/www.conf

修正&追加するのは下記。

listen = /var/run/php-fpm.sock
listen.owner = nobody
listen.group = nobody
listen.mode = 0666
pm = static
pm.max_children = 5
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_admin_value[upload_max_filesize] = 16M
php_admin_value[post_max_size] = 16M

listenポートをUNIXソケットに変更したので、Nginxの設定も同じように修正する。

$ sudo vim /usr/local/nginx/conf/nginx.conf

下記をUNIXソケットに書き換える。

fastcgi_pass?? 127.0.0.1:9000;
 ↓
fastcgi_pass?? unix:/var/run/php-fpm.sock;

php-fpmとNginxを再起動。

$ sudo /etc/rc.d/init.d/php-fpm restart
 $ sudo /etc/rc.d/init.d/nginx restart

MySQLもチューニングする。

$ sudo vim /etc/my.cnf

下記を修正&追加。

character-set-server=utf8
symbolic-links=0
innodb_buffer_pool_size=64M
innodb_log_file_size=16M
innodb_flush_method=O_DIRECT
query_cache_size=128M
query_cache_limit=2M
query_cache_min_res_unit=4k
query_cache_type=1
tmp_table_size=128M
max_heap_table_size=128M
table_open_cache=1024
max_allowed_packet=1M
sort_buffer=256K
read_buffer_size=256K
read_rnd_buffer_size=256K
join_buffer_size=256K
key_buffer_size=16M
max_connections=256
thread_cache=256
wait_timeout=60

MySQLを再起動する。

$ sudo/etc/rc.d/init.d/mysqld restart

■eAcceleratorの導入

必要なパッケージを普通にyumでインストールしようとしたら、あれこれ依存性エラーが出たので下記で導入。

?$ sudo yum install ?enablerepo=remi ?enablerepo=remi-php55 php-devel

ソースからビルド。

$ wget //github.com/eaccelerator/eaccelerator/archive/master.zip
$ unzip master.zip
$ cd eaccelerator-master/
$ phpize
$? ./configure ?enable-eaccelerator=shared ?with-php-config=/usr/bin/php-config
$ make
$ sudo make install

インストールされたか確認。

$ php -v

表示された結果にeacceleratorの記載があればOK。

設定ファイルのコピー。

$ sudo cp eaccelerator.ini /etc/php.d/
$ sudo vim /etc/php.d/eaccelerator.ini

キャッシュ用ディレクトリはデフォルトの設定通りの場所に作ってもいいけど、気分で変えた。

eaccelerator.cache_dir = “/tmp/eaccelerator”
 ↓
eaccelerator.cache_dir = “/var/cache/eaccelerator

上記で設定したキャッシュ用ディレクトリの作成。

$ sudo mkdir /var/cache/eaccelerator
$ sudo chmod 755 /var/cache/eaccelerator

管理者用の情報をWebで見ることができるので、PHPファイルをコピーしてユーザ名とパスワードを設定する。

$ sudo cp control.php /var/www/nakayan.jp/
$ sudo vim /var/www/nakayan.jp/control.php

デフォルト設定の赤字の部分を、わかりにくいものに変更しておくこと。

/*** CONFIG ***/
$auth = true;?????????? // Set to false to disable authentication
$user = “admin“;
$pw = “eAccelerator“;

ここまでやったら、システムに変更を適用するためにphp-fpmを再起動。

$ sudo /etc/init.d/php-fpm restart

念のため、既にPHPアクセラレータのphp-pecl-apcがインストールされているので削除する。

$ sudo yum erase php-pecl-apc

 

以上!!!

 

 

 

コメント

タイトルとURLをコピーしました