【Docker第3回】WEBサーバを構築/ Nginxのインストール/ネットワークの概要を確認

【Docker第3回】WEBサーバを構築/ Nginxのインストール/ネットワークの概要を確認

Dockerのプログラミングメモ第3回です。何回かに分けてメモを投稿していきます。

なお、この記事はプログラミングメモですのでどんどん追記していきます。

第3回はWEBサーバを構築/ Nginxのインストール/ネットワークの概要を確認していきます。

Dockerに入門したのに、すぐにDockerを学ばずWEBサーバを構築する理由は、Dockerを理解する上でLinuxの基礎とNetworkの基礎の把握が必要だからです。

【参考記事】


【関連記事】


WEBサーバーを構築してみる

LinuxにNginxをインストールしてWEBサーバーを構築する

Nginxのインストール

手順

> GCPでGCEを起動しSSH接続する


> 以下のコマンドを実施

$ sudo apt updateを実施
$ sudo apt install nginx

> GCEの外部IPをクリック


Nginxのトップページが表示されない場合の確認ポイント

  • ’sudo apt install nginx’が成功したか
  • GCPのファイアーウォールの設定は正しいか
  • httpsではなくhttpになっているか
  • ブラウザのシークレットウィンドウだと表示されるか

自作のHTMLをブラウザで表示してみる

# 現在の設定
$ ls /var/www/html/
index.nginx-debian.html

$ cd /var/www/html/
$ cat index.nginx-debian.html
$ pwd
/var/www/html
$ sudo vi hello.html

>> コードはこちら

> ブラウザでIPアドレスの後で/hello.htmlとつけてブラウジング


プロセスの基本

 

# プロセス 実行中のプログラム
# 以下のコマンドで確認可能

$ pstree -p
systemd(1)─┬─...                                                       # systemdのプロセス
:
├─nginx(26867)─┬─nginx(26872)                                          # Nginxのプロセス
│ └─nginx(26873)
:
├─sshd(1606)───sshd(28275)───sshd(28385)───bash(28386)───pstree(28602) # SSHのプロセス
:

Linuxの起動の流れとプロセス管理

  • カーネルによるプロセス管理
  • CPUは本来、コアが一つなら一つだけプログラムが動かせる
  • OSの中核であるカーネルがCPUの時間を順番にプロセスに割り当てて複数プロセスが同時に動いているように振る舞う

Linuxの起動の流れとプロセス管理

  1. 電源ON → CPUがマザーボードのROMにある「BIOS」を実行する
  2. BIOSがストレージからメモリに「ブートローダ」を読み込んで実行する
  3. ブートローダがストレージからメモリに「カーネル」を読み込んで実行する
  4. カーネルが「init」プロセスを起動する

initプロセスとは

  • PID1で動く親プロセス
  • 最近はsystemdというプログラムがよく使われている

Nginxを手動で実行してみる

# Nginxのステータスを確認
# activeになっている
$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2023-02-17 23:57:04 UTC; 6h ago
:
:

# stop nginx
# inactiveになった
$ sudo systemctl stop nginx
$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Sat 2023-02-18 06:59:16 UTC; 4s ago
:
:

# 再度起動
$ ls -l /usr/sbin/nginx
-rwxr-xr-x 1 root root 1149096 Nov 10 06:38 /usr/sbin/nginx

$ sudo /usr/sbin/nginx -g 'daemon off;'
# プロンプトは返らない
# Nginxはアクティブになる
# システムDで動かした方がいい

# 再度sytemctlで Nginxを起動する
# activeになった
$ sudo systemctl start nginx
$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2023-02-18 07:10:46 UTC; 6s ago
:
:

ネットワークの仕組みの概要

IPアドレス

  • ネットワーク上の住所
  • 通信先のコンピュータはIPアドレスで決まる
  • 127.0.0.1は自分自身を指すIPアドレス/別名:localhost

ポート番号

  • マンションの部屋番号に例えられる
  • 一つのコンピュータで複数のプログラムが通信を持っている
  • ポート番号によってどのプログラムが接続するのか伝える

メッセージ

  • WEBサーバー(Nginxなど)の場合
  • HTTPリクエスト、HTTPレスポンスという形式でメッセージをやりとりする
  • クライアントとサーバーが適切にやりとりするために通信方式ごとにメッセージの形式が決まっている

curlとtelnetでWebサーバと通信してみる

> curlコマンドで確認

$ curl -v localhost
* Rebuilt URL to: localhost/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.58.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.14.0 (Ubuntu)
< Date: Sat, 18 Feb 2023 09:09:35 GMT
< Content-Type: text/html
< Content-Length: 612
< Last-Modified: Fri, 17 Feb 2023 23:57:03 GMT
< Connection: keep-alive
< ETag: "63f0144f-264"
< Accept-Ranges: bytes
<
:
:
:
* Connection #0 to host localhost left intact

> telnetでも手動で確認可能

$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
Host: localhost
User-Agent: curl/7.58.0
Accept: */*
:
:
# 同様にレスポンスがあることを確認
# Ctrl + C で抜ける

TCP/IP モデル

メッセージの形式/やり取りの手順


アプリケーション層 HTTP SSH FTP SMTP
TCP UDP
トランスポート層 接続の確立、パケットの分割/組立
TCP UDP
インターネット層 IPアドレスで指定された先にパケットを配送
IP ICMP
ネットワークインターフェース層 ハードウェアが通信を実現する
イーサネット 有線LAN
IEEE802.11 無線LAN