第5回 一撃サーバー構築シェルスクリプト勉強会
USP友の会 2015/03/14
[自己紹介] 名前: 濱田康貴 ( @nullpopopo ) Blog http://nullpopopo.blogcube.info/ Facebook https://www.facebook.com/nullpopopo 第5回 一撃サーバー構築シェルスクリプト勉強会
[自己紹介] 執筆: シェルスクリプトマガジン (旧USP Magazine) 教えて先輩♡サーバー運用お助けTIPS 隔月(偶数月号)連載中 Vol.22 では石狩DCまで 取材に行ってきました→ 第5回 一撃サーバー構築シェルスクリプト勉強会
[自己紹介] 執筆: CodeZine ( http://codezine.jp/ ) で ツールがなくてもサーバー構築でたじろがない! 一撃シェルスクリプト道場 連載はじめました。 第5回 一撃サーバー構築シェルスクリプト勉強会
[USP友の会とは] USP(ユニバーサル・シェル・プログラミング)友の会は、日本 唯一の、シェルプログラミングファンのコミュニティで す。2009年5月にスタートした本会は、シェルプログラミングに限 らず、簡潔明瞭さ、創意工夫を尊ぶエンジニアが集まり、技術の 話題に花を咲かせています。 公式サイト https://www.usptomo.com/ Twitter https://twitter.com/usptomo FB https://www.facebook.com/usptomo FB (グループ) https://www.facebook.com/groups/141271259271220/ 第5回 一撃サーバー構築シェルスクリプト勉強会
一撃シェルスクリプトとは
「シェルスクリプト
(と設定ファイルのひな形)を用
意すれば、コマンドを1回実行するだけで環境
構築ができてしまうというスグレモノ」
を目指し ています。(「一撃シェルスクリプト」は @nullpopopo の造語です) 現在のところ、線引きとして以下のように詳細なルールを作っています。 ● OSインストール直後に一撃シェルスクリプトを配置して動かす ものとする ● 実行回数は1回のみで、人が張り付く必要のない設計とする ● 対話式の入力は可能な限り回避する 第5回 一撃サーバー構築シェルスクリプト勉強会一撃シェルスクリプトで重視していないこと
例) ● 何がなんでも1枚のスクリプトファイルのみで完結することを 目的としなくてよい ● (インターネットに繋がっていることが前提ですが)設定ファイルが複数または 多岐にわたる場合は、GitHubなどから雛形ファイルをダウン ロードし、各々のホストで整形加工することもよしとする (これはベテラン勢によくありがちなのですが)いわゆる○○準拠というものに 対しては、あまり重視するつもりはありません。最終的に望むものが出 来上がるのであれば、人様に迷惑をかけない限り何をやってもよいと考えます。同一条件でイン ストールされたOSで同じ結果が得られるのであれば、どんな言語やシェルを使っても構いませ ん。 第5回 一撃サーバー構築シェルスクリプト勉強会なぜシェルスクリプトでやるのか?
第5回 一撃サーバー構築シェルスクリプト勉強会 ● インストール対象のOSに初めからあるコマンドだけで完結で きる(基本的にyumで何かをインストールしたり、config書き換えたり) ● 環境構築のための環境構築が不要 ● エージェントレスですよ奥さん! ● まさに一撃! ● シェルスクリプトの文法を知ってしまえば運用ツールを書く のにも応用が効く ● case、ヒアドキュメントあたりは使います。 ● 原則として綺麗な環境を前提としているのでifは余り使わない ● 一度きりの実行なので、forも余り使わない
一撃でMovable Typeをインストール
今回のテーマは...
Movable Typeとは
シックス・アパートが開発するブログソフト/CMS。 ブログだけでなく、ウェブサイト単位でのウェブページや、ファ イルの管理、更新履歴の保存などCMSとしての基盤を進化させた パブリッシングプラットフォーム。 (公式サイト: http://www.sixapart.jp/movabletype/support/fundamental/about-mt.html よ り) 第5回 一撃サーバー構築シェルスクリプト勉強会今回の一撃シェルスクリプトでやっていること
● ドキュメントルートのディレクトリを作成し、ここにMovable Type のファイル一式を配置する ● iptables設定 ● MySQLインストールとdatabase「mt」作成 ● nginx+FCGIインストール ● nginx設定ファイルはヒアドキュメントで作成 ● fastcgi-wrapper.pl 作成 ● perl-fastcgi initスクリプト作成 ● perl-fastcgi initスクリプト 修正 ● パッケージ、OSのアップデート 第5回 一撃サーバー構築シェルスクリプト勉強会使用しているコマンド
awk basename cat cd chkconfig chmod cp curl
echo egrep grep ip iptables ls mkdir mv mysql
reboot sed service tee unzip yum
パッケージのインストール
●基本的にはyumでインストール
●ほとんどのパッケージは標準リポジトリ
●perlモジュールでMovable Typeが求める一部の
パッケージはepelやrpmforgeリポジトリ
●MySQLは公式のコミュニティリポジトリ
第5回 一撃サーバー構築シェルスクリプト勉強会設定ファイルの生成
●nginxのバーチャルホスト設定ファイルは、一撃
シェルスクリプトの中でヒアドキュメントで生成
●perl-fastcgiと、perl-fastcgiから呼び出される
fastcgi-wrapper.plはWEBに公開されているものを
流用
第5回 一撃サーバー構築シェルスクリプト勉強会本日やること
1.Movable Typeダウンロードサイトへの登録 2.githubから一撃シェルスクリプトのダウンロード 3.さくらのクラウド コントロールパネルでスタートアップスクリプ ト登録 4.一撃サーバー構築 5.Movable Type設定 第5回 一撃サーバー構築シェルスクリプト勉強会1. Movable Typeダウンロードサイトへの登録
http://www.movabletype.jp/ へアクセス
下へスクロール
ご自身のメールアドレスを入力し、利用目的に「初めて利用する」 を選び、「上記に同意して申し込む」をクリック
この画面が表示されたら、メール受信を確認します。 第5回 一撃サーバー構築シェルスクリプト勉強会
メールで通知されたログインキーを入力し、ログインする
MT-6_1.zip へのリンクを右クリック メニューからコピーする
※ リンクはメモ帳などに保存しておいてください
2. githubから一撃シェルスクリプトのダウンロード
以下のURLから作業用PCへ、一撃シェルスクリプトをダウンロードしま す。https://raw.githubusercontent.com/nullpopopo/sakura-cloud/master/ICHIGEKI-MT-CentOS6
※ 文字コードはUTF-8、改行コードはLFで保存します ※ Windows環境の方は以下のエディタをおすすめします 第5回 一撃サーバー構築シェルスクリプト勉強会第5回 一撃サーバー構築シェルスクリプト勉強会
CentOS 6.6を選択
ディスクサイズは20GB
複雑な覚えやす いパスワード (by横田さん) を入力する 任意のホスト名 を入力する 先ほど登録した スタートアップ スクリプトを選 第5回 一撃サーバー構築シェルスクリプト勉強会
任意のパスワード
を入力する Movable Type ダウンロードサイトでコピーした
URLを貼り付ける 第5回 一撃サーバー構築シェルスクリプト勉強会
これらの項目は、後でわかりやすいように任意の値を入れてください。
「作成後すぐに起動」にチェックを入れ、右下にある「作成」ボタンをクリック
サーバーが出来上がると、このように情報を見ることができます
コンソールからプロンプト が見えたらログイン可能 ※ コンソールから作業する とコピペしにくいので、ssh 接続推奨 第5回 一撃サーバー構築シェルスクリプト勉強会
サーバーのIPアドレスは「NIC」をクリックした後、↑の赤い枠に囲われ た箇所に表示されます。
休憩
コードの簡単な解説
コードの構成
1.さくらのクラウド スタートアップスクリプトの特殊タグ設定 2.自身のhosts登録 3.Movable Typeダウンロードとドキュメントルート作成 4.iptables設定 5.MySQLインストール+データベース作成 6.nginx+FCGIインストール 7.initスクリプト作成8.nginx、FCGI起動 〜 yum update+再起動
1. さくらのクラウド スタートアップスクリプトの特殊タグ設定 第5回 一撃サーバー構築シェルスクリプト勉強会
# @sacloudonce スタートアップスクリプトの動作 サーバ作成画面でスタートアップスクリプトを選択すると、起動後のサー バ内で以下の動作が行われます。 1.起動時、/etc/rc.localが/root/.sacloud-api/startup.shを実行 2. startup.shが、「スタートアップスクリプト」で指定したスクリプト (“/root/.sacloud-api/notes/スタートアップスクリプトID“に配置)を実行 3.スクリプトが実行され、ログが”/root/.sacloud-api/notes/スタートアッ プスクリプトID.log”に出力される 4.各スクリプトが正しく(終了コードが”0″)終了する と、”/root/.sacloud-api/notes/スタートアップスクリプト ID.done”という名前の空ファイルを作成(このファイルが存在すると @sacloud-once を指定したスクリプトは実行されない) 第5回 一撃サーバー構築シェルスクリプト勉強会
# @saclouddesc サーバ作成後、サーバのIPアドレスをhostsに登録 してブラウザでアクセスしてください。 # @saclouddesc (このスクリプトは、CentOS6.XもしくはScientific Linux6.Xでのみ動作します) # @saclouddesc Movable TypeダウンロードURL 入力例: https://xxxxxxxxxxxxxxxxxx/ 第5回 一撃サーバー構築シェルスクリプト勉強会
# @sacloudtext required shellarg maxlen=200 durl "Movable TypeダウンロードURL"
# @sacloudpassword required shellarg maxlen=100 rootpw "MySQLのパスワード"
DURL=@@@durl@@@
スタートアップスクリプトの特殊タグを理解するには
http://cloud-news.sakura.ad.jp/startup-script/
2. 自身のhosts登録
eth0のIPアドレスをhostsに登録 ● IPアドレスを抜き出す # ip a show dev eth0 | egrep '(inet )' | awk '{print $2}' | sed e 's/\/[09]*//g' 133.242.xxx.xxx ● IPアドレスとホスト名を2タブ区切りで表示 # echo $(ip a show dev eth0 | egrep '(inet )' | awk '{print $2}' | sed e 's/\/[09]*//g') $ {HOSTNAME} | awk '{print $1"\t""\t"$2}' 133.242.xxx.xxx mt001 ● あとはteeコマンドでhostsファイルに追記 # cp p /etc/hosts{,.orig} # echo $(ip a show dev eth0 | egrep '(inet )' | awk '{print $2}' | sed e 's/\/[09]*//g') $ {HOSTNAME} | awk '{print $1"\t""\t"$2}' | tee a /etc/hosts 第5回 一撃サーバー構築シェルスクリプト勉強会
3. Movable Typeダウンロードとドキュメントルート作成 第5回 一撃サーバー構築シェルスクリプト勉強会
HOME=/root export HOME mkdir p /var/www mkdir p ${HOME}/src cd ${HOME}/src FILENAME=$(basename ${DURL} | awk 'BEGIN {FS="?"} {print $1}') curl o ${FILENAME} ${DURL} unzip ${FILENAME} mv $(ls | grep v zip$) /var/www/html cd ${HOME} これを1つ1つコマンド叩いてみるとどうなるか? (変数のところは省略します) 第5回 一撃サーバー構築シェルスクリプト勉強会
[root@mt001 ~]# mkdir -p /var/www [root@mt001 ~]# mkdir src
[root@mt001 ~]# cd src
[root@mt001 src]# DURL="https://〜〜〜/file_download.php/MT-6_1.zip?id=9&type=MT6" [root@mt001 src]# FILENAME=$(basename ${DURL} | awk 'BEGIN {FS="?"} {print $1}') [root@mt001 src]# echo $FILENAME
MT-6_1.zip (続きます)
[root@mt001 src]# curl -o ${FILENAME} ${DURL} # ll
合計 17928
-rw-r--r-- 1 root root 18354703 3月 4 13:27 2015 MT-6_1.zip [root@mt001 src]# unzip ${FILENAME}
[root@mt001 src]# ls MT-6.1 MT-6_1.zip
[root@mt001 src]# ls | grep -v zip$ MT-6.1
[root@mt001 src]# mv $(ls | grep -v zip$) /var/www/html
4. iptables設定
第5回 一撃サーバー構築シェルスクリプト勉強会
コマンド 内容
service iptables stop
iptables -P INPUT DROP 外部からのパケットはすべて拒否する iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP パケット転送はすべて拒否する iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT
service iptables save 設定を保存 service iptables start
chkconfig iptables on
iptables停止
自ホストから外部へのパケットはすべて 許可する
localhostからのアクセスをすべて許可 iptables -A INPUT -m state --state ESTABLISHED,RELATED
-j ACCEPT 内部から行ったアクセスに対する外部からの返答アクセスを許可 外部からのTCP22番ポート(SSH)へのア クセスを許可 外部からのTCP80番ポート(HTTP)へのア クセスを許可 iptablesを起動 iptablesをスタートアップ登録する
第5回 一撃サーバー構築シェルスクリプト勉強会
[root@mt001 ~]# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 Chain FORWARD (policy DROP)
target prot opt source destination Chain OUTPUT (policy ACCEPT)
target prot opt source destination Chain fail2ban-SSH (1 references)
target prot opt source destination RETURN all -- 0.0.0.0/0 0.0.0.0/0
5. MySQLインストール+データベース作成
yum y install http://dev.mysql.com/get/mysqlcommunityreleaseel6 5.noarch.rpm yum y install mysqlcommunityserver service mysqld start chkconfig mysqld on MySQLコミュニティのYUMリポジトリをインストール MySQLサーバーをインストール 第5回 一撃サーバー構築シェルスクリプト勉強会
mysql u root e "SET PASSWORD FOR
root@localhost=PASSWORD('${ROOTPW}');"
MySQLのrootパスワードを設定。 (localhost)
変数「ROOTPW」はサーバー作成時に指定したもの
-eオプションをつけることでシェルを奪われない!
mysql u root p${ROOTPW} e "SET PASSWORD FOR root@\"$ {HOSTNAME}\"=PASSWORD('${ROOTPW}');"
MySQLのrootパスワードを設定。 (ホスト名)
mysql u root p${ROOTPW} e "SET PASSWORD FOR [email protected]=PASSWORD('${ROOTPW}');"
MySQLのrootパスワードを設定。 (127.0.0.1)
mysql u root p${ROOTPW} e "SET PASSWORD FOR root@\"::1\"=PASSWORD('${ROOTPW}');"
MySQLのrootパスワードを設定。 (::1)
mysql u root p${ROOTPW} e "delete from mysql.user where password='';"
パスワードのカラムが空のユーザーを削除する(すなわち匿名 ユーザーも削除される)
mysql u root p${ROOTPW} e 'FLUSH PRIVILEGES;' 権限テーブルを再読み込みする
mysql u root p${ROOTPW} e "create database mt;" データベース「mt」作成
[root@mt001 ~]# grep ^ROOTPW .sacloud-api/notes/〜〜〜 ROOTPW='********'
変数に格納したMySQLの
root
パスワードは後で確認
可能
第5回 一撃サーバー構築シェルスクリプト勉強会[root@mt001 ~]# mysql -u root -p${ROOTPW} -e "select user,password,host from mysql.user;"
Warning: Using a password on the command line interface can be insecure.
+---+---+---+ | user | password | host | +---+---+---+ | root | *C4AAE40CA5DC4AB9F085432AD4EB43955369AB7A | localhost | | root | *C4AAE40CA5DC4AB9F085432AD4EB43955369AB7A | mt001 | | root | *C4AAE40CA5DC4AB9F085432AD4EB43955369AB7A | 127.0.0.1 | | root | *C4AAE40CA5DC4AB9F085432AD4EB43955369AB7A | ::1 | +---+---+---+
第5回 一撃サーバー構築シェルスクリプト勉強会
第5回 一撃サーバー構築シェルスクリプト勉強会 yum -y install http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm cp -p /etc/yum.repos.d/nginx.repo /etc/yum.repos.d/nginx.repo.orig
sed -i 's/centos/mainline\/centos/' /etc/yum.repos.d/nginx.repo
nginxのリポジトリをイン ストール
nginxのリポジトリを mainlineに変更
第5回 一撃サーバー構築シェルスクリプト勉強会
yum -y install DBI DBD-MySQL Archive-Zip perl-XML-SAX perl-XML-LibXML perl-XML-NamespaceSupport Digest-SHA GD gd libXpm Crypt-SSLeay Archive-Tar perl-IO-Zlib perl-Package-Constants ImageMagick-perl perl-Time-HiRes yum -y --enablerepo=epel install perl-FCGI perl-Crypt-DSA
yum -y --enablerepo=rpmforge install XML-SAX-Expat perl-Imager
yum -y install nginx
perlのモジュールたちを インストール
第5回 一撃サーバー構築シェルスクリプト勉強会
cp -p /etc/nginx/nginx.conf{,.orig}
sed -i "s/worker_processes[[:space:]]\+[0-9]\+/worker_processes $(cat /proc/cpuinfo | grep processor | wc -l)/g"
/etc/nginx/nginx.conf
デフォルトのnginx設定 ファイルをバックアップ
nginxのworker_processes をCPUのコア数に合わせる
第5回 一撃サーバー構築シェルスクリプト勉強会 # cat /proc/cpuinfo | grep ^processor
processor : 0 processor : 1 processor : 2 processor : 3 # diff /etc/nginx/nginx.conf{,.orig} 3c3 < worker_processes 4; ---> worker_processes 1;
第5回 一撃サーバー構築シェルスクリプト勉強会
mkdir -p /etc/nginx/conf.d/BACKUP
mv /etc/nginx/conf.d/*.conf /etc/nginx/conf.d/BACKUP/
cat << _EOL_ | tee /etc/nginx/conf.d/000_MT.conf server { ... (略) } _EOL_ デフォルトのnginx設定 ファイルをバックアップ nginx設定ファイルをヒア ドキュメントで生成
第5回 一撃サーバー構築シェルスクリプト勉強会 nginx設定 (抜粋) server { listen 80; server_name ${HOSTNAME}; location / { root /var/www/html;
index index.html index.htm index.cgi index.pl; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } ... ヒアドキュメントの中で HOSTNAME変数が展開される indexの順序に注意 ※ .cgiと.plを後ろにしな いとmt.cgiが優先されてし
第5回 一撃サーバー構築シェルスクリプト勉強会 nginx設定 (抜粋) location ~ .pl$ { gzip off; root /var/www/html; include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:8999; fastcgi_index index.pl;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; } location ~ .cgi$ { gzip off; root /var/www/html; include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:8999; fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; }
ヒアドキュメントの中で変 数を展開しないようエス ケープしている
第5回 一撃サーバー構築シェルスクリプト勉強会
第5回 一撃サーバー構築シェルスクリプト勉強会 nginx+perl-fastcgi 起動の仕組み
● fastcgi-wrapper.pl と perl-fastcgi は www.linode.com
からダウンロードする ● perl-fastcgi はダウンロード後、数カ所の修正を行う nginx perl-fastcgi /etc/rc.d/init.d/nginx から起動 /etc/rc.d/init.d/perl-fastcgi から fastcgi-wrapper.pl を起動 参考: https://www.linode.com/docs/websites/nginx/nginx-and-perlfastcgi-on-centos-5
第5回 一撃サーバー構築シェルスクリプト勉強会 fastcgi-wrapper.pl 入手 curl -L -o /usr/bin/fastcgi-wrapper.pl http://www.linode.com/docs/assets/642-fastcgi-wrapper.sh chmod 700 /usr/bin/fastcgi-wrapper.pl
第5回 一撃サーバー構築シェルスクリプト勉強会 perl-fastcgi 入手 PERLFCGIDAEMON=/etc/rc.d/init.d/perl-fastcgi curl -L -o ${PERLFCGIDAEMON} http://www.linode.com/docs/assets/641-init-rpm.sh (中略) chmod 700 ${PERLFCGIDAEMON} ※ 「中略 (sedでinitスクリプトの修正)」の部分は休憩後に解説します
第5回 一撃サーバー構築シェルスクリプト勉強会
き
ゅ
う
け
第5回 一撃サーバー構築シェルスクリプト勉強会 サーバーにログインしてtmpディレクトリを作り、実際にsedで どう置換されるのかを見てみましょう。 # mkdir -p ${HOME}/tmp # cd $_ # PERLFCGIDAEMON=./perl-fastcgi # curl -L -o ${PERLFCGIDAEMON} http://www.linode.com/docs/assets/641-init-rpm.sh # cp -p ${PERLFCGIDAEMON} ${PERLFCGIDAEMON}.orig
第5回 一撃サーバー構築シェルスクリプト勉強会
sed -i '/^#[[:space:]][ndpc][gerio]*/d' $ {PERLFCGIDAEMON}
第5回 一撃サーバー構築シェルスクリプト勉強会
[Before]
# cat ${PERLFCGIDAEMON} | egrep '(^#[[:space:]] [ndpc][gerio]*)'
# nginx – this script starts and stops the nginx daemon
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /opt/nginx/conf/nginx.conf
第5回 一撃サーバー構築シェルスクリプト勉強会
[After]
# sed -i '/^#[[:space:]][ndpc][gerio]*/d' $ {PERLFCGIDAEMON}
# cat ${PERLFCGIDAEMON} | egrep '(^#[[:space:]] [ndpc][gerio]*)'
第5回 一撃サーバー構築シェルスクリプト勉強会
とは言えdescriptionがないのも不都合なので追加する
(たまたま2行目と3行目に空のコメントが残ったのでこれを利用する)
sed -i '2s/^#$/# perl-fastcgi/' $ {PERLFCGIDAEMON}
sed -i '3s/^#$/# description: this script starts and stops the perl-fastcgi daemon/' $ {PERLFCGIDAEMON}
第5回 一撃サーバー構築シェルスクリプト勉強会
[After]
# sed -i '2s/^#$/# perl-fastcgi/' $ {PERLFCGIDAEMON}
# sed -i '3s/^#$/# description: this script starts and stops the perl-fastcgi daemon/' $ {PERLFCGIDAEMON}
# cat ${PERLFCGIDAEMON} | egrep '(^#[[:space:]] [ndpc][gerio]*)'
# perl-fastcgi
第5回 一撃サーバー構築シェルスクリプト勉強会
3行目 descriptionの直下に「# chkconfig: - 85 15」を追加する
sed -i "3a # chkconfig: - 85 15" $ {PERLFCGIDAEMON}
第5回 一撃サーバー構築シェルスクリプト勉強会
[After]
# sed -i "3a # chkconfig: - 85 15" $ {PERLFCGIDAEMON}
# cat ${PERLFCGIDAEMON} | egrep '(^#[[:space:]] [ndpc][gerio]*)'
# perl-fastcgi
# description: this script starts and stops the perl-fastcgi daemon
第5回 一撃サーバー構築シェルスクリプト勉強会 「nginx="/opt/nginx/sbin/nginx"」を 「perlfastcgi="/usr/bin/fastcgi-wrapper.pl"」に直す sed -i s/^nginx=[\"\/ [:alnum:]]*/perlfastcgi='"\/usr\/bin\/fastcgi-wrapper.pl"'/ ${PERLFCGIDAEMON}
第5回 一撃サーバー構築シェルスクリプト勉強会
[Before]
# cat ${PERLFCGIDAEMON} | egrep '^(nginx=| perlfastcgi)'
第5回 一撃サーバー構築シェルスクリプト勉強会
[After]
# sed -i s/^nginx=[\"\/
[:alnum:]]*/perlfastcgi='"\/usr\/bin\/fastcgi-wrapper.pl"'/ ${PERLFCGIDAEMON}
# cat ${PERLFCGIDAEMON} | egrep '^(nginx=| perlfastcgi)'
perlfastcgi="/usr/bin/fastcgi-wrapper.pl"
変数名がnginxからperlfastcgiに、変数の中身も /opt/nginx/sbin/nginx から
第5回 一撃サーバー構築シェルスクリプト勉強会
「prog=$(basename $nginx)」を「prog=$(basename perl)」に直す
sed -i 's/prog=\$(basename \$nginx)/prog=\$\ (basename perl\)/' ${PERLFCGIDAEMON}
第5回 一撃サーバー構築シェルスクリプト勉強会
[Before]
# cat ${PERLFCGIDAEMON} | egrep '^(prog=)'
第5回 一撃サーバー構築シェルスクリプト勉強会
[After]
# sed -i 's/prog=\$(basename \$nginx)/prog=\$\ (basename perl\)/' ${PERLFCGIDAEMON}
# cat ${PERLFCGIDAEMON} | egrep '^(prog=)'
prog=$(basename perl)
prog変数の中身がnginxから perlに変わった
第5回 一撃サーバー構築シェルスクリプト勉強会
「NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"」で始まる行を削除する
sed -i s/^NGINX_[[:alnum:]_=\"\\./]*// $ {PERLFCGIDAEMON}
第5回 一撃サーバー構築シェルスクリプト勉強会
[Before]
# cat ${PERLFCGIDAEMON} | egrep '(^NGINX_[[:alnum:]_=\"\\./]*)'
第5回 一撃サーバー構築シェルスクリプト勉強会
[After]
# sed -i s/^NGINX_[[:alnum:]_=\"\\./]*// $ {PERLFCGIDAEMON}
# cat ${PERLFCGIDAEMON} | egrep '(^NGINX_[[:alnum:]_=\"\\./]*)'
第5回 一撃サーバー構築シェルスクリプト勉強会 sed -i 's/lockfile=\/var\/lock\/subsys\/nginx/lockfile \=\/var\/lock\/subsys\/perl-fastcgi/' $ {PERLFCGIDAEMON} 「lockfile=/var/lock/subsys/nginx」を 「lockfile=/var/lock/subsys/perl-fastcgi」に直す
第5回 一撃サーバー構築シェルスクリプト勉強会
[Before]
# cat ${PERLFCGIDAEMON} | egrep '^(lockfile=)'
第5回 一撃サーバー構築シェルスクリプト勉強会 [After] # sed -i 's/lockfile=\/var\/lock\/subsys\/nginx/lockfile \=\/var\/lock\/subsys\/perl-fastcgi/' $ {PERLFCGIDAEMON}
# cat ${PERLFCGIDAEMON} | egrep '^(lockfile=)'
lockfile=/var/lock/subsys/perl-fastcgi
lockfile変数の中身がnginxから perl-fastcgiに変わった
第5回 一撃サーバー構築シェルスクリプト勉強会
start関数の中の「 [ -x $nginx ] || exit 5 」 を
「 [ -x $perlfastcgi ] || exit 5 」に直す
sed -i 's/\[ -x $nginx ] || exit [0-9]/[ -x $perlfastcgi ] || exit 5/' ${PERLFCGIDAEMON}
第5回 一撃サーバー構築シェルスクリプト勉強会
[Before]
# cat ${PERLFCGIDAEMON} | egrep "^(\[ -x \\\$ [np][[:alpha:]]* \] \|\| exit [0-9])"
第5回 一撃サーバー構築シェルスクリプト勉強会
[After]
# sed -i 's/\[ -x $nginx ] || exit [0-9]/[ -x $perlfastcgi ] || exit 5/' ${PERLFCGIDAEMON} # cat ${PERLFCGIDAEMON} | egrep "^(\[ -x \\\$ [np][[:alpha:]]* \] \|\| exit [0-9])" [ -x $perlfastcgi ] || exit 5 testコマンドの条件式が、「もしnginxが 実行可でなければ」から「もしperl-fcgi が実行可でなければ」に書き換わった ※ どうでもいいですが、この条件式を日本語にすると不自然ですよね? [ ! -x $perlfastcgi ] && exit 5 のほうがシックリくる。。。 ほんとどうでもいいんですが。
第5回 一撃サーバー構築シェルスクリプト勉強会
start関数の中の 「 [ -f $NGINX_CONF_FILE ] || exit 6 」 を削除する
sed -i 's/\[ -f $NGINX_CONF_FILE ] || exit [0-9]//' ${PERLFCGIDAEMON}
第5回 一撃サーバー構築シェルスクリプト勉強会
[Before]
# cat ${PERLFCGIDAEMON} | egrep "^(\[ -f \\\ $NGINX_CONF_FILE \] \|\| exit [0-9])"
第5回 一撃サーバー構築シェルスクリプト勉強会
[After]
# sed -i 's/\[ -f $NGINX_CONF_FILE ] || exit [0-9]//' ${PERLFCGIDAEMON}
# cat ${PERLFCGIDAEMON} | egrep "^(\[ -f \\\ $NGINX_CONF_FILE \] \|\| exit [0-9])"
第5回 一撃サーバー構築シェルスクリプト勉強会
start関数の中の「daemon $nginx -c $NGINX_CONF_FILE」
を「daemon $perlfastcgi」に直す
sed -i 's/daemon $nginx -c
$NGINX_CONF_FILE/daemon $perlfastcgi/' $ {PERLFCGIDAEMON}
第5回 一撃サーバー構築シェルスクリプト勉強会
[Before]
# cat ${PERLFCGIDAEMON} | egrep "^(daemon)"
第5回 一撃サーバー構築シェルスクリプト勉強会
[After]
# sed -i 's/daemon $nginx -c
$NGINX_CONF_FILE/daemon $perlfastcgi/' $ {PERLFCGIDAEMON}
# cat ${PERLFCGIDAEMON} | egrep "^(daemon)"
daemon $perlfastcgi
fastcgi-wrapper.pl を
第5回 一撃サーバー構築シェルスクリプト勉強会
restart関数とreload関数の中から「configtest || return $?」を削除する
sed -i 's/configtest || return $?//g' $ {PERLFCGIDAEMON}
第5回 一撃サーバー構築シェルスクリプト勉強会
[Before]
# cat ${PERLFCGIDAEMON} | egrep "(configtest \|\| return \\\$\?$)"
configtest || return $? configtest || return $?
第5回 一撃サーバー構築シェルスクリプト勉強会
[After]
# sed -i 's/configtest || return $?//g' $ {PERLFCGIDAEMON}
# cat ${PERLFCGIDAEMON} | egrep "(configtest \|\| return \\\$\?$)"
第5回 一撃サーバー構築シェルスクリプト勉強会
reload関数内の「killproc $nginx -HUP」を
「killproc $prog -HUP」に直す -> HUPすると死んでし
まうので「stop ; start」に直す
sed -i 's/killproc $nginx -HUP/stop ; start/' $ {PERLFCGIDAEMON}
第5回 一撃サーバー構築シェルスクリプト勉強会
[Before]
# cat ${PERLFCGIDAEMON} | egrep "^(killproc \\\ $nginx -HUP|stop ; start)"
第5回 一撃サーバー構築シェルスクリプト勉強会
[After]
# sed -i 's/killproc $nginx -HUP/stop ; start/' ${PERLFCGIDAEMON}
# cat ${PERLFCGIDAEMON} | egrep "^(killproc \\\ $nginx -HUP|stop ; start)"
stop ; start
reload関数が実行されたときの動作が
killproc $nginx -HUP から stop
第5回 一撃サーバー構築シェルスクリプト勉強会
60〜62行目、「configtest」を関数ごと削除する
第5回 一撃サーバー構築シェルスクリプト勉強会
[Before]
# cat -n ${PERLFCGIDAEMON} | grep -A 2 configtest\(\)
60 configtest() {
61 $nginx -t -c $NGINX_CONF_FILE 62 }
第5回 一撃サーバー構築シェルスクリプト勉強会
[After]
# sed -i '60,62d' ${PERLFCGIDAEMON}
# cat -n ${PERLFCGIDAEMON} | grep -A 2 configtest\(\)
第5回 一撃サーバー構築シェルスクリプト勉強会 case文の中で引数にrestartとconfigtestを与えたときの 条件を、restartのみに変更する (configtest関数を削除したため) sed -i 's/restart|configtest/restart/' $ {PERLFCGIDAEMON}
第5回 一撃サーバー構築シェルスクリプト勉強会
[Before]
# cat ${PERLFCGIDAEMON} | egrep -A 2 '(^restart[[:alnum:]|)]*$)' | tail -n 3
restart|configtest)
$1
第5回 一撃サーバー構築シェルスクリプト勉強会
[After]
# sed -i 's/restart|configtest/restart/' $ {PERLFCGIDAEMON}
# cat ${PERLFCGIDAEMON} | egrep -A 2 '(^restart[[:alnum:]|)]*$)' | tail -n 3 restart) $1 ;; case文の引数判定がrestartと configtestの両方だったのが restartのみに変更された
第5回 一撃サーバー構築シェルスクリプト勉強会
95行目、Usageの行からconfigtestを削除する
第5回 一撃サーバー構築シェルスクリプト勉強会
[Before]
# cat -n ${PERLFCGIDAEMON} | grep Usage | grep \|configtest\}\"
95 echo $"Usage: $0 {start|stop|status|restart|
condrestart|try-restart|reload|force-reload|
第5回 一撃サーバー構築シェルスクリプト勉強会
[After]
# sed -i "95s/|configtest//" ${PERLFCGIDAEMON} # cat -n ${PERLFCGIDAEMON} | grep Usage |
grep \|configtest\}\"
# cat -n ${PERLFCGIDAEMON} | grep Usage
95 echo $"Usage: $0 {start|stop|status|
第5回 一撃サーバー構築シェルスクリプト勉強会
第5回 一撃サーバー構築シェルスクリプト勉強会
chmod 700 ${PERLFCGIDAEMON} chkconfig --add perl-fastcgi chkconfig perl-fastcgi on
service perl-fastcgi start service nginx start
chkconfig nginx on yum -y update
第5回 一撃サーバー構築シェルスクリプト勉強会
$ echo
$ echo 求刑
求刑 | \
| \
sed -e 's/
第5回 一撃サーバー構築シェルスクリプト勉強会
第5回 一撃サーバー構築シェルスクリプト勉強会
ウェブサイトパス は /var/www/html のまま!
第5回 一撃サーバー構築シェルスクリプト勉強会
第5回 一撃サーバー構築シェルスクリプト勉強会
第5回 一撃サーバー構築シェルスクリプト勉強会