サーバーを作ってみる -1

先日、研究室での活動を行う中で、「これ自分でサーバー立ち上げることができたら便利だな」と感じた。今日は時間があるので*1、サーバーを作ってみる。今回作るのは、研究とか関係なく、自分用。趣味の範囲。

自分用のメモなので、普通には読みづらい。こういうの、誰にでも読みやすいような体裁でメモとっていけたら、資料としても使えて便利だよなあ。

どういうものを作りたいか

イメージ

イメージとしては、「Dropbox」的なのを作りたい。ファイルをネットを通じて共有できるもの。できれば、「インターネットで、グローバルにアクセスできるもの」と「ローカルのネットワークでしかアクセスできないもの」の2種類を作れるようになりたい。

使用する機材

今回は、家でほとんど稼働することがなくなった、デスクトップPCを使う。結構スペックは持て余すことになる。OSはWindows11 Pro。できれば、消費電力が少なく、今後使う機会が多いラズパイでやりたかったが、自分で持っていない。買う金も今はないので、ひとまず、上記の機材を使う。

参考資料を読む→実装

Raspberry-Pi 初めてガイド

まあ今回ラズパイを使うわけではないのだが、『第4章サーバーとして利用しよう』という章がある。これは、ラズパイを使わないにしても、『初めてガイド』である以上それなりに初歩的なことが書いてあるだろう。ひとまず、自分は「サーバーとはなんたるか」がわからない。なんか「サーバールームとやらがあって、いっぱいコンピュータが並んでいてすごい」みたいなイメージしかないのだ。

固定IPアドレスの設定

この『初めてガイド』を読み込んでいくと、「固定IPアドレス」なるものの設定が必要らしい。

普段、WiFiに接続する際に、パスワードを入力して接続するが、この時にもIPアドレスは割り当てられている。ここでの接続方式は「DHCP: Dynamic Host Configuratoin Protocol」と呼ばれる。これにより、自動的にIPアドレスなどの情報が割り当てられ、複雑な設定を行うことなく、ネットワークの接続をすることができる。ちなみにここで割り当てられるIPアドレスのことを「動的IPアドレス」と呼ぶ。

この動的IPアドレスが、サーバーの用途においてはまずい。いつも同じIPアドレスが振り分けられるとは限らない。サーバーにおいては、他のコンピュータからアクセスする際に、最初からIPアドレスがはっきりしていることはとても重要だ。そこで、「固定IPアドレス」の設定が必要になる。

固定IPアドレスの設定を行う場合、「インターフェース自体に対して行う方法」と「ESSIDごとに行う方法」があるらしい。前者では、どのWiFiネットワークに接続しても同じIPアドレスになる。後者では、WiFiネットワークごとに異なるIPアドレスを使い分けることが可能になる。
個人的に、前者のが便利ではないかと思うわけだが。後者がどのような用途で必要になるかは、またいつか調べよう…

さて、ここで『はじめてガイド』に掲載されている手順に則って、手元のWindowsデスクトップに固定IPアドレスを振り分けてみようと思う*2

IPv4アドレス」「IPv4 DNSサーバー」「IPv4 デフォルトゲートウェイ」をメモする。まあ、これらが何に当たるものなのか、どのような役割を果たすもんかはわからん。

さて、ここまでが『はじめてガイド』でWindowsでも共通となろう情報。ここから、普通に調べて設定していく。以下のページを参考にする。自分のWiFiルーターIPアドレスが「192.168.11.1」だったので、同じ条件での情報が載っているページを使うことにした。どうやらWiFiルーターIPアドレスによって、少し手順が異なるらしい。今回はひとまず、細かいことは調べず先に進んでいく。なんか「IPv4 DNSサーバー」が「非暗号化」になっているのが気になった。画像を遡ると最初からこの状態なので、気にしなくてよさそう。調べてみると、うん、なんか大丈夫そうである。
今回は「192.168.11.30」に設定した。
pc-karuma.net
www.buffalo.jp
answers.microsoft.com

サーバーを動かすためのソフトウェアなど

さて、「ラズパイのOSでは、様々なソフトウェアを追加することで、機能を強化する」という記載がある。これは、Windowsについても共通であろう。ラズパイのOSでは、ホームページのためのWebサーバーとしての運用において、「Apache HTTP Server」や「Nginx」などのソフトウェアがいる。ファイルサーバーにおいては、「Samba」というソフトウェアが必要だ*3。今回の自分が実現したい用途においては、「Samba」のようなソフトウェアが主役になるだろう。そして、自分が実現したいのは「ファイルサーバー」らしい。

~ $

ここで読んでいて「へー!」と思った部分があった。コマンドプロンプトにおける、「~ $」の部分について。「~」の部分が「現在いるディレクトリ」を示すことは知っていた。だが、「$」については謎だった。まあ、「呪文的なものだろう」と思っていた。しかし、調べると、どうやらこれは「権限レベル」を示すものらしい。「$」の時は「一般ユーザー」。「#」の時が「管理者ユーザー(いわゆるroot)」。これは知らなんだ。じゃあ、なんかCLIで権限がありません、的なことが起こった時はここを参照するといいことにもなる。まあ、普通は「sudo」で対応するのだろうが。

ip addr show

「ip addr show」を用いて、ターミナルからIPアドレスを調べることもできるらしい。ネットワークの状態の診断にも役に立つらしい。また、機会があれば利用してみよう。こういうのは、一度目を通して、「存在を知っておく」だけでも後々役に立つ。

標準入出力

コマンドで、実行結果をターミナルに表示してきた。ここで、その出力先のことを「標準出力」と呼ぶらしい。標準出力は指定をしなければ画面で、そのほかに切り替えることもできる。これを「リダイレクト」と呼ぶ。
例えば、ファイルをリダイレクトすることで、lsコマンドの結果をファイルに書き出すこともできる。標準出力のリダイレクトは「>」を使うとのこと。
例えば、本来画面に表示される内容を「out.txt」のファイルにリダイレクトするなら以下のようになる。

pi@raspberrypi: ~ $ ls >out.txt

逆に、「標準入力」なるものもある。標準入力もまた、リダイレクトが可能である。標準入力においては、先ほどと逆の「<」を用いる。例えば、以下のような感じだ。

pi@raspberrypi: ~ $ cat </etc/passwd

上記により、ファイルの内容がそのまま表示される。

パイプ

「パイプ:|」を用いることによって、最初のコマンドの標準入力を次のコマンドの標準入力に結びつけることができる。grepコマンドによるフィルタをかけた実行結果などを活用することができるようになる。

pi@raspberrypi: ~ $ ls | grep p #pを含むものを抜き出す
Desktop
aptコマンド

これはお馴染みではあるが、実用上の知識しかない。
CLIにおけるパッケージの操作を、「aptコマンド」を使って行うことが可能である。aptは「advanced package tool」の略。一般に以下のような書式で用いる。

apt 操作(サブコマンド) パッケージ

サブコマンドには、「update」「install」「upgrade」「remove」「search」などが入る。」

aptコマンドを使う前には、インデックスの更新を行うことが推奨される。リポジトリと呼ばれるパッケージのデータベースが更新されたり、ラズパイOS自身が参照するリポジトリが変わったりすることがあるため、インデックスを最新にする必要があるとのこと。

pi@raspberrypi: ~ $ sudo apt update

sudoは「super user do」の略。一般ユーザーを一時的に管理者ユーザーに格上げしてくれる。ちなみに、aptコマンドはシステムに変更を加えるものであるため、管理者ユーザーでないと実行できない。

ここで、すべてのパッケージをアップグレードする方法についても記載しておく。

pi@raspberrypi: ~ $ sudo apt upgrade
pi@raspberrypi: ~ $ sudo apt upgrade gimp #これで、upgradeする対象を指定できる。

すでにインストールされているパッケージの情報を調べるには、「infoサブコマンド」を使う。バージョンやサイズなどの情報を見ることができる。

pi@raspberrypi: ~ $ sudo apt info gimp #gimpを調べる


すでにインストールされたものを削除するには、「removeコマンド」もある。そのほか、コマンドのマニュアルを見るためには以下のように「manコマンド」を使って、調べてみる良い。

pi@raspberrypi: ~ $ man apt
WebサーバーでWebサイトを表示する

Webサーバーとは、WebブラウザからアクセスしてHPやECサイトなどをみることができるようにするためのサーバーである。普段私たちがインターネットを使って最もアクセスする機会が多いのがおそらくこれである。実は意外に簡単に作ることができるようだ。

Webサーバーとしての動作には、専用のアプリケーションが必要になる。ここで有名なのが、Apache(Apache HTTP Server、アパッチ)である*4Apache以外にもWebサーバーアプリケーションは存在するが、Apacheに関する情報の蓄積は膨大なので、最も取り組みやすいとのこと。
ちなみに、ここでの対抗馬として挙げられているのが、「Nginx(エンジンエックス)」。
Windows版も、上記の両者にはあるが、Windows用として最も使用されているのは、Microsoftがリリースしている「IIS(Internet Information Service、アイアイエス)」である。IISは、MicrosoftのWebアプリケーション環境であるASP.NET(これについてはまだ知らん)を動かせるなど、Windowsに親和性を持たせているため、Windowsユーザーに支持されている。



「はじめてガイド」では、Pythonのモジュールを使ってWebサーバーの機能を実現させている。手っ取り早い体験や検証には便利だからだ。

サーバーへの接続方法について説明する。Webサーバーでは、URLに基づいて接続を行う。URLは「Unified Resource Locator」の略。ファイルなどのリソースを統合的に表すものだ。以下のような形式になっている。

URLの基本書式

スキーマ」は、Webサーバーへのアクセス方法。一般的なのはhttpかhttps。それぞれHTTP、HTTP over SSL(HTTPS)を意味する。HTTPはHTMLファイルなどのコンテンツをWebサーバーとWebクライアントでやり取りする手順を定めたもの。HTTP over SSLSSLという暗号化の手段をHTTPに加えたもの。

「ホスト名」はサーバーの名前であり、「//」で始まる。必ずしも名前である必要はなく、IPアドレスでも問題はない。なお、一般的には覚えやすい名前が用いられる。また、自分自身を表すときには「localhost」という名称が使用できる。
Webサーバーにアクセスする際には、最終的にIPアドレスを用いる。このときにホスト名をIPアドレスに変換する役割を持つサーバーがDNSサーバーである。
ここで、ホスト名には、「www.server.com:8000」など、「:」を続けてポート番号を指定することがある。(これはみたことがあるぞ!)ポート番号は、サーバーが提供するサービスを区別する番号。Webサーバーでは、80(HTTP)と443(HTTPS)が用いられる。ポート番号の指定がないときにはwebブラウザが勝手に判断してポート番号を指定する。

「パス」はコンテンツのありかを示す。Webサーバーはこれを元に自分の中からコンテンツを探し出し、Webクライアントに返す。

サーバーを起動する!

では、サーバーを起動していく!
以下のコマンドを実行することで、サーバーが立ち上がる。

pi@raspberrypi: ~ $ python3 -m http.server

すると、ポート8000でサーバーが立ち上がる。サーバーを立ち上げているコンピュータ自身からサーバーにアクセスするなら「http://localhost:8000/」でアクセスできる。また、他のPCからアクセスするなら先ほど設定したIPアドレス「192.168.11.30」を使って「http://192.168.11.30:8000/」でアクセスできる。ここでは、ホームフォルダの一覧画面が表示される。ファイルをクリックすると、そのファイルがダウンロードされる。(先生のサーバーはこの状態なのかな。)
ターミナルで表示されていくメッセージは、「アクセスログ」と呼ばれるものである。いつ、どこで、何がリクエストされたのかの記録である。「GET」で始まるものがファイルのリクエストで、「code」で始まるものがその結果になる。

想定した通りの挙動が得られたときの感動!
アクセスログ(この画像も、サーバー越しに取得した。便利
ドキュメントルートを作る

「ドキュメントルート」とは、Webサイトとして公開するファイルが置かれるフォルダのことである。ここでは、http.serverを起動した時のカレントディレクトリがドキュメントルートになる。そこで、フォルダ(~/Web/)をあらかじめ作成し、HTMLファイルをおくことにする。

HTMLファイルは「nano」と呼ばれるCLIで使えるテキストエディタを使う。以下で起動する。

pi@raspberrypi: ~/Web $ nano index.html

適当に書いて、表示してみる。

良い!が、これ普通にファイル一覧が表示されていた頃の方が便利だったな
ポート番号の指定

http.serverは特にオプションをつけなければ、8000番を用いる*5。これを、一般的なwebサーバーのように80番で待機させる2は、以下のように記述する。

pi@raspberrypi: ~ $ python3 -m http.server 80

これで、Webブラウザに入力するURLとして、「http://192.168.11.30/」などと、ポート番号が不要になる。80番はHTTPの標準ポートであり、指定の必要がない。

index.htmlの意味合い

Webサーバーアプリケーションでは、一般的にURLにファイルの指定がなければ、「index.html」が表示されるようになっている。このような性質のある、「index.html」や「index.htm」などは、インデックスファイルと呼ぶ。

ファイルサーバーとNAS

NASは「Network Attached Storage」の略。ファイル保存用のHDDやSSDがネットワークで活用できるもの。この点で、ファイルサーバーもNASと同じだが、NASは専用に専用に作られた機器を示すことが多い。ファイルサーバーの方が、柔軟性・拡張性に優れている。

例えば、ラズパイをサーバーにすると、それはNASになったと言える。ここで、ラズパイのmicroSDをストレージとして用いるには、コスパ上微妙なので、外部ストレージを接続して使うと良い。

ファイルサーバーはファイル共有のための通信プロトコルの、「SMB(WebサーバーのHTML的なもの)」で実現される。SMBはWindows, Mac, Linuxをサポートしており、Windowsのためのファイルサーバーを作れば、自動でMacOSLinuxのためのファイルサーバーにもなる。

Sambaのインストール

以下でインストールする

pi@raspberrypi: ~ $ sudo apt install samba

インストールをした際に、「/usrがworldで編集可能になってるぜ?」というお叱りを受けた。確かにこれはまずいと思い、以下を実行した。

pi@raspberrypi: ~ $ sudo chmod 774 /usr 
大ミスをやらかす

上記の結果、何も実行できなくなった。/usrに下に、Linuxの基本的なコマンド(lsやsudoなど)が格納されていたようなのだ。終わった…まあ、今回どうでもいい仮装環境で諸々の作業をしていてよかった。細心の注意を払わねば。というか、大事なデータの入っているPCでやらなくてよかった。だから「大いなる力には大いなる責任が伴う」ということがsudoについて言われるのだ。以前から、こういうやらかしをしていた人が何人もいたのだろう。
WSLの初期化で無事復帰。
ari23.hatenablog.com

それでは、フォルダの共有の設定をしていく

共有するフォルダは「~/Share」にする。
Sambaの設定は、「/etc/samba/smb.conf」のファイルを書き換えることで行うことができる。ここで、ファイルの書き換えを行う前にバックアップを取る*6

pi@raspberrypi: ~ $ sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.org

ここで、上記の「.org」の意味は下記のような感じらしい。

「これは(変更前の元ファイルのような)オリジナルのファイルだよ~」なファイルに付くことが多い拡張子です。 きっと「最初の」とか「元の」を意味する英語の「original(オリジナル)」が由来でしょうね。

次に、

pi@raspberrypi: ~ $ sudo nano /etc/samba/smb.conf

を用いて、設定ファイルを書き換える。末尾までいき、下記を追記、保存する。

[share]
comment = Share
path = /home/Share #任意
public = yes
browsable = yes
read only = no
force user = User #自分のユーザー名
設定内容の確認

以下のコマンドで追加した設定が正しいかを確認できるらしい。これが何をしているのかはよくわからんが。

pi@raspberrypi: ~ $ sudo testparm
表示される画面
WSLとホストのWindowsIPアドレスを共有する

先のUbuntuのリセット後、UbuntuIPアドレスを通じてサーバーに接続することができなくなった。
下記を参考にして、IPアドレスを共有することに成功した。ファイアウォールのところまでやって繋がった。
gunmagisgeek.com

一旦ここで、使える時間がなくなってしまったので終了。次の機会に持ちこそう。一度、ラズパイで試してみたいので、学校でやってみようかしら。

*1:襟裳岬に行こうかなと思っていたが、一緒に行ってくれる人を手早く捕まえられなかった

*2:載っているのはラズパイの手順だが、そこは適宜調べる

*3:この「Samba」については先生から使ってみては?と言われたことがある

*4:先生のサーバーもこれで動いていた気がする

*5:8000番を使う理由は、おそらく一般に使われる80と混ざることを防ぎ、かつそれと似た数字的なことだと考えられる。

*6:ここまでの作業でもすでにやらかしたように、バックアップの重要性が身にしみてわかる今日この頃である