不要なPCで最低限のWebサーバを作ってみる

こんにちは、OPTiM Storeの開発チームの半田です。
クラウドでサーバを構築したことはあっても物理サーバを構築したことはないなとふと考え、自宅で簡単にやってみることにしました。
不要なWindows 7のPCがあるので、これをCentOS 8のWebサーバにしてみます。
今回は本当に最低限の工数を想定して、インターネット越しにアクセスして静的なHTMLを表示させることだけを目標にします。

※学習意図の内容のため、実運用に耐えるものではありません。セキュリティや、常時起動の対応を行っておりません。
※一度LinuxにしたWindowsは元には戻せない可能性があります。
※今回CentOS 8を使っていますが、2021年12月31日をもってサポートが終了します。

使用機器

(1) Windows 7
今回CentOS 8になってもらうマシンです。自宅の光回線にwifiで接続しています。 スペックは以下です。

プロセッサ: Intel Core i7 @2.20GHz
メモリ: 8.00GB

(2) MacBookPro
作業・LAN内確認用マシンです。 Windows 7と同じ自宅の光回線にwifiで接続しています。

(3) Androidスマホ
インターネット確認用マシンです。自宅の光回線には繋がず、4G回線を使っています。

Linuxインストール用のブータブルUSBを準備する

作業用MacBookProで、以下のサイトからCentOS 8のisoデータをダウンロードします。
私はCentOS-8.4.2105-x86_64-boot.isoをデスクトップにダウンロードしました。
CentOSダウンロードページ

次にUSBを挿して、その名前を調べます。

$ ls /Volumes
Macintosh HD    HANDA       Recovery

Macintosh HDとRecoveryは元々あるものなので、HANDAだとわかりました。
今度はこのUSBのデバイスファイル名を調べます。

$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk0
   1:                        EFI EFI                     314.6 MB   disk0s1
   2:                 Apple_APFS Container disk1         1.0 TB     disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +1.0 TB     disk1
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD            11.1 GB    disk1s1
   2:                APFS Volume Macintosh HD - Data     253.5 GB   disk1s2
   3:                APFS Volume Preboot                 83.3 MB    disk1s3
   4:                APFS Volume Recovery                533.8 MB   disk1s4
   5:                APFS Volume VM                      1.1 GB     disk1s5

/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *31.0 GB    disk2
   1:                                HANDA               31.0 GB    disk2s1

下の方にありました。この場合/dev/disk2がそれです。
これを指定してディスクを初期化します。

$ diskutil eraseDisk MS-DOS UNTITLED /dev/disk2
〜省略〜
Finished erase on disk2

そしてマウントを解除します。

$ diskutil unMountDisk /dev/disk2
Unmount of all volumes on disk2 was successful

isoデータをただUSBにドラッグ&ドロップしてデータコピーしてもブータブルUSBになりません。ここではddコマンドを使います。

$ sudo dd if=./Desktop/CentOS-8.4.2105-x86_64-boot.iso  of=/dev/disk2 bs=1m
723+0 records in
723+0 records out
758120448 bytes transferred in 115.320908 secs (6574007 bytes/sec)

完成です。
USBを取り出します。

$ diskutil eject /dev/disk2
Disk /dev/disk2 ejected

Windows 7をCentOS 8にする

まずはWindows 7に十分にお別れを言います。(これには中にある必要なデータを退避させたことの確認等を含みます)

覚悟と準備ができたら上記で準備したUSBをWindows 7に挿入して電源を入れます。
すぐに[F2]キーを押してBIOS画面を立ち上げます。
メーカーによって画面の様子が違うと思いますが、起動デバイスの優先順位を指定する画面を探します。
挿入したUSBが下の方の優先順位になっていることが確認できます。

これを1位にずらします。

[F10]キーで保存して、再起動すると以下のような画面になるので[Install CentOS Linux 8]を選択します。

しばらく待つと言語選択画面が出るので日本語を選択し、インストール概要に移ります。 ビックリマークの付いている項目が残っていると[インストールの開始]が非活性なので、一つずつ潰します。
特に[インストールソース]がなぜエラーになっているのかわかりませんが、先に[ネットワークとホスト名]でwifi経由でインターネットに接続をしていればダウンロードし直せます。
今回は以下をセットしました。

(http://) ftp.riken.jp/Linux/centos/8.4.2105/BaseOS/x86_64/os/

全ての入力が完了すると[インストールの開始]が活性化するので選択します。

しばらく待つとやっとCentOS 8のトップ画面がお目見えします。

最低限のWebサーバに仕立て上げる

端末を開いて、Apacheをダウンロードします。

sudo dnf -y install httpd

ドキュメントルートを設定ファイルから調べます。

$ cat /etc/httpd/conf/httpd.conf | grep "^DocumentRoot"
DocumentRoot "/var/www/html"

インデックスファイル名を調べます。

$ cat /etc/httpd/conf/httpd.conf | grep "DirectoryIndex "
        DirectoryIndex index.html

この/var/www/htmlindex.htmlを作成し、以下を書き込みます。

<div>Hello!OPTiM</div>

Apacheを起動します。

sudo systemctl start httpd 

現在のファイヤーウォールを確認してservices欄にhttpがないことを確認します。

$ sudo firewall-cmd --list-all --permanent
public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

httpを許可します。

$ sudo firewall-cmd --add-service=http --zone=public --permanent
success

firewalldを再起動します。

$ sudo firewall-cmd --reload
success

httpが許可されていることを確認します。

$ sudo firewall-cmd --list-all --permanent
public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: cockpit dhcpv6-client http ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

LAN内で確認する

インターフェースを調べてIPを確認します。

$ ifconfig
enp10s0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 50:26:90:a0:f0:8d  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 94  bytes 419939 (410.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 94  bytes 419939 (410.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:50:9b:d5  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlp11s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.3.9  netmask 255.255.255.0  broadcast 192.168.3.255
        inet6 fe80::5831:fcea:689f:b007  prefixlen 64  scopeid 0x20<link>
        inet6 2400:2411:8583:b800:7380:9e2e:45b1:29ee  prefixlen 64  scopeid 0x0<global>
        ether 74:e5:0b:bc:04:66  txqueuelen 1000  (Ethernet)
        RX packets 50340  bytes 65532624 (62.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 24338  bytes 4134984 (3.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

RUNNINGになっているloでない方がそれでプライベートIPが192.168.3.9なので、MacBookProのブラウザから接続します。

見れました。

ルータの設定を変更して、インターネットから確認する

ルータによって設定方法が違いますが、以下のような内容に設定します。

プロトコル WAN側ポート番号 LAN側ポート番号 転送先IPアドレス
TCP 80-80 80-80 192.168.3.9

ルータからグローバルIPを確認して、Androidスマホから4G回線経由で接続します。

見れました。
ルータの開いたポートは必ず閉じてください。

まとめ

結構長い工程でしたが、これに比べればやっぱりクラウドは楽だなと思いました。

オプティムでは、一緒に働く仲間を募集しています。興味のある方は、こちらをご覧ください。
www.optim.co.jp