webサーバーを構築する…?
例のSNSで、こんな投稿を見かけた。
webサーバーを構築して下さい
わからないことがあれば聞いて下さい
というタスクが割り当てられており、さらに「先輩はすぐにデータセンターに行ってしまっていない」という条件もついていることが読み取れる。
単に「いない」だけでなく、「データセンターに行ってしまって」いないということから、通信機器の持ち込みや使用が制限され、連絡が取れない可能性があることがうかがえる。
(連絡が取れないことは明示されておらず、あくまで可能性があるだけであることに注意)
今回は、このタスクについて考えていく。
前提を確認する
webサーバーとは?
webサーバーとは、「HTTPのリクエストを受け付け、レスポンスを返すソフトウェアおよびハードウェア (コンピュータ)」のことであると考えられる。
特に、ウェブブラウザからのリクエストを受け付け、ウェブページのデータ (HTML・CSS・画像・スクリプトなど) を返すものと考えるのがよさそうである。
サーバーを構築するとは?
サーバーを構築するとは、サーバーを作ることであると考えられる。
具体的には、
どのようなサーバーを作るか決める
サーバーとして用いるコンピュータを用意する
サーバー用のソフトウェアをインストールする
という流れになるだろう。
条件を考える
どんなwebサーバーを構築するかも気になるが、これは後でゆっくり考えるとして、まずはそれ以外の条件を考えてみる。
誰に聞くか?
「わからないことがあれば聞いて下さい」という条件があるが、具体的に誰に聞くべきかは書かれていない。
誰に聞くのがいいだろうか?
「わからないこと」の中身として想定されることには、例えば以下があるだろう。
何が求められているか
後述の「どのようなwebサーバーを構築するか」など
技術的にどう実現するか
○○をするソフトウェアはあるか、△△に××させるにはどう設定するか、など
今回のタスクには関係ないこと
ある人物の体重やスリーサイズ、P≠NPか、など
「何が求められているか」に関しては、このタスクを作った元に聞きたい。
「webサーバーを構築する」ではなく、「webサーバーを構築して下さい」と表現していることから、このタスクはタスクを実行する人が自分で考えたのではなく、誰かから依頼されたと推測できる。
聞ける場合は、その依頼元に聞くのがいいだろう。
ただし、依頼元が先輩 (今回は「いない」という条件がある) である、パワハラをよくする人で聞くと攻撃される可能性が高そうである、試験の条件で質問を受け付けないとされている、などの事情により、依頼元に聞けない可能性もある。
その場合は、自問自答する、まわりの聞けてかつ聞けば有効な答えが得られそうな人に聞く、AI (ChatGPTやPerplexityなど) に聞く、などが候補になってくるだろう。
「技術的にどう実現するか」については、聞く先の候補は多いだろう。
Stack Exchange などの質問サイトで質問をしたり、AI に聞いたりすることが有効だと考えられる。
まわりに聞けてかつ聞けば有効な答えが得られそうな人が居て、かつそのような人が居ることを自分がわかっている場合は、その人に聞くという選択肢もあるだろう。
「今回のタスクには関係ないこと」の中には、通常は聞かない方がいいこともあるかもしれない。
また、聞いてもいいことであっても、どうでもいいときに聞くことは相手の迷惑になる可能性がある。
しかし、「わからないことがあれば聞いて下さい」という条件があるので、「わからないこと」がある限り「聞く」という操作を行うことが求められる。
とはいえ、「わからないことがあればそのことについて聞いて下さい」という条件ではないため、「このことについて他の人に聞くべきだろうか?」と自問自答するだけで条件を満たせる可能性がある。
また、人ではなく AI に聞くことも人に迷惑をかけるのを回避するために有効であると考えられる。ただし、個人情報や機密情報、その他の流出させないべき情報を流出させないよう注意するべきだろう。
構築して「下さい」?
「下さい」と「ください」の使い分け(広報Q&A):日本広報協会
「webサーバーを構築してください」ではなく、「webサーバーを構築して下さい」と書かれていることから、単にwebサーバーを構築するだけではなく、構築したwebサーバーを渡すことが求められている可能性がある。
とはいえ、「わからないことがあれば聞いて下さい」とも書かれており、単なる誤字の可能性もある。
もちろん、「わからないことがあれば聞いて下さい」は「わからないことがあれば聞き、その内容 (質問と回答) をまとめたレポートを下さい」と解釈することもでき、こちらも含めて誤字ではない可能性もある。
どのようなwebサーバーを構築するかを考える
「webサーバーを構築して下さい」というだけでは、何をするべきかがはっきりしない。
ここでは、具体的にどのようなwebサーバーを構築するかについて、考えたほうが良さそうなポイントをみていく。
コンテンツは?
webサーバーを構築するということは、構築したwebサーバーで何らかのコンテンツを配信するはずである。
そこで、どのようなコンテンツを配信するかを考えるべきだろう。
たとえば、以下のものが候補となってくるだろう。
実験系
なし (常に404などのエラーを返す)
空
hello, world! / It works! / Welcome to nginx!
簡単な静的サイト
簡単な動的サイト
WordPress
実用系
意味のある情報やアプリケーションなどを載せた静的サイト
掲示板
(Qiita などのような) 情報共有サイト
(Webカメラなどの) 映像のストリーミング
ロボットなどのハードウェアを操作するインターフェイス
ユーザーがアップロードしたコンテンツ (各ユーザーのホームディレクトリ直下の www ディレクトリの中身を公開する、など)
ここで、「実験系」は配信するコンテンツにはあまり意味が無くwebサーバーの構築の練習を主目的にするもの、「実用系」は単にwebサーバーを構築するだけでなくそこで配信するコンテンツを活用できるようにすることを目的にするものを表す。
アクセス元は?
サーバーは、クライアントからのアクセスを受け付ける。
そこで、どのようなクライアントからのアクセスを受け付けるかを考える。
アクセス元のネットワークに注目すると、たとえば以下の候補があるだろう。
インターネット全体
(インターネットには接続するが) 特定のIPアドレスのみ
(社内など) 同じLAN内のみ
サーバーのハードウェアにWi-Fiで接続された近くのデバイス
ローカルマシン内のみ
また、クライアントの認証 (とそれに基づく認可) に注目すると、たとえば以下の候補があるだろう。
認証なし (誰でもアクセス可)
IDとパスワードによる認証
証明書による認証
対応するアクセス方法は?
webサーバーは主にHTTPでのアクセスを受け付けるはずであるが、一口に「HTTP」といっても
HTTP/0.9
HTTP/1.0
HTTP/1.1
HTTP/2
HTTP/3
という種類がある。
HTTP の進化 - HTTP | MDN
これらのうちどれに対応するかは、検討するべき点の一つだろう。
「HTTP/1.0とHTTP/1.1のみ」というのが基本になりそうだが、練習のため、もしくは大規模なアクセスに対する効率を高めるため、HTTP/2などに対応させることが求められるかもしれない。
また、SSL/TLS (HTTPS) に対応するか、対応する場合はどのように対応するか、というのも一つの大きなポイントだろう。
選択肢としては
SSL/TLS対応なし (HTTPのみ)
自己署名証明書でのSSL/TLS対応
独自の認証局 (情報をインポートすれば警告を回避できる) による証明書でのSSL/TLS対応
正式な証明書 (特別な操作なしで通常警告されない) によるSSL/TLS対応
といったものがあるだろう。
また、SSL/TLS対応時、HTTPでのアクセスをどう処理するかの選択肢もある。具体的には
対応しない (HTTP用のポートはリッスンしない)
そのままレスポンスを返す (リダイレクトしない)
HTTPSにリダイレクトする
HTTPSにリダイレクトし、さらにHSTSを設定する
などが考えられるだろう。
さらに、対応するIPのバージョンも決めることが求められるだろう。選択肢は
IPv4のみに対応する
IPv6のみに対応する
IPv4とIPv6の両方に対応する
が考えられる。
また、IPアドレスを直接指定してのアクセスにのみ対応するか、ドメイン名でのアクセスに対応するか、という選択肢もある。
ドメイン名でのアクセスに対応する場合、さらに
(Amazon EC2 などで) 自動的に付加されるドメイン名を用いる
(ムームードメイン、Cloudflare Registrar、Amazon Route 53 などで) ドメインを取得 (購入) する
ダイナミックDNSサービスを利用する
ローカルでのみ対応する (hosts ファイルの編集など)
mDNS によりドメイン名の情報を配信する
などの選択肢があるだろう。
性能や予算は?
求められる性能は、(特に実用的なコンテンツを配信する場合) webサーバーを構築する上で考慮するべきポイントの一つだろう。
たとえば、性能の観点の一つとして「どのくらいアクセスされることを想定するか」がある。
選択肢としては
採点者による1回のアクセスのみ
1日あたり数回~数百回程度アクセスされる
1日に何百万回もアクセスされる
などが考えられるだろう。
また、単純なアクセス回数だけでなく、1回のアクセスあたりどのくらいの容量のコンテンツを配信するか、ということも考慮するべきかもしれない。
他の観点としては、
アクセスの速度 (スループットおよびレイテンシ)
アプリケーションの処理速度 (サーバー上での計算速度)
などもかかわってくるだろう。
また、予算を考えることも重要である。
予算は、1ヶ月あたり0円からウン億円まで、もしくはそれを超える水準など、多くの可能性がある。
また、予算は「初期費用」と「ランニングコスト」に分けて考えると考えやすくなるだろう。
初期費用としては、ハードウェア・ドメイン・ソフトウェア(OSを含む)・素材(画像など)の購入費などが考えられる。
ランニングコストとしては、ハードウェアの電気代・クラウドやソフトウェアの利用料・ドメインの更新料などが考えられる。
どのようにwebサーバーを構築するかを考える
「どのような」webサーバーを構築するかが決まったら、次にそれに応じて「どうやって」webサーバーを構築するかを考えることになるだろう。
この章では、実際にwebサーバーを構築するにあたってどのような選択肢があるかを考える。
コンピュータ
webサーバーを構築するには、まずはベースとなるコンピュータが必要になるだろう。
具体的には、手元に物理的なハードウェアを用意する場合は
デスクトップパソコン
ノートパソコン
サーバー (ラックに設置するコンピュータ)
Raspberry Pi シリーズ
その他のミニPC
ESP32
Arduino (シールドを含む)
その他のマイコン・周辺デバイス
FPGA
などが候補になるだろう。
また、手元に物理的なハードウェアを用意しない場合は
仮想マシン (VirtualBox など)
VPS (Virtual Private Server)
クラウド (Amazon EC2 など)
などが候補になるだろう。
さらに、コンピュータ本体だけでなく、それに接続するネットワーク (物理的なハードウェアであればルーターやLANケーブルなど、Amazon EC2 であれば Amazon VPC など) も用意することが求められるかもしれない。
もちろん、物理的なハードウェアを用いる場合、電源も必要である。
乾電池
充電式電池
ソーラーパネル
商用電源 (いわゆるコンセント)
UPS (無停電電源装置)
などが選択肢になるだろう。
なお、今回のタスクは「webページを公開する」ではなく「webサーバーを構築する」なので、GitHub Pages やホスティングサービス (いわゆる「ホームページスペース」) などの「既に構築されているwebサーバーを利用する」サービスの利用では達成できないだろう。
ソフトウェア
コンピュータを用意したら、次にその上でwebサーバーとして動作するソフトウェアを用意することになるだろう。
有名なwebサーバーのソフトウェアとしては、nginx や Apache などがある。
さらに、たとえば以下のソフトウェアにもHTTPサーバー機能がある。
これらのソフトウェアのHTTPサーバー機能でコンテンツを用意し、クライアントからのアクセスは nginx などのリバースプロキシ機能で受け付ける、という構成も考えられる。
さらに、これらのソフトウェアをコンピュータに直接インストールするのではなく、Docker などのコンテナを用いて実行するという選択肢もある。
コンテンツ
導入するサーバーのソフトウェアを決めたら、次にサーバーに配置するコンテンツを用意することになるだろう。
コンテンツの内容は、
文章 (挿入する画像などを含む)
アプリケーション
データ (何らかの観測結果のグラフなど)
などが考えられる。
文章であれば、
直接HTML形式で書いてファイルとして配置する
SQLite などのデータベースに格納し、そこから読み出して表示するソフトウェアを配置する
などの配信方法が考えられ、中身は
自分で書く
ライターに依頼する
AIで生成する
Lorem ipsum などのダミーテキストを用いる
などの選択肢が考えられるだろう。
アプリケーションの場合は、
自分で実装する
既存のアプリケーションをインストールする
などの可能性が考えられる。
既存のアプリケーションの中には、CTFd などwebサーバー機能が含まれているものもあるので、それに合わせたインストール方法をとることが求められるだろう。
データの場合は、
データの取得
取得したデータの表示・配信
の仕組みをそれぞれ用意することになるだろう。
これらの仕組みの具体的な中身は、扱うデータの内容によるだろう。
まとめ
「webサーバーを構築して下さい」というだけでは、求められるものに様々な可能性が考えられ、それによって用意するべきコンピュータの性能や予算も変わってくる。
今回のタスクを依頼してきた人が存在し、その人に聞くことができ、かつ聞くことで (パワハラなどの攻撃を受けるなどではなく) 有効な答えが返ってくることが期待できるのであれば、聞いて具体的にどういうwebサーバーを構築するのかを絞り込むのがいいだろう。
依頼元が存在しなかったり、聞けなかったり、聞いても有効な答えが得られることが期待できない場合は、いきなりお金をいっぱい使って高性能なwebサーバーを構築してしまうよりは、無料または少ないコストで最低限のwebサーバーを構築しておくのがいいと考えられる。
ただし、依頼元が考える「正解」を一発で当てないとパワハラを受けてしまう可能性もあるため、覚悟したほうがいいかもしれない。
依頼元が先輩であった場合、「わからないことがあれば聞いて下さい」という条件を出しておきながら自分から聞けない状態を作り、それでいて「聞いて下さいという条件を出したのに聞かない、ふざけんな」と主張するパワハラを狙っている可能性も考えられる。
ただし、「すぐにデータセンターに行って」しまったのが (パワハラ目的など) わざとではなく、たまたま悪いタイミングで緊急事態が発生して対応を求められたため、などの可能性もあることには注意したい。
この記事では検討するべきと考えられる複数の観点を例として挙げたが、観点や選択肢はこれで網羅できているとは限らない。
この記事を参考にした、もしくは参考にしなかった結果生じた、パワハラ・懲戒・その他一切の損害について、筆者は責任を負わない。
おまけ
自分は、以前AWSを用いてwebサーバーを立てる方法の記事を書いている。
Amazon EC2 を用いてファイル受け渡し用のWebサーバをとりあえず立てる #EC2 - Qiita
この記事では、
ファイル1個~数個を受け渡す目的
インターネット全体からのアクセスを受け付ける
IDとパスワードによるアクセス制限を行う
アクセス数は少ない
自己署名証明書、またはCloudFrontでSSL/TLSに対応する
IPアドレス直接、およびEC2やCloudFrontが自動で割り当てるドメイン名でのアクセスに対応する
初期費用0円
ランニングコスト (AWS使用料) 月2,000円程度 (最初の12ヶ月の無料枠があれば無料)
という条件のwebサーバーを扱っている。
この記事が気に入ったらサポートをしてみませんか?