月次アーカイブ: 9月 2014

第1回 一撃サーバー構築シェルスクリプト勉強会で作成したシェルスクリプトのソースコードと発表資料はこちらになります。(クリックで大きくなります)

#!/bin/bash
# @sacloud-once

DBNAME=wordpress
DBUSER=wpuser
ETH0=$(ip a show eth0 | grep inet | grep -v inet6 | awk '{print $2}' | sed -e "s//[0-9]*//")
HOME=/root
export HOME
USER=root
export USER
################################################################################
# Section1 yum update

yum -y update
################################################################################

################################################################################
# Section2 fail2ban configure and IPTABLES Setting

##--@--## fail2ban のメール宛先と送信元を変更する
cp -p /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.orig
sed -i 's/you@example.com/root@localhost/g;s/fail2ban@example.com/fail2ban@localhost/g' /etc/fail2ban/jail.conf

##--@--## iptables設定
# 初期化のため一旦iptablesを停止する
service iptables stop
# 受信はすべて破棄する
iptables -P INPUT DROP
# 送信はすべて許可する
iptables -P OUTPUT ACCEPT
# パケット転送はすべて破棄する
iptables -P FORWARD DROP
# localhostからのアクセスをすべて許可
iptables -A INPUT -i lo -j ACCEPT
# 内部から行ったアクセスに対する外部からの返答アクセスを許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 外部からのTCP22番ポート(SSH)へのアクセスを許可
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 外部からのTCP80番ポート(HTTP)へのアクセスを許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 設定を保存
service iptables save
# iptablesを起動
service iptables start
# iptablesをスタートアップ登録する
chkconfig iptables on
################################################################################

################################################################################
# Section3 Package install

# NGINX
# リポジトリをインストール
yum -y install http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
# mainlineに向き先変更
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
# install
yum -y install nginx

# PHP
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
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

# MySQL
yum -y install mysql-server
################################################################################

################################################################################
# Section4 MySQL Configuration
PARAMFILE=${HOME}/.mysql/MySQLPARAM
mkdir ${HOME}/.mysql
chkconfig mysqld on
service mysqld start

# MySQLのrootユーザとパスワードを作成し、パラメーターファイルに格納する。
# 書式は user root 
echo "user root $(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 8)" > ${PARAMFILE}

# WordPressのDBに関してパラメーターファイルに格納する。
# 書式は DBPARAM DB名 DBユーザー名 
echo "DBPARAM ${DBNAME} ${DBUSER} $(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 8)" >> ${PARAMFILE}

# MySQLのrootユーザーのパスワードを設定する。
mysqladmin -u root password "$(grep ^user ${PARAMFILE} | awk '{print $NF}')"

# WordPressのデータベースを作成する。
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') 
-e "create database ${DBNAME} character set utf8;"

# DBユーザー(WordPressデータベース接続用)のパスワードを変数PWに格納する。
PW=$(grep ^DBPARAM ${PARAMFILE} | awk '{print $NF}')

# DBユーザーを作成する。
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') 
-e "GRANT ALL PRIVILEGES on ${DBNAME}.* to ${DBUSER}@localhost identified by "${PW}";"

# mysql_secure_installation
# 匿名ユーザーの削除
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') 
-e "DELETE FROM mysql.user WHERE User='';"

# localhost以外からのrootログイン禁止
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') 
-e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"

# testデータベース削除
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') 
-e "DROP DATABASE test;"

# 権限情報の再読込
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') 
-e "FLUSH PRIVILEGES;"
################################################################################

################################################################################
# Section5 PHP Configuration

# php.ini Configuration
cd /etc
cp -p php.ini php.ini.orig
sed -i 's/;date.timezone =/;##--@--##date.timezone =ndate.timezone = Asia/Tokyo/' php.ini

# PHP-FPM Configuration
cd /etc/php-fpm.d
cp -p www.conf www.conf.orig
sed -i 's/^user = apache/;user = apachenuser = nginx/' www.conf
sed -i 's/^group = apache/;group = apachengroup = nginx/' www.conf

service php-fpm start
chkconfig php-fpm on
################################################################################

################################################################################
# Section6 WordPress Install

# Create DocumentRoot
mkdir -p /var/www/${ETH0}

cd ${HOME}
mkdir bin
cd bin
wget https://raw.githubusercontent.com/nullpopopo/wpdl/master/bin/wpdl

chmod 700 wpdl
cd ${HOME}
bin/wpdl

cd ${HOME}/src/wordpress/current/
tar xzf latest-ja.tar.gz
cd wordpress/
cp -pr * /var/www/${ETH0}

cd /var/www/${ETH0}
cp -p wp-config-sample.php wp-config.php
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

cd /var/www/
chown -R nginx:${USER} ${ETH0}
chmod -R g+w ${ETH0}

################################################################################

################################################################################
# Section7 NGINX Configuration

# http://wpdocs.sourceforge.jp/Nginx
cd /etc/nginx/
cp -p nginx.conf nginx.conf.orig

# worker_processesの数をコア数に合わせる
sed -i "s/worker_processes[[:space:]]+[0-9]+/worker_processes $(cat /proc/cpuinfo | grep processor | wc -l)/g" nginx.conf

cd conf.d

# Per Site Configuration
cat << _EOL_ > 000_VHOST.conf
server {
    server_name ${ETH0};
    root /var/www/${ETH0};

    # This order might seem weird - this is attempted to match last if rules below fail.
    # http://wiki.nginx.org/HttpCoreModule
    location / {
        try_files $uri $uri/ /index.php?$args;
        index  index.php index.html index.htm;
    }

    # Add trailing slash to */wp-admin requests.
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;

    # Directives to send expires headers and turn off 404 error logging.
    location ~* .(js|css|png|jpg|jpeg|gif|ico)$ {
        expires 24h;
        log_not_found off;
    }

    # Pass all .php files onto a php-fpm/php-fcgi server.
        location ~ .php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+.php)(/.+)$;
        include fastcgi_params;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
    }
}
_EOL_

service nginx start
chkconfig nginx on
################################################################################

################################################################################
# Section8 Reboot

reboot
################################################################################

WordPressインストール(クリックで大きくなります)

# Create DocumentRoot
mkdir -p /var/www/${ETH0}

cd ${HOME}
mkdir bin
cd bin
wget https://raw.githubusercontent.com/nullpopopo/wpdl/master/bin/wpdl

chmod 700 wpdl
cd ${HOME}
bin/wpdl

cd ${HOME}/src/wordpress/current/
tar xzf latest-ja.tar.gz
cd wordpress/
cp -pr * /var/www/${ETH0}

cd /var/www/${ETH0}
cp -p wp-config-sample.php wp-config.php
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

cd /var/www/
chown -R nginx:${USER} ${ETH0}
chmod -R g+w ${ETH0}

 

nginx設定(クリックで大きくなります)

# http://wpdocs.sourceforge.jp/Nginx
cd /etc/nginx/
cp -p nginx.conf nginx.conf.orig

# worker_processesの数をコア数に合わせる
sed -i "s/worker_processes[[:space:]]+[0-9]+/worker_processes $(cat /proc/cpuinfo | grep processor | wc -l)/g" nginx.conf

cd conf.d

# Per Site Configuration
cat << _EOL_ > 000_VHOST.conf
server {
    server_name ${ETH0};
    root /var/www/${ETH0};

    # This order might seem weird - this is attempted to match last if rules below fail.
    # http://wiki.nginx.org/HttpCoreModule
    location / {
        try_files $uri $uri/ /index.php?$args;
        index  index.php index.html index.htm;
    }

    # Add trailing slash to */wp-admin requests.
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;

    # Directives to send expires headers and turn off 404 error logging.
    location ~* .(js|css|png|jpg|jpeg|gif|ico)$ {
        expires 24h;
        log_not_found off;
    }

    # Pass all .php files onto a php-fpm/php-fcgi server.
        location ~ .php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+.php)(/.+)$;
        include fastcgi_params;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
    }
}
_EOL_

service nginx start
chkconfig nginx on

 

再起動

reboot

 

回答つきスライドはこちらになります。

MySQL設定(クリックで大きくなります)

PARAMFILE=${HOME}/.mysql/MySQLPARAM
mkdir ${HOME}/.mysql
chkconfig mysqld on
service mysqld start

# MySQLのrootユーザとパスワードを作成し、パラメーターファイルに格納する。
# 書式は user root 
echo "user root $(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 8)" > ${PARAMFILE}

# WordPressのDBに関してパラメーターファイルに格納する。
# 書式は DBPARAM DB名 DBユーザー名 
echo "DBPARAM ${DBNAME} ${DBUSER} $(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 8)" >> ${PARAMFILE}

# MySQLのrootユーザーのパスワードを設定する。
mysqladmin -u root password "$(grep ^user ${PARAMFILE} | awk '{print $NF}')"

# WordPressのデータベースを作成する。
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') 
-e "create database ${DBNAME} character set utf8;"

# DBユーザー(WordPressデータベース接続用)のパスワードを変数PWに格納する。
PW=$(grep ^DBPARAM ${PARAMFILE} | awk '{print $NF}')

# DBユーザーを作成する。
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') 
-e "GRANT ALL PRIVILEGES on ${DBNAME}.* to ${DBUSER}@localhost identified by "${PW}";"

# mysql_secure_installation
# 匿名ユーザーの削除
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') 
-e "DELETE FROM mysql.user WHERE User='';"

# localhost以外からのrootログイン禁止
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') 
-e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"

# testデータベース削除
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') 
-e "DROP DATABASE test;"

# 権限情報の再読込
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') 
-e "FLUSH PRIVILEGES;"

 

 

PHP設定(クリックで大きくなります)

# php.ini Configuration
cd /etc
cp -p php.ini php.ini.orig
sed -i 's/;date.timezone =/;##--@--##date.timezone =ndate.timezone = Asia/Tokyo/' php.ini

# PHP-FPM Configuration
cd /etc/php-fpm.d
cp -p www.conf www.conf.orig
sed -i 's/^user = apache/;user = apachenuser = nginx/' www.conf
sed -i 's/^group = apache/;group = apachengroup = nginx/' www.conf

service php-fpm start
chkconfig php-fpm on

fail2ban のメール宛先と送信元を変更する

cp -p /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.orig
sed -i 's/you@example.com/root@localhost/g;s/fail2ban@example.com/fail2ban@localhost/g' /etc/fail2ban/jail.conf

iptables設定(クリックで大きくなります)

# 初期化のため一旦iptablesを停止する
service iptables stop
# 受信はすべて破棄する
iptables -P INPUT DROP
# 送信はすべて許可する
iptables -P OUTPUT ACCEPT
# パケット転送はすべて破棄する
iptables -P FORWARD DROP
# localhostからのアクセスをすべて許可
iptables -A INPUT -i lo -j ACCEPT
# 内部から行ったアクセスに対する外部からの返答アクセスを許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 外部からのTCP22番ポート(SSH)へのアクセスを許可
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 外部からのTCP80番ポート(HTTP)へのアクセスを許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 設定を保存
service iptables save
# iptablesを起動
service iptables start
# iptablesをスタートアップ登録する
chkconfig iptables on

パッケージインストール(クリックで大きくなります)

# NGINX
# リポジトリをインストール
yum -y install http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
# mainlineに向き先変更
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
# install
yum -y install nginx

# PHP
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
#rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
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

# MySQL
yum -y install mysql-server