Webプログラミングに関する世界観です。Linux(ネットワーク)も参照してください。
自分の書いたブログ「神々とともに生きる詩人」2021/01/27より。
HTTPにおいては、サーバとクライアントの間でHTMLデータをやり取りする。
この時、リクエストに対してサーバはレスポンスを返す。
WebブラウザはWebサーバにリクエストを要求し、この時GETやPOSTなどのメソッドを要求する。
これに対して、Webサーバは、「安全にデータを返します」「エラーが発生しました」といった番号(HTTPステータスコード)による応答と、具体的なデータ(エンティティボディ)を返す。
Webの世界も参照のこと。
現在主流のサーバー。Apacheを参照のこと。
イベント駆動のアプローチで高い性能を誇るサーバー。Nginxを参照のこと。
軽量なWebサーバー。
Wikipedia
ソースコード
MicrosoftのWebサーバー。昔からApacheの一番のライバル。
使いたい人は少ないが、なぜかシェアは多い。
MSのASP.NETを使えるのは長所だが、逆にIISでPHPなどを動かす場合はどうなるのかなどが疑問である。
ネットを調べたところ、Windows 7のIISでもPHPを動かすことは現実的に可能なようだ。
ASP.NETをLinuxで使いたい場合は、monoを使うことで実現できる。monoにはC#/VB.NETコンパイラが付属し、.NET Frameworkが搭載され、ASP.NETの開発が出来る。ただ、どこまで動くのかは疑問である。
HTTPリクエストでは、リクエスト行(HTTPメソッドとURLを含む)、メッセージヘッダ(情報)、エンティティボディ(実際のデータ)がクライアントからサーバーにリクエストされる。
HTTPレスポンスでは、HTTPステータスコード(結果)、メッセージヘッダ、エンティティボディがサーバーからクライアントにレスポンスとして返ってくる。
以下の書籍が参考になります。
2023.08.17編集
(おうちで学べるネットワークのきほんを参考に執筆しました。)
HTTPメソッドには、
HTTPメソッド | 説明 |
---|---|
GET | データの取得 |
HEAD | ヘッダだけを取得 |
POST | サーバへとデータを送信 |
PUT | 既にあるデータを置換 |
がある。
また、RESTと呼ばれる新しいWeb上のリソースのやり取りのAPIとして、RESTfulメソッド(GET、POST、PUT、DELETEなど)が設定(追加)されることもある。
(おうちで学べるネットワークのきほんとふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道を参考に執筆しました。)
HTTPのステータスコードは、1xx(情報がある)、2xx(成功)、3xx(リダイレクト)、4xx(クライアントのエラー)、5xx(サーバのエラー)となる。
たとえば、ステータスコード200は「成功」、404は「ページが存在しない」、403は「アクセスするための権限がない」を表す。
Webサーバーを実装するのは、プログラミング初心者にとってよい練習になります。
たとえば、「ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道」のような書籍でも、WebサーバーをソケットAPIを使って実装することが、最後の演習問題の課題になっていて、fork()によって並列で動くサーバーのサンプルコードがついてきます。
また、Rustの「Rust Book second-edition」においても、マルチスレッドで動くWebサーバーのサンプルコードが出てきます。
このように、Webサーバーを実装するということは、適度に難しい課題であり、プログラミング初心者にとっては取り組みやすい問題であると言えます。LinuxのシステムコールやRustの言語仕様を学ぶ上でも適切であると言えます。
2023.08.17
HTTPのデフォルトのポート番号は80番、HTTPSのデフォルトのポート番号は443番。
ただし、Apacheの設定ファイルなどで設定すると、デフォルト以外のポート番号を指定することもできる。
サーバーにアクセスする際、デフォルト以外のポート番号を指定するためには、http://www.hogehoge.com:8080/のように、ドメインの後にポート番号(ここでは8080番)を指定する。
2023.08.19
何はともあれ、サーバー構築のために一番必要なのはセキュリティの知識です。
セキュリティさえしっかりしていれば、あとはどんな運用や設定も許されます。
以下のページが参考になるでしょう。
ダイナミックDNSは動的に変わるIPアドレスとホスト名をDNSに登録する仕組みで、IPアドレスがDHCPで自動的に割り振られる場合でも、サーバーとなる一台のコンピュータのIPアドレスを特定することができる仕組み。ホスト名からIPアドレスを割り出すことができ、定期的に更新することによって、DHCPの中の自宅サーバーでも特定のホスト名アドレスからその一台へとアクセスすることができる。
家庭用ネットワークで、独自ドメインを有料で登録しなくても、ダイナミックDNSを使えば、自宅サーバーを固有のアドレスで公開できる。一部のダイナミックDNSは無料で利用できる。
ネットワークの雑多なことも参照のこと。
Linuxサーバーを自動で(cronなどで定期的に)アップデートするための専用パッケージのインストールについては、Linux パッケージ管理を参照のこと。
Linuxでサーバーを立てるために、まず、練習用の外部に非公開のマシンを一台用意しましょう。
そのマシンで、Linuxをインストールしてネットワークやファイヤーウォールの設定をし、Apache、PHP、MySQLの導入をすれば、すぐにWebアプリケーションを開発する環境が整います。
FTPやSSHの設定もしましょう。必要な知識としては、パッケージ管理システムの知識、ネットワークの設定の知識、それからApache/PHP/MySQLの設定の知識と、Web向けのプログラミング言語の知識(HTML/CSS/JavaScript + PHP + MySQL)が必要になるでしょう。また、FTPクライアントの操作の仕方や、Windowsから操作するSSHの知識も必要になります。
ですが、外部に公開しない範囲で練習するのであれば、けっこう簡単です。PHPの教科書を読みながら、ツイッターのようなシステムはそんなに上級者ではなくても作れるでしょう。PHPができたら、Ruby on Railsに挑戦すると良いでしょう。
ただし、何もLinux用のマシンを用意しなくても、XAMPPを導入すればWindowsでサーバー環境を構築することはできます。RailsもWindowsで動かすこともできます。
決して、安易な気持ちでサーバーを公開しないこと。Webアプリケーションにセキュリティホールがあれば、一貫の終わりです。サービス化してしまうと、途中でやめるわけにもいきませんし、掲示板であれば運営するための手間とコストも必要です。本当にサービスを公開するのであれば、レンタルサーバーを利用するのが良いでしょう。
サーバーを公開したいのであれば、まず、セキュリティがきちんとできているかを確認すること。次に、きちんとシステム管理を行い、パッケージを最新版に更新し続けるための時間と手間がきちんと準備できていることを確認すること。その上で、独自ドメインを取って、サーバーを外部に公開するために、ルーターなどを設定し、サーバーを公開するように設定を行うこと。Linuxはそれだけで、だれかれ構わずしっかりとサーバーとして動いてくれるでしょう。
オープンソースやLinuxとサーバーには、いくらかの親和性とメリットがある。
1.いくらサーバー台数・CPU数が増えても無料のままで、UNIXと比べてコストが削減でき、導入のハードルも低い。
2.パッケージ管理システムで、コマンド一発で全てのソフトウェアを最新にできる。
3.Perl/PHP/Python/Rubyなど、主流のさまざまな言語処理系・開発ツールが使える。
4.Dockerなどのクラウド関連ソフトウェアが使える。
5.カーネルやマシンレベルで、UNIXの優れたネットワーク機能が使える(システムがネットワークと親和性が高く、UNIXの設計であるため安定性が高い)。
6.コマンドのOSなので、リモートログインしてコマンドで操作でき、GUIなどの不要なソフトウェアを入れる必要がない。またUNIXのツールが使えるためシステム管理がやりやすい。
7.オープンソースで開発されているため、バグが少ない。
特に、ApacheからMySQL(MariaDB)まで、全てのパッケージがリポジトリから配布されており、簡単に最新バージョンにすることができるというのは、セキュリティが大切なサーバーマシンにはメリットが大きい。
ただし、デメリットとして
8.会社が作っていないため、サポート期間が短い。
9.GUI機能が貧弱(サーバーにはあまり関係がない)。
というのがあげられる。だが、これはRed HatやSUSEを購入することなどで対応できる(RHELはサポート期間が長い)。エンタープライズ向けには、IBMのメインフレームでLinuxを動かすこともできる。もちろんPC向けにも使えるほか、Androidなどはモバイル機器で使うこともでき、スケーラブルなマシン構成に対応できる。従来のUNIXワークステーションのように、中央のマシンと端末を分けて構成できるなど、マシン構成の柔軟性が高い。クラスタや分散システムなどの構築も可能。
全般
PHPやJavaScriptについては対象の言語の項目を参照して下さい。