nginx その1 -インストールとファイル構成のお話-

2022年5月29日

今日はnginxのお話です。nginxとは、apacheとは別のWebサーバソフトウェアです。
私がこの業界を始めてからは、Webサーバと言ったら、UNIX/LINUXではapache、WindowsOSではIISが多かった気がします。
特にシステム開発(SI)の現場では、UNIX/LINUXでJavaアプリケーションサーバであれば、フロントのWebサーバはapacheですし、Windowsで.NET Framework(ASP.NET)ではIIS一択のような寡占状態が長らく続いていたような気がします。
ココ数年、Webサーバのシェアが変わってきています。W3Tech調べでは以下のようにnginxがapacheを少し抜いて1位となり、IISに至ってはWindowsOSのシェアとは異なり6%程度となっています。
一時期はJavaか.NETかなんて2強の時代は過去のものとなっています。
そこで今回WebサーバのNginxを使ってみようと思います。

Nginx33.1%
Apache30.9%
Cloudflare Server22.0%
LiteSpeed12.3%
Microsoft-IIS6.1%
Websサーバソフトウェアのシェア(W3techhsサイトより)

nginxとは

nginxは主にはHTTPサーバですが、今どきHTTPをそのまま使うこともないので、HTTPS(SSL暗号化HTTP)にはもちろん対応しています。
また、nginxはWebサーバ機能以外にも、リバースプロキシ機能やロードバランス機能、HTTPキャッシュ機能などのフロントのWebサーバとしてのいくつもの機能を持っています。
更に、HTTP以外にもリバースプロキシ機能としてメール関連(SMTP、POP)のリバースプロキシ機能も持っています。
apacheでもできるじゃん。と言われてしまうとそのとおりなのですが、なぜ巷でApacheのシェアを食ってnginxがシェアを伸ばしているかというと、nginxはapacheより軽量でメモリ量も少なく、処理性能にも優れているようです。
特徴としてnginxはシングルスレッドのプロセスで、たくさんのリクエストを並列で処理する方式をとっています。反対にapacheはマルチプロセスで基本的に1リクエストに対して1プロセスで処理を行う方式をとっています。
雑に行ってしまうと、同時に多数のアクセス来たときに、nginxはシングルスレッドでガンガン処理していくのですが、apacheはアクセスが来るとアクセスに応じてプロセスをどんどん作って行きます。
プログラム経験のある方なら、1個のプログラムのループ処理で1000回「helloWorld」を表示するプログラムと、1回だけ「helloWorld」を表示するプログラムを1000回起動するときの速度の違いは一目瞭然ですよね。

nginxを入れてみる

基本的に、多くのLinuxディストリビューションであればApacheのように標準インストール時にすでにインストールされていることはないけれど、debやrpmなどの追加インストール用のパッケージが準備されていると思います。今回はubuntuに入れてみます。
(2022.3.12追記)RHEL系ではフォルダ構造が違っているので注意ください。ただ、nginx.confを読んでもらえば違いはわかると思います。)

nginxのインストール


まずは、さくっとaptコマンドでnginxをインストールします。インストール後にpsコマンドでプロセスを確認するとインストールが終わると自動起動するようです。さらにsystemctlコマンドでサーバ起動時に自動起動するか確認すると自動起動するようです。
CentOS系ならdnfかyumコマンドで同様にコマンド一発で入ると思います。
今回インストールするnginxのバージョンは「1.18.0」のUbuntu版となりますので、バージョンアップなどで若干設定内容が変わっているかもしれませんが、そのあたりは都度更新します。

# nginxをインストール
$ sudo apt install nginx -y
# nginxプロセスの確認
$ ps -aux | grep nginx
root        4443  0.0  0.1  55280  1488 ?        Ss   07:41   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data    4444  0.0  0.5  55844  5320 ?        S    07:41   0:00 nginx: worker process
www-data    4445  0.0  0.5  55844  5320 ?        S    07:41   0:00 nginx: worker process
vagrant     4673  0.0  0.0   8160   656 pts/0    S+   07:44   0:00 grep --color=auto nginx
# nginxが自動起動の有無を確認
$ systemctl is-enabled nginx
enabled

ブラウザで確認してみると、はい、確認できました。Ubuntu版のnginxのウェルカム画面はシンプルですね。別のディストリビューションだと違う画面デザインになります。

nginxの設定ファイルの構造

nginxの設定ディレクトリはUbuntuの場合は以下のようになっています。
ディストリビューションによっては多少の違いはあれども概ねこのような各種設定ファイル構成となっています。

# nginx管理ディレクトリに移動
$ cd /etc/nginx
# 中身を見る
$ ls -alR
.:
total 72
drwxr-xr-x  8 root root 4096 Mar  6 07:41 .
drwxr-xr-x 94 root root 4096 Mar  6 07:58 ..
drwxr-xr-x  2 root root 4096 May 25  2021 conf.d
-rw-r--r--  1 root root 1077 Feb  4  2019 fastcgi.conf
-rw-r--r--  1 root root 1007 Feb  4  2019 fastcgi_params
-rw-r--r--  1 root root 2837 Feb  4  2019 koi-utf
-rw-r--r--  1 root root 2223 Feb  4  2019 koi-win
-rw-r--r--  1 root root 3957 Feb  4  2019 mime.types
drwxr-xr-x  2 root root 4096 May 25  2021 modules-available
drwxr-xr-x  2 root root 4096 Mar  6 07:41 modules-enabled
-rw-r--r--  1 root root 1490 Feb  4  2019 nginx.conf
-rw-r--r--  1 root root  180 Feb  4  2019 proxy_params
-rw-r--r--  1 root root  636 Feb  4  2019 scgi_params
drwxr-xr-x  2 root root 4096 Mar  6 07:41 sites-available
drwxr-xr-x  2 root root 4096 Mar  6 07:41 sites-enabled
drwxr-xr-x  2 root root 4096 Mar  6 07:41 snippets
-rw-r--r--  1 root root  664 Feb  4  2019 uwsgi_params
-rw-r--r--  1 root root 3071 Feb  4  2019 win-utf

./conf.d:
total 8
drwxr-xr-x 2 root root 4096 May 25  2021 .
drwxr-xr-x 8 root root 4096 Mar  6 07:41 ..

./modules-available:
total 8
drwxr-xr-x 2 root root 4096 May 25  2021 .
drwxr-xr-x 8 root root 4096 Mar  6 07:41 ..

./modules-enabled:
total 16
drwxr-xr-x 2 root root 4096 Mar  6 07:41 .
drwxr-xr-x 8 root root 4096 Mar  6 07:41 ..
lrwxrwxrwx 1 root root   61 Mar  6 07:41 50-mod-http-image-filter.conf -> /usr/share/nginx/modules-available/mod-http-image-filter.conf
lrwxrwxrwx 1 root root   60 Mar  6 07:41 50-mod-http-xslt-filter.conf -> /usr/share/nginx/modules-available/mod-http-xslt-filter.conf
lrwxrwxrwx 1 root root   48 Mar  6 07:41 50-mod-mail.conf -> /usr/share/nginx/modules-available/mod-mail.conf
lrwxrwxrwx 1 root root   50 Mar  6 07:41 50-mod-stream.conf -> /usr/share/nginx/modules-available/mod-stream.conf

./sites-available:
total 12
drwxr-xr-x 2 root root 4096 Mar  6 07:41 .
drwxr-xr-x 8 root root 4096 Mar  6 07:41 ..
-rw-r--r-- 1 root root 2416 Mar 26  2020 default

./sites-enabled:
total 8
drwxr-xr-x 2 root root 4096 Mar  6 07:41 .
drwxr-xr-x 8 root root 4096 Mar  6 07:41 ..
lrwxrwxrwx 1 root root   34 Mar  6 07:41 default -> /etc/nginx/sites-available/default

./snippets:
total 16
drwxr-xr-x 2 root root 4096 Mar  6 07:41 .
drwxr-xr-x 8 root root 4096 Mar  6 07:41 ..
-rw-r--r-- 1 root root  423 Feb  4  2019 fastcgi-php.conf
-rw-r--r-- 1 root root  217 Feb  4  2019 snakeoil.conf

ファイル多すぎ、良くわからない?ってげんなりするかもしれませんが、単純なWebサーバ(HTTP/HTTPS)ならば設定すべきファイルは限られますので、大丈夫です。よく使うものを紹介していきます。

ディレクトリ・ファイル内容
nginx.confメインの設定ファイル。nginx全体の設定が書かれているが、作法的にはこのファイルに書くのではなくて、conf.d, site-sites-available,sites-enabledに書くことで、nginx.confの設定値を上書きすることができる
conf.dメインの設定ファイルを上書きする設定を記述するファイルを格納するディレクトリ。
追加したい設定値などはconf.d内にhoge.confという拡張子confでファイルを作るとnginx.confの設定値を更新できる。
sites-availableWebサイトの設定ファイルを格納するディレクトリ。設定ごとにファイルを作成して設定を記述する。ただし、ここに格納されただけだと設定は読み込まれない。
あくまで定義ファイルの実体を格納する運用を行う。
sites-enabledメインの設定ファイルから読み込まれる。
使い方としては、sites-availableディレクトリに配置した定義ファイルのシンボリックリンクをこのディレクトリに格納すると起動時にファイルが読み込まれる。
定義を無効や差し替えたい場合はsites-availableディレクトリの定義ファイルの実体のシンボリックリンクを置き換えることで設定の更新、ロールバックが簡単にできるようになる。

なんだかよくわからないかもしれないので、メインの設定ファイルの内容を説明してみます。以下がメインの設定ファイル(nginx.conf)の内容です。
設定ファイル内にコメントつけていますが、私の個人的な解釈なので違ったらごめんなさい。
メインの設定ファイルを読むと、上で紹介した、「conf.d」、「sites-enable」ディレクトリの設定ファイルを読み込んでますね。メインの設定ファイルに個別のWebサイトの設定は行わずに、各ディレクトリ内に設定ファイルを作成することが望ましいようです。
また、「sites-available」と「sites-enabled」の関係性はわかりましたでしょうか?メインの設定ファイルが読み込むのは「sites-enabled」のみで、「sites-available」は読み込んでいません。
そのため、設定が有効になるディレクトリは、「conf.d」、「sites-enable」内の設定ファイルのみとなります。
同様の考え方で拡張モジュール用のディレクトリも「modules-enabled」「modules-available」が存在します。上のnginxのディレクトリのファイルリストをみると「modules-enabled」にいくつかのシンボリックリンクファイルが存在します。ただ、「modules-available」は空で全然ちがう、「/usr」とかのモジュールを読み込んでいるのは、まあ拡張ライブラリのパッケージがそちらに入るからなのでしょう。。。

# nginxを実行するユーザ
user www-data;
# nginxのワーカプロセス数の上限設定。autoは自動となっている。
worker_processes auto;
pid /run/nginx.pid;
# ここでnginxの拡張モジュールをよみこんでいる
# 拡張モジュールもenabled,availableはsites-xxxxと同じ考え方
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
	# multi_accept on;
}

# 基本のHTTPサーバの設定
# 作法的にはここは変子せずに、sites-availableディレクトリに設定を書けばhttp{}範囲内の設定を上書き設定できる。
http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

#ここでSSLの基本設定を行っている。
#ただしここではTLSのバージョン設定などであり、証明書の設定はWebサイト毎にsites-availableディレクトリ内に
#ファイルを作成して設定する。
	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

# gzipの設定、あまりいじらないかも。
	gzip on;

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# Virtual Host Configs
	##

#ここでconf.dディレクトリ配下の拡張子confファイルを読み込む
	include /etc/nginx/conf.d/*.conf;
#ここでsites-enabledディレクトリに存在する全ファイルを読み込む。
	include /etc/nginx/sites-enabled/*;
}

#以下はメール関係のリバースプロキシ設定なのでインストール直後はコメントアウトされている。
#mail {
#	# See sample authentication script at:
#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
#	# auth_http localhost/auth.php;
#	# pop3_capabilities "TOP" "USER";
#	# imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
#	server {
#		listen     localhost:110;
#		protocol   pop3;
#		proxy      on;
#	}
# 
#	server {
#		listen     localhost:143;
#		protocol   imap;
#		proxy      on;
#	}
#}


標準のWebサイト設定ファイル

nginxの各種設定ファイルの構成が少し理解できたところで、標準のWebサイト設定ファイルを見ていきましょう。ファイルは、先程紹介した定義ファイルが格納されている「sites-available」ディレクトリに存在する「default」ファイルとなります。ファイル内容は以下となります。
設定ファイル内に私なりの解釈を追加しています。間違ってたらごめんなさい。
どうでしょうか?結構シンプルな作りになってませんか?apacheと違って設定項目が標準では少ないですよね。apacheとはパラメータ名称など似ている部分もあるのでapache設定をしたことがあるならなんとなく理解出来るかもしれませんが、設定ファイル自体の互換性はないので注意してください。

##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or WordPress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

# Default server configuration
#
# Webサイトの設定グループ「server」
server {
 #Webサーバが使用するTCPポート番号の設定(IPv4用)
	listen 80 default_server;
 #Webサーバが使用するTCPポート番号の設定(IPv6用)
	listen [::]:80 default_server;

#SSLの設定は標準ではコメントアウトされている。
	# SSL configuration
	#
	# listen 443 ssl default_server;
	# listen [::]:443 ssl default_server;
	#
	# Note: You should disable gzip for SSL traffic.
	# See: https://bugs.debian.org/773332
	#
	# Read up on ssl_ciphers to ensure a secure configuration.
	# See: https://bugs.debian.org/765782
	#
	# Self signed certs generated by the ssl-cert package
	# Don't use them in a production server!
	#
	# include snippets/snakeoil.conf;

#Webサイトのコンテンツ格納ディレクトリ、ここにHTMLファイルを置くとブラウザからアクセスできる
	root /var/www/html;

#ファイル名指定しない場合のアクセス時になにを表示するかの設定
	# Add index.php to the list if you are using PHP
	index index.html index.htm index.nginx-debian.html;

# Webサーバの名前、基本はなし(なんでもOKになっている)
	server_name _;

# アクセスしたURLに対応するファイルがないときに「404 Not Found」とする設定
	location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		try_files $uri $uri/ =404;
	}

#PHPプログラムの設定(標準状態では無効化されている)
	# pass PHP scripts to FastCGI server
	#
	#location ~ \.php$ {
	#	include snippets/fastcgi-php.conf;
	#
	#	# With php-fpm (or other unix sockets):
	#	fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
	#	# With php-cgi (or other tcp sockets):
	#	fastcgi_pass 127.0.0.1:9000;
	#}

#.htaccesファイルの設定(標準状態では無効化されている)
	# deny access to .htaccess files, if Apache's document root
	# concurs with nginx's one
	#
	#location ~ /\.ht {
	#	deny all;
	#}
}

#以下はバーチャルホストを作成する場合のサンプル(雛形)
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
#	listen 80;
#	listen [::]:80;
#
#	server_name example.com;
#
#	root /var/www/example.com;
#	index index.html;
#
#	location / {
#		try_files $uri $uri/ =404;
#	}
#}


おわりに

今回は、nginxのインストールと初期状態の設定ファイルをまとめてみました。
私自体もやっとこつい最近触り始めたので説明が間違っていたらごめんなさい。
apacheに比べると標準の設定ファイルはシンプルな気がします。apacheが多くのモジュールとそのモジュールの初期設定などが書かれたり、設定ファイルに大量の解説を書いていてくれるおかげで結果設定ファイルが肥大化しているので、それに比べるとだいぶシンプルじゃないかなと思います。
今回は、インストール直後までのお話だったので、次回はWebサイトを作って行こうと思います。

Linux,Tips,ubuntu系

Posted by Qtaro