LINEで現役エンジニアに直接質問してみよう!登録無料

Nginxとは?基礎知識、インストール方法、設定ファイルをまとめて解説

Nginxとは?

Nginxとは、簡単に言うととても早く処理ができるWebサーバーです。

従来のApatch httpdについて

従来、Nginxの前にはApatchというWebサーバーがよく使われていました。Apatchには「クライアントのリクエストの数だけプロセス(スレッド)を作る」という起動方式が採用されています。

この方式は比較的簡単に実装ができる一方、大量のアクセスが同時に来ると処理性能が落ちてしまう限界がありました。

Webサーバーが登場し始めた当時はこ、の方式でも十分な性能だったのですが、現代のようにありとあらゆるモノがネットに繋がる環境になったことで、このWebサーバーでは処理が間に合わなくなってきました。

「もっと、新しい機能を追加して改善すればいいじゃないか!」という声もあるかとおもいますが、実際にApatchをそのように改善しようとすれば基礎の基礎から作り変えることになり、全く新しいものを1から作ったほうが早くなってしまうのです。

そのため、コア部分の変更は行われないまま、機能改善やバグ修正が行われています。

MEMO

クライアント10K問題(1万台問題)とは?

Apatch Webサーバーで処理が間に合わなくなる問題には、「クライアント10K問題」という名前が付いています。

1万台のユーザーが一斉にブラウザにアクセスすると、Webサーバーが耐えきれなくて落ちてしまうという問題です。

インストール方法

Amazon Linux

Amazon LinuxでNginxをインストールするには、amazon-linux-extras install nginx1を使います。

$ sudo amazon-linux-extras install nginx1

amazon-linux-extrasとは、Amazonが安定した基盤にピンポイントで新しいソフトウェアをインストールすることを目的に導入されているソフトウェアです。

例えば、CentOSのyumからインストールできるphpは安定版をインストール出来ますが、バージョンが古くフレームワークなどのプログラムで動かない場合や、セキュリティ面で更新がされない場合などの問題があります。

最新版をインストールできるようにするため、amazon-linux-extrasがあります。

またnginx1は、Nginxのバージョン1系の意味です。

https://dev.classmethod.jp/articles/how-to-work-with-amazon-linux2-amazon-linux-extras/

CentOS7

CentOS7の場合は、デフォルトリポジトリにNginxは含まれていないので、Nginxが提供しているリポジトリを追加してインストールします。

# リポジトリの追加
$ sudo yum localinstall -y https://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# nginxのインストール
$ sudo yum install -y nginx

正常にインストールできれば、最後に「Complete!」と表示されます。

Ubuntu

Ubuntuの場合は、デフォルトでNginxが入っているので、sudo apt install nginxでインストール可能です。

-yオプションをつけると、「本当にインストールしますか?(英語)」の問に対して常に「はい」を答えるようにできるので、今回は付けています。

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

最後の行に、E:から始まる行がなければ、正常にインストール出来ています。また、実際にnginx -vで実行可能かで調べることも出来ます。

$ nginx -v
nginx version: nginx/1.14.0 (Ubuntu)

また、sudo apt updateは必ず行うようにしましょう。apt updateは、ソフトウェアをダウンロードするURLなどの情報を更新する役割があります。

apt updateを実行せずにapt installを行った場合、エラーが出てインストールが進まない事があります。

その場合のログを下記に書いていますので、気になったら見てみてくださいね!

apt updateを行わなかった時に起こったエラーログ
[email protected]:~$ sudo apt install nginx
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  fontconfig-config fonts-dejavu-core libfontconfig1 libgd3 libjbig0 libjpeg-turbo8 libjpeg8 libnginx-mod-http-geoip
  libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream libtiff5 libwebp6 libxpm4
  nginx-common nginx-core
Suggested packages:
  libgd-tools fcgiwrap nginx-doc ssl-cert
The following NEW packages will be installed:
  fontconfig-config fonts-dejavu-core libfontconfig1 libgd3 libjbig0 libjpeg-turbo8 libjpeg8 libnginx-mod-http-geoip
  libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream libtiff5 libwebp6 libxpm4
  nginx nginx-common nginx-core
0 upgraded, 18 newly installed, 0 to remove and 0 not upgraded.
Need to get 2461 kB of archives.
After this operation, 8210 kB of additional disk space will be used.
Do you want to continue? [Y/n] 
Get:1 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libjpeg-turbo8 amd64 1.5.2-0ubuntu5.18.04.3 [110 kB]
Get:2 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic/main amd64 fonts-dejavu-core all 2.37-1 [1041 kB]
Get:3 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic/main amd64 fontconfig-config all 2.12.6-0ubuntu2 [55.8 kB]
Get:4 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic/main amd64 libfontconfig1 amd64 2.12.6-0ubuntu2 [137 kB]
Get:5 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic/main amd64 libjpeg8 amd64 8c-2ubuntu8 [2194 B]
Get:6 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic/main amd64 libjbig0 amd64 2.1-3.1build1 [26.7 kB]
Get:7 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libtiff5 amd64 4.0.9-5ubuntu0.3 [153 kB]       
Get:8 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic/main amd64 libwebp6 amd64 0.6.1-2 [185 kB]                        
Get:9 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic/main amd64 libxpm4 amd64 1:3.5.12-1 [34.0 kB]                     
Ign:10 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libgd3 amd64 2.2.5-4ubuntu0.3                 
Ign:11 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic-updates/main amd64 nginx-common all 1.14.0-0ubuntu1.6            
Err:10 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 libgd3 amd64 2.2.5-4ubuntu0.3                                   
  404  Not Found [IP: 54.199.72.88 80]
Err:11 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 nginx-common all 1.14.0-0ubuntu1.6                              
  404  Not Found [IP: 54.199.72.88 80]
Ign:12 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-http-geoip amd64 1.14.0-0ubuntu1.6
Err:12 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-http-geoip amd64 1.14.0-0ubuntu1.6                 
  404  Not Found [IP: 54.199.72.88 80]
Ign:13 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-http-image-filter amd64 1.14.0-0ubuntu1.6
Err:13 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-http-image-filter amd64 1.14.0-0ubuntu1.6          
  404  Not Found [IP: 54.199.72.88 80]
Ign:14 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-http-xslt-filter amd64 1.14.0-0ubuntu1.6
Err:14 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-http-xslt-filter amd64 1.14.0-0ubuntu1.6           
  404  Not Found [IP: 54.199.72.88 80]
Ign:15 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-mail amd64 1.14.0-0ubuntu1.6     
Err:15 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-mail amd64 1.14.0-0ubuntu1.6                       
  404  Not Found [IP: 54.199.72.88 80]
Ign:16 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-stream amd64 1.14.0-0ubuntu1.6   
Err:16 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-stream amd64 1.14.0-0ubuntu1.6                     
  404  Not Found [IP: 54.199.72.88 80]
Ign:17 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic-updates/main amd64 nginx-core amd64 1.14.0-0ubuntu1.6            
Err:17 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 nginx-core amd64 1.14.0-0ubuntu1.6                              
  404  Not Found [IP: 54.199.72.88 80]
Ign:18 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic-updates/main amd64 nginx all 1.14.0-0ubuntu1.6                   
Err:18 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 nginx all 1.14.0-0ubuntu1.6                                     
  404  Not Found [IP: 54.199.72.88 80]
Fetched 1745 kB in 14s (125 kB/s)                                                                                                  
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/libg/libgd2/libgd3_2.2.5-4ubuntu0.3_amd64.deb  404  Not Found [IP: 54.199.72.88 80]
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/n/nginx/nginx-common_1.14.0-0ubuntu1.6_all.deb  404  Not Found [IP: 54.199.72.88 80]
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/n/nginx/libnginx-mod-http-geoip_1.14.0-0ubuntu1.6_amd64.deb  404  Not Found [IP: 54.199.72.88 80]
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/n/nginx/libnginx-mod-http-image-filter_1.14.0-0ubuntu1.6_amd64.deb  404  Not Found [IP: 54.199.72.88 80]
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/n/nginx/libnginx-mod-http-xslt-filter_1.14.0-0ubuntu1.6_amd64.deb  404  Not Found [IP: 54.199.72.88 80]
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/n/nginx/libnginx-mod-mail_1.14.0-0ubuntu1.6_amd64.deb  404  Not Found [IP: 54.199.72.88 80]
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/n/nginx/libnginx-mod-stream_1.14.0-0ubuntu1.6_amd64.deb  404  Not Found [IP: 54.199.72.88 80]
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/n/nginx/nginx-core_1.14.0-0ubuntu1.6_amd64.deb  404  Not Found [IP: 54.199.72.88 80]
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/n/nginx/nginx_1.14.0-0ubuntu1.6_all.deb  404  Not Found [IP: 54.199.72.88 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

Nginxの操作コマンド10つ確認

Nginxの操作コマンドを10つ確認しましょう!

操作 コマンド
バージョン確認 nginx -v
Nginx起動 systemctl start nginx
Nginx停止 systemctl stop nginx
Nginx再起動 systemctl restart nginx
Nginx設定再読み込み systemctl reload nginx
Nginxステータス表示 systemctl status nginx
Nginx自動起動有効 systemctl enable nginx
Nginx自動起動無効 systemctl disable nginx
Nginx自動起動設定確認 systemctl is-enabled nginx

Nginxのバージョン確認

Nginxのバージョンを確認したい時は、下記のコマンドを実行します。

$ nginx -v
nginx version: nginx/1.14.0 (Ubuntu)

Nginx起動

Nginxを起動したい時は、下記のコマンドを実行します。

$ sudo systemctl start nginx

Nginx停止

Nginxを停止したい時は、下記のコマンドを実行します。

$ sudo systemctl stop nginx

Nginx再起動

Nginxを再起動したいときは、下記のコマンドを実行します。

$ sudo systemctl restart nginx

Nginx設定再読み込み

Nginxの設定を再読み込みしたいときは、下記のコマンドを実行します。

$ sudo systemctl reload nginx

Nginxステータス表示

Nginxが今起動しているかどうかなど、ステータス状態を確認したい時は、下記のコマンドを実行します。

$ 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 Sat 2020-04-04 04:13:19 UTC; 21min ago
     Docs: man:nginx(8)
 Main PID: 2710 (nginx)
    Tasks: 3 (limit: 522)
   CGroup: /system.slice/nginx.service
           ├─2710 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           ├─2714 nginx: worker process
           └─2718 nginx: worker process

Apr 04 04:13:19 ip-172-31-18-125 systemd[1]: Starting A high performance web server and a reverse proxy server...
Apr 04 04:13:19 ip-172-31-18-125 systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument
Apr 04 04:13:19 ip-172-31-18-125 systemd[1]: Started A high performance web server and a reverse proxy server.

Nginx自動起動有効

PCが起動した時、自動的にNginxも起動するように設定するには、下記のコマンドを実行します。

$ sudo systemctl enable nginx

Nginx自動起動無効

Nginxの自動起動を無効化するには、下記のコマンドを実行します。

$ sudo systemctl disable nginx

Nginx自動起動設定確認

Nginxの今の自動起動設定がどのようになっているのか確認するには、下記のコマンドを実行します。

$ systemctl is-enabled nginx

Nginxにアクセスしてみよう!

Nginxを起動してそのIPアドレスにアクセスすると、このようなページが出てきます!

これで、Webページ配信をする準備は整いました!

この後は、Nginxの設定ファイルの場所や書き方を学びましょう!

Nginxの設定を変更してみよう!

このように「Welcome to nginx!」というWebページが作成されましたが、このまま使う人はいないと思います。

何かしらの設定を加えて、カスタマイズしてくことになるでしょう!

カスタマイズに必要なNginxのせってファイルの場所や設定項目の解説、書き方などを解説していきます。

Nginxの設定ファイルの場所

Nginxの設定ファイルは/etc/nginxにあります。Amazon Linux、CentOS7、Ubuntuのどれでも変わりありません。

これは、yumやaptでインストールした時、設定ファイルは/etcの中にまとめる決まりがあるからです。Nginxもそれに従って、/etcの中に設定ファイルがまとめられています。

また、ソースコードからビルドした場合は/etc/nginxでない場所に作ることも可能です。

Nginxの設定ファイルを見てみる

Nginxの設定には大きく分けて2種類あります。

  1. /etc/nginx/nginx.conf: nginx全体に関わる設定。このファイルが一番最初に読み込まれる
  2. /etc/nginx/conf.d/*: Webサーバーに関する細かい設定ファイルをまとめるディレクトリ

/etc/nginx/nginx.conf

このファイルはNginxの一番基本となるファイルです。

  • TCPでアクセスが来たた時どのくらいまで待つようにするのか
  • どのくらいのアクセスまで捌くようにするのか
  • アクセスログは何処に書くのか
  • データ転送時圧縮はするのか

など、細かく設定出来ます。

更に、nginx.confを見てみると、下記のような記述があります。

user www-data;
worker_processes auto;
.
.
http {
    .
    .
    include /etc/nginx/conf.d/*.conf;
}   

このincludeの部分で、/etc/nginx/conf.d/*.confのマッチングパターンにマッチしたファイルを一括して読み込んでいます。そのため、後述する/etc/nginx/conf.d/*を読み込む事につながっているのですね!

/etc/nginx/conf.d/*

このディレクトリ内のファイルで各サイトの設定を行います。

各サイトというのは、1台サーバーで複数のドメインのWebサイトを運営できるからです。ドメインごとに設定を変えて配信する場合は、その数だけ設定ファイルが増えます。

ディレクティブとは?

Nginxの設定には「ディレクティブ」というパーツがよく登場します。ディレクティブとは、簡単に言うと設定のグループの事です。

Nginx設定全体の中にHTTPに関する設定があって、その中にURLに関する設定があって、、、のように入れ子構造になっているのがなんとなくわかると思います。

このまとまりごとの設定項目のことをNginxではディレクティブと言います。

まとめ

  • Nginxとはとても早いWebサーバーです。
  • Nginxのインストール方法
    – Amazon Linuxではamazon-linux-extrasを使います
    – CentOSではリポジトリをインストールしてからyum install nginxです
    – Ubuntuはapt updateからapt install nginxをします
  • Nginxのバージョン確認にはnginx -vをつかいます
  • その他のNginx操作はsystemctlを使いましょう
  • Nginxの設定ファイルは/etc/nginxにあります
  • Nginxはディレクティブを使って設定を行います。

以上、Nginxの基礎をアキ(@hackablejp)が解説しました!

この記事を書いた人

自身がプログラミングを独学で勉強し始めて躓いた経験を元に、これから勉強をする人に向けに「イラスト多めでわかりやすい記事」にこだわって情報を発信しています。

現在はフルスタックエンジニアとしてサービス開発などのお仕事をしています。