Nginx+PerlのCGI環境にMovable Typeをインストールする一撃シェルスクリプト
ツールがなくてもサーバー構築でだじろがない! 一撃シェルスクリプト道場 第2回
ダウンロード ICHIGEKI (6.9 KB)
-
- Page 4
-
- perl-fastcgiのinitスクリプトの作成
- ①行頭のdescriptionを修正するためにいったん削除する
- ②・③descriptionがないのも不都合なので追加する
- ④3行目にあるdescriptionの直下に「# chkconfig: - 85 15」を追加する
- ⑤「nginx="/opt/nginx/sbin/nginx"」を「perlfastcgi="/usr/bin/fastcgi-wrapper.pl"」に直す
- ⑥「prog=$(basename $nginx)」を「prog=$(basename perl)」に直す
- ⑦「NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"」で始まる行を削除する
- ⑧「lockfile=/var/lock/subsys/nginx」を「lockfile=/var/lock/subsys/perl-fastcgi」に直す
- ⑨start関数の中の「 [ -x $nginx ] || exit 5 」 を 「 [ -x $perlfastcgi ] || exit 5 」に直す
- ⑩start関数の中の 「 [ -f $NGINX_CONF_FILE ] || exit 6 」 を削除する
- ⑪start関数の中の「daemon $nginx -c $NGINX_CONF_FILE」を「daemon $perlfastcgi」に直す
- ⑫restart関数とreload関数の中から「configtest || return $?」を削除する
- ⑬reload関数内の「killproc $nginx -HUP」を「stop ; start」に直す
- ⑭60〜62行目にある「configtest」を関数ごと削除する
- ⑮case文の中で引数にrestartとconfigtestを与えたときの条件を、restartのみに変更する(configtest関数を削除したため)
- ⑯95行目にあるUsageの行から「configtest」を削除する
OSインストール直後の各種設定
一撃シェルスクリプトには、Movable TypeのダウンロードURLだけを引数として渡します。これを変数DURLに格納します。
DURL=$1
冒頭にも記した通り、一撃シェルスクリプトの引数にはたった1つ、Movable TypeのダウンロードURLしか与えません。そのため、これを変数に入れることに意味があるのかと思われる方もいらっしゃるでしょう。理由はコードの可読性です。
今回の一撃シェルスクリプトにおいて、変数DURLはcurlコマンドを使ったファイルのダウンロードの他に、ファイル名を切り出す箇所で使われます(詳細は後述)。次に示すのがそのコードですが、変数DURLを使うことにより何をしているのかをイメージしやすくし、保守性を損ねないようにしています。
MTARC=$(basename ${DURL} | awk 'BEGIN {FS="?"} {print $1}')
curl -o ${MTARC} ${DURL}
また、本稿執筆時点では、Movable Typeはzipファイルで提供されています。このため、unzipコマンドをインストールします。
## unzip install yum -y install unzip
ドキュメントルートの作成とMovable Typeのダウンロード
今回はドキュメントルートを/var/www/htmlとするため、まず基点となる/var/wwwディレクトリを作成します。続いて、Movable Typeのインストールzipファイルを/root/srcディレクトリにダウンロードし展開します。そして、展開によりできたMovable Typeのディレクトリを、/var/wwwディレクトリに移動します。
## Create DocumentRoot and Movable Type Download
mkdir -p /var/www
mkdir -p ${HOME}/src
cd ${HOME}/src
MTARC=$(basename ${DURL} | awk 'BEGIN {FS="?"} {print $1}')
curl -o ${MTARC} ${DURL}
unzip ${MTARC}
mv $(ls | grep -v zip$) /var/www/html
cd ${HOME}
このコードでは変数MTARCがキモになるので少し解説しますと、本稿執筆時点でMovable TypeのダウンロードURLは「https://……/file_download.php/MT-6_1.zip?id=9&type=MT6」という構造になっています。これをそのままcurlコマンドでダウンロードすると、ファイル名が「MT-6_1.zip?id=9&type=MT6」になってしまいます。
このため、curlコマンドでダウンロードするファイル名を「MT-6_1.zip」にしてあげる必要があります。ここでは引数としてURL「https://……/file_download.php/MT-6_1.zip?id=9&type=MT6」を受け取ったbasenameコマンドが最後のスラッシュまでを削除して「MT-6_1.zip?id=9&type=MT6」を出力し、さらに区切り文字(FSの値)として「?」を指定されたawkコマンドが1フィールド目、つまり「MT-6_1.zip」を出力することでこれを実現しています。
MySQLのインストールとDBの作成
次に、MySQLサーバー(パッケージ名はmysql-community-server)をインストールします。今回の一撃シェルスクリプトでは次の順に処理を行っています。
- mysql-communityリポジトリをインストール
- mysql-community-serverパッケージをインストール
- mysqldサービスの起動および自動起動の設定
- MySQLのrootユーザーにパスワードを付与し、匿名ユーザーを削除
- データベース「mt」を作成
「1. mysql-communityリポジトリをインストール」から、「3. mysqldサービスの起動および自動起動の設定」までは、特に変わったことをせずにストレートに処理を進めます。
## MySQL install yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm yum -y install mysql-community-server service mysqld start chkconfig mysqld on
「4. MySQLのrootユーザーにパスワードを付与し、匿名ユーザーを削除」は、mysql_secure_installationコマンドが行う処理にほぼ相当します。mysql_secure_installationコマンドは対話式のシェルスクリプトです。そのまま実行してしまうと人間の入力待ちとなってしまうため、次の処理を行います。
- root@localhostにパスワードを付与
- root@${HOSTNAME}にパスワードを付与
- root@127.0.0.1にパスワードを付与
- root@::1にパスワードを付与
- パスワードが空のユーザーを削除
- mysqlの権限テーブルを再読み込み
なお、mysql_secure_installationコマンドはtestデータベースの削除も行っていますが、本稿執筆時点においてmysql-communityリポジトリからインストールしたmysql-community-serverにはtestデータベースが含まれていなかったため、この処理は実装していません。
今回の一撃シェルスクリプトでは、/root/root.my.cnfファイルの有無で処理を分けています。
if [ -f ${HOME}/root.my.cnf ];
then
ROOTPW=$(cat ${HOME}/root.my.cnf | grep ^password | awk 'BEGIN {FS="\""} {print $2}')
mysql -e "SET PASSWORD FOR root@localhost=PASSWORD('${ROOTPW}');"
mv ${HOME}/root.my.cnf ${HOME}/.my.cnf
chmod 600 ${HOME}/.my.cnf
mysql -u root -e "SET PASSWORD FOR root@\"${HOSTNAME}\"=PASSWORD('${ROOTPW}');"
mysql -u root -e "SET PASSWORD FOR root@127.0.0.1=PASSWORD('${ROOTPW}');"
mysql -u root -e "SET PASSWORD FOR root@\"::1\"=PASSWORD('${ROOTPW}');"
mysql -u root -e "delete from mysql.user where password='';"
mysql -u root -e 'FLUSH PRIVILEGES;'
else
ROOTPW=$(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 16)
mysql -e "SET PASSWORD FOR root@localhost=PASSWORD('${ROOTPW}');"
echo [client] | tee ${HOME}/.my.cnf
echo user=root | tee -a ${HOME}/.my.cnf
echo password=\"${ROOTPW}\" | tee -a ${HOME}/.my.cnf
mysql -u root -e "SET PASSWORD FOR root@\"${HOSTNAME}\"=PASSWORD('${ROOTPW}');"
mysql -u root -e "SET PASSWORD FOR root@127.0.0.1=PASSWORD('${ROOTPW}');"
mysql -u root -e "SET PASSWORD FOR root@\"::1\"=PASSWORD('${ROOTPW}');"
mysql -u root -e "delete from mysql.user where password='';"
mysql -u root -e 'FLUSH PRIVILEGES;'
fi
上記のif文では、/root/root.my.cnfがあれば、このファイルからrootユーザーに与えるパスワードを抜き出してmysqlコマンドで設定し、root.my.cnfファイルを.my.cnfファイル(隠しファイル)にリネームしています。反対に、/root/root.my.cnfが存在しなければ、rootパスワードをランダムな文字列で生成し、.my.cnfファイルに格納しています。
以上の処理が終わった後、データベース「mt」を作成します。
## Create "mt" database mysql -u root -e "create database mt;"
この記事は参考になりましたか?
- ツールがなくてもサーバー構築でたじろがない! 一撃シェルスクリプト道場連載記事一覧
-
- WordPressとnginx+MySQL+memcached+wp-cliをインストール...
- Nginx+PerlのCGI環境にMovable Typeをインストールする一撃シェルスク...
- Apacheホスティング環境(Webサーバー+PHP実行環境)をコマンド一発で構築する一撃...
- この記事の著者
-
濱田 康貴(ハマダ ヤスタカ)
サーバーエンジニアとして主にLinuxのWEBサーバーを設計、構築、運用を行っています。運用ツールの相棒としてシェルスクリプトやワンライナーは心強いパートナーと信じて疑わず、ブログでTIPSを公開しています。2009年5月のUSP友の会活動開始より参画し、現副会長。最近では、USP友の会で「一撃サーバー構築シェルスクリプト勉強会」を開催しているほか、日本で唯一のシェルスクリプト総合誌『シェルスクリプトマガジン』(毎月25日発売)で、隔月(偶数月号)連載「教えて先輩 サーバー運用お助けTips」を執筆しています。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
