CentOS 6.2 サーバー構築手順
今まで何回かLinux構築やってて前の記事も古くなってきたので、ここらで新しく記事を書きなおすことにした。そして色々なミドルウェアの入れ方も一緒に書いておく。下記はその一覧。
目次
サーバーの前準備
パッケージの更新
何はともあれインストールされているパッケージの更新を行う。
# yum -y update
ファイアウォールの設定
余分なポートは閉じる。解放ポートの追加/削除は適宜自分で設定すること。このスクリプトはこちらを参考にさせてもらった。
俺史上最強のiptablesをさらす - Qiita
iptables.sh を下記のように作成。
# vim /etc/sysconfig/iptables.sh
#!/bin/bash ########################################################### # このスクリプトの特徴 # # 受信・通過については基本的に破棄し、ホワイトリストで許可するものを指定する。 # 送信については基本的に許可する。ただし、サーバが踏み台になり外部のサーバに迷惑をかける可能性があるので、 # 心配な場合は、送信も受信同様に基本破棄・ホワイトリストで許可するように書き換えると良い。 ########################################################### ########################################################### # 用語の統一 # わかりやすさのためルールとコメントの用語を以下に統一する # ACCEPT : 許可 # DROP : 破棄 # REJECT : 拒否 ########################################################### ########################################################### # チートシート # # -A, --append 指定チェインに1つ以上の新しいルールを追加 # -D, --delete 指定チェインから1つ以上のルールを削除 # -P, --policy 指定チェインのポリシーを指定したターゲットに設定 # -N, --new-chain 新しいユーザー定義チェインを作成 # -X, --delete-chain 指定ユーザー定義チェインを削除 # -F テーブル初期化 # # -p, --protocol プロコトル プロトコル(tcp、udp、icmp、all)を指定 # -s, --source IPアドレス[/mask] 送信元のアドレス。IPアドレスorホスト名を記述 # -d, --destination IPアドレス[/mask] 送信先のアドレス。IPアドレスorホスト名を記述 # -i, --in-interface デバイス パケットが入ってくるインターフェイスを指定 # -o, --out-interface デバイス パケットが出ていくインターフェイスを指定 # -j, --jump ターゲット 条件に合ったときのアクションを指定 # -t, --table テーブル テーブルを指定 # -m state --state 状態 パケットの状態を条件として指定 # stateは、 NEW、ESTABLISHED、RELATED、INVALIDが指定できる # ! 条件を反転(〜以外となる) ########################################################### # パス PATH=/sbin:/usr/sbin:/bin:/usr/bin ########################################################### # IPの定義 # 必要に応じて定義する。定義しなくても動作する。 ########################################################### # 内部ネットワークとして許可する範囲 # LOCAL_NET="xxx.xxx.xxx.xxx/xx" # 内部ネットワークとして一部制限付きで許可する範囲 # LIMITED_LOCAL_NET="xxx.xxx.xxx.xxx/xx" # 全てのIPを表す設定を定義 # ANY="0.0.0.0/0" # 信頼可能ホスト(配列) # ALLOW_HOSTS=( # "xxx.xxx.xxx.xxx" # "xxx.xxx.xxx.xxx" # "xxx.xxx.xxx.xxx" # ) # 無条件破棄するリスト(配列) # DENY_HOSTS=( # "xxx.xxx.xxx.xxx" # "xxx.xxx.xxx.xxx" # "xxx.xxx.xxx.xxx" # ) ########################################################### # ポート定義 ########################################################### SSH=22 FTP=20,21 DNS=53 SMTP=25,465,587 POP3=110,995 IMAP=143,993 HTTP=80,443,8080,8443 IDENT=113 NTP=123 DBPORT=3306,6379,27017 NET_BIOS=135,137,138,139,445 DHCP=67,68 ########################################################### # 関数 ########################################################### # iptablesの初期化, すべてのルールを削除 initialize() { iptables -F # テーブル初期化 iptables -X # チェーンを削除 iptables -Z # パケットカウンタ・バイトカウンタをクリア iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT } # ルール適用後の処理 finailize() { /etc/init.d/iptables save && # 設定の保存 /etc/init.d/iptables restart && # 保存したもので再起動してみる return 0 return 1 } # 開発用 if [ "$1" == "dev" ] then iptables() { echo "iptables $@"; } finailize() { echo "finailize"; } fi ########################################################### # iptablesの初期化 ########################################################### initialize ########################################################### # ポリシーの決定 ########################################################### iptables -P INPUT DROP # すべてDROP。すべての穴をふさいでから必要なポートを空けていくのが良い。 iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP ########################################################### # 信頼可能なホストは許可 ########################################################### # ローカルホスト # lo はローカルループバックのことで自分自身のホストを指す iptables -A INPUT -i lo -j ACCEPT # SELF -> SELF # ローカルネットワーク # $LOCAL_NET が設定されていれば LAN上の他のサーバとのやり取りを許可する if [ "$LOCAL_NET" ] then iptables -A INPUT -p tcp -s $LOCAL_NET -j ACCEPT # LOCAL_NET -> SELF fi # 信頼可能ホスト # $ALLOW_HOSTS が設定されていれば そのホストとのやり取りを許可する if [ "${ALLOW_HOSTS[@]}" ] then for allow_host in ${ALLOW_HOSTS[@]} do iptables -A INPUT -p tcp -s $allow_host -j ACCEPT # allow_host -> SELF done fi ########################################################### # $DENY_HOSTSからのアクセスは破棄 ########################################################### if [ "${DENY_HOSTS[@]}" ] then for host in ${DENY_HOSTS[@]} do iptables -A INPUT -s $ip -m limit --limit 1/s -j LOG --log-prefix "deny_host: " iptables -A INPUT -s $ip -j DROP done fi ########################################################### # セッション確立後のパケット疎通は許可 ########################################################### iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ########################################################### # 攻撃対策: Stealth Scan ########################################################### iptables -N STEALTH_SCAN # "STEALTH_SCAN" という名前でチェーンを作る iptables -A STEALTH_SCAN -j LOG --log-prefix "stealth_scan_attack: " iptables -A STEALTH_SCAN -j DROP # ステルススキャンらしきパケットは "STEALTH_SCAN" チェーンへジャンプする iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags ALL NONE -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j STEALTH_SCAN ########################################################### # 攻撃対策: フラグメントパケットによるポートスキャン,DOS攻撃 # namap -v -sF などの対策 ########################################################### iptables -A INPUT -f -j LOG --log-prefix 'fragment_packet:' iptables -A INPUT -f -j DROP ########################################################### # 攻撃対策: Ping of Death ########################################################### # 毎秒1回を超えるpingが10回続いたら破棄 iptables -N PING_OF_DEATH # "PING_OF_DEATH" という名前でチェーンを作る iptables -A PING_OF_DEATH -p icmp --icmp-type echo-request \ -m hashlimit \ --hashlimit 1/s \ --hashlimit-burst 10 \ --hashlimit-htable-expire 300000 \ --hashlimit-mode srcip \ --hashlimit-name t_PING_OF_DEATH \ -j RETURN # 制限を超えたICMPを破棄 iptables -A PING_OF_DEATH -j LOG --log-prefix "ping_of_death_attack: " iptables -A PING_OF_DEATH -j DROP # ICMP は "PING_OF_DEATH" チェーンへジャンプ iptables -A INPUT -p icmp --icmp-type echo-request -j PING_OF_DEATH ########################################################### # 攻撃対策: SYN Flood Attack # この対策に加えて Syn Cookie を有効にすべし。 ########################################################### iptables -N SYN_FLOOD # "SYN_FLOOD" という名前でチェーンを作る iptables -A SYN_FLOOD -p tcp --syn \ -m hashlimit \ --hashlimit 200/s \ --hashlimit-burst 3 \ --hashlimit-htable-expire 300000 \ --hashlimit-mode srcip \ --hashlimit-name t_SYN_FLOOD \ -j RETURN # 解説 # -m hashlimit ホストごとに制限するため limit ではなく hashlimit を利用する # --hashlimit 200/s 秒間に200接続を上限にする # --hashlimit-burst 3 上記の上限を超えた接続が3回連続であれば制限がかかる # --hashlimit-htable-expire 300000 管理テーブル中のレコードの有効期間(単位:ms # --hashlimit-mode srcip 送信元アドレスでリクエスト数を管理する # --hashlimit-name t_SYN_FLOOD /proc/net/ipt_hashlimit に保存されるハッシュテーブル名 # -j RETURN 制限以内であれば、親チェーンに戻る # 制限を超えたSYNパケットを破棄 iptables -A SYN_FLOOD -j LOG --log-prefix "syn_flood_attack: " iptables -A SYN_FLOOD -j DROP # SYNパケットは "SYN_FLOOD" チェーンへジャンプ iptables -A INPUT -p tcp --syn -j SYN_FLOOD ########################################################### # 攻撃対策: HTTP DoS/DDoS Attack ########################################################### iptables -N HTTP_DOS # "HTTP_DOS" という名前でチェーンを作る iptables -A HTTP_DOS -p tcp -m multiport --dports $HTTP \ -m hashlimit \ --hashlimit 1/s \ --hashlimit-burst 100 \ --hashlimit-htable-expire 300000 \ --hashlimit-mode srcip \ --hashlimit-name t_HTTP_DOS \ -j RETURN # 解説 # -m hashlimit ホストごとに制限するため limit ではなく hashlimit を利用する # --hashlimit 1/s 秒間1接続を上限とする # --hashlimit-burst 100 上記の上限を100回連続で超えると制限がかかる # --hashlimit-htable-expire 300000 管理テーブル中のレコードの有効期間(単位:ms # --hashlimit-mode srcip 送信元アドレスでリクエスト数を管理する # --hashlimit-name t_HTTP_DOS /proc/net/ipt_hashlimit に保存されるハッシュテーブル名 # -j RETURN 制限以内であれば、親チェーンに戻る # 制限を超えた接続を破棄 iptables -A HTTP_DOS -j LOG --log-prefix "http_dos_attack: " iptables -A HTTP_DOS -j DROP # HTTPへのパケットは "HTTP_DOS" チェーンへジャンプ iptables -A INPUT -p tcp -m multiport --dports $HTTP -j HTTP_DOS ########################################################### # 攻撃対策: IDENT port probe # identを利用し攻撃者が将来の攻撃に備えるため、あるいはユーザーの # システムが攻撃しやすいかどうかを確認するために、ポート調査を実行 # する可能性があります。 # DROP ではメールサーバ等のレスポンス低下になるため REJECTする ########################################################### iptables -A INPUT -p tcp -m multiport --dports $IDENT -j REJECT --reject-with tcp-reset ########################################################### # 攻撃対策: SSH Brute Force # SSHはパスワード認証を利用しているサーバの場合、パスワード総当り攻撃に備える。 # 1分間に5回しか接続トライをできないようにする。 # SSHクライアント側が再接続を繰り返すのを防ぐためDROPではなくREJECTにする。 # SSHサーバがパスワード認証ONの場合、以下をアンコメントアウトする ########################################################### iptables -A INPUT -p tcp --syn -m multiport --dports $SSH -m recent --name ssh_attack --set iptables -A INPUT -p tcp --syn -m multiport --dports $SSH -m recent --name ssh_attack --rcheck --seconds 60 --hitcount 5 -j LOG --log-prefix "ssh_brute_force: " iptables -A INPUT -p tcp --syn -m multiport --dports $SSH -m recent --name ssh_attack --rcheck --seconds 60 --hitcount 5 -j REJECT --reject-with tcp-reset ########################################################### # 攻撃対策: FTP Brute Force # FTPはパスワード認証のため、パスワード総当り攻撃に備える。 # 1分間に5回しか接続トライをできないようにする。 # FTPクライアント側が再接続を繰り返すのを防ぐためDROPではなくREJECTにする。 # FTPサーバを立ち上げている場合、以下をアンコメントアウトする ########################################################### # iptables -A INPUT -p tcp --syn -m multiport --dports $FTP -m recent --name ftp_attack --set # iptables -A INPUT -p tcp --syn -m multiport --dports $FTP -m recent --name ftp_attack --rcheck --seconds 60 --hitcount 5 -j LOG --log-prefix "ftp_brute_force: " # iptables -A INPUT -p tcp --syn -m multiport --dports $FTP -m recent --name ftp_attack --rcheck --seconds 60 --hitcount 5 -j REJECT --reject-with tcp-reset ########################################################### # 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットは破棄 ########################################################### iptables -A INPUT -d 192.168.1.255 -j LOG --log-prefix "drop_broadcast: " iptables -A INPUT -d 192.168.1.255 -j DROP iptables -A INPUT -d 255.255.255.255 -j LOG --log-prefix "drop_broadcast: " iptables -A INPUT -d 255.255.255.255 -j DROP iptables -A INPUT -d 224.0.0.1 -j LOG --log-prefix "drop_broadcast: " iptables -A INPUT -d 224.0.0.1 -j DROP ########################################################### # 全ホスト(ANY)からの入力許可 ########################################################### # ICMP: ping に応答する設定 iptables -A INPUT -p icmp -j ACCEPT # ANY -> SELF # HTTP, HTTPS iptables -A INPUT -p tcp -m multiport --dports $HTTP -j ACCEPT # ANY -> SELF # SSH: ホストを制限する場合は TRUST_HOSTS に信頼ホストを書き下記をコメントアウトする iptables -A INPUT -p tcp -m multiport --dports $SSH -j ACCEPT # ANY -> SEL # FTP # iptables -A INPUT -p tcp -m multiport --dports $FTP -j ACCEPT # ANY -> SELF # DNS # iptables -A INPUT -p tcp -m multiport --sports $DNS -j ACCEPT # ANY -> SELF # iptables -A INPUT -p udp -m multiport --sports $DNS -j ACCEPT # ANY -> SELF # SMTP # iptables -A INPUT -p tcp -m multiport --sports $SMTP -j ACCEPT # ANY -> SELF # POP3 # iptables -A INPUT -p tcp -m multiport --sports $POP3 -j ACCEPT # ANY -> SELF # IMAP # iptables -A INPUT -p tcp -m multiport --sports $IMAP -j ACCEPT # ANY -> SELF ########################################################### # ローカルネットワーク(制限付き)からの入力許可 ########################################################### if [ "$LIMITED_LOCAL_NET" ] then # SSH iptables -A INPUT -p tcp -s $LIMITED_LOCAL_NET -m multiport --dports $SSH -j ACCEPT # LIMITED_LOCAL_NET -> SELF # FTP iptables -A INPUT -p tcp -s $LIMITED_LOCAL_NET -m multiport --dports $FTP -j ACCEPT # LIMITED_LOCAL_NET -> SELF # 各種DB iptables -A INPUT -p tcp -s $LIMITED_LOCAL_NET -m multiport --dports $DBPORT -j ACCEPT # LIMITED_LOCAL_NET -> SELF fi ########################################################### # 特定ホストからの入力許可 ########################################################### if [ "$ZABBIX_IP" ] then # Zabbix関連を許可 iptables -A INPUT -p tcp -s $ZABBIX_IP --dport 10050 -j ACCEPT # Zabbix -> SELF fi ########################################################### # それ以外 # 上記のルールにも当てはまらなかったものはロギングして破棄 ########################################################### iptables -A INPUT -j LOG --log-prefix "drop: " iptables -A INPUT -j DROP ########################################################### # SSH 締め出し回避策 # 30秒間スリープしてその後 iptables をリセットする。 # SSH が締め出されていなければ、 Ctrl-C を押せるはず。 ########################################################### trap 'finailize && exit 0' 2 # Ctrl-C をトラップする echo "In 30 seconds iptables will be automatically reset." echo "Don't forget to test new SSH connection!" echo "If there is no problem then press Ctrl-C to finish." sleep 30 echo "rollback..." initialize
以上をコピペして、iptables を起動させる。
# chmod u+x /etc/sysconfig/iptables.sh # /etc/sysconfig/iptables.sh
iptables.sh を実行して Ctrl-C を入力すると設定が保存されるが、新しい ssh の接続が可能かどうか確認してから保存すること。締め出しをくらうと、遠隔操作は二度と出来なくなる。
それから、hosts.allow と hosts.deny も編集しておく。
# vim /etc/hosts.allow
ALL : 127.0.0.1 sshd : ALL
# vim /etc/hosts.deny
ALL : ALL
ユーザーの作成/設定
こちらのブログを参考にした。
VPS 借りたら、せめてこれくらいはやっとけというセキュリティ設定 | dogmap.jp
リンク先の記事の方がセキュリティしっかりしているので、ガッチリやりたい人はそっちを参照のこと。
まずはユーザー作成。ここでは "mogera" というユーザーを作成。
# useradd mogera # passwd mogera
このユーザーに sudo 権限を渡したい場合は wheel グループを追加する。
# usermod -G wheel mogera
※usermod -G でのグループ登録は、追加ではなくて上書きのため今まで参加していたグループも消えてしまう。今までのグループも保持したい場合は、下記のようにグループを確認して、そのグループも追加してやる必要がある。
# groups mogera mogera : mogera svn git unko # usermod -G svn,git,unko,wheel mogera # ← このように、グループをカンマで区切って追加する。ユーザーの初期グループは指定する必要はない。 # groups mogera #確認 mogera : mogera svn git unko wheel
そして、wheel には sudoer 権限を与える。
# /usr/local/sbin/visudo
visudo の
# %wheel ALL=(ALL) ALL
この行のコメントアウトを外す。この時点で、作成したユーザーで sudo ができるかを確認しておくこと!sudo 権限の付与に失敗している場合はサーバー設定が行えなくなる。
root でのログインを禁止。
# vim /etc/ssh/sshd_config
#PermitRootLogin yes ↓ 以下のように変更 PermitRootLogin no
sshd を再起動。
# service sshd restart
必要なライブラリのインストール
ここまできたら一端ログアウトして、ユーザーで sudo しながら作業をすすめる。
epel リポジトリの追加
さくらのVPSではすでに入ってるけど、一応追加方法を書いておく。
$ cd /usr/local/src/ $ sudo yum install wget # wget がない場合はyumからいれておく $ sudo wget http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-7.noarch.rpm $ sudo rpm -ivh epel-release-6-7.noarch.rpm $ sudo yum -y update epel-release # epel-releaseアップデート
epel 入れたらとりあえず tmux とか git とか入れておく。
$ sudo yum -y install tmux git
ライブラリのインストール
ミドルウェアのインストールに必要なライブラリを入れていく。さくらのVPSだと意外と揃っているので、半分ぐらいいらないかも。他のVPSだと必要だったりするし、重複して指定する分には「すでに最新版があります」みたいなことを言われるだけなので、全部ぶっこんでインストールしてOK。
$ cd /usr/local/src $ yum install -y \ gettext gettext-devel ncurses-devel libpng-devel libjpeg-devel \ freetype-devel libxml2-devel curl-devel gd gd-devel cmake \ openssl libevent-devel libxml2-devel libmcrypt-devel openssl-devel \ bzip2-devel t1lib-devel gmp-devel libicu-devel aspell-devel \ readline-devel libtidy-devel libxslt-devel gcc gcc-c++ wget bison tcl make
zlib 入れる。
$ sudo wget http://zlib.net/zlib-1.2.7.tar.gz $ sudo tar zxf zlib-1.2.7.tar.gz $ cd zlib-1.2.7 $ sudo ./configure --shared && make all install $ cd ../
MySQLのインストール
MySQL 用のユーザーを作成する。
$ sudo /usr/sbin/groupadd mysql $ sudo /usr/sbin/useradd -d /home/mysql -g mysql -r -s /sbin/nologin mysql
ソースファイルをダウンロード & コンパイルする。
$ cd /usr/local/src/ $ sudo wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.27.tar.gz/from/http://cdn.mysql.com/ $ sudo tar zxf mysql-5.5.27.tar.gz $ cd mysql-5.5.27 $ sudo cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci $ sudo make $ sudo make install $ sudo mkdir /usr/local/mysql/etc $ cd /usr/local/mysql $ sudo chown -R mysql:mysql /usr/local/mysql $ sudo ./scripts/mysql_install_db --user=mysql --skip-name-resolve $ sudo cp /usr/local/src/mysql-5.5.27/support-files/my-medium.cnf /usr/local/mysql/etc/my.cnf $ sudo chown -R root . $ sudo chown -R mysql:mysql /usr/local/mysql/data $ sudo install -o root -g root -m 755 /usr/local/src/mysql-5.5.27/support-files/mysql.server /etc/rc.d/init.d/mysql $ sudo /sbin/chkconfig --add mysql # サーバー起動時に稼働させたい場合 $ sudo /sbin/chkconfig --list mysql # 起動スクリプト確認 $ cd /usr/local/src
一応 .bashrc にもパスを記述する
# vim ~/.bashrc 以下2行を一番下に追記 --------------------------------------- PATH=$PATH:/usr/local/mysql/bin export PATH --------------------------------------- # source ~/.bashrc
これでインストール完了。
起動/終了: $ sudo /etc/init.d/mysql (start|stop|restart) ログイン $ mysql -u ユーザー -p
一応パスワードを変更しておく。
# sudo /etc/init.d/mysql start # mysql -u root root> SET PASSWORD FOR root@localhost=PASSWORD('hoge'); root> exit; # mysql -u root # これで弾かれることを確認 # sudo /etc/init.d/mysql stop # 一応停止しておく # cd /usr/local/src
このへんのインストール後のセットアップは、下記のコマンドでやってくれる。便利。
$ sudo mysql_secure_installation
Apacheのインストール
Apache 用のユーザーを作成する。めんどくさいので、Webサーバー系の仕事をするユーザーは www-data でまとめたほうがいいと思う。(Nginx とか FPM-PHP のユーザーの切り替えが面倒)
$ sudo /usr/sbin/groupadd www-data $ sudo /usr/sbin/useradd -d /home/www-data -g www-data -r -s /sbin/nologin www-data
それからダウンロード/インストール
$ cd /usr/local/src/ $ sudo wget http://ftp.riken.jp/net/apache//httpd/httpd-2.2.23.tar.gz $ sudo tar zxf httpd-2.2.23.tar.gz $ cd httpd-2.2.23 $ sudo ./configure \ --with-libdir=lib64 --prefix=/usr/local/apache2 --with-layout=PHP --with-pear \ --with-apxs2=/usr/local/apache2/bin/apxs --enable-calendar \ --enable-bcmath --with-gmp --enable-exif --with-mcrypt \ --with-mhash --with-zlib --with-bz2 --enable-zip --enable-ftp \ --enable-mbstring --with-iconv --enable-intl --with-icu-dir=/usr \ --with-gettext --with-pspell --enable-sockets --with-openssl \ --with-curl --with-curlwrappers --with-gd --enable-gd-native-ttf \ --with-jpeg-dir=/usr --with-png-dir=/usr --with-zlib-dir=/usr \ --with-xpm-dir=/usr --with-freetype-dir=/usr --with-t1lib=/usr \ --with-libxml-dir=/usr --with-mysql=mysqlnd --with-mysqli=mysqlnd \ --with-pdo-mysql=mysqlnd --enable-soap --with-xmlrpc --with-xsl \ --with-tidy=/usr --with-readline --enable-pcntl --enable-sysvshm \ --enable-sysvmsg --enable-shmop --enable-ssl=shared --enable-rewrite \ --enable-deflate --enable-headers $ sudo make $ sudo make install $ sudo chown -R www-data:www-data /usr/local/apache2
Apache の設定ファイルを編集する。
$ sudo vim /usr/local/apache2/conf/httpd.conf # 実行ユーザーを変更 ------------------------------------------------- User daemon Group daemon ↓ User www-data Group www-data ------------------------------------------------- # index を html から php に変更 ------------------------------------------------- <IfModule dir_module> DirectoryIndex index.html </IfModule> ↓ <IfModule dir_module> DirectoryIndex index.php </IfModule> ------------------------------------------------- # バーチャルホストを設定する場合は、デフォルトのバーチャルホストは Basic 認証をかけて見れないようにする。 # (追記) ------------------------------------------------- NameVirtualHost *:80 <VirtualHost *:80> ServerAdmin admin@example.com DocumentRoot "/usr/local/apache2/htdocs" ServerName dummy.example.com ServerAlias dummy.example.com ErrorLog "logs/dummy-host.error_log" CustomLog "logs/dummy-host.access_log" common <Directory "/usr/local/apache2/htdocs"> Options All AllowOverride All </Directory> </VirtualHost> ------------------------------------------------- # 追加設定ファイル用のフォルダもIncludeしておく ------------------------------------------------- Include conf.d/*.conf ------------------------------------------------- $ sudo mkdir /usr/local/apache2/conf.d $ sudo chown www-data:www-data /usr/local/apache2/conf.d
Basic認証をかける場合は下記を実行する。
$ sudo vim /usr/local/apache2/htdocs/.htaccess # Basic 認証用に .htaccess を作成、追記 ------------------------------------------------- AuthUserFile /usr/local/apache2/.htpasswd AuthGroupFile /dev/null AuthName "Please enter your ID and password" AuthType Basic require valid-user ------------------------------------------------- $ sudo /usr/local/apache2/bin/htpasswd -cb /usr/local/apache2/.htpasswd [ユーザー名] [パスワード] # パスワードファイル作成
起動スクリプトをソース内からコピー&編集。
$ sudo cp /usr/local/src/httpd-2.2.23/build/rpm/httpd.init /etc/rc.d/init.d/httpd $ sudo vim /etc/init.d/httpd ------------------------------------------------- httpd=${HTTPD-/usr/sbin/httpd} ↓ httpd=/usr/local/apache2/bin/httpd pidfile=${PIDFILE-/var/log/httpd/httpd.pid} ↓ pidfile=/usr/local/apache2/logs/httpd.pid CONFFILE=/etc/httpd/conf/httpd.conf ↓ CONFFILE=/usr/local/apache2/conf/httpd.conf -------------------------------------------------
これで動くか確認。ブラウザからのアクセスもチェックすること。
$ sudo /etc/init.d/httpd (start|stop|restart)
ここまでOKだったら、設定ファイルをGitで管理する。
$ cd /usr/local/apache2/conf $ sudo git init $ sudo git add . $ sudo git commit -m "Initial commit" $ cd /usr/local/apache2/conf.d $ sudo git init $ sudo git add . $ sudo git commit -m "Initial commit"
自動起動の設定も行っておく。
$ sudo /sbin/chkconfig --add httpd $ sudo /sbin/chkconfig httpd on $ sudo /sbin/chkconfig --list httpd
PHPのインストール
$ cd /usr/local/src/ $ sudo wget http://www.php.net/get/php-5.4.7.tar.gz/from/this/mirror $ tar zxf php-5.4.7.tar.gz $ cd php-5.4.7 $ sudo ./configure --with-libdir=lib64 --prefix=/usr/local/php547 --with-layout=PHP \ --with-pear --with-apxs2=/usr/local/apache2/bin/apxs --enable-calendar \ --enable-bcmath --with-gmp --enable-exif --with-mcrypt --with-mhash \ --with-zlib --with-bz2 --enable-zip --enable-ftp --enable-mbstring --with-iconv \ --enable-intl --with-icu-dir=/usr --with-gettext --with-pspell --enable-sockets \ --with-openssl --with-curl --with-curlwrappers --with-gd --enable-gd-native-ttf \ --with-jpeg-dir=/usr --with-png-dir=/usr --with-zlib-dir=/usr --with-xpm-dir=/usr \ --with-freetype-dir=/usr --with-t1lib=/usr --with-libxml-dir=/usr \ --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd \ --enable-soap --with-xmlrpc --with-xsl --with-tidy=/usr --with-readline \ --enable-pcntl --enable-sysvshm --enable-sysvmsg --enable-shmop \ --enable-cli --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data \ $ sudo make $ sudo make test $ sudo make install
Apache にモジュールを読み込ませる。
$ sudo vim /usr/local/apache2/conf/httpd.conf
下記を追記 ---------------------------------------- LoadModule php5_module modules/libphp5.so AddType application/x-httpd-php .php ----------------------------------------
php.ini をコピーする。本番環境なら php.ini-production を。
$ cd /usr/local/src/php-5.4.7 $ sudo cp php.ini-development /usr/local/php547/lib/php.ini
php.ini の設定を編集する。(デフォルトのタイムゾーン指定)
$ sudo vim /usr/local/php547/lib/php.ini
追記
date.timezone = "Asia/Tokyo"
シンボリックリンク作って、パスを通す。
$ sudo ln -s /usr/local/php547 /usr/local/php
追記
$ vim ~/.bashrc
PATH=$PATH:/usr/local/php/bin export PATH
どこぞのディレクトリに index.php とか書いて phpinfo 表示させて、Apache 再起動して問題なければOK.
httpd.conf が更新されたので一応 git コミットする。
$ cd /usr/local/apache2/conf $ sudo git add httpd.conf $ sudo git commit -m "add php"
Nginxのインストール
公式サイトでRPMを配布しているのでRPMでインストールする。
$ cd /usr/local/src $ sudo wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm $ sudo rpm -ivh nginx-release-centos-6-0.el6.ngx.noarch.rpm $ sudo yum -y install nginx
設定ファイルは /etc/nginx/conf.d に書く。
Redisのインストール
同じようにソースダウンロードしてビルドしてインストールして終わり。
$ cd /usr/local/src $ sudo wget http://redis.googlecode.com/files/redis-2.4.17.tar.gz $ sudo tar zxf redis-2.4.17.tar.gz $ cd redis-2.4.17 $ sudo make $ sudo make test $ sudo make install
起動スクリプトが必要な場合は
$ cd utils
$ sudo ./install_server.sh
を実行するといろいろ聞かれるので、必要情報を設定すると起動スクリプトができあがる。
上記のインストール方法だと、全部デフォルトで大丈夫。
同じサーバーでRedisを別々のサービスで使いたい場合はポートを分けて起動するのもひとつの手なので、このインストールスクリプトは消さずに置いといたほうがいいとおもう。
この起動スクリプトをインストールすると、起動は下記のようになる。
$ sudo /etc/init.d/redis_[ポート番号:デフォルト6379] (start|stop|restart)
MongoDBのインストール
MongoDB はソースからのビルドに失敗するので、パッケージを利用する。
まずはリポジトリの追加。
$ sudo vim /etc/yum.repos.d/10gen.repo
このファイルに下記をコピペ
[10gen] name=10gen Repository baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64 gpgcheck=0 enabled=1
そして yum でインストール実行
$ sudo yum install mongo-10gen mongo-10gen-server
これで下記のコマンドが使えるようになる。
- mongo
- mongodump
- mongorestore
- mongoexport
- mongoimport
- mongostat
- mongotop
- bsondump
起動/停止は下記
$ sudo /etc/init.d/mongod (start|stop|restart) または $ sudo service mongod (start|stop|restart)
サーバー再起動時に起動するように設定するには
$ sudo chkconfig mongod on
とかやっとけばいい。