[さくら][クラウド]シェルスクリプト一発でWordPressをインストールする


さくらのクラウドで、ログイン後に一発シェルスクリプトを叩くだけで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"]