お金をかけずにサーバーの勉強をしよう

NGiNXサーバーを作る

2024年1月4日

メニューへ戻る

NGiNXをインストールして WEBサーバーを作ります。

ここでは Ubuntu Serverに NGiNX(エンジンエックスと読む)をインストールして、WEBサーバーを構築します。

NGiNXはロシア製 OSSの WEBサーバーで、現在は米国のF5ネットワークスのものになっています。

NGiNXが出るまでは Apache全盛時代でしたが、インターネット利用者が増えるに従い、同時アクセス数が多くなるとパフォーマンスが極端に悪くなる問題(C10K問題:クライアント数が 1万を超えてるくらいになると極端にパフォーマンスが悪くなる)の解消のために開発されたものと記憶しています。

Apacheとは基本的な設計が異なり、都度のアクセスが軽いものを数多く捌くのが得意な設計になっています。

設定も Apacheよりシンプルなこともあって、非力なマシンで簡単な WEBサーバーの機能を提供するのに適していると思います。

但し NGiNXが真価を発揮するのは WEBサーバー機能よりはリバースプロキシ機能やロードバランス機能であるという捉え方をされていることが多いようです。


1.環境

Ubuntu Server 22.04.3にインストールします。


2.インストール

NGiNXのソースコードを配布しているホームページを見てみますと、以下のようになっていました。

Ubuntuのパッケージ管理は snap と apt の 2種類ありますが、2024年1月4日時点でそれぞれのパッケージリポジトリに登録されているバージョンは以下のようになっていました。

NGiNXは後述するように、自分でソースプログラムをコンパイルして導入するノリなのですが、他の共有ライブラリとの関係を鑑みるとパッケージでインストールしたいのが本音です。

若干古いバージョン(1.18.0)ですが、aptのパッケージインストールすることにします。

subro@UbuntuServer2204-1:~$ sudo apt install -y nginx
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  fontconfig-config fonts-dejavu-core libdeflate0 libfontconfig1 libgd3 libjbig0 libjpeg-turbo8 libjpeg8 libnginx-mod-http-geoip2 libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter
  libnginx-mod-mail libnginx-mod-stream libnginx-mod-stream-geoip2 libtiff5 libwebp7 libxpm4 nginx-common nginx-core
提案パッケージ:
  libgd-tools fcgiwrap nginx-doc ssl-cert
以下のパッケージが新たにインストールされます:
  fontconfig-config fonts-dejavu-core libdeflate0 libfontconfig1 libgd3 libjbig0 libjpeg-turbo8 libjpeg8 libnginx-mod-http-geoip2 libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter
  libnginx-mod-mail libnginx-mod-stream libnginx-mod-stream-geoip2 libtiff5 libwebp7 libxpm4 nginx nginx-common nginx-core
アップグレード: 0 個、新規インストール: 20 個、削除: 0 個、保留: 2 個。
2,692 kB のアーカイブを取得する必要があります。
この操作後に追加で 8,345 kB のディスク容量が消費されます。

〜〜〜 中略 〜〜〜

No containers need to be restarted.

No user sessions are running outdated binaries.

No VM guests are running outdated hypervisor (qemu) binaries on this host.

インストールができました。


3.インストールされたファイルなど

インストールされたファイルなど、どこにあるか見てみます。
まずNGiNX本体の実行ファイルです。

subro@UbuntuServer2204-1:~$ ls -l /usr/sbin/nginx
-rwxr-xr-x 1 root root 1240136  5月 31  2023 /usr/sbin/nginx

次がライブラリファイルです。

subro@UbuntuServer2204-1:~$ ls -lR /usr/lib/nginx
/usr/lib/nginx:
合計 4
drwxr-xr-x 2 root root 4096  1月  4 12:02 modules

/usr/lib/nginx/modules:
合計 396
-rw-r--r-- 1 root root  19024  5月 31  2023 ngx_http_geoip2_module.so
-rw-r--r-- 1 root root  31872  5月 31  2023 ngx_http_image_filter_module.so
-rw-r--r-- 1 root root  27672  5月 31  2023 ngx_http_xslt_filter_module.so
-rw-r--r-- 1 root root 112264  5月 31  2023 ngx_mail_module.so
-rw-r--r-- 1 root root  18896  5月 31  2023 ngx_stream_geoip2_module.so
-rw-r--r-- 1 root root 184904  5月 31  2023 ngx_stream_module.so

次がログファイルです。

subro@UbuntuServer2204-1:~$ ls -l /var/log/nginx
合計 4
-rw-r----- 1 www-data adm  0  1月  4 12:02 access.log
-rw-r----- 1 www-data adm 76  1月  4 12:02 error.log

ログファイルのオーナー・グループとファイルパーミッションを見てみると、更新はインストールによって作成された [www-data]ユーザーのみ、参照はインストーラによって作成された [adm]グループに所属しているユーザーまでとなっています。

少し厳し目ですね。

次が設定ファイルです。
ここが設定としてイジるところです。

subro@UbuntuServer2204-1:~$ ls -lR /etc/nginx
/etc/nginx:
合計 64
drwxr-xr-x 2 root root 4096  5月 31  2023 conf.d
-rw-r--r-- 1 root root 1125  5月 31  2023 fastcgi.conf
-rw-r--r-- 1 root root 1055  5月 31  2023 fastcgi_params
-rw-r--r-- 1 root root 2837  5月 31  2023 koi-utf
-rw-r--r-- 1 root root 2223  5月 31  2023 koi-win
-rw-r--r-- 1 root root 3957  5月 31  2023 mime.types
drwxr-xr-x 2 root root 4096  5月 31  2023 modules-available
drwxr-xr-x 2 root root 4096  1月  4 12:02 modules-enabled
-rw-r--r-- 1 root root 1447  5月 31  2023 nginx.conf
-rw-r--r-- 1 root root  180  5月 31  2023 proxy_params
-rw-r--r-- 1 root root  636  5月 31  2023 scgi_params
drwxr-xr-x 2 root root 4096  1月  4 12:02 sites-available
drwxr-xr-x 2 root root 4096  1月  4 12:02 sites-enabled
drwxr-xr-x 2 root root 4096  1月  4 12:02 snippets
-rw-r--r-- 1 root root  664  5月 31  2023 uwsgi_params
-rw-r--r-- 1 root root 3071  5月 31  2023 win-utf

/etc/nginx/conf.d:
合計 0

/etc/nginx/modules-available:
合計 0

/etc/nginx/modules-enabled:
合計 8
lrwxrwxrwx 1 root root 55  1月  4 12:02 50-mod-http-geoip2.conf -> /usr/share/nginx/modules-available/mod-http-geoip2.conf
lrwxrwxrwx 1 root root 61  1月  4 12:02 50-mod-http-image-filter.conf -> /usr/share/nginx/modules-available/mod-http-image-filter.conf
lrwxrwxrwx 1 root root 60  1月  4 12:02 50-mod-http-xslt-filter.conf -> /usr/share/nginx/modules-available/mod-http-xslt-filter.conf
lrwxrwxrwx 1 root root 48  1月  4 12:02 50-mod-mail.conf -> /usr/share/nginx/modules-available/mod-mail.conf
lrwxrwxrwx 1 root root 50  1月  4 12:02 50-mod-stream.conf -> /usr/share/nginx/modules-available/mod-stream.conf
lrwxrwxrwx 1 root root 57  1月  4 12:02 70-mod-stream-geoip2.conf -> /usr/share/nginx/modules-available/mod-stream-geoip2.conf

/etc/nginx/sites-available:
合計 4
-rw-r--r-- 1 root root 2412  5月 31  2023 default

/etc/nginx/sites-enabled:
合計 0
lrwxrwxrwx 1 root root 34  1月  4 12:02 default -> /etc/nginx/sites-available/default

/etc/nginx/snippets:
合計 8
-rw-r--r-- 1 root root 423  5月 31  2023 fastcgi-php.conf
-rw-r--r-- 1 root root 217  5月 31  2023 snakeoil.conf

結構ありますね。

特筆ポイントは、NGiNXはモジュールという単位で機能を追加・削除できるということです。

NGiNXは WEBサーバーそのものであったり、リバースプロキシサーバー(かつロードバランサー)であったり、HTTPSの終端に使えたりします。

よってインターネットに近い所で運用されるサーバーですので、セキュリティ対策が強く求められるサーバーになります。

そもそもは必要なだけのモジュール(機能)を導入する形で運用するべきで、
[/etc/nginx/modules-enabled]ディレクトリがそれぞれのモジュールの設定ファイルになります。

モジュールの追加・削除については、nginx documentationを参照して下さい。
いずれ慣れてきたら、モジュール導入・削除にもチャレンジしてみると良いと思います。

最後にHTMLドキュメントのルートディレクトリです。
要するにホームページの中身を入れるところ。

subro@UbuntuServer2204-1:~$ ls -l /var/www/html
合計 4
-rw-r--r-- 1 root root 612  1月  4 12:02 index.nginx-debian.html



4.サーバー起動時に自動起動

インストールすることで NGiNXが自動起動するように systemdの設定がされていますので、実はこの時点でも既に起動しています。


5.WEBアクセス

実際に WEBブラウザでアクセスしてみましょう。

[80/tcp](http) で待ち受けていますので、WEBブラウザでアクセスしましょう。
私の環境では、[http://UbuntuServer2204-1] です。
NGiNX
インデックスのページ([/var/www/html/index.nginx-debian.html]ファイル)が表示されました。
WEBサーバーとして上手く動いています。


6.実行されているプロセスなど

どのようなプロセスが実行されているのか見てみます。

subro@UbuntuServer2204-1:~$ ps -ef | grep nginx
root        2027       1  0 12:02 ?        00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data    2030    2027  0 12:02 ?        00:00:00 nginx: worker process
www-data    2031    2027  0 12:02 ?        00:00:00 nginx: worker process
www-data    2032    2027  0 12:02 ?        00:00:00 nginx: worker process
www-data    2033    2027  0 12:02 ?        00:00:00 nginx: worker process
subro       2215    1138  0 12:26 pts/0    00:00:00 grep --color=auto nginx

[root]ユーザーでマスタープロセスが 1つ自動起動されています。
(親プロセスの番号が 1の [/bin/init]になってます)

そしてマスタープロセスが [www-data]ユーザーでワーカープロセスと呼ばれる子プロセスを 4つ起動していました。

マスタープロセスでアクセスを捌き、ワーカープロセスで処理しているらしいです。

ワーカープロセスの数は設定により変更できますので、詳しくは
nginx documentationを参照して下さい。


7.自分のホームページを作っていく

後は [/var/www/html]ディレクトリの下に [index.html]ファイルや、そこからリンクされる HTMLファイルや画像ファイル、ディレクトリを整備することで好みの WEBサイトを提供することができます。

これ以降の詳細は「ホームページを作ろう」的な分かりやすい書籍が一杯出ていますのでそれをどうぞ。


==========
以下のような NGiNXの書籍には、どのような時に NGiNXが効果を発揮するか、リバースプロキシ機能やロードバランンサ機能について書かれていると思います。

もしこれから レンタルサーバーなどで WEBサーバーを展開していこう、会社の WEBサーバーを作らなきゃいけない、等などを NGiNXでやってみようという方は、書籍は 1冊持っておくと良いと思います。

業務で使われる方は、有償版の NGiNX Plusというものもありますので検討してみて下さい。


専門書は新しいのが出なくなってしまいましたね。
もうすぐオライリーの新刊が出るようですけど。