CentOS6.10 に LXCでWebサーバを立てる
はじめに
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
※ 本稿は、10連休というGW中に書き上げ、てっきり投稿していたと思ったものが ※
※ 下書きに保存されていたものです。予めご了承ください。(ドウシテコウナッタ)※
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
ふと、Webサーバが欲しくなった。
特に凝ったものではなく、Wordpressが動けば最悪それでいいレベルである。
しかし、今から新たにWebサーバを立てる環境がない。
現状、EC2などのインスタンスかVPSを借りるしかなく、ここで費用はかけたくない。
ふと横を見ると、そこにはアニメ録画サーバと踏台ノーパソがいるではないか。
両方とも普段は殆ど使っておらず、正直電力の無駄と言っても過言ではないレベルだ。
この余剰環境をうまく使えば、なんとかなるのではないか。
10連休GWという、貴重だが有り余る時間を使って、一つ、おっ始めようじゃないか。
とまあ、洒落込んだ導入を書いたところで力尽きたので、いつもの感じで。
1日かけてきたので、その時のメモです。
決して、最終更新日が2年前だからびっくりして書き始めたんじゃないんだからねw
ちなみに
Foltia Anime Locker (ver4) サーバで Docker を導入して動かしたことはあります。
なので、今回はあえてLXCを選択しています。
Docker導入編は気が向いたら書きます。大分前なので忘れています…
あと、過去記事を見返したら、LXCやってましたね…全然覚えてないです…
目標
Foltia Anime Locker が動作している CentOS6.10 上に
LXC環境で構築したCentOS系コンテナにWebサーバを立てる。
以上。あとはやるだけです。
環境
MySQL は今回お留守番です。入れたければ自分で入れてくださいスタンスです。
ちなみに、Foltiaのバージョンは5以上推奨です。 *1
ver4以下の場合は、外付けのディスクかなにかを用意して、そこにLXCデータを入れるほうが良さそうです。
LXC 導入
基本的には下記Qiita記事のとおりにやればできます。
が、一部ハマったり横道に逸れたりしたので、そのあたりも最後に書いておきます。
コマンド類はすべてrootでの実行を想定しています。最初にrootになっておくことをおすすめします。
$ su - または $ sudo su - のち、 Passwd: <rootパスワード> # id
Foltia の場合は、すでにepelとrpmforgeが入っているので、
何も気にせずにインストールコマンドを実行します。
yum install lxc lxc-templates lxc-doc lxc-libs rsync debootstrap
LXC コンテナ作成
テンプレートもインストールしているので、すぐにコンテナが作れます。
ちなみに、osは合わせたほうが無難らしい*2 ので、
今回はCentOS6にトライ。7の場合は最後に書いています。
lxc-create -n centos6 -t centos -- --release 6
lxcのコマンド系では、 -n
で名前を指定すると
公式に書いてあります。困ったら -n
で名前指定ですね。
起動前に
LXCの起動前に、cgconfigを起動させる必要があるそうです。
service cgconfig start
起動させて置かないと、下記エラーが表示され、LXCコンテナの起動に失敗します。
lxc-start: cgfs.c: cgfs_init: 2335 cgroupfs failed to detect cgroup metadata lxc-start: start.c: lxc_spawn: 903 failed initializing cgroup support lxc-start: start.c: __lxc_start: 1149 failed to spawn 'lxconlxd' lxc-start: lxc_start.c: main: 341 The container failed to start. lxc-start: lxc_start.c: main: 345 Additional information can be obtained by setting the --logfile and --logpriority options.
困ったものよ…
LXCコンテナ 起動
起動前に、下記ファイルに記載のあるRootパスワードをメモること。
忘れるとログインできないので注意。*3
cat /var/lib/lxc/centos6/tmp_root_pass
満を持してようやく起動。簡単。
Qiitaの記事にも書いてありましたが、起動方法は2パターン。
基本的にはバックグラウンド起動になると思いますが、
最初はフォアグラウンドにさせておいたほうが、ログが見やすくて個人的にはおすすめ。
LXCと生涯を共にする(フォアグラウンド起動)
lxc-start -n centos6
→ OS起動時のログが閲覧可能。そのままコンソールに接続したままになる。
切断はゲストの再起動ORプロセスKill
LXCを勝手にさせておく(バックグラウンド起動)
lxc-start -n centos6 -d
→ コンソールへの接続はしない。接続する場合は下記。
lxc-console -n centos6
LXCコンテナ ネットワーク周り調整
ゲストコンテナが起動するも、ネットワークが変。
もしくはそもそもI/Fがいないから起動しない。という状況のはず。
再起動
そういうときは、落ち着いて、ホストOSの再起動 をする。
networkリスタートでNICは認識するので、再起動までは…と思うかもしれないです。
ですが、iptablesに追加NIC(ブリッジ用NIC)の設定が入らず、
結果的に再起動したほうが早いです。
((もし再起動できない場合は、
networkリスタート
orifup virbr0
iptablesの追記
(設定は下記にあり)
をすればなんとか動きそうな予感はします。))
というわけで、ホスト側で再起動します。
## 見ておくといいかも /etc/init.d/iptables status ## 再起動 reboot ---------- ## 見るといいかも /etc/init.d/iptables status
iptables 設定保存
再起動の前後でiptablesを見ると、びっくり。
LXC追加NIC virbr0
向けの設定が入っています。
なので、すかさず保存です。 iptablesに関する操作は下記サイトがおすすめです。
## 同階層に置くと読み込まれるので、完全に対比させておく。 cp -vip /etc/sysconfig/iptables ~/iptables.org ## 表示の確認 iptables-save ## 保存 iptables-save > /etc/sysconfig/iptables
個人的に、iptablesはブロック用途なので停止させるべきと思っていましたが、
転送設定などができるので、今回は活かしておきます。*4
ちなみに、今回私が出くわしたiptablesの設定ファイルは下記です。
[root@foltia ~]# cat /etc/sysconfig/iptables # Generated by iptables-save v1.4.7 on Fri May 3 14:37:19 2019 *mangle :PREROUTING ACCEPT [2945:337681] :INPUT ACCEPT [2929:336881] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [1621:424424] :POSTROUTING ACCEPT [1731:442192] -A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill COMMIT # Completed on Fri May 3 14:37:19 2019 # Generated by iptables-save v1.4.7 on Fri May 3 14:37:19 2019 *nat :PREROUTING ACCEPT [1558:80027] :POSTROUTING ACCEPT [52:12741] :OUTPUT ACCEPT [79:20900] -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535 -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535 -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE COMMIT # Completed on Fri May 3 14:37:19 2019 # Generated by iptables-save v1.4.7 on Fri May 3 14:37:19 2019 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [1621:424424] :RH-Firewall-1-INPUT - [0:0] -A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT -A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT -A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT -A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -d 192.168.122.0/24 -o virbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT -A FORWARD -i virbr0 -o virbr0 -j ACCEPT -A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT -A RH-Firewall-1-INPUT -p igmp -j ACCEPT -A RH-Firewall-1-INPUT -p esp -j ACCEPT -A RH-Firewall-1-INPUT -p ah -j ACCEPT -A RH-Firewall-1-INPUT -d 224.0.0.0/4 -j ACCEPT -A RH-Firewall-1-INPUT -d 224.0.0.251/32 -p udp -m udp --dport 5353 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 137 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 138 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 139 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 445 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 8200 -j ACCEPT -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited COMMIT # Completed on Fri May 3 14:37:19 2019
ここまでくれば、LXCにつないで上げると、
中から外に対しての通信ができるようになるかと。
あとは煮るなり焼くなり好きなようにすればOKです。
まとめ
このあと、シンプルにApacheを入れ、Webサーバとしての第一歩を踏み出すところまでやりました。
後はコンテンツを置いたり、外部公開したり、SSL化したりとするぐらいでしょうか。
(2019/09 追記)
今更公開するものの、現在LXCを組んだサーバ自体が停止中のため、動いていないです。
追加でやったこと言えば、Apacheを入れ、Route53のヘルスチェックを組み、
メンテナンスページをS3においたぐらいでしょうか。
Route53とメンテナンスページの作り方は、情報が数多あるのでここでは略。
私のWebページは永遠のメンテナンス表示となりました。*5
今回はここまで。それでは。