Gateway NE132-F14PにUbuntu 22.0.4.5 LTSを導入し、Webサーバを構築する
作成期間: 2024/11/25 - 2024/12/01
これからサーバーを構築しようとする、ある程度興味はある人向けの内容です。最終的にDocker container上でapache2によるサーバーを動かし、そこで自身が作成したウェブサイトを表示させるところまで行います。その途中で、公開鍵暗号とパスワードを利用した2段階認証を使うSSH接続、Linuxの基礎知識やコマンド、vi(vim)の使い方などを学習します。
0. 準備物
- Gateway NE132-F14P(以下、「ノートパソコン」、「パソコン」などと呼称します)
- 4GBほど空き容量がある中身が削除されてもいいUSBメモリ(以下、「USBメモリ」と呼称します)
- SSH接続するためのパソコン
1. インストールするためのISOファイルの作成
-
初期化されたGateway NE132-F14PはWindows 10 Homeが入っています。そこでローカルアカウントを作成してください1。
-
Rufusをダウンロードしてください。タイプは標準、プラットフォームはWindows x64のものを選んでください。
-
Ubuntu Desktop 日本語 Remixをダウンロードしてください。ミラーサイトは好きなもので構いません。
-
Gateway NE132-F14PにUSBメモリをさしてRufusを起動してください。
-
デバイスをさしたUSBメモリに指定してください。
-
選択でダウンロードしたISOファイルを選択してください。
-
パーティション構成をMBRからGPTに変更してください。
-
ターゲットシステムをUEFU(CSM無効)にしてください。
-
スタートを押してください。
-
ISOイメージ(ファイル コピー)モードで書き込む(推奨)を選択してください。
-
USBメモリの中身がすべて削除されることを了承してください。
-
完了したら、Rufusを閉じるで終了して、USBメモリを抜いてください。
-
パソコンをシャットダウンしてください。
2. Ubuntuのインストール2
4-6は使用するパソコンがeMMCだと特に必要です。
-
パソコンを起動してください。このとき、F2を連打してUEFI BIOSに入ってください。
-
set supervisor passwordで簡単なsupervisor passwordを一時的に設定してください。
-
Boot欄からboot priority orderのUSB HDDを1にしてください。F6で設定できます。
-
Security欄のSelect an UEFI files as trusted for executingを選択してください。
-
HDD0 -> EFI -> ubuntu -> shimx64.efiを順番に選択してください。
-
set supervisor passwordで2で決めたsupervisor passwordを入力し、空入力(Enter)、空入力(Enter)でsupervisor passwordを空白にしてください。
-
F10で設定を保存し、パソコンをシャットダウンしてください。
-
パソコンにUSBメモリをさしてください。
-
パソコンを起動してください。
-
ブートデバイス選択画面で、try or install ubuntuを選択してください。
-
Ubuntuをインストールを選択してください。
-
キーボードはJapaneseのJapanese(OADG109A)を選択してください。
-
とりあえず無線ネットワークには接続しない(I don't want to connect to a Wi-Fi network right now)を選択してください。
-
アップデートと他のソフトウェアの、「あらかじめどのアプリケーションをインストールしますか?」に対しては、通常のインストールを選択してください。
-
今回は「ディスクを削除してUbuntuをインストール」を選択してください。
-
「ディスクに変更を書き込みますか?」というタイトルのダイアログボックスは続けるをクリックしてください。
-
「どこに住んでいますか?」はTokyoを選択してください。
-
名前を入力してください。短いほうがいいです3。
-
コンピューターの名前も入力してください。
-
パスワードも入力してください。忘れないでください。
-
インストールが終わったらUSBメモリを抜いてください。
-
パソコンをシャットダウンしてください。
3. Linuxについて
-
パソコンを起動してください。
-
ユーザーを選択して、パスワードを入力してください。
-
Wi-Fiに接続します。右上のボタンから設定画面に遷移して、CA証明書は必要ありませんにチェックを入れ、ユーザー名とパスワードを入力してください。
-
Windowsキーを押して、
terminal
と検索して端末を起動してください。ubuntu bashが起動します。もし日本語入力が出来なくて、したいのであれば、このページなどを見て、mozcとfcitx5を入れてください。
-
ここからしばらくLinuxについて学びます。知っている人は飛ばしてください。
-
LinuxとはOSです。Linus Torvaldsを中心としてカーネルというシステムの中核部分(プロセス管理、メモリ管理、ファイルシステムなど)が開発されています。カーネルはGPLでソースが公開されています。このカーネルに、シェル(カーネルとユーザーを仲介するソフトウェア)やUI、インストーラーなどを一緒にして、簡単に使えるようにしたのがLinuxディストリビューションです。大きくDebian系とRed Hat系があり、UbuntuはDebian系です。
-
Linuxでは、拡張子は単にファイル名の一部として認識されます。種類として、
- 通常ファイル(テキストファイルとバイナリファイル)、
- リンクファイル(Windowsでいうショートカット)、
- 特殊ファイル(デバイスファイル4やWindowsでいう隠しファイル)、
- ディレクトリ(Windowsでいうフォルダ)
の4つがあります。
-
Linuxのファイルシステムはディレクトリの中にディレクトリがあって(ファイルもあって)、更にその中にディレクトリがあって(ファイルもあって)...というような木構造をしています。この一番上のファイルをルート(
root
)ディレクトリと言って、/
で表します。また、現在のユーザーのファイル(/home/
のどのディレクトリかということ)を~
で表します。 -
ディレクトリやフォルダを一意に指定するのにパスというのを使います。例えば
/home/user/desktop/hello
というのはルートディレクトリの
home
ディレクトリのuser
ディレクトリのdesktop
ディレクトリのhello
というファイルを指すということです。このように/
から始めるパスのことを絶対パスといいます。そうではなくて今いるディレクトリ(カレントディレクトリ)からのパスを相対パスといいます。
例えば今
user
ディレクトリにいるとして、./../user2/picture/apple.jpg
というのは
user
ディレクトリの親ディレクトリにあるuser2
ディレクトリのpicture
ディレクトリのapple.jpg
というファイルを指すということです。カレントディレクトリは./
で、親ディレクトリは../
で表します。通常./
は省いても構いません。
4. シェルについて
-
シェルとはカーネルとユーザーを仲介するソフトウェアです。(2024/12/03追記: 違うらしいです https://qiita.com/ko1nksm/items/935be63e940f00e4c228) Ubuntuでは標準でbashというシェルが入っています。シェルのコマンドについてとりあえず最低限必要なものを紹介します。オプションはコマンドの後に空白を入れてつけてください。また、一番初めにsudo
をつけると管理者権限で実行できます。強制終了はCtrl
+C
です。他にもあるので都度インターネットなどで調べるなどしてください5。ls
ディレクトリにあるファイルを表示します。
-a
オプションで隠しファイルなどもすべて表示します。cd (ディレクトリ名)
カレントディレクトリにあるディレクトリに移動します。
foo/bar/baz
のようにして深い位置に一度でに移動できます。mkdir (ディレクトリ名)
カレントディレクトリに新しいディレクトリを生成します。
foo/bar/baz
のように深い位置に移動せずに生成できます。rm (ファイル名)
カレントディレクトリにあるファイルを削除します。
foo/bar/baz
のようにして深い位置に移動せずに削除できます。rmdir (ディレクトリ名)
カレントディレクトリにあるディレクトリを削除します。削除するディレクトリは空でないといけません。
foo/bar/baz
のようにして深い位置に移動せずに削除できます。cp (ファイルもしくはディレクトリ名) (新しいファイルもしくはディレクトリ名)
カレントディレクトリにあるファイルもしくはディレクトリをコピーして新しいファイルもしくはディレクトリを生成します。ただしディレクトリに中身がある場合は
-r
オプションを付けて中身もコピーする必要があります。touch (新しいファイル名)
カレントディレクトリに新しいファイルを生成します。
vi (ファイル名)
カレントディレクトリのファイルをテキストエディタvimで開きます。ファイルがない場合は勝手に作成して開きます。
(Vimはviの派生ソフトウェアです。)
VimはGUIを必要とせずCUIでも動くため、Unix系OSに標準のエディタとして搭載されていることが多い。コンピュータの大容量化と高速化にともない、2000年以降のOSでは viに代わってより高機能な Vim、あるいはその機能劣化版が標準装備されるようになってきている。このため、コマンドライン上でviを実行すると代わりにVimが起動するディストリビューションが一般的となった。
Vim - Wikipediacat (ファイル名)
ファイルの中身を表示します。
また、シェルにはパイプというものがあります。パイプを使用すると、あるコマンドの出力を別のコマンドの入力として渡すことができます。パイプは
|
という記号で表されます。例えば、
ls
コマンドでディレクトリの内容を表示し、その結果をgrep
コマンドでフィルタリングする場合、以下のようにパイプを使用します:ls | grep "pattern"
この例では、
ls
コマンドの出力がgrep
コマンドの入力として渡され、指定したパターンに一致する行だけが表示されます。
5. vimについて
-
vimについて最低限必要な知識を紹介します。vimにはモードがあります。通常
vi
コマンドで起動したときはノーマルモードで、ファイルの保存やvimの終了、カーソル移動などができます。ノーマルモードでi
を押すと挿入モードに移行し、文字の入力ができます。挿入モードでESC
を押すとノーマルモードに移行します。ノーマルモードでよく使う動作を以下に示します。他にもあるので都度インターネットなどで調べるなどしてください。6
:wq
保存して終了します
h j k l
上から順に、左、下、上、右に移動します
dd
行を削除します
x
ハイライトのかかった文字を削除します
i
挿入モードに移行します
6. シェルとvimの演習
- 以下の演習を通して体験してみてください。後で使います。4-1や5-1を見てもわからない場合は生成AIなどに聞いてもいいでしょう。
-
/home/sandbox/test/hello
というファイルを作成し、vimで起動して挿入モードに移行しHello, World!
と書いて保存して閉じてください。 -
/home/(ユーザー名)
に移動して管理者権限で.vimrc
というファイルを作成してください(すでにある場合は一旦それを別名にして、新しく作ってください)。 -
.vimrc
を開いて入力モードに移行し、.vimrcset showmode set number set expandtab set shiftwidth=4 set smartindent
と入力し7、保存して閉じてください。
-
/home/sandbox/test/hello2
というファイルを作成し、中身に「Hello, World!?」と書いて保存して閉じてください(初めから..vimrc
がなかった場合、見た目が変わって現在のモードや行番号が表示されているに気が付きましたか?これは.vimrc
によるものです8。初めからあった場合は名前を変えたのを戻してそれを使ってください)。 -
1回のコマンドで
test
をコピーしてtest2
を作成してください。 -
/home/sandbox/test2/
の中身を確認してください。そこにあったファイルの中身も確認してください。 -
test2
を1回のコマンドで削除してください。
7. 権限について
-
9ファイルやディレクトリの権限について、
ls -l
で確認できます。作った人が所有者になります。権限には、r: 読み取り、w: 書き込み、x:実行の3種類があリます。ls -lの1文字目はファイルの種類(ファイル:-、ディレクトリ:d)で、2-4文字目は所有者の権限、5-7文字目は所有グループの権限、8-10文字目はどちらでもないユーザーの権限です。これを変更するのにchmod
コマンド(chmod
(アクセス権) (ファイルもしくはディレクトリ名))を利用できます。記号を用いた方法では、以下のような方法を使います。対象 操作 権限 u: 所有者 +: 権限の追加 r: 読み取り g: 所有グループ -: 権限の削除 w: 書き込み o: その他ユーザー =: 権限の指定 x: 実行 a: 全ユーザー 例えば
hello
を全ユーザーが読めるようにしたいときにはchmod a+r sandbox
とすれば良いです。実行して
ls -l
で確認してみてください。数字を用いた方法では、以下のような方法を使います。
r, w, xをそれぞれニ進数の桁に見立て、r=4, w=2, x=1として権限がある場合にその桁を1、ない場合は0とします。それを10進数として見たしたものを使います。例えば読み書きが出来て実行できないならrは1、wも1、xは0ですからこれは10進数で6です。読みだけ出来てそれ以外が出来ないならrだけが1なので4です。仮に
hello2
を所有者が読み書きできて所有グループは読みのみ、どちらでもないユーザーは何も出来ないという権限にしたい場合はchmod 640 hello2
とすればいいわけです。これも実行して
ls -l
で確認してみてください。 -
10権限をより管理者レベルの高いユーザーに移譲したいときは
chown
コマンドを使います。なおsudo
(管理者権限)が必要です。sudo chown (ユーザー名) (ファイルもしくはディレクトリ名)
所有グループの変更は
chgrp
コマンドで行います。sudo chgrp (グループ名) (ファイルもしくはディレクトリ名)
8. 環境変数について
-
ここで環境変数というのはシェルの状態や設定値のことです。例えばあるプログラムをあるファイルに適用するときに毎回そのプログラムまでのパスを指定するのが面倒くさいのでそのパスを省略したりするのに使います(これまで使ってきたコマンドがまさにそうです)。
環境変数は
echo
コマンドで確認できます11。環境変数名の先頭には$を付けてください。echo $(環境変数名)
なお、
echo
コマンドは本来指定した文字列をそのまま表示するだけのコマンドです。環境変数名には以下のようなものがあります:
- PATH : コマンドが実行される際に検索されるディレクトリのリスト
- USER : 現在のユーザー名
- LANG : 使用する言語とロケール(場所)の設定
- HOME : 現在のユーザーのホームディレクトリ
- HISTSIZE : 保存されるコマンド履歴の最大数
- HISTFILE : コマンド履歴が保存されるファイルのパス
- EDITOR : デフォルトのテキストエディタ
- SHELL : 現在使用しているシェルのパス
環境変数の値を一時的に変更するには
export
コマンドを使います12。この場合は環境変数名の先頭に$をつけません。export (環境変数名)=(設定値)
例えばコマンド履歴を保存する場所を
sandbox/.bash_history
にしたい場合はexport HISTFILE=/home/(ユーザー名)/sandbox/.bash_history
を実行すると良いです。これでこのターミナルが終了するまでは
sandbox/.bash_history/
にコマンド履歴が保存されます。ターミナルが一度終了して次に起動しても、永続的に設定を保持していたい場合は
~/.bashrc
もしくは.bash_profile
を編集してください。
9. ネットワークについて
-
インターネットやLANではTCP/IPというネットワークプロトコルを利用してIPアドレスというものでネットワーク上の機器を管理識別しています13。IPv4アドレスは8ビット×4の形式で構成され、各ブロックは10進数表記で0から255までを割り当てる事ができます。
11000000.10101000.00000001.00000010 192. 168. 1. 2
IPアドレスはネットワーク部とホスト部が合体したもので、その境界をサブネットマスクというもので管理します14。サブネットマスクはIPアドレスと同じく8ビット×4の形式ですが、特定の場所まではすべて1で特定の場所からはすべて0という形式になっています。この1と0の境界が対応するIPアドレスのネットワーク部とホスト部の境界です。
11111111.11111111.11111111.00000000 255. 255. 255. 0
例えばこの場合上24桁目までがネットワーク部です。
このIPアドレスとサブネットマスクの表記法としてCIDR(サイダー: Classless Inter-Domain Routing15)表記というのがあります。これはサブネットマスクのネットワーク部の長さをそのまま10進数にしたもので、上2つの例では
192.168.1.2/24
というふうになります。
-
IPアドレスはA, B, Cという3つのクラスがあります。CIDR表記で示すとクラスAは.../8, Bは.../16, Cは.../24となるもののことです。
-
ネットワークアドレスとはホスト部がすべて0に置き換えられたIPアドレスのことで、ネットワークそのものを指します。
ブロードキャストアドレスとはホスト部がすべて1に置き換えられたIPアドレスのことで、ネットワーク全体に通信を行うときに使います。
ネットワークアドレスとブロードキャストアドレスは機器に割り当てることができません。
プライベートIPアドレスとはLANで特定の範囲内で自由に割当できるIPアドレスです。
グローバルIPアドレスとは世界中で一意に指定できるIPアドレスのことです。
-
複数のアプリケーションが一つのコンピューターで動作している場合に、それぞれに対する別の通信が来ると、IPアドレス1つで指定するとかぶるので、ポートという概念を利用します16。よく使われるサービスにはあらかじめポートが割り当てられており、これはwell-knownポートと呼ばれ、
cat /etc/services
で見ることが出来ます。
-
IPアドレスは数字です。これはコンピューターにとっては理解しやすいですが人間にとっては理解しにくいので、数字以外のアルファベットなどを使って管理します17。IPアドレスに対応する名前をホスト名として、DNS(Domain Name System)で管理します18 19。ホスト名とドメイン名を組み合わせてFQDN(Fully Qualified Domain Name: 完全修飾ドメイン名)といいます。例えば
www.ct.omu.ac.jp
はjp(日本)ネットワークのac(高等教育機関)ネットワークのomu(大阪公立大学)ネットワークの(高専)ctネットワークのwwwサーバーを指すということです。
-
ネットワークとの接点をネットワークインターフェースと呼び、Linuxでは「eth0(Ethernetの0番20)」などの名前で表されます。これは
ip addr show
で確認できます。
-
普通コンピューターをネットワークに接続するとDHCP(Dynamic Host Configuration Protocol)で自動的にIPアドレスが割り当てられます21。これは時間経過で勝手にIPアドレスが変わります。しかし、外部にサーバーを公開する場合などは時間経過でIPアドレスが変化されると困ります。なのでサーバーを運用する場合などはIPアドレスを固定する必要があります。Ubuntuではnetplanを利用してIPアドレスを固定します。これは設定ファイルを
/etc/netplan/(ファイル名).yaml
を作って、sudo netplan apply
というコマンドを実行することで可能です。設定ファイルの作り方はこのページを参考にしてください。
10. ユーザー管理について
-
ターミナルで
$
が出た場合は一般ユーザー、#
が出た場合はrootユーザーです22。rootユーザーは管理者権限が必要なときのみ使いますが、一般ユーザーがsudo
を使うことでもそのコマンドのみで管理者権限を与えられます。Ubuntuインストール直後はrootユーザーのパスワードがないので、sudo passwd root
で設定する必要があります。実際のところセキュリティ上rootユーザーを使うことはほとんどなく、
sudo
で済ましてしまいます。 -
ユーザーを追加するときは
sudo adduser (ユーザー名)
を実行します23。途中で
New password:
という状態になるので入力して、もう一度確認のために同じパスワードを入力します。
追加されたのを確認するには
tail /etc/passwd
を実行します。
-
ユーザーをグループへ追加するときは
sudo usermod -aG (グループ名) (ユーザー名)
を実行します。あるユーザーが
sudo
を使いたいときは、そのユーザーがsudo
グループに追加されている必要があります23。 -
ユーザーをグループから削除するときは
sudo gpasswd -d (ユーザー名) (グループ名)
を実行します。
-
ユーザーを削除するときは
sudo userdel (ユーザー名)
を実行します。
-
ユーザーを切り替えるときは
su (切り替え先のユーザー名)
を実行します。-オプションをつけると切り替え後そのユーザーのディレクトリに移動します。なお、rootユーザーは
su
を実行します23。-オプションを付けると切り替え後ルートディレクトリに移動します。
11. サーバー管理
-
サーバーの稼働時間と負荷を確認するには、
uptime
を実行します24。このコマンドで末尾に表示される
load average
で、左から順に1分間での負荷、5分間での負荷、15分間での負荷が表示されます。これらの負荷がサーバーのCPUコア数を下回っていれば、サーバーのスペックが十分であると判断できます。逆に、上回っていれば、スペック増強を考えないといけません。 -
ディスクの使用状況を確認するには
df
を実行します25。-hオプションで単位をつけてくれるのでわかりやすいです。
Size
はそのファイルシステムの最大容量、Use
は現在使用している容量、Avail
は空き容量、Use%
は最大容量に対する現在使用している割合、Mounted on
はどこに接続されているかを表します。 -
メモリやスワップ領域(メモリに載せきることができず、仮想メモリとしてSSDやHDDなどが利用されている領域)の利用状況を確認するには、
free
を実行します26。
-h
オプションで単位を付けてくれるのでわかりやすいです。total
は使用可能な最大メモリ領域、used
は現在利用されているメモリ領域、free
は現在利用されていないメモリ領域(からキャッシュやバッファに使用されているメモリを除いたもの)、shared
は複数プロセス間で共有されているメモリの領域、buff/cache
はバッファとキャッシュに使用されているメモリの領域、avialble
は現在利用されていないメモリ領域です。 -
プロセスという実行中のプログラムを確認するには、
ps
を実行します27。
aux
オプションですべてのプロセスを確認できます。USER
はプロセスを所有しているユーザー名、PID
は各プロセスに割り当てられた一意の識別子、%CPU
はプロセスが使用しているCPU時間の割合、VSZ
はプロセスが利用している仮想メモリの総量、RSS
はプロセスが利用している実際の物理メモリの量、TTY
はプロセスが関連付けられている端末、STAT
はプロセスの状態、START
はプロセスが開始された時刻または日付、TIME
はプロセスが使用したCPU時間の累計、COMMAND
は実行されたコマンド名とその引数です。 -
uptime
やfree
、ps
コマンドを定期的に行ってリアルタイムに確認する場合はtop
を実行します28。3秒ごとに更新されます。
-
サービスとは特定の役割や機能を持ったサブシステムのことです。
systemd
とは、Linuxの一般的な初期化システムで、各種サービスを起動時に立ち上げる役割を持ちます29。これを制御管理するのがsystemctl
ですが、systemd
以外にもsystemctl (サブコマンド) (サービス名)
のように実行すればサービスを管理できます。以下はサブコマンドです30:
-
start
サービスの開始 -
stop
サービスの停止 -
reload
サービスの再読み込み -
restart
サービスの再起動 -
enable
サービスの自動起動オン(システム起動時) -
disable
サービスの自動起動オフ(システム起動時) -
status
サービスの状態表示 -
daemon-reload
設定ファイルの再読み込み
-
-
定期的にコマンドを実行するには
crontab (オプション)
を実行します31。
-l
オプションでスケジュール設定を表示、-r
オプションでスケジュール設定をすべて削除、-e
オプションでスケジュール設定を編集します。編集する際は、
(分) (時) (日) (月) (曜日) (実行コマンド)
のように記述します。分、時、日、月、曜日にはすべてを意味する*(ワイルドカード)を指定できます。すべてワイルドカードにした場合は1分毎に実行されます。
例として、毎週土曜日20時50分にAtCoderを開くコードを以下に示します:
50 20 * * 6 xdg-open https://atcoder.jp
なお、実行コマンドにはシェルスクリプトなども指定できます。
sudo
などもつけることができます。また、/etc
のcron
と名のつくファイルにそれぞれ設定を書けばスケジュールから設定を記述することもできます。 -
時間管理をするには、
timedatectl
を実行します。現在の場所の時間などが表示されます。
自動で設定したい場合は、インターネットを使って時刻を同期させるNTP(Network Time Protocol)という仕組みを使います。
sudo timedatectl set-ntp true
を実行し、もう一度
timedatectl
を実行してNTP synchronized: yesと表示されればOKです32。タイムゾーンを設定する場合は
sudo timedatectl set-timezone (タイムゾーン)
で設定します。
12. Apache HTTP Serverの導入
-
(3-4でmozcとfcitx5を入れた人はもう知っているかもしれませんが)Debian系でソフトウェアをインストールするにはaptコマンド
sudo apt install (パッケージ名)
を実行してインストールできます。
-
ここではApache HTTP Serverを利用してWebサーバーを構築します。インストールするにはまず
sudo apt update
を実行し、パッケージリストを更新(パッケージリポジトリから最新のパッケージのバージョンなどを入手する)33してから
sudo apt -y install apache2
を実行します34。
-y
オプションは途中で聞かれるyes/noで答える質問に全部yesで答えるというオプションです。インストールできたらsudo systemctl start apache2
で起動し、
sudo systemctl enable apache2
で自動起動を有効化、
sudo systemctl status apache2
で状況を確認します。正しく起動できていれば
Active
欄がactive (running)
と表示されます。正しく起動できていることを確認したらブラウザで
http://(サーバーのIPアドレス)
に接続してApache2 Ubuntu Default Pageというページが表示されたらOK。サーバーのIPアドレスはip addr show
で確認できます。 -
Apache HTTP Serverの設定ファイルは
/etc/apache2/apache2.conf
や/etc/apache2/sites-available/000-defualt.conf
です。apache2.conf
はサーバー全体の設定を行うファイルで、Apacheの基本的な動作や全体に適用される設定を記述します。000-default.conf
は特定の仮想ホスト(この場合はデフォルトのホスト)の設定を行うファイルで、特定のサイトやドメインに対する設定を記述します。Webページに関する変更は基本的に
000-default.conf
を変更するか新しい設定ファイルを作成します。設定ファイルで記述可能な設定項目をディレクティブといい、主要なものを以下に示します35。
-
ServerRoot
: 設定ファイル等を配置するトップディレクトリ(例:/etc/apache2) -
Listen
: Apacheが受け付けるIPアドレス(省略可能)とポート番号(例:80) -
User
: Apacheの実行ユーザー(例:User #-1) -
Group
: Apacheの実行グループ(例:Group #-1) -
ServerAdmin
: Apacheの管理者(例:webmaster@localhost) -
ServerName
: Webサーバー名、クライアントに返す様々なエラーメッセージ中に記述する、問い合わせアドレス(例:www.example.com) -
DocumentRoot
: Webページを配置するディレクトリ(例:/var/www/html) -
DirectoryIndex
: サーバー名でアクセスしたときに表示するファイル(例:index.html)
-
-
今ある仮想ホストを残して仮想ホストを新しく作るために、
sudo touch /etc/apache2/sites-available/(ファイル名).conf
を実行します。そこに
(ファイル名).conf<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot (ディレクトリパス) DirectoryIndex (ファイル名) ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory "var/www/practice1"> AuthType Basic AuthName "Restricted Content" AuthUserFile /etc/apache2/.htpasswd Require valid-user </Directory> </VirtualHost>
を記述してください。ディレクトリパスには例えば
/var/www/html2
などWebページを配置するディレクトリを、ファイル名には例えばindex.html
などを記述してください。ディレクトリパス(今回は
/var/www/html2
とします)に指定したディレクトリとファイル名(今回はindex.html
とします)に指定したファイルを作ります。sudo mkdir -p /var/www/html2 sudo touch /var/www/html2/index.html sudo vi /var/www/html2/index.html
を実行して、適当にHTMLファイルをなにか書いてください。例えば
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>デモページ</title> </head> <body> <h1>ようこそ、デモページへ!</h1> <p>これはサンプルのHTMLページです。</p> <p>Apache HTTP Serverを使用してこのページを表示しています。</p> </body> </html>
のように。
そして、もともと起動していた仮想ホストを無効化し、この新しく作った仮想ホストを有効化するために
sudo a2dissite 000-default.conf # 無効化 sudo a2ensite ファイル名.conf # 有効化 sudo systemctl reload apache2
を実行します。
これでまた http://(サーバーのIPアドレス) に接続して自分で記述した内容のページが表示されたらOK。サーバーのIPアドレスは
ip addr show
で確認できます。 -
Ubuntuではファイアフォールの設定に
ufw
コマンドを利用します36。sudo ufw enable sudo ufw allow 'Apache' sudo ufw status
enable
でファイアフォールを有効化し、allow 'Apache'
でwell-knownである80番ポートを開放しています。正しく実行できていればApache ALLOW Anywhere Apache(v6) ALLOW Anywhere(v6)
のように表示されます。
-
Webページにパスワードをかけて特定の人のみに閲覧させたいときは、BASIC認証を使用します。
sudo apt install apache2-utils
を実行して基本認証を利用するパッケージをインストールします。次に、
sudo htpasswd -c /etc/apache2/.htpasswd (ユーザー名)
でユーザー登録を行います37。初回ではないなら
-c
オプションは不要です。次に設定ファイル(
/etc/apache2/sites-available/(ファイル名).conf
)に以下のディレクティブを追加します:(ファイル名).conf<Directory "(認証を利用するディレクトリパス)"> AuthType Basic AuthName "Restricted Content" AuthUserFile /etc/apache2/.htpasswd Require valid-user </Directory>
(認証を利用するディレクトリパス)に記述されるディレクトリには、パスワード認証をしたいファイルが入り、そのディレクトリにあるすべてのファイルに対して有効になります。
AuthType
には認証の種類を記述します。今回はBasic認証です。Digest認証などもあります。AuthName
には、認証ダイアログに表示取れるメッセージを記述します。今回はRestricted Content(制限されたコンテンツ)です。AuthUserFile
には認証に使用するユーザー名とパスワードが格納されているファイルのパスを記述します。Require
には認証に成功したユーザーに対するアクセス制御を指定します。valid-user
で認証したすべてのユーザーにアクセスを許可します。変更を保存したら、
sudo systemctl reload apache2
でApache HTTP Serverを再起動します。
-
Apache HTTP Serverのアクセスログは/var/log/apache2/access.logに保存されます。
cat /var/log/apache2/access.log
で覗くと、
- どのIPアドレスから接続してきたか
- 接続元のユーザー名
- アクセス日時
- リクエストされたページ
- ステータスコード
- リソースに対する転送量
- アクセス元のURL
- アクセスしたWebブラウザ
などを見ることができます38。
ステータスコードとはHTTPリクエストが正常に終了したかどうかを示すコードで、
- 200 OK: リクエストが成功し、サーバーがリクエストされたリソースを正常に返したことを示します。
- 401 Unauthorized: 認証が必要なリソースに対して認証が行われていない、または認証に失敗したことを示します。
- 403 Forbidden: サーバーがリクエストを理解したが、アクセスを拒否していることを示します。認証があってもアクセスが許可されない場合に使用されます。
- 404 Not Found: リクエストされたリソースがサーバー上に存在しないことを示します。
- 500 Internal Server Error: サーバー内部で予期しないエラーが発生し、リクエストを処理できなかったことを示します。
などがあります39。
-
Apache HTTP Serverのエラーログは
/var/log/apache2/error.log
に保存されます。cat /var/log/apache2/error.log
で覗くと、
- エラーがおきた日時
- エラーを発生させたモジュールとエラーレベル
- プロセスID
- クライアント情報(IPアドレスとポート番号)
- エラーメッセージ
などが表示されます40。
13. SSH接続
-
よくサーバーにSSHで接続して作業をするということがあるので、公開鍵認証とパスワード認証の2段階認証を使ってSSH接続をするための設定を行います。
sudo apt install opnessh-server
でOpenSSHをインストールし、
sudo systemctl start ssh sudo systemctl enable ssh
で起動、
sudo systemctl status ssh
で起動しているかを確認します41。起動していたらActiveの欄active (running) になっています。
-
セキュリティ向上のため、デフォルトの設定を(ポートをwell-knownのものからwell-knownではないものに)変更します。しかしその前に元の設定のバックアップを
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config_backup
でとっておきましょう。
そして
sudo vi /etc/ssh/sshd_config
で#Port22とある行を探し、#をとってコメントアウトを解除、今回は10022に変更して保存してください。終わったら
sudo ufw allow 10022/tcp sudo sytemctl reload ssh
でポートを開放し、SSHを再起動します。
外部からはrootユーザーでログインされると危険なので、それを禁止するために
PermitRootLogin no
を実行します42。特定のユーザーにのみログインを許可する場合は
AloowUsers (ユーザー名)
を実行します43。それぞれ行ったあとは
systemctl
で再起動を忘れないでください。 -
SSH接続をするためのパソコンでシェルを開き、
ssh (ユーザー名)@(ホスト名もしくはIPアドレス) -p (ポート番号)
を実行します。今回はポート番号は10022です。初回接続のときは"Are you sure you want to continue connectinf (yes/no/[fingerprint])?と聞かれるので、正しく接続できているならyesを選択します。
-
SSH接続をするためのパソコンのシェルで、
ssh-keygen -t ed25519 -f ./.ssh/id_ed25519
を実行します44。実行するとパスフレーズを入力せよと言われるので入力して(しなくてもいい)、Enterを押してください。
ed25519
45は暗号化アルゴリズムで、現在(2024年11月)主流のものです。ファイル名で指定したファイルに鍵が隠されています。このファイルはユーザーディレクトリの
.ssh
というディレクトリにあることが多いです。正常に実行されていると
.ssh
にid_ed25519
という秘密鍵とid_ed25519.pub
という公開鍵の2つのファイルが生成されます。 -
公開鍵を登録するために、
$ cat $HOME\.ssh\(公開鍵のファイル名) | ssh (ユーザ名@ホスト名もしくは IP アドレス)-p (ポート番号) "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
を実行します。今回の場合は公開鍵のファイル名は
id_ed25519.pub
です。公開鍵の内容を
cat
で取得、それをssh
コマンドで接続した先にファイルを作って入れ、所有者以外は権限を与えないようにしています。また、2段階認証を有効化するために、
sudo vi /etc/ssh/sshd_config
で設定ファイルを開き46、
AuthenticationMethods publickey, password
を記述して保存したら、
systemctl
で再起動してください。これでSSH接続をするためのパソコンで
ssh (ユーザー名)@(ホスト名もしくはIPアドレス) -p (ポート番号)
を実行して接続できれば完了です。
14. Docker導入
-
Dockerは、アプリケーションをコンテナとしてパッケージ化し、どこでも一貫して動作させるためのツールです。コンテナと呼ばれる実行環境は軽量で、仮想マシンよりも効率的です47。また、Dockerイメージという環境を再現するためのアーカイブファイルで簡単に環境を作ることができます。
-
まず、適当なところに
docker_install.sh# Add Docker's official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
を、
docker_install.sh
として保存し、名前をそのまま入力して実行してください48。必要なら、chmod +x docker_install.sh
で実行権限をつけてください。インストール出来たら、
sudo docker --version sudo systemctl status docker
でDockerのバージョンと起動状態を確認してください。もし起動していなければ、
systemctl
コマンドで起動してください。今後、dockerコマンドをユーザーで実行したい場合は、sudo usermod -aG docker $USER newgrp docker
を実行してdockerグループにユーザーを追加してください。
-
11-6で書いたように、OSはまず初めにPID1(
Systemd
)を実行し、そのプログラムがどんどん他のサービスを起動させます。プロセスには依存関係があるので、PID1を停止させると、それが呼んでいたサービスもすべて停止します。逆に、それ停止させると全プロセスをすべて停止させるようなプロセスをPID1と呼びます。コンテナを停止しても全プロセスの停止にもなります。 -
DockerイメージはDocker Hubに上がっていればインストールできるので、とりあえず
hello-world
を実行します。docker container run hello-world docker run -it ubuntu bash
下のコマンドはコンテナ内でubuntu bashを開くためのコマンドです。
exit
で脱出できます。docker container ls -a
でコンテナの一覧を確認できます。そこでは
-
コンテナID: 各コンテナに割り当てられる一意の識別子です。通常、12文字の短縮形式で表示されます。
-
イメージ: コンテナの実行環境を定義するテンプレートです。アプリケーションやその依存関係を含みます。
-
ステータス: コンテナの現在の状態を示します。例:running(実行中)、exited(停止)、paused(一時停止)など。
-
コンテナ名: コンテナに割り当てられた名前です。指定しない場合は自動的に生成されますが、--name オプションで指定することもできます。
などが表示されます49。
-
-
hello-world
を停止するにはdocker container stop hello-world
を実行します。
hello-world
の部分はdocker container ls -a
で調べたときに出てきています。 -
hello-world
を削除するにはdocker container rm hello-world
を実行します。停止→削除と行うときには
-f
オプションを付けます。 -
何故か名前で指定でないときは、
docker ps -q
でコンテナのIDが表示されるので、これを指定してください50。
15. Docker上でApache HTTP Serverを動かす
-
httpdがApache HTTP ServerのDocker Hubでの名前なので、
mkdir -p ~/(ディレクトリ名)/htdocs ~/ディレクトリ名/conf
で管理ディレクトリを作ってから、
cd ~/(ディレクトリ名) docker run -dit --name my-apahe-app -p 8080:80 -v ./htdcos:/usr/local/apache2/htdocs/ -v ./conf:/usr/apache2/conf httpd:2.4
で起動させます51。
-dit
は-d
、-i
、-t
コマンドの組み合わせで、コンテナをバックグラウンドで実行し、標準入力を開いたまま疑似ターミナルを割り当てるというオプションです。-p
オプションでホストの8080番ポートにアクセスすると、コンテナ内の80番ポートにリクエストが転送されるようになっています。-v
オプションでホストの./htdocs
ディレクトリをコンテナの/usr/local/apache2/htdocs/
ディレクトリに接続します。これにより、ホスト上のファイルがコンテナ内で利用可能になります。httpd:2.4
は使用するDockerイメージの名前です。この状態で、
./htdocs
にindex.html
を入れるとコンテナ上のApache HTTP Serverで読み込まれて内容がインターネットに公開されます。
-
ここではそれてしまうので詳しくは書きませんが、例えばこういうサイトが参考になります ↩
-
なぜならターミナルの先頭に表示される名前だからです。長いと領域を取られて邪魔です。 ↩
-
コンピューターに接続されているキーボードやマウス、ディスプレイやスピーカーなど外部デバイスを制御するためのファイル。 ↩
-
それぞれ、以下のような意味です。
set showmode
現在のモードを表示する。set number
行を表示する。set expandtab
tabを半角スペースで代用。set shiftwidth=4
インデントの幅を4に。set smartindent
改行したときに勝手にインデント。プログラムの構造も考慮。こちらのページを参考にしました ↩ -
私が行った限りでは、何故か標準でtiny vimがインストールされるということになっていました。なので、ここで作成しています。 ↩