All Articles

"インストール" というのはファイルを配置したりするだけという話

“インストール” とは?

“インストール” という言葉は、「何をしてくれるか分からないけど、とりあえず入れたソフトウェアが使えるようになる」くらいに思われやすいと思います。

インストールとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典」というページでは、

(ソフトを中に入れて)パソコンやソフトを使えるように準備すること

と説明されています。

この説明の通り、“インストール” というのは、単に関係するファイルをコンピュータ上に保存して、各種設定をしてしまうだけのことを指しています。

設定というのもファイルに保存するわけですから、結局は関係するファイルをダウンロードしたりしてきて配置したりするだけということです。

インストールしたものを実行するのも、単に実行形式のプログラムのファイルを実行するだけです。

Nginx をインストールして確認

実際に、Nginx (よく使われる Web サーバのソフトウェア) をサーバにインストールして、このことを確認していこうと思います。

なお、以後の確認は AWS EC2 の Ubuntu で実施しました。

$ cat /proc/version
Linux version 5.4.0-1045-aws (buildd@lcy01-amd64-026) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #47-Ubuntu SMP Tue Apr 13 07:02:25 UTC 2021

Nginx インストール

まずは Nginx をインストールするため、apt コマンドを実行します。

$ sudo apt update -y
$ sudo apt install -y nginx

インストールが完了したら、Nginx のステータスを確認します。

$ sudo 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 Tue 2021-07-06 04:18:08 UTC; 4s ago
       Docs: man:nginx(8)
    Process: 3267 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 3278 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 3279 (nginx)
      Tasks: 5 (limit: 9418)
     Memory: 5.1M
     CGroup: /system.slice/nginx.service
             ├─3279 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             ├─3280 nginx: worker process
             ├─3281 nginx: worker process
             ├─3282 nginx: worker process
             └─3283 nginx: worker process

Jul 06 04:18:08 ip-172-31-6-255 systemd[1]: Starting A high performance web server and a reverse proxy server...
Jul 06 04:18:08 ip-172-31-6-255 systemd[1]: Started A high performance web server and a reverse proxy server.

ステータスは

     Active: active (running) since Tue 2021-07-06 04:18:08 UTC; 4s ago

となっているので、無事起動しているようです。

実際に curl でアクセスしてみると…

$ curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
    :

デフォルトで表示されるページが返ってきました!

どんなコマンドで実行されているのか

では、Nginx がどんなコマンドで実行されているのか、Nginx のプログラムのファイルはどこにあるのかを見ていきます。

Nginx のステータスの表示から関係する部分を抜粋すると…

$ sudo systemctl status nginx
    :
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
    :
    Process: 3278 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    :

上記の Loaded の部分に書かれている /lib/systemd/system/nginx.service というファイルに書かれている通り、/usr/sbin/nginx -g daemon on; master_process on; というコマンドで起動したようです。

/lib/systemd/system/nginx.service を見てみると…

$ cat /lib/systemd/system/nginx.service
    :
[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

たしかに、起動コマンドが

ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'

のように書かれています。

この記述をもとに、systemd というプログラムが Nginx を起動してくれているわけです。

このように、Nginx と言えど単なる実行可能ファイル (/usr/sbin/nginx) が正体であり、これを手動で実行すればインストールしたのと同じように動くはずです。

手動で動かしてみる

では、/lib/systemd/system/nginx.service の設定をもとに Nginx を動かすのではなく、手動でコマンドを打って起動できるか試してみようと思います。

まずは Nginx を一旦停止します。

$ sudo systemctl stop nginx

手動でどんなコマンドを打つべきかは、Nginx の Dockerfile が参考になります。

CMD [“nginx”, “-g”, “daemon off;”]

の記述を参考に実行すればよさそうです。

では、実行してみます。

$ sudo nginx -g 'daemon off;'

この状態でアクセスすると…

$ curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
    :

無事 HTML が返ってきました!

このように、Nginx をインストールした際は設定ファイルに記載のコマンド通り systemd が動かしてくれているだけであり、手動でコマンドを打って動かすこともできます

※ 手動での起動はあくまで試しにやってみただけで、実際には systemd で動かした方がログ管理などが楽になります

ファイルを見てみる

ここで少し、nginx コマンドのファイルを見てみようと思います。

ファイルのありかは /usr/sbin/nginx です。

$ which nginx
/usr/sbin/nginx

file コマンドでファイルの種類を見てみると…

$ file /usr/sbin/nginx
/usr/sbin/nginx: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=087cd7ff5400c7d80593bba6c8e4639004a765ca, for GNU/Linux 3.2.0, stripped

ということで、ELF という形式のファイルであることが分かりました。

ELF は実行可能なバイナリファイルの一種です。

Nginx 自体は C 言語で実装されており、そのコードをコンパイルしたりして実行可能なバイナリファイルにしたのが nginx コマンド (/usr/sbin/nginx ファイル) ということです。

バイナリファイルなので通常のエディタで開いても読めませんが、objdump や readelf、od コマンドなどで中身を調べることができます。(リバースエンジニアリングする際はライセンスにご注意ください)

ということで、「“Nginx をインストールする” というのは、単に実行形式のファイルや設定ファイルをダウンロードしてきて適切な場所に配置したりすること」ということが分かりました。