仮想オフィスを活用したITエンジニア研修とは?
- 1.Nginxとは?
- 2.Apacheとの違いを比較
- 3.Nginxを使うメリット
- 4.Nginxを使うデメリット
- 5.Nginxが適しているシーン
- 6.Nginxをインストールしてみよう
- 7.Nginxの設定方法
Webサーバと言えば有名なのが「Apache」ですが、最近ではよく「Nginx」という単語も良く耳にするのではないでしょうか。
本記事では、Nginxの基本的な情報やApacheとの違い、インストール方法を詳しく解説していきます。
1.Nginxとは?
まずは、Nginxの基本的な情報から紹介します。
①フリーかつオープンなWebサーバ
Nginx(エンジンエックス)は、ウェブブラウザからサーバへアクセスした際に、HTMLや画像などを表示するために利用するサーバソフトウェアである「Webサーバ」の一種です。
Nginxは、ソースコードが公開されており、誰でも無料で利用できるOSSソフトウェアで、Nginx Inc.によって開発・メンテナンスされています。
OSSであり対応OSも多く、Linuxだけでなく、BSDやmacOSといったUnix系OSやWindows版も提供されています。
②複数の機能を持つ
Nginxは、Webサーバとしての多くの機能を有しています。
機能の一例は以下の通りです。
・HTTP、HTTPS/2サーバ
・リバースプロキシ
・ロードバランサ
・メールプロキシ
③ Webサーバのトップシェア
Webサーバのシェアといえば、長らくApacheがトップでした。
ところが、2021年の5月にはじめてNginxのシェアがApacheを上回りました。
理由としては「Webサーバの機能に特化している」という点が大きく、JavaやGo、Railsといったサーバと組み合わせて利用するのであれば、高速に動作するNginxが適しているという点が評価されているようです。
コンテナ仮想化による大規模システムを構築する「Kubernetes」でも、Webサーバの機能としてNginxを利用できます。
Nginxの利用用途が広いことを考慮すると、今後も高いシェアが継続することでしょう。
2.Apacheとの違いを比較
Webサーバとして有名なのが「Apache」ですが、ApacheとNginxはどう違うのでしょうか?
ここでは、ApacheとNginxの違いを解説していきます。
① Apacheとは?
Webサーバといえば、最も認知度が高いと言っても過言ではない「Apache HTTP Server」です。
Javaのエンジニアであれば、Apache MavenやLog4jといったソフトウェアの名前を聞いたこともあるでしょう。
これらのソフトウェアは、「Apacheソフトウェア財団」の支援を受けてオープンソースとして提供されています。
Apache HTTP Serverは、そのApacheソフトウェア財団の中でも高い知名度を持っているため、「Apache」=「Apache HTTP Server」という認識の方もいることでしょう。
ここでは、この「Apache HTTP Server」を「Apache」として解説していきます。
② Apacheの主な機能
Apacheは、主にHTMLやCSSのホスティングを行うWebサーバの機能だけでなく、PHPやCGIの動的コンテンツを動作させる機能も有しています。
③ Apacheの歴史と問題点
Apacheの大きな特徴として挙げられるのは、「非常に歴史が長い」という点。
Nginxのリリースが2004年であったのに対し、Apacheがリリースされたのは1995年。つまり、10年ほどの違いがあることがわかります。
C10K問題
2010年台に入ると、iPhoneをはじめとするスマートフォンの普及にあわせてインターネットを使うことが普通になりました。
その結果、ひとつのサイトに対するアクセス数が増え、サーバの負荷が非常に高くなってしまったのです。
この問題を「C10K問題」と呼びます。
C10K問題は、「C=クライアントが10K(一万)アクセスするとサーバがパンクする」という意図で用いられています。
そのC10Kに対応すべく登場したのがNginxです。
Nginxは、このC10K問題を解決すべく開発されたこともあり、Apacheと比較しても高速に動作し、かつ大量のリクエストを処理することに向いています。
そのため、
・大規模であればNginx
・小規模またはスタートアップであればApache
というような使い分けがされていました。
とはいえ、現在ではApacheもこのC10K問題が解決できるようになっているため、大きな差は出ていないと言えます。
よって、現在では
・高速処理でリバースプロキシをしたいならNginx
・PHPやCGIを動作させたいならApache
という使い分けができると考えましょう。
④ NginxとApacheを機能で比較
Apacheの特徴を踏まえて、NginxとApacheを機能面で比較してみましょう。
比較項目 | Nginx | Apache |
静的コンテンツの処理 (HTMLやCSSなど) | ◎ | ○ |
動的コンテンツの処理 (PHPなど) | × | ○ |
並列処理性能 | ◎ | △ |
少ないリソースで動作 | ○ | △ |
セットアップの容易性 | △ | ○ |
どちらもWebサーバとしての機能を有していますが、得意とする領域が異なります。
扱いたいコンテンツの種類に応じて使い分けると良いでしょう。
3.Nginxを使うメリット
ApacheとNginxの違いを理解したところで、Nginxの持つメリットを解説します。
① 同時多数のアクセスに対応可能
Nginxの大きな特徴として、大量の同時アクセスであっても高速に動作する点が挙げられます。
100万人規模の利用が想定されるような一般向けサービスであれば、Nginxが適していると言えます。
② 高速かつ軽量な動作
Nginxの動作は非常に軽く、大量のアクセスがあっても少量のプロセスのみで処理できるような設計となっています。
そのため、大量にアクセスがあってもメモリ使用量が激増することがなく、安定して稼働します。
③ Webサーバとしての機能に特化している
Nginxは、Webサーバとしての機能に特化しており、リクエストを他のサーバへ転送する「リバースプロキシ」として高い性能を誇っています。
同時多数のアクセスに強いNginxがリクエストを引き受けることで、他のサーバへの負担を減らすことが可能となるのです。
Java向けのWebコンテナとして有名なのがTomcatです。
Nginxと同様に、Apacheもリバースプロキシの機能を有していますが、Nginxの方が高い処理性能を有しています。
他のWebアプリと組み合わせて使用するのであれば、Webサーバに特化したNginxは非常に有用と言えるでしょう。
4.Nginxを使うデメリット
Nginxの持つメリットを理解したところで、Nginxのデメリットを紹介します。
① 動的コンテンツを扱えない
Nginxは、Webサーバに特化したソフトウェアであるため、機能としては
・HTMLやCSSといった静的コンテンツのホスティング
・リバースプロキシ
が主な機能であり、PHPやCGIといった動的コンテンツを動作させたい場合にはFPM(Fast CGI Process Manager)などを併用する必要があります。
そのため、他の機能を使いたい場合には設定内容が膨大になることを覚えておきましょう。
② .htaccessが使えない
Nginxでは、Apacheで利用できる「.htaccess」が利用できません。
.htaccessは、そのディレクトリに対するアクセス権を記述することで、サイトへのアクセス制限をかけたり、パスワードを必須にしたりできます。
つまり、.htaccessを使うだけで、簡易的とはいえWebページにセキュリティの設定ができるのです。
そのため、Apacheの場合には簡単に設定できていたような設定内容が、簡単に実現できない可能性があります。
ログインが必要な会員制サイトなどを構築する場合は、Nginxではなくリバースプロキシ先のアプリケーション内で実施するようにしましょう。
5.Nginxが適しているシーン
Apacheと比較して、Nginxは「大量な同時アクセス」に向いています。
そのため、以下のようなシステムであればNginxが適しています。
・マルチテナント型のSaaS
・特定時間(イベントなど)に利用人数が激増するゲーム
「高速かつ大量な処理が必要」 という場合にはNginxが利用されると覚えましょう。
6.Nginxをインストールしてみよう
それでは、Nginxをインストールしてみましょう。
今回は、例としてWindowsへのインストールを紹介します。
① Nginxのダウンロード
Nginxの公式サイトへアクセスします。
最新を含め過去のバージョンもここからダウンロードできます。今回は安定版(Stable)をインストールしてみましょう。
Stable Version欄の「nginx/Windows-xx(xxはバージョン名)」を選択することで、zipファイルがダウンロードできます。
補足:Versionの意味
Nginxには「Mainline」、「Stable」、「Legacy」の3つのカテゴリが存在し、それぞれ以下の意味を持ちます。
名称 | 意味 |
Mainline | 最新版 |
Stable | 安定版 |
Legacy | 過去バージョン |
通常であれば過去のバージョンを利用することはほとんどありませんが、最新版と安定版の違いがわからない方も多いことでしょう。
最新版は新しい機能を利用できる反面、バグなどを含んでいる可能性が高いことがリスク。
一方で、安定版はひとつ前のバージョンを指していることが多く、ある程度バグの修正がされているため、最新版よりも安定して稼働します。
そのため、なるべく安定した稼働を目的とした本番環境では安定版を利用することが多い、と覚えましょう。
② zipファイルを解凍
ダウンロードが終了したら、zipファイルを解凍します。
以下の例では、Cドライブの直下に解凍しています。
③ 起動
Nginxを起動するにはまずPowerShellを起動し、解凍した場所に移動後、以下のコマンドを実行します。
start .\nginx
コマンドはすぐに終了してしまいますが、Nginx自体は起動しています。
試しに、ブラウザを起動し「http://localhost」へアクセスしてみましょう。
以下のように表示されていれば、Nginxの起動は成功です。
④Nginxの終了
Nginxを終了する場合には、以下のコマンドを実行します。
.\nginx -s stop
7.Nginxの設定方法
それでは、次にNginxの設定方法を紹介します。
Nginxの設定ファイルは、インストールフォルダの「conf」の中に格納されています。
① 設定ファイルのルール
設定ファイルは、「モジュール」という単位で記載します。
モジュールは「{~}(波カッコ)」で囲んで記載し、その中に設定を記載していきます。
# モジュールとして囲まれていないものは「core」モジュールとして扱われる
user nobody;
worker_processes 1;
error_log logs/error.log;
# eventsには、Nginxのパフォーマンスに関する設定を記述
events {
# 値を大きくするほどたくさんのファイルを一度に処理できる
worker_connections 1024;
}
# httpには、Webサーバとしての設定を記述
http {
# 他のファイルを読み込む
include mime.types;
default_type application/octet-stream;
access_log logs/access.log;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
}
}
② 一般設定
一般的な設定は「core」モジュールとして記述しますが、Nginxの設定を記述する場合、この設定は「{~}」で囲む必要はありません。
実際に設定できる内容をいくつか紹介します。
実行ユーザー
Nginxの実行ユーザーを指定します。
user nobody;
Webサーバを公開する場合、間違って管理者権限で実行しないように気をつけましょう。
管理者権限で実行した場合、Nginxがそのサーバに対してすべての権限を持つことになります。つまり、OSの乗っ取りが簡単にされてしまうリスクが発生してしまうのです。
開発者のローカルで実行する場合には問題ありませんが、本番サーバで実行する場合には、ユーザーを必ず指定するようにしましょう。
※Windows版のNginxではこの設定は使用できないので注意しましょう。
ワーカープロセス
Nginxのワーカープロセス数を指定します。
worker_processes 1;
ワーカープロセスを端的に説明すると、「同時起動(同時処理)できる件数」のこと。
原則として、ひとつのワーカープロセスでCPUの1コアを消費することになります。
以下のように「auto」を指定すると、CPUのコアに合わせた指定がされるため、よりたくさんのリクエストを処理できるようになります。
worker_processes auto
ログ
Nginxの起動時にエラーが発生したときのログを格納する場所を指定します。
以下の例では、Nginxのフォルダの中にある「logs」の中にエラー情報が出力されていきます。
error_log logs/error.log;
問題が発生した際に原因を調査する場合には、間違いなくエラーログを参照することになります。
本番はもちろん、開発の際にもエラーログはしっかりと残すように設定しましょう。
③ Webサーバ設定
Webサーバに関する設定は、「http」モジュールの中に記載します。
今回は、よく使う項目を紹介します。
access_log
Webブラウザからアクセスされたときに、アクセス元の情報を保存する「アクセスログ」の保存場所を指定します。
access_log logs/host.access.log;
エラーログと同様、アクセスログも重要な要素なのでしっかりと設定しておきましょう。
server
実際にWebサーバとして動作する設定はserverの中に記載します。
server {
# 受け付けるポート番号
listen 80;
# サーバのドメイン(DNS)
server_name localhost;
# コンテンツの設定
location / {
root html;
index index.html index.htm;
}
}
④ locationの書き方
Nginxの中でも最も重要なのが、「location」です。
ここでは、locationの基本的な記載について紹介します。
locationの基本的な記載方法
locationには、以下のルールで記載します。
location 条件 {
転送先
}
条件に応じて、転送先の内容がクライアントへ返却されます。
静的コンテンツをホスティングする場合
HTMLやCSSなどといった静的コンテンツを提供する場合には、以下のように記載します。
server {
# 中略
location / {
root html;
index index.html index.htm;
}
}
この場合、
・rootには表示したいファイルが格納されているフォルダ
・indexには、ファイル名が省略された場合に優先的に使用されるindexファイル名
をそれぞれ記載します。
リバースプロキシする場合
TomcatやRailsと組み合わせて使用する場合には、リクエストを転送する「リバースプロキシ」を利用します。
以下の例では、リクエストをすべてTomcat(http://localhost:8080)へ転送します。
server {
# プロキシするときに、ヘッダ情報を転送する設定
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://localhost:8080/;
}
}
この際、「proxy_set_header」の記載をすることが重要です。
この設定を忘れてしまうと、Tomcat上で動作しているJavaアプリ上でクライアントの情報を取得できなくなります。 業務アプリを開発するときなどは、接続元の端末情報を保存することも多いので、忘れずに設定するようにしましょう。