Blend day's Note

思い立ったことをメモする

CentOS6.10 に LXCでWebサーバを立てる

f:id:kayo_tozaki:20190503170823p:plain

はじめに

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
※ 本稿は、10連休というGW中に書き上げ、てっきり投稿していたと思ったものが ※   ※ 下書きに保存されていたものです。予めご了承ください。(ドウシテコウナッタ)※
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

ふと、Webサーバが欲しくなった。
特に凝ったものではなく、Wordpressが動けば最悪それでいいレベルである。

しかし、今から新たにWebサーバを立てる環境がない。
現状、EC2などのインスタンスVPSを借りるしかなく、ここで費用はかけたくない。

ふと横を見ると、そこにはアニメ録画サーバと踏台ノーパソがいるではないか。
両方とも普段は殆ど使っておらず、正直電力の無駄と言っても過言ではないレベルだ。

この余剰環境をうまく使えば、なんとかなるのではないか。
10連休GWという、貴重だが有り余る時間を使って、一つ、おっ始めようじゃないか。

とまあ、洒落込んだ導入を書いたところで力尽きたので、いつもの感じで。
1日かけてきたので、その時のメモです。

決して、最終更新日が2年前だからびっくりして書き始めたんじゃないんだからねw

ちなみに

Foltia Anime Locker (ver4) サーバで Docker を導入して動かしたことはあります。
なので、今回はあえてLXCを選択しています。
Docker導入編は気が向いたら書きます。大分前なので忘れています…

あと、過去記事を見返したら、LXCやってましたね…全然覚えてないです…

kayo-tozaki.hatenablog.com

目標

Foltia Anime Locker が動作している CentOS6.10 上に
LXC環境で構築したCentOS系コンテナにWebサーバを立てる。

以上。あとはやるだけです。

環境

  • Foltia Anime Locker (ver6.1.4 / CentOS6.10)

MySQL は今回お留守番です。入れたければ自分で入れてくださいスタンスです。

ちなみに、Foltiaのバージョンは5以上推奨です。 *1
ver4以下の場合は、外付けのディスクかなにかを用意して、そこにLXCデータを入れるほうが良さそうです。

LXC 導入

基本的には下記Qiita記事のとおりにやればできます。
が、一部ハマったり横道に逸れたりしたので、そのあたりも最後に書いておきます。

qiita.com

コマンド類はすべて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を起動させる必要があるそうです。

qiita.com

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)の設定が入らず、
結果的に再起動したほうが早いです。
((もし再起動できない場合は、

  1. networkリスタートorifup virbr0
  2. iptablesの追記(設定は下記にあり)

をすればなんとか動きそうな予感はします。))

というわけで、ホスト側で再起動します。

## 見ておくといいかも
/etc/init.d/iptables status

## 再起動
reboot

----------

## 見るといいかも
/etc/init.d/iptables status

iptables 設定保存

再起動の前後でiptablesを見ると、びっくり。
LXC追加NIC virbr0 向けの設定が入っています。

なので、すかさず保存です。 iptablesに関する操作は下記サイトがおすすめです。

help.sakura.ad.jp

## 同階層に置くと読み込まれるので、完全に対比させておく。
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

今回はここまで。それでは。

*1:rootパーティションが8GBしかないため。多分コンテナを入れて終わりのレベル。

*2:参考記事を忘れました。。。

*3:chrootでログインすればいけるらしいが、最初からそうはしたくない。

*4:恥ずかしながら初めて知りました。有効活用していこうな…

*5:サーバを起動しない限り。ですが。