連載:Azure で学ぶインフラ入門2(Webサーバー構築編)
1. Webサーバーを構築する
前回の記事でネットワークの構築が終わりましたが、現実世界でいうと、インターネット接続の契約が済み、ルータやハブの設置・配線が完了したような状態です。
全然関係ありませんが、私のアパートの部屋にはインターネット回線が二つ配線されています。まだルータとかその辺の常識がさっぱり無かったあの頃の私は、インターネット契約代理店の営業マンに見事に騙され、すでに設置してある回線に重ねるようにもう一本、配線工事をお願いしてしまいました。悔しい。
気を取り直しまして、この記事では、仮想ネットワーク上にWebサーバーを構築していきます。
1-1. 仮想サーバの構築
前章で作成したパブリックサブネットの中に、仮想サーバを立てていきます。
冒頭の構成図でいうと、まずはWebサーバを立てていきます。
仮想サーバは、Azure Virtual Machines を用いて作成します。長いのでこれ以降 VM と表記します。
VMには、パブリックサブネット内で利用可能な「プライベートIPアドレス」を割り当てます。
パブリックサブネットは「10.0.0.0/24」のCIDRブロックにしたので、「10.0.0.0」〜「10.0.0.255」のいずれかを割り当てることになります。
しかし、プライベートIPアドレスはインターネットとの接続に用いることはできません。ですので、VMを起動するときは、もう一つのIPアドレス「パブリックIPアドレス」を設定します(このパブリックIPアドレスは Azureに割り当てられているIPアドレスブロックのうち、適当なものが使われます)。
つまり、VMは「仮想ネットワーク(内部ネットワーク)で内部と通信するためのプライベートIPアドレス」と「インターネットで外部と通信するためのパブリックIPアドレス」の2つを持ちます。
VMの作成
それではVMを作成していきます。
左端の「Virtual Machines」を選択し、VMの一覧パネルが開いたら、ページ上部の「追加」をクリックします。
すると、右側にOS選択のパネルが現れます。
今回はCentOSを利用しますので、検索ボックスに「centos」と入力して検索しましょう。
するとリストの一番上に CentOS based 7.4 が出てくるので、それを選択しましょう。
続いて基本設定をしていきます。
名前は「Web-Server」、ディスクは「HDD」、ユーザ名は「centos」。
自分のSSH公開鍵を登録し、任意のサブスクリプション、リソースグループには、「既存のものを使用」を選択し、前回と引き続き「blog-system」グループを使用します。
※SSH鍵について
本記事では基本的にVMとの接続に「SSH接続」を用います。そのため、SSH公開鍵、SSH秘密鍵を事前に作成する必要があります。MacOSであれば、以下のようなコマンドで作成可能です。
ssh-keygen -t rsa -f ~/.ssh/my-key
本記事は詳細を省きますので、以下のURLも参考に作成をお願いします。
それでは次にVMのサイズ選択を進めていきます。
今回は練習ですので、なるべく安価なサイズを選択しましょう。
サポートするディスクは「HDD」を選び、「すべて表示」をクリックします。
「A1 Basic」を選択します。
可用性セットと 管理ディスク使用は「なし」、ネットワークには「blog-vnet」、サブネットは「piblic-subnet」をパブリックIPアドレスは、ここで新規作成されるのでそのままでOKです。ネットワークセキュリティグループも、ここで新規作成されたデフォルトのものをそのまま利用します。
残りの設定をしていきます。
拡張機能は「なし」、自動シャットダウンは「オフ」、監視項目についても全て「無効」で大丈夫です。「OK」をクリックすると、最後に設定の確認ページに切り替わりますので、誤りがないことを確認して「作成」をクリックしてください。
VMが作成中になり、blog-systemのリソース一覧からも「Web-Server」のVMが作成中であることが確認できます。
1-2. インターネットとルーティング
ここで話を一旦ネットワークの方に戻します。
仮想ネットワークとインターネットの接続ですが、実はこの辺りは Azure のデフォルト設定でよしなにやってくれています。本来ならば仮想ネットワークに「インターネットゲートウェイ」を設置し、「ルートテーブル」の作成といった工程を経て初めてインターネットにアクセスできるようになります。
インターネットゲートウェイの設置は、「自分のネットワーク内にインターネット回線を引き込む」イメージの作業になります。ルートテーブルはパケット(データを送受信する際に細切れにしたもの)を宛先のIPアドレスまで届けるために、宛先アドレスと流すべきネットワーク先を設定するものです。「流すべきネットワーク先」は「next pop」とも呼ばれます。
これらの値がAzure上でどのようなデフォルト値になっているのかは、先ほどVMを構築した際に同時に作成された、「ネットワークインタフェース」というAzureリソースから確認できます。「ネットワークインターフェース」は、作成したAzure 仮想マシンがインターネット、Azure、およびオンプレミスのリソースとの通信を制御しており、VMの作成と同時にアタッチされます。
「blog-system」グループ内の、web-serverXXXという名前で、リソースの種類が「ネットワークインターフェース」となっているものをクリックしてください。
そこで左端の「有効なルート」をクリックすると、パケットを送って良い「宛先アドレスと流すべきネットワーク先」の一覧が確認できます。
注目したいのは、赤線で囲まれている2つの既定ルートです。1つ目は、next pop の種類が「仮想ネットワーク」でアドレス範囲は、前回作成したblog-vnetと同じ値です。つまり先ほど作ったVMは、仮想ネットワークblog-vnet上の全てのプライベートIPアドレスにアクセスできることを表します。
2つ目は、next pop の種類が「インターネット」でアドレス範囲は、「0.0.0.0/0」です。「0.0.0.0/0」は全てのIPアドレスを表すので、インターネット上の全てのパブリックIPアドレスにアクセスできることを示しています。
1-3. SSHでサーバに接続する
それでは起動したVMにインターネットからログインして操作してみましょう。接続には、SSH(Secure SHell)というプロトコルを使用します。
パブリックIPアドレスを確認する
VMにインターネット側からアクセスするには、「パブリックIPアドレス」を用います。
パブリックIPアドレスはVMの概要ページから確認できます。
SSHで接続する
パブリックIPアドレスを確認したら、このIPアドレスにSSHで接続します。
Windowsの場合、SSH接続には「Tera Term」などのクライアントソフトが必要です。Macの場合は、標準のターミナルコマンドからSSH接続できますので、今回はこちらの接続例を紹介します。
Mac のターミナルを立ち上げて、以下のsshコマンドを入力してしましょう。
ssh -i ~/.ssh/my-key centos@xxxxxxxx
「-i」は 接続に使用する秘密鍵をしていする引数です。「~/.ssh/my-key」の部分は、VMを作成した時に登録した公開鍵と対になる秘密鍵を指定します。「centos@xxxxxxxx」の部分は「ユーザ名@接続先のパブリックIPアドレス」で指定します。
接続に成功したら以下のような出力が得られます。
Warning: Permanently added the ECDSA host key for IP address 'xxx.xxx.xxx.xxx' to the list of known hosts. [centos@web-server ~]$
接続に失敗する場合
sshコマンドで接続した時に、以下のメッセージが表示されてssh接続できない場合があります。
エラーメッセージを読むと、鍵ファイルのパーミッションが、他のユーザも閲覧できる状態になっているのが原因のようです。このような場合は以下のようにchmodコマンドを実行し、秘密鍵ファイルを自分のユーザしか読み込めないように権限変更してください。
chmod 400 ~/.ssh/my-key
1-4. IP アドレスとポート番号
インターネットからログインして遠隔のサーバ上で操作ができるのは、サーバ上で、ユーザからのコマンドを受け付けるためのソフトが動いているからです。SSH接続の場合は、「sshd」というプログラムが動いています。
TCP/IPで通信するサーバの機器などには、「他のコンピュータとデータを送受信するためのデータの出入り口」が設定されています。これを「ポート(port)」と言います。ポートは、0 ~ 65535 まであります。ポートがあるおかげで一つのIPアドレスに対して、複数のアプリケーションが同時に通信できます。
待ち受けているポート番号とプログラムを確認する
sshdというプログラムもサーバ上で通信を待ち受けているアプリケーションの一つです。このプログラムがどのようなポート番号を持っているのか、lsof コマンドを用いて調べてみましょう。
[centos@web-server ~]$ sudo lsof -i -n -P
上記のコマンドを作成したVM上で実行すると以下の出力が得られます。
[centos@web-server ~]$ sudo lsof -i -n -P COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME chronyd 497 chrony 1u IPv4 15959 0t0 UDP 127.0.0.1:323 chronyd 497 chrony 2u IPv6 15960 0t0 UDP [::1]:323 dhclient 771 root 6u IPv4 18226 0t0 UDP *:68 dhclient 771 root 20u IPv4 18193 0t0 UDP *:28332 dhclient 771 root 21u IPv6 18194 0t0 UDP *:20970 sshd 837 root 3u IPv4 18771 0t0 TCP *:22 (LISTEN) sshd 837 root 4u IPv6 18780 0t0 TCP *:22 (LISTEN) sshd 854 root 3u IPv4 18891 0t0 TCP 10.0.0.4:22->自分のIPアドレス (ESTABLISHED) sshd 894 centos 3u IPv4 18891 0t0 TCP 10.0.0.4:22->自分のIPアドレス (ESTABLISHED)
この結果のうち、行の最後に「LISTEN」と書かれているのが「他のコンピュータからの通信を待ち受けているポート」、「EDTABLISHED」と書かれているのが「相手と現在通信中のポート」を示します。どちらでもないのは、「UDP」のプログラムです。UDPはデータ送りっぱなしで相手の確認を取らないため、「通信中」という概念がありません。
LISTEN状態なのは、以下の二つです。
sshd 837 root 3u IPv4 18771 0t0 TCP *:22 (LISTEN) sshd 837 root 4u IPv6 18780 0t0 TCP *:22 (LISTEN)
プログラム名は「sshd」で、「*:22」というのは、「全てのIPアドレスを接続元としてポート22で受け付ける」という意味です。
というわけでSSHで接続するときのポート番号は、22でした。
1-5. ファイアウォールで接続制限する
IPアドレスとポート番号についての知識は、サーバやネットワークのセキュリティを高める時に役立ちます。セキュリティを高めるには、「ファイアウォール」を設置することが必要です。ファイアウォールとは「通して良いデータだけを通して、それ以外を遮断する機能」の総称です。そのうちもっとも簡単なものが、「パケットフィルタリング(Paket Filtering)」です。
パケットフィルタリング
パケットフィルタリングは流れるパケットをみて、通過の可否を決める仕組みです。パケットには、「IPアドレス」のほか「ポート番号」も含まれています。パケットフィルタリングはIPアドレスやポート番号など、パケットに付随する情報を見て、通信の可否を決めます。
VMのセキュリティグループ
現実では、ルーターや専用のファイアウォール機器がパケットフィルタリングの機能を果たしています。Azure ではVMに付随して作成される「セキュリティグループ」が、この機能を担当します。
前節でVMを作成した時は、「Web-Server-nsg」というセキュリティグループが作られました。Web-Server-nsgの設定を確認してみましょう。
概要ページから「受信セキュリティ」の項目を見てみると、「default-allow-ssh」という規則があり、「ポート22に対して、全ての通信(任意)を許可する」という設定になっています。
次節から作成したVMにWebサーバソフトをインストールしていきますが、このセキュリティグループのデフォルト設定では、通信が阻まれてしまいます。この受信セキュリティにルールを追加していくことで適切にポートを開けたり、特定のIPアドレスからのアクセスに制限したりできます。
2. Webサーバーソフトをインストールする
この章では、パブリックサブネットに構築したサーバの中にWebサーバソフトをインストールしていきます。
構成図でいうと以下の部分を作成していきます。
2-1. Apache HTTP Server のインストール
サーバをWebサーバとして機能させるために、Webサーバソフトのひとつである「Apache HTTP Server」をインストールします。
① VMにSSHでログインする
1-3を参考にVMにログインしてください
② Apacheをインストールする
次のコマンドを入力して、Apacheをインストールして下さい
[centos@web-server ~]$ sudo yum -y install httpd
yumはアプリケーションをインストールしたり、アンインストールするときに用いる管理者コマンドです。「-y」はユーザの確認なしにすぐインストールする指定です。
③ Apacheの起動
[centos@web-server ~]$ sudo service httpd start
service コマンドは 、指定したコマンドを(ここではhttpdなので、Apache全体)を「起動」、「停止」、「再起動」するコマンドです。
④ 自動起動をオンにする
[centos@web-server ~]$ sudo chkconfig httpd on
chkconfig コマンドは、自動起動の設定を「on」、「off」にしたり、設定の確認をするコマンドです。
Apacheのプロセスを確認する
正しくインストールできたか検証のため、以下のコマンドでApacheのプロセスが動いているか確認しましょう。
[centos@web-server ~]$ ps aux
psコマンドは、実行中のプロセスを表示してくれるコマンドです。出力結果に以下のような行があれば、Apacheのプロセスが動いてると確認できます。
896 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
先頭についてる 896 という番号は、「プロセス番号(PID)」と呼ばれるもので、プロセスを区別するために自動で付けられる番号です。
プロセスが動いてると確認できたら、次にネットワークの待ち受け状態を確認しましょう。
[centos@web-server ~]$ sudo lsof -i -n -P
ポート番号はlsofコマンドで確認できます。
実行すると以下のような出力のなかにhttpdが存在しているとわかりました。自分の環境ではポート番号は80であるとことが確認できます。
httpd 896 apache 4u IPv6 19087 0t0 TCP *:80 (LISTEN) httpd 897 apache 4u IPv6 19087 0t0 TCP *:80 (LISTEN) httpd 898 apache 4u IPv6 19087 0t0 TCP *:80 (LISTEN) httpd 899 apache 4u IPv6 19087 0t0 TCP *:80 (LISTEN) httpd 900 apache 4u IPv6 19087 0t0 TCP *:80 (LISTEN)
2-2. ファイアウォールの設定
Apacheをインストールし起動までさせたので、このVMはWebサーバとして機能しているはずです。実際にWebブラウザを使ってアクセスして見ましょう。
ブラウザからアクセスする場合、接続先のパブリックIPアドレスを指定します。AzureのマネジメントコンソールでパブリックIPアドレスを確認したら、ブラウザのアドレスバーに入力してみましょう。しかし、残念ながらこのままではアクセスできないはずです。
ファイアウォールの設定
接続できないのは、ポート80番がファイアウォールによってブロックされているからです。
Azure の場合、ファイアウォールの機能を「ネットワークセキュリティーグループ」が担当しています。
1-5節でVMを作成をした時に付随して作成された「Web-Server-nsg」を確認しました。その受信セキュリティ設定には「ポート22だけ通し、それ以外は通さない」という設定になっていました。そのためApacheが待ち受けているポート80がブロックされ、通信できない状態です。
以下の手順で、ポート80番を開けていきましょう。
「Web-Server-nsg」の「受信セキュリティ規則」から「追加」をクリックして、新しい規則の設定画面を開きます。
デフォルトの値から変更すべき箇所は、宛先ポート範囲を「80」に、プロトコルを「TCP」に、名前はここでは「HTTP-default」とします。変更を加えたら、OKをクリックしてセキュリティ規則が反映されるのを待ちましょう。再びブラウザにパブリックIPアドレスを入力して、以下のような画面が表示されれば成功です。
※捕捉
ブラウザへのパブリックIPアドレス入力ですが、一般的には、「パブリックIPアドレス:ポート番号」という記法で入力します。今回のApacheの場合は、「xxx.xxx.xxx.xxx:80」という入力になります。しかしApacheの場合、IPアドレスの入力だけでアクセスできてしまいます。これは、ブラウザのデフォルトのポートが80になっているからです。
2.3 ドメイン名と名前解決
Webブラウザへのアクセスには成功しましたが、一般的にはパブリックIPアドレスでアクセスすることはありません。ほとんどの場合、「www.example.co.jp」などのドメイン名を用いてアクセスします。
DNSによる名前解決
TCP/IPの世界では、相手先を確認するのはあくまで「IPアドレス」です。ドメイン名でアクセスするときも、最終的にIPアドレスに変換してアクセスします。
この変換に用いる仕組みに「DNS(Domain Name System)」があります。DNSを用いて、あるドメイン名からそれに対応するIPアドレスを引き出すことを「名前解決」と呼びます。
DNS名の設定
AzureのVMにDNS名を付与するには、以下の操作を行います。
VMの概要にある、「DNS名 構成」という項目をクリックします。
DNS構成のパネル中のDNS名ラベルの部分に、任意のラベルを付けます。ここでは「myblog」とします。
設定を完了すると、VMの概要ページ中にDNSが表示されているのがわかります。
このDNS名をWebブラウザのアドレスバーに入力して、先ほどのApacheの画面にアクセスできたら成功です。
まとめ
本記事ではWebサーバの構築が終わりました。
IPアドレスとポート番号の関係やDNSについては、実際にあまり意識せずとも問題ありませんが、セキュリティグループについては、正しく設定しておかないと実作業にてアクセスがうまくいかなかったり、通してはいけない受信設定をしてしまったりと事故の元ですので、正しい理解が必要です。
次回は、Azure で学ぶインフラ入門3(DBサーバー構築編)にて、DBサーバを構築しブログシステムを完成さていきます。
DATUM STUDIOは、クライアントの事業成長と経営課題解決を最適な形でサポートする、データ・ビジネスパートナーです。
データ分析の分野でお客様に最適なソリューションをご提供します。まずはご相談ください。
Contact
Explore Jobs
関連記事