【入門】nginx とは 設定方法を紹介nginx 2022.04.09 2021.11.22スポンサーリンクnginx とはnginx とは、以下の機能を持つ Web サーバーです。・HTTP サーバー(Web サーバー) - 静的 Web サーバー - 動的 Web サーバー・HTTP リバースプロキシサーバー・ロードバランサー・TCP/ UDP リバースプロキシサーバー・メールプロキシサーバーWeb サーバー・HTTP サーバーWeb サーバーとは、「HTTP サーバー (必須) 」と「ファイル (オプション) 」の集まりのことです。HTTP サーバーとは、URL および HTTP プロトコルを理解するソフトウェアのことです。https://developer.mozilla.org/ja/docs/Learn/Common_questions/What_is_a_web_serverなお、Web サーバーは以下の2種類が存在します。静的 Web サーバー動的 Web サーバー構成要素HTTP サーバー (ソフトウェア)コンピューター (ハードウェア)静的 Web サーバーアプリケーションサーバー (AP)データベース (DB)レスポンスサーバーにあるファイルをそのまま返すAP や DB を利用してファイルを毎回生成して返すプロキシ・リバースプロキシとはプロキシサーバーとは、クライアントの代わりに外部のサーバーにアクセスするサーバーです。リバースプロキシサーバーとは、クライアントからのアクセスをサーバーに転送するサーバーです。リバースプロキシサーバーをバックエンドサーバーの前段に置く理由は、以下の5つです。キャッシュサーバーとして利用 (レスポンスの高速化とバックエンドサーバーの負荷を軽減)レスポンスを圧縮 (レスポンスの転送を高速化)SSL ターミネーション (暗号化や復号化の処理をリバースプロキシにオフロード)セキュリティの向上 (リバースプロキシでフィルタリング、バックエンドサーバーを隠蔽)拡張性 (クライアントはリバースプロキシと通信するので、バックエンドサーバーを変更可能)なお、nginx はリバースプロキシに対応しています。nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev.http://nginx.org/en/プロキシサーバーを構築する場合は、Squid を利用します。【入門】Squid で proxy サーバー構築Squid とはSquid とは「プロキシ」と「リバースプロキシ」のサーバー機能を持つソフトウェアです。プロキシサーバーとは、クライアントの代わりに外部のサーバーにアクセスするサーバーです。リバースプロキシ...ロードバランサーとはロードバランサーとは、クライアントからのアクセスを各サーバーに振り分けることで、負荷分散を行うサーバーです。ロードバランサーは、1台のサーバーで処理できないような大量なリクエストに対応するために利用します。リバースプロキシとロードバランサーの違いロードバランサーは負荷分散に利用バックエンドサーバーは複数の同じサーバーを置きますリバースプロキシは転送に利用バックエンドサーバーが1台でも OKバックエンドサーバーに異なるサーバーを置いても OK認証サーバーに転送し、認証に成功した場合は Web サーバーに転送といったことが可能本記事で紹介する nginx の設定本記事では、以下の設定方法を記載します。静的 Web サーバー動的 Web サーバーHTTP リバースプロキシサーバーロードバランサーdocker で nginx を起動docker で ロードバランサーを起動なお、nginx に HTTPS の設定をする場合は以下の記事をご覧ください。Let's Encrypt で nginx に HTTPS を設定 (TLS 証明書を発行)Let's Encrypt とはLet's Encrypt とは、TLS 証明書を無料で発行する証明書認証局です。Let's Encrypt の認証局を利用して TLS 証明書を発行し、 nginx の HTTPS を有効...ネットワークの基礎①ネットワークの基礎②スポンサーリンクnginx の使い方nginx のセットアップnginx のインストールAmazon Linux 2 の場合Copysudo amazon-linux-extras install nginx1 -yその他の OS の場合以下の公式ドキュメントをご覧ください。http://nginx.org/en/linux_packages.htmlnginx を起動Copysudo systemctl start nginxブラウザの URL 欄にサーバーの IP アドレスを入力すると Web ページが確認できます。nginx の設定設定ファイルは「/etc/nginx/nginx.conf」です。設定ファイルに関する用語用語説明モジュール取り外し可能な小さなプログラム使う機能(モジュール)のみを取り込むことで、プロセスサイズを小さくしてメモリ消費量を抑えるディレクティブ命令モジュールは複数のディレクティブから構成されるコンテキスト適用範囲ディレクティブを{ } で囲むディレクティブの一覧は以下のとおりです。ディレクティブのアルファベットの索引 日本語訳ディレクティブの設定例構文:server { ... }デフォルト:-コンテキスト:httphttp://mogile.web.fc2.com/nginx/http/ngx_http_core_module.html#server例えば、上記の「server」ディレクティブは以下のように利用します。http{ server{ } }「server」ディレクティブは、「http」ディレクティブのコンテキストなので、 "http { }" で囲んで利用します。なお、「server」、「http」ディレクティブは ngx_http_core_module モジュールに含まれます。main コンテキスト設定ファイル /etc/nginx/nginx.conf は、暗黙的に main コンテキストで囲まれています。構文:useruser [group];デフォルト:user nobody nobody;コンテキスト:mainhttp://mogile.web.fc2.com/nginx/ngx_core_module.html#userつまり、上記の「main」コンテキストにある「user」ディレクティブは以下のように利用できます。user nginx;/etc/nginx/conf.d/http コンテキストの設定は「/etc/nginx/conf.d/」配下に、追加で設定ファイルを置くことができます。これは「etc/nginx/nginx.conf」ファイルの以下の include ディレクティブによるものです。Copyhttp { (中略) include /etc/nginx/conf.d/*.conf; }スポンサーリンク静的 Web サーバーの設定静的 Web サーバーとは、保持しているファイルをブラウザーへ「そのまま」送るサーバーです。ここでは、nginx を静的 Web サーバーとして設定方法を紹介します。Web ページを作成テキストファイルと画像ファイルを配置するディレクトリを作成し、ファイルを配置します。Copysudo mkdir /var/wwwsudo sh -c 'echo "text files path" > /var/www/index.html'Copysudo mkdir /var/imagessudo sh -c 'echo "images files path" > /var/images/index.html'nginx の設定静的 Web ページは以下のように設定します。Copysudo vim /etc/nginx/conf.d/static.confCopyserver { listen localhost:80; location / { root /var/www; } location /images/ { root /var; } }ディレクティブ説明listen接続を待ち受けるアドレスとポート番号今回は「localhost:80」でアクセスした場合の設定locationURL のパスごとに動作を決定(最長一致)今回は以下の2つでアクセスした場合の設定・「localhost:80/」・「localhost:80/images/」rootドキュメントルート(Web ページのファイルを置く場所)を指定アクセスするパスは「<root> + <location>」となります。・/var/www + / = /var/www/・/var + /images/ = /var/images/Copysudo systemctl restart nginx動作確認以下のコマンドで動作確認をします。Copycurl localhost/index.htmltext files path「location」ディレクティブで指定した「/」にアクセスしたので、「/var/www/」に存在する index.html の内容が表示されています。Copycurl localhost/images/index.htmlimages files path「location」ディレクティブで指定した「/images/」にアクセスしたので、「/var/images/」に存在する index.html の内容が表示されています。静的 Web サーバーでは、「現在 ** 人やこのページを見てます」のようなアクセスする度にページの内容を変更することはできません。このような Web ページを作成する場合は、動的 Web サーバーを利用します。動的 Web サーバーの設定動的 Web サーバーとは、保持しているファイルをアプリケーションが変更してから、HTTP サーバを通してブラウザーに送信するサーバーです。冒頭で述べたように、動的 Web サーバーは主に以下の3要素で構成されます。静的 Web サーバー (HTTP サーバー)アプリケーションデータベース今回は、静的 Web サーバー + アプリケーションで動的な Web ページを作成します。ゲートウェイインターフェースWeb サーバーとアプリケーション (or AP サーバーとアプリケーション) を繋ぐには、以下のようなゲートウェイインターフェースを利用します。対応言語ゲートウェイインターフェースどの言語でもFastCGI (Common Gateway Interface)PythonWSGI (Web Server Gateway Interface)RubyRack (Ruby web server interface)PerlPSGI (Perl web Server Gateway Interface)JavaJava ServletPHPFPM (FastCGI Process Manager)一般的には、各言語に特化したインターフェースの方が使いやすかったり、機能が充実しています。WSGI を利用して動的 Web ページを作成する場合は以下の記事をご覧ください。nginx + Gunicorn + Flask で Python の Web アプリ入門この記事では以下の順でアプリケーションを作成します。Python アプリケーションで Hello World を実行動的 Web サーバー(アプリケーションサーバー)で Hello World を実行Web アプリケーションフレー...本記事では、言語に依らない FastCGI を紹介します。FastCGI (fcgiwrap) をインストールここでは Amazon Linux 2 での fastcgi を利用したインストール方法を紹介します。デフォルトのリポジトリに「fcgiwrap」パッケージが存在しないため、EPEL(Extra Packages for Enterprise Linux)リポジトリを追加します。Copysudo amazon-linux-extras install epel -yfcgiwrap (FastCGI) をインストールします。Copysudo yum install fcgiwrap -yFastCGI プロセスを生成するために、spawn-fcgi をインストールします。Copysudo yum install spawn-fcgi -yspawn-fcgi の設定Copysudo vim /etc/sysconfig/spawn-fcgiUNIX ドメインソケットに「/var/run/fcgiwrap.socket」を bind し、FastCGI プロセスとして「/usr/sbin/fcgiwrap」を利用するように設定します。CopyOPTIONS="-u nginx -g nginx -s /var/run/fcgiwrap.socket -S -M 0770 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/sbin/fcgiwrap"Copysudo systemctl start spawn-fcgiFastCGI プログラムを Python で作成Copysudo vim /usr/share/nginx/html/test.pyCopy#!/usr/bin/python3 import random print("HTTP/1.0 200 OK") print("Content-type: text/html\n") print("ランダムな数字を表示します。") print(random.random())Copysudo chmod 755 /usr/share/nginx/html/test.pyFastCGI プロキシの設定Copysudo vim /etc/nginx/conf.d/fcgi.confCopyserver { listen localhost:8080; location ~ \.py$ { root /usr/share/nginx/html/; #$document_root fastcgi_pass unix:/var/run/fcgiwrap.socket; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }$document_root現在のリクエストのroot または aliasディレクティブ値$fastcgi_script_name変数の値の中のスラッシュで終わるURIの後に追加されるファイル名を設定します。http://mogile.web.fc2.com/nginx/http/ngx_http_core_module.html#variableshttp://mogile.web.fc2.com/nginx/http/ngx_http_fastcgi_module.html#var_fastcgi_script_nameディレクティブ説明fastcgi_passFastCGI サーバーのアドレス or UNIX ドメインソケットパスを指定します。今回は spawn-fcgi で指定した UNIX ドメインソケットパスを指定します。fastcgi_paramFastCGI サーバーに渡すパラメータを指定します。・SCRIPT_FILENAME は利用する FastCGI プログラムのパスを指定します。・他にも「QUERY_STRING」・「REQUEST_METHOD」等があります。Copysudo systemctl restart nginx動作確認Copycurl localhost:8080/test.pyランダムな数字を表示します。 0.035786423335100515上記の Web ページは test.py はランダムな数字を生成する FastCGI プログラムを利用して、アクセスする度に HTML を生成しています。実際にもう1度アクセスしてみると、Web ページの内容が変わっていることがわかります。Copycurl localhost:8080/test.pyランダムな数字を表示します。 0.5110232597988356リバースプロキシの設定リバースプロキシサーバーとは、クライアントからのアクセスをサーバーに転送するサーバーです。キャッシュがあれば Web サーバーに転送せずに、リバースプロキシがキャッシュをレスポンス今回は同一ホストに「リバースプロキシサーバー」と「 Web サーバー」を立てます。Web ページの作成Web サーバーで利用する Web ページを作成します。Copysudo mkdir /var/proxysudo sh -c 'echo "proxied page" > /var/proxy/index.html'Copysudo chmod 755 /var/proxy/index.htmlnginx のリダイレクトの設定Copysudo vim /etc/nginx/conf.d/proxy.conf「8001 ポートがリバースプロキシサーバー」、「8002 ポートが Web サーバー」となるように設定します。Copyserver { listen localhost:8001; location / { proxy_pass http://localhost:8002/proxy/; } } server { listen localhost:8002; location /proxy/ { root /var; } }「proxy_pass」ディレクティブでリバースプロキシサーバーがリクエストを転送する先を指定します。今回は同じホスト(localhost)に転送してますが、異なるホストの IP アドレスを指定することも可能です。Copysudo systemctl restart nginx動作確認Copycurl localhost:8001/proxied page8001 ポートのリバースプロキシサーバーにアクセスし、8002 ポートのウェブサーバーに転送されていることが確認できます。ロードバランサーの設定ロードバランサーとは、クライアントからのアクセスを複数の Web サーバーに振り分けることで負荷分散を行うサーバーです。nginx ではリバースプロキシの機能を利用してロードバランサーを実現します。1台のロードバランサーで3台のWebサーバーで処理を分散する4台もホストを用意できないよ!!という方は後述する docker コンテナを4つ利用する方法を実施ください。3台の Web サーバーを設定3 台のホストで以下のコマンドを実行します。Copysudo amazon-linux-extras install nginx1 -y3台の Web サーバーを区別するために、異なる Web ページを作成します。Copysudo sh -c 'echo "server1" > /usr/share/nginx/html/loadbalance.html'Copysudo sh -c 'echo "server2" > /usr/share/nginx/html/loadbalance.html'Copysudo sh -c 'echo "server3" > /usr/share/nginx/html/loadbalance.html'3台のホストで Web サーバーを起動します。Copysudo systemctl start nginxnginx の設定ロードバランサーのホスト1台で以下の設定を行います。Copysudo vim /etc/nginx/conf.d/loadbalancer.confCopyserver { listen 8003; location / { proxy_pass http://myapp1; } } upstream myapp1 { server 192.0.2.1; server 192.0.2.2; server 192.0.2.3; }赤線で引いたホストの IP アドレスは適宜置き換えてください。ディレクティブ説明proxy_passロードバランサーのプロキシ先を指定します。upstream のグループ名を指定します。upstreamロードバランサー配下に置く各 Web サーバーを設定します。Copysudo systemctl restart nginx動作確認アクセスする度に異なるサーバーにロードバランスされていることがわかります。Copycurl localhost:8003/loadbalance.htmlserver1Copycurl localhost:8003/loadbalance.htmlserver2Copycurl localhost:8003/loadbalance.htmlserver3docker で nginx を起動docker を利用して nginx を起動する方法を紹介します。なお、そもそも docker って何?という方や、まだ docker をインストールしていない方は以下の記事をご覧ください。【入門】Docker とは?コマンドや Dockerfile の使い方Docker とはDocker とは、指定した OS やソフトウェアを持つ環境(=コンテナ)で、指定したコマンドの実行結果を再現するソフトウェアです。例1:「CentOS の環境」で「ls コマンドを実行」例えば、...また、既に 80 番ポートで nginx が listen している場合は停止しておいてください。Copysudo systemctl stop nginxnginx コンテナを起動今回利用する nginx のイメージファイルは以下です。Docker HubCopydocker run --rm -d --name nginx -p 80:80 nginx:latest使い終わったらコンテナは止めておきましょう。(後述するロードバランサーで 80 番ポートを使います)Copydocker stop nginxdocker でロードバランサーを実現以下の構成を目指して、4つの nginx コンテナを作成します。Web ページを作成各 Web サーバーが区別できるように、Web ページの内容を「server1」・「server2」・「server3」とする。Copysudo sh -c 'echo "server1" > /var/local/server1.html'sudo sh -c 'echo "server2" > /var/local/server2.html'sudo sh -c 'echo "server3" > /var/local/server3.html'nginx の設定Copysudo vim /var/local/load_balancer.confCopyserver { listen 80; location / { proxy_pass http://myapp1; } } upstream myapp1 { server web_server1; server web_server2; server web_server3; }upstream の server ディレクトリでは、後述する docker-compose.yml の「container_name」を指定しています。docker-compose.yml を作成1つのロードバランサーと、3つの Web サーバーを用意します。Copyvim docker-compose.ymlCopyversion: '3' services: load_balancer: image: nginx:latest ports: - "80:80" volumes: - /var/local/load_balancer.conf:/etc/nginx/conf.d/default.conf web_server1: container_name: web_server1 image: nginx:latest volumes: - /var/local/server1.html:/usr/share/nginx/html/server.html web_serber2: container_name: web_server2 image: nginx:latest volumes: - /var/local/server2.html:/usr/share/nginx/html/server.html web_serber3: container_name: web_server3 image: nginx:latest volumes: - /var/local/server3.html:/usr/share/nginx/html/server.htmlnginx コンテナを起動・動作確認docker-compose でコンテナを一気に起動します。docker-compose をインストールしていない方は以下の記事をご覧ください。【入門】Docker とは?コマンドや Dockerfile の使い方Docker とはDocker とは、指定した OS やソフトウェアを持つ環境(=コンテナ)で、指定したコマンドの実行結果を再現するソフトウェアです。例1:「CentOS の環境」で「ls コマンドを実行」例えば、...Copydocker-compose up -dロードバランサー(localhost:80)にアクセスする度に、各 Web サーバーからレスポンスが戻ってきていることを確認できる。Copycurl localhost/server.htmlserver1Copycurl localhost/server.htmlserver2Copycurl localhost/server.htmlserver3参考資料Beginner’s Guideスポンサーリンク【入門 HTTP プロトコル】Status Code とはnginx + Gunicorn + Flask で Python の Web アプリ入門スポンサーリンク