さくらのVPS+WordPress+PHP+Nginxのまとめに書いた通りに、ちょっと長いけどサーバを設定する手順をメモしておく。
ご参考まで。
目次
- VPSの基本設定
- Nginxの導入と設定
- マルチドメイン&リバースプロクシの設定
- NginxのログをLogwatchの対象にする
- MySQL、PHP、PhpMyAdminの設定
- eAcceleratorの導入
■VPSの基本設定
下記の記事通り。 基本に忠実に。
■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。
■マルチドメイン&リバースプロクシの設定
フロントエンドのサーバが静的にキャッシュを返して、裏方のバックエンドサーバは動的コンテンツを担当する、という理解で良いのかな?教えて偉い人。
まずバックエンドから。
$ 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の設定
導入~大まかな設定は下記エントリを参照。
その後の試行錯誤は下記を参照。
細かい設定はココを参考に修正した。 まずは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
以上!!!