さくらのクラウドで、ログイン後に一発シェルスクリプトを叩くだけでWordPressが動くようにシェルスクリプトを書いてみました。前提条件となる環境構築はこちらで取り上げたスタートアップスクリプトを実行済みであることとします。
■ 仕様
- WEBサーバはNginx+PHP-FPM
- NginxはCentALTリポジトリからインストールする
- PHPはremi-php56リポジトリからインストールする
- ドキュメントルートは /home/vhosts/IPアドレス/public_html
- アクセスログは /home/logs/IPアドレス/ 以下に保存
- Nginx全体のアクセス制御(IPアドレスによる制限) は /etc/nginx/denyhosts で行う
- /etc/logrotate.d/nginx のローテーション対象ログに、バーチャルホストのアクセスログを含め、366世代保管にする
- MySQLのrootパスワード、WordPress用ユーザのパスワードはインストール時に生成する
- WordPress用のDB名、ユーザ名は変数で指定する
- キックするシェルスクリプトの他には、/etc/nginx/nginx.confの元ファイル、/etc/nginx/denyhostsの元ファイル、WordPressダウンロードスクリプトの元ファイルを準備し、シェルスクリプトと同じディレクトリにアップロードする
理屈の解説まで全部やってしまうと物凄いボリュームになってしまうので、まずはシェルスクリプト「INSTALLER」のソースコードを。
#!/bin/bash LANG=C ################################################################################ # PHP and Nginx Install sudo touch /etc/yum.repos.d/centos.alt.ru.repo sudo chmod 666 /etc/yum.repos.d/centos.alt.ru.repo echo '[CentALT] name=CentALT Packages for Enterprise Linux 6 - $basearch baseurl=http://centos.alt.ru/repository/centos/6/$basearch/ enabled=0 gpgcheck=0' > /etc/yum.repos.d/centos.alt.ru.repo sudo chmod 644 /etc/yum.repos.d/centos.alt.ru.repo sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm sudo yum --enablerepo=remi-php56 -y install php-cli php-common php-mbstring php-pdo php-xml php-mysqlnd php-pecl-apcu php-xmlrpc php-opcache php-fpm sudo yum -y --enablerepo=CentALT install nginx sudo cp -p /etc/php.ini /etc/php.ini.orig sudo sed -i 's/;date.timezone =/;##--@--##date.timezone =ndate.timezone = Asia/Tokyo/' /etc/php.ini sudo cp -p /etc/php.ini ~/ sudo chmod 666 ~/php.ini echo 'upload_tmp_dir = /var/tmp' >> ~/php.ini sudo chmod 644 ~/php.ini sudo mv ~/php.ini /etc/ sudo sed -i 's/^user = apache/;user = apachenuser = nginx/' /etc/php-fpm.d/www.conf sudo sed -i 's/^group = apache/;group = apachengroup = nginx/' /etc/php-fpm.d/www.conf sudo sed -i 's/^listen.allowed_clients = 127.0.0.1/;##--@--##listen.allowed_clients = 127.0.0.1/' /etc/php-fpm.d/www.conf ################################################################################ ################################################################################ # VirtualHost Create IPADDR=$(ifconfig eth0 | egrep '(inet addr)' | awk '{print $2}' | cut -b 6-) sudo mkdir -p /home/logs/${IPADDR} sudo mkdir -p /home/vhosts/${IPADDR}/{public_html,src} sudo chown -R nginx:hamada /home/vhosts/${IPADDR} sudo chmod -R g+w /home/vhosts/* ################################################################################ ################################################################################ # Nginx config Copy , Edit and Start sudo cp -p /etc/nginx/nginx.conf /etc/nginx/nginx.conf.orig sudo mv 900_denyhosts /etc/nginx/denyhosts sudo chown root. /etc/nginx/denyhosts sudo mv 901_nginx.conf /etc/nginx/nginx.conf sudo sed -i s/_IPADDR_/$(echo ${IPADDR})/g /etc/nginx/nginx.conf sudo chown root. /etc/nginx/nginx.conf sudo mkdir -p /etc/logrotate.d/BACKUP sudo cp -p /etc/logrotate.d/nginx /etc/logrotate.d/BACKUP/nginx.orig sudo sed -i "s/\/var\/log\/nginx\/\*log/\/var\/log\/nginx\/\*log \/home\/logs\/\*\/access_log \/home\/logs\/\*\/error_log/g;s/rotate 10/rotate 366/" /etc/logrotate.d/nginx sudo service php-fpm start sudo chkconfig php-fpm on sudo chkconfig php-fpm --list sudo service nginx start sudo chkconfig nginx on sudo chkconfig nginx --list ################################################################################ ################################################################################ # MySQL Install DBNAME=wordpress DBUSER=wpuser sudo yum -y install mysql-server sudo chkconfig mysqld on sudo chkconfig mysqld --list sudo service mysqld start PARAMFILE=~/920_MySQLPARAM echo "user root $(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 8)" > ${PARAMFILE} echo "DBPARAM ${DBNAME} ${DBUSER} $(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 8)" >> ${PARAMFILE} PW=$(grep ^DBPARAM ${PARAMFILE} | awk '{print $NF}') mysqladmin -u root password "$(grep ^user ${PARAMFILE} | awk '{print $NF}')" mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') -e "create database ${DBNAME} character set utf8;" mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') -e "GRANT ALL PRIVILEGES on ${DBNAME}.* to ${DBUSER}@localhost identified by "${PW}";" mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') -e "select user,host,password from mysql.user;" mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') -e "show databases;" cat ${PARAMFILE} ################################################################################ ################################################################################ # WordPress Install mkdir bin mv 910_wpdl bin/wpdl chmod 700 bin/wpdl wpdl cd src/wordpress/current/ tar xvzf latest-ja.tar.gz cd wordpress cp -pr * /home/vhosts/${IPADDR}/public_html/ cd /home/vhosts/${IPADDR}/public_html/ cp -p wp-config-sample.php wp-config.php sudo chmod 660 wp-config.php sed -i s/database_name_here/$(grep ^DBPARAM ${PARAMFILE} | awk '{print $2}')/g wp-config.php sed -i s/username_here/$(grep ^DBPARAM ${PARAMFILE} | awk '{print $3}')/g wp-config.php sed -i s/password_here/$(grep ^DBPARAM ${PARAMFILE} | awk '{print $4}')/g wp-config.php sed -i s/'put your unique phrase here'/$(cat /dev/urandom | tr -dc '[:alnum:]'| head -c 32)/g wp-config.php sudo chown -R nginx:${USER} /home/vhosts/${IPADDR}/public_html/ sudo chmod -R g+w /home/vhosts/${IPADDR}/public_html/ ################################################################################
続いて、Nginxのアクセス制御ファイル「900_denyhosts」をシェルスクリプトと同じディレクトリに置きます。
#deny 10.0.0.1; allow all;
同じく、Nginxの設定ファイル「901_nginx.conf」もシェルスクリプトと同じディレクトリに置きます。ダミーの文字列 _IPADDR_ をsedでIPアドレスに変換するようにしています。IPアドレスは「ifconfig eth0 | egrep '(inet addr)' | awk '{print $2}' | cut -b 6-」の値をとるようにしています。また、今回は省略していますが、「worker_processes」も「cat /proc/cpuinfo | grep ^processor | tail -n 1 | awk '{print $NF}'」の値で置換してあげてもよいですね。
user nginx; worker_processes 1; worker_rlimit_nofile 100000; #error_log /var/log/nginx/error.log; error_log /home/logs/_IPADDR_/error.log; pid /var/run/nginx.pid; events { worker_connections 1024; use epoll; } http { include /etc/nginx/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"'; access_log /home/logs/_IPADDR_/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; server_tokens off; gzip on; gzip_static on; gzip_comp_level 5; gzip_min_length 1024; keepalive_timeout 65; limit_conn_zone $binary_remote_addr zone=addr:10m; # Load config files from the /etc/nginx/conf.d directory include /etc/nginx/conf.d/*.conf; server { limit_conn addr 10; listen 80; server_name _IPADDR_; root /home/vhosts/_IPADDR_/public_html; #charset koi8-r; #access_log logs/host.access.log main; location / { index index.php index.html index.htm; try_files $uri $uri/ /index.php?$args; } rewrite /wp-admin$ $scheme://$host$uri/ permanent; location ~* ^.+.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ { access_log off; log_not_found off; expires max; } location = /favicon.ico { log_not_found off; } location ~ .php$ { try_files $uri =404; ## WordPressのパーマリンク設定をカスタム構造に ## if (!-e $request_filename) { rewrite ^.+?($/wp-.*) $1 last; rewrite ^.+?(/.*.php)$ $1 last; rewrite ^ /index.php last; } ## ここまで ## root /home/vhosts/_IPADDR_/public_html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; client_max_body_size 100M; include fastcgi_params; } error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } }
最後に、WordPressダウンロードスクリプト「910_wpdl」もシェルスクリプトと同じディレクトリに置きます。
#!/bin/bash ## Environment DLSITE=http://ja.wordpress.org/ WPDIR=wordpress DLDIR=${HOME}/src/${WPDIR} DLFILE=latest-ja.tar.gz VFILE=${WPDIR}/wp-includes/version.php VERSION=${DLDIR}/version YYYYMMDD=$(date +%Y/%m/%d) ## Initialize [ ! -d ${DLDIR} ] && mkdir -p ${DLDIR} cd ${DLDIR} ## Now Version record ls -l | egrep ^d | awk '{print $NF}' | egrep '(^[0-9].)' | tail -1 > ${VERSION} ## WordPress GET and Expand wget ${DLSITE}/${DLFILE} && tar xzf ${DLFILE} ${VFILE} > /dev/null 2>&1 VDIR=$(egrep '(^$wp_version)' ${VFILE} | awk '{print $NF}' | sed -e "s/'//g;s/;//g") [ ! -d ${VDIR} ] && mkdir -p ${VDIR} && mv ${DLFILE} ${VDIR} [ -d ${WPDIR} ] && rm -fr ${WPDIR} [ -f ${DLFILE} ] && rm -f ${DLFILE} [ -L current ] && rm -f current ln -s $(ls -l | egrep ^d | awk '{print $NF}' | tail -1) current
あとはこれら4つのファイルをインストール後のサーバにSCPでアップロードし、シェルスクリプト「INSTALLER」を実行するだけです。Nginxの設定ファイルについては、あらためて取り上げてみたいと思います。ね、簡単でしょう?
[amazonjs asin="B00H372KS8" locale="JP" title="基礎からのWordPress"]