NGINX Plus の動作

1. NGINX Plusのインストール (15min)

本ページに記載する手順に従ってNGINX Plus をインストールします

Note

手順確認の目的で、NGINX Plusの他、NGINX App Protect WAF、NGINX App Protect Dosのインストール手順も示しています。 ただし、本ラボでセキュリティ機能の確認はありません

1. NGINX Licenseファイルのコピー

ライセンスファイルをコピーしてください ファイルがラボ環境に配置されていない場合、トライアルを申請し証明書と鍵を取得してください
トライアルの申請方法はトライアル申請方法を参照してください

Note

取得したライセンスファイルをJump Hostにコピーした後、ubuntu-01に送信するためにpscpをご利用いただくことが可能です。以下コマンドを参考にご利用ください。コマンドプロンプト、powershellなどのターミナルから実行いただけます

なお、ubuntu01/02およびdocker_hostにライセンスファイルを格納しております。格納位置は以下になります

Windows2019_JumpBox、vnc-windows:C:UsersuserDesktopKey

Ubuntu01/02:/home/ubuntu/

docker_host:/home/centos/

コマンド: pscp -i <SSHで利用する公開鍵> <送付するファイル> <宛先>

pscp -i .\.ssh\id_rsa-putty.ppk <送信するファイル> ubuntu@10.1.1.7:/home/ubuntu
sudo mkdir -p /etc/ssl/nginx
sudo cp ~/nginx-repo.crt /etc/ssl/nginx/
sudo cp ~/nginx-repo.key /etc/ssl/nginx/

2. コマンドの実行

NGINX、App Protect WAF と App Protect DoS のリポジトリに利用する鍵を取得します

sudo wget -qO - https://cs.nginx.com/static/keys/nginx_signing.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

sudo wget -qO - https://cs.nginx.com/static/keys/app-protect-security-updates.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/app-protect-security-updates.gpg >/dev/null

必要となるパッケージをインストールします

sudo apt-get update

sudo apt-get install apt-transport-https lsb-release ca-certificates wget gnupg2 ubuntu-keyring

レポジトリの情報を追加します

# NGINX Plusのレポジトリ情報
printf "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://pkgs.nginx.com/plus/ubuntu `lsb_release -cs` nginx-plus\n" | sudo tee /etc/apt/sources.list.d/nginx-plus.list

# NGINX App Protectのレポジトリ情報
printf "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://pkgs.nginx.com/app-protect/ubuntu `lsb_release -cs` nginx-plus\n" | sudo tee /etc/apt/sources.list.d/nginx-app-protect.list

printf "deb [signed-by=/usr/share/keyrings/app-protect-security-updates.gpg] https://pkgs.nginx.com/app-protect-security-updates/ubuntu `lsb_release -cs` nginx-plus\n" | sudo tee -a /etc/apt/sources.list.d/nginx-app-protect.list

# NGINX App Protect DoSのレポジトリ情報
printf "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://pkgs.nginx.com/app-protect-dos/ubuntu `lsb_release -cs` nginx-plus\n" | sudo tee /etc/apt/sources.list.d/nginx-app-protect-dos.list

aptコマンドの設定情報を取得します

sudo wget -P /etc/apt/apt.conf.d https://cs.nginx.com/static/files/90pkgs-nginx

パッケージ情報を更新します

sudo apt-get update

3. NGINX パッケージのインストール

sudo apt-get install -y nginx-plus
sudo apt-get install -y app-protect app-protect-attack-signatures
sudo apt-get install -y app-protect-dos
# NAP DoS Release 4.4 より
sudo apt-get install -y app-protect-dos app-protect-dos-ebpf

インストールしたパッケージの情報の確認します

参考となる記事はこちらです。
nginx -v
実行結果サンプル
1nginx version: nginx/1.23.4 (nginx-plus-r29)

-V (大文字) を指定することによりパッケージが利用するOpenSSLの情報や、configureのオプションを確認できます。

nginx -V
実行結果サンプル
1nginx version: nginx/1.23.4 (nginx-plus-r29)
2built by gcc 9.3.0 (Ubuntu 9.3.0-10ubuntu2)
3built with OpenSSL 1.1.1f  31 Mar 2020
4TLS SNI support enabled
5configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --build=nginx-plus-r29 --with-http_auth_jwt_module --with-http_f4f_module --with-http_hls_module --with-http_proxy_protocol_vendor_module --with-http_session_log_module --with-stream_mqtt_filter_module --with-stream_mqtt_preread_module --with-stream_proxy_protocol_vendor_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-plus-1.23.4/debian/debuild-base/nginx-plus-1.23.4=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'

またUbuntuの環境では以下サンプルのようにパッケージの詳細を確認することが可能です。

実行結果サンプル
 1# sudo apt show nginx-plus
 2Package: nginx-plus
 3Version: 29-1~focal
 4Priority: optional
 5Section: httpd
 6Maintainer: NGINX Packaging <nginx-packaging@f5.com>
 7Installed-Size: 6760 kB
 8Provides: httpd, nginx, nginx-plus-r29
 9Depends: libc6 (>= 2.28), libcrypt1 (>= 1:4.1.0), libpcre2-8-0 (>= 10.22), libssl1.1 (>= 1.1.1), zlib1g (>= 1:1.1.4), lsb-base (>= 3.0-6), adduser
10Conflicts: nginx, nginx-common, nginx-core
11Replaces: nginx, nginx-core, nginx-plus-debug
12Homepage: https://www.nginx.com/
13Download-Size: 3369 kB
14APT-Manual-Installed: yes
15APT-Sources: https://pkgs.nginx.com/plus/ubuntu focal/nginx-plus amd64 Packages
16Description: NGINX Plus, provided by Nginx, Inc.
17 NGINX Plus extends NGINX open source to create an enterprise-grade
18 Application Delivery Controller, Accelerator and Web Server. Enhanced
19 features include: Layer 4 and Layer 7 load balancing with health checks,
20 session persistence and on-the-fly configuration; Improved content caching;
21 Enhanced status and monitoring information; Streaming media delivery.
  • 2~3,8行目 : 指定したNGINX Plusのパッケージであることが確認できます

  • 6行目 : MaintainerとしてF5の情報が確認できます

NGINX App Protect のVersion

cat /opt/app_protect/VERSION

NGINX App Protect DoS のVersion

admd -v

その他インストールしたパッケージの情報を確認いただけます。ラボ環境のホストはUbuntuとなります。

実行結果サンプル
1 # dpkg-query -l | grep nginx-plus
2 ii  nginx-plus                         25-1~focal                            amd64        NGINX Plus, provided by Nginx, Inc.
3 ii  nginx-plus-module-appprotect       25+3.671.0-1~focal                    amd64        NGINX Plus app protect dynamic module version 3.671.0
4 ii  nginx-plus-module-appprotectdos    25+2.0.1-1~focal                      amd64        NGINX Plus appprotectdos dynamic module
実行結果サンプル
 1 # dpkg-query -l | grep app-protect
 2 ii  app-protect                        28+4.2.0-1~focal                      amd64        App-Protect package for Nginx Plus, Includes all of the default files and examples. Nginx App Protect provides web application firewall (WAF) security protection for your web applications, including OWASP Top 10 attacks.
 3 ii  app-protect-attack-signatures      2023.01.09-1~focal                    amd64        Attack Signature Updates for App-Protect
 4 ii  app-protect-common                 10.179.0-1~focal                      amd64        NGINX App Protect
 5 ii  app-protect-compiler               10.179.0-1~focal                      amd64        Control-plane(aka CP) for waf-general debian
 6 ii  app-protect-dos                    28+3.1.7-1~focal                      amd64        Nginx DoS protection
 7 ii  app-protect-dos-ebpf               28+3.1.7-1~focal                      amd64        Nginx DoS protection
 8 ii  app-protect-engine                 10.179.0-1~focal                      amd64        NGINX App Protect
 9 ii  app-protect-plugin                 4.2.0-1~focal                         amd64        NGINX App Protect plugin
10 ii  app-protect-threat-campaigns       2023.01.11-1~focal                    amd64        Threat Campaign Updates for App-Protect

2. NGINXの基礎

1. ステータスの確認 (5min)

NGINX Plusのアーキテクチャ

  • ../../_images/nginx_architecture.jpg
  • ../../_images/nginx_architecture2.jpg

NGINX の停止・起動

sudo service nginx stop
sudo service nginx start

NGINX のstatusを確認します

sudo service nginx status
実行結果サンプル
 1 ● nginx.service - NGINX Plus - high performance web server
 2      Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
 3      Active: active (running) since Mon 2021-11-22 10:12:55 UTC; 11s ago
 4        Docs: https://www.nginx.com/resources/
 5     Process: 9126 ExecStartPre=/usr/lib/nginx-plus/check-subscription (code=exited, status=0/SUCCESS)
 6     Process: 9146 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
 7    Main PID: 9147 (nginx)
 8       Tasks: 3 (limit: 2327)
 9      Memory: 2.6M
10      CGroup: /system.slice/nginx.service
11              ├─9147 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
12              ├─9148 nginx: worker process
13              └─9149 nginx: worker process
14
15 Nov 22 10:12:55 ip-10-1-1-7 systemd[1]: Starting NGINX Plus - high performance web server...
16 Nov 22 10:12:55 ip-10-1-1-7 systemd[1]: nginx.service: Can't open PID file /run/nginx.pid (yet?) after start: Operation not permitted
17 Nov 22 10:12:55 ip-10-1-1-7 systemd[1]: Started NGINX Plus - high performance web server.

pidファイルの配置場所の確認します

grep pid /etc/nginx/nginx.conf
実行結果サンプル
1 pid        /var/run/nginx.pid;

pidの内容を確認します

cat /var/run/nginx.pid
実行結果サンプル
1 9147

論理コア数を確認します

grep processor /proc/cpuinfo | wc -l
実行結果サンプル
1 2

NGINX Processを確認します

NGINXはMaster Processと通信制御を行うWorker Processに分かます。Worker ProcessはCPUCore数の数起動し、並列処理を行う設定となっている。 Master ProcessのPIDがPIDファイルに記載されている内容と一致していることを確認する また、Worker ProcessがCPU Core数の数だけ起動していることを確認します

ps aux | grep nginx
実行結果サンプル
1 nginx       9122  0.0  0.0   2616   608 ?        Ss   10:12   0:00 /bin/sh -c usr/share/ts/bin/bd-socket-plugin tmm_count 4 proc_cpuinfo_cpu_mhz 2000000 total_xml_memory 307200000 total_umu_max_size 3129344 sys_max_account_id 1024 no_static_config 2>&1 >> /var/log/app_protect/bd-socket-plugin.log
2 nginx       9123  0.3  3.0 385260 61592 ?        Sl   10:12   0:00 usr/share/ts/bin/bd-socket-plugin tmm_count 4 proc_cpuinfo_cpu_mhz 2000000 total_xml_memory 307200000 total_umu_max_size 3129344 sys_max_account_id 1024 no_static_config
3 nginx       9125  0.0  0.0   2616   608 ?        Ss   10:12   0:00 /bin/sh -c /usr/bin/admd -d --log info 2>&1 > /var/log/adm/admd.log
4 nginx       9127  0.5  2.5 799208 50732 ?        Sl   10:12   0:00 /usr/bin/admd -d --log info
5 root        9147  0.0  0.0   9136   892 ?        Ss   10:12   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
6 nginx       9148  0.0  0.1   9764  3528 ?        S    10:12   0:00 nginx: worker process
7 nginx       9149  0.0  0.1   9764  3528 ?        S    10:12   0:00 nginx: worker process

2. Directive / Block (5min)

  • ../../_images/nginx_directive.jpg

3. Configの階層構造 (5min)

  • ../../_images/nginx_directive2.jpg
  • ../../_images/nginx_directive3.jpg
  • ../../_images/nginx_directive4.jpg

3. 基本的な動作の確認

1. 事前ファイルの取得 (5min)

ラボで必要なファイルをGitHubから取得します

sudo su -
cd ~/
git clone https://github.com/BeF5/f5j-nginx-plus-lab1-conf.git

2. 設定のテスト、設定の反映 (10min)

ディレクトリを移動し、必要なファイルをコピーします

cp ~/f5j-nginx-plus-lab1-conf/lab/incomplete.conf /etc/nginx/conf.d/default.conf

設定ファイルの内容を確認します

cat ~/f5j-nginx-plus-lab1-conf/lab/incomplete.conf
実行結果サンプル
1 server {
2     # you need to add ; at end of listen directive.
3     listen       81
4     server_name  localhost;
5     location / {
6         root   /usr/share/nginx/html;
7         index  index.html index.htm;
8     }
9 }

基本的なコマンドと、Signalについて以下を確認してください。

  • ../../_images/nginx_command.jpg
  • ../../_images/nginx_command2.jpg
NGINX Config Fileを反映する前にテストすることが可能です。コマンドを実行し、テスト結果を確認してください。
-t-T の2つのオプションを実行し、違いを確認します。

まず、オプションの内容を確認してください。

実行結果サンプル
 1 # nginx -h
 2 nginx version: nginx/1.21.3 (nginx-plus-r25)
 3 Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
 4              [-e filename] [-c filename] [-g directives]
 5
 6 Options:
 7   -?,-h         : this help
 8   -v            : show version and exit
 9   -V            : show version and configure options then exit
10   -t            : test configuration and exit
11   -T            : test configuration, dump it and exit
12   -q            : suppress non-error messages during configuration testing
13   -s signal     : send signal to a master process: stop, quit, reopen, reload
14   -p prefix     : set prefix path (default: /etc/nginx/)
15   -e filename   : set error log file (default: /var/log/nginx/error.log)
16   -c filename   : set configuration file (default: /etc/nginx/nginx.conf)
17   -g directives : set global directives out of configuration file

テストを実行します(-t)

nginx -t
実行結果サンプル
1 nginx: [emerg] invalid parameter "server_name" in /etc/nginx/conf.d/default.conf:4
2 nginx: configuration file /etc/nginx/nginx.conf test failed
“server_name” directive でエラーとなっていることがわかります。 これは、その一つ前の行が正しく「;(セミコロン)」で終わっていないことが問題となります。
エディタで設定ファイルを開き修正してください
vi /etc/nginx/conf.d/default.conf
実行結果サンプル
1 listen directiveの文末に ; を追加してください。
2 ---
3 [変更前]    listen       81
4 [変更後]    listen       81;
5 ---
再度テストを実行してください。
-t の実行
nginx -t
実行結果サンプル
1 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
2 nginx: configuration file /etc/nginx/nginx.conf test is successful

-T の実行

nginx -T
実行結果サンプル
 1 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
 2 nginx: configuration file /etc/nginx/nginx.conf test is successful
 3 # configuration file /etc/nginx/nginx.conf:
 4
 5 user  nginx;
 6 worker_processes  auto;
 7
 8 error_log  /var/log/nginx/error.log notice;
 9 pid        /var/run/nginx.pid;
10
11
12 events {
13     worker_connections  1024;
14 }
15
16
17 http {
18     include       /etc/nginx/mime.types;
19     default_type  application/octet-stream;
20
21     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
22                       '$status $body_bytes_sent "$http_referer" '
23                       '"$http_user_agent" "$http_x_forwarded_for"';
24
25     access_log  /var/log/nginx/access.log  main;
26
27     sendfile        on;
28     #tcp_nopush     on;
29
30     keepalive_timeout  65;
31
32     #gzip  on;
33
34     include /etc/nginx/conf.d/*.conf;
35 }
36
37
38 ※省略※
39 # configuration file /etc/nginx/conf.d/default.conf:
40 server {
41     # you need to add ; at end of listen directive.
42     listen       81;
43     server_name  localhost;
44     location / {
45         root   /usr/share/nginx/html;
46         index  index.html index.htm;
47     }
48 }
設定の読み込み、動作確認をします。
正しく Port 81 でListenしていることを確認してください
nginx -s reload
ss -anp | grep nginx | grep LISTEN
実行結果サンプル
1 tcp    LISTEN  0       511                                              0.0.0.0:81                                                0.0.0.0:*                      users:(("nginx",pid=9341,fd=12),("nginx",pid=9340,fd=12),("nginx",pid=9147,fd=12))

curlコマンドを実行します

curl -s localhost:81 | grep title
実行結果サンプル
1 <title>Welcome to nginx!</title>

3. 設定の継承 (10min)

ラボで使用するファイルをコピーします

cp -r ~/f5j-nginx-plus-lab1-conf/html /etc/nginx/conf.d
cp ~/f5j-nginx-plus-lab1-conf/lab/inheritance.conf /etc/nginx/conf.d/default.conf
設定ファイルの確認してください。
本設定では、indexがポイントとなります。

listen 80では、indexを個別に記述をしていません。 listen 8080では、 indexとして main.html を指定しています。 また、それぞれ root の記述方法が異なっています。

cat ~/f5j-nginx-plus-lab1-conf/lab/inheritance.conf
実行結果サンプル
 1 index index.html;
 2 server {
 3         listen 80;
 4         root conf.d/html;
 5 }
 6 server {
 7         listen 8080;
 8         root /etc/nginx/conf.d/html;
 9         index main.html;
10 }

設定を反映し、これらがどのように動作するのか見てみましょう

nginx -s reload
ss -anp | grep nginx | grep LISTEN
実行結果サンプル
1 tcp    LISTEN  0       511                                              0.0.0.0:8080                                              0.0.0.0:*                      users:(("nginx",pid=9392,fd=9),("nginx",pid=9391,fd=9),("nginx",pid=9147,fd=9))
2 tcp    LISTEN  0       511                                              0.0.0.0:80                                                0.0.0.0:*                      users:(("nginx",pid=9392,fd=8),("nginx",pid=9391,fd=8),("nginx",pid=9147,fd=8))

Port 80 に対し、curlコマンドを実行します

curl -s localhost:80 | grep path
実行結果サンプル
1     <h2>path: html/index.html</h2>

Port 8080 に対し、curlコマンドを実行します

curl -s localhost:8080 | grep path
実行結果サンプル
1     <h2>path: html/main.html</h2>

4. server directive (10min)

NGINXが通信を待ち受ける動作について以下を確認してください

  • ../../_images/nginx_server.jpg
  • ../../_images/nginx_server2.jpg

ラボで使用するファイルをコピーします

cp ~/f5j-nginx-plus-lab1-conf/lab/blank-defaultbehavior.conf /etc/nginx/conf.d/default.conf

設定内容を確認します

cat ~/f5j-nginx-plus-lab1-conf/lab/blank-defaultbehavior.conf
実行結果サンプル
1 server {
2
3 }

設定を反映します

nginx -s reload
ss -anp | grep nginx | grep LISTEN
実行結果サンプル
1 tcp    LISTEN  0       511                                              0.0.0.0:80                                                0.0.0.0:*                      users:(("nginx",pid=9445,fd=8),("nginx",pid=9444,fd=8),("nginx",pid=9147,fd=8))
設定が反映され、80でListenしていることが確認できます。
curlコマンドで結果を確認します
curl localhost:80
実行結果サンプル
1 <html>
2 <head><title>404 Not Found</title></head>
3 <body>
4 <center><h1>404 Not Found</h1></center>
5 <hr><center>nginx/1.21.3</center>
6 </body>
404エラーとなりました。これはどこを参照しているのでしょうか。
各directiveのdefaultパラメータを確認してください

これらの内容より、server directiveに設定を記述しない場合にも、defaultのパラメータで動作していることが確認できます。

それでは対象となるディレクトリにファイルをコピーします

mkdir /etc/nginx/html
cp /etc/nginx/conf.d/html/default-path_index.html /etc/nginx/html/index.html
htmlファイルを配置しました。
設定ファイルに変更は加えておりませんので、再度curlコマンドで結果を確認します
curl -s localhost:80 | grep default
実行結果サンプル
1     <h2>This is default html file path</h2>

今度は正しく結果が表示されました。 このようにdefaultパラメータの動作を確認できました

5. listen directive (10min)

listen directiveを利用することにより、NGINXが待ち受けるIPアドレスやポート番号など指定することができます。
以下のような記述で意図した動作となるよう設定をします
  • ../../_images/nginx_listen.jpg
  • ../../_images/nginx_listen2.jpg

ラボで使用するファイルをコピーします

cp ~/f5j-nginx-plus-lab1-conf/lab/multi-listen.conf /etc/nginx/conf.d/default.conf

設定内容を確認し、反映します

cat ~/f5j-nginx-plus-lab1-conf/lab/multi-listen.conf
実行結果サンプル
 1 # server {
 2 #    ## no listen directive
 3 # }
 4
 5 server {
 6     listen 127.0.0.1:8080;
 7 }
 8
 9 server {
10     listen 127.0.0.2;
11 }
12
13 server {
14     listen 8081;
15 }
16
17 server {
18     listen unix:/var/run/nginx.sock;
19 }

設定を反映します

service nginx restart
設定で指定したポート番号やソケットでListenしていることを確認してください。
(正しく設定が読み込めない場合は、再度上記コマンドにて設定を読み込んでください)

ソケットが生成されていることを確認します

ls /var/run/nginx.sock
実行結果サンプル
1 /var/run/nginx.sock

NGINXでListenしている内容を確認します

ss -anp | grep nginx | grep LISTEN
実行結果サンプル
1 u_str LISTEN    0      511                                  /var/run/nginx.sock 60394                                                   * 0                      users:(("nginx",pid=9947,fd=9),("nginx",pid=9946,fd=9),("nginx",pid=9945,fd=9))
2 tcp   LISTEN    0      511                                            127.0.0.2:80                                                0.0.0.0:*                      users:(("nginx",pid=9947,fd=7),("nginx",pid=9946,fd=7),("nginx",pid=9945,fd=7))
3 tcp   LISTEN    0      511                                            127.0.0.1:8080                                              0.0.0.0:*                      users:(("nginx",pid=9947,fd=6),("nginx",pid=9946,fd=6),("nginx",pid=9945,fd=6))
4 tcp   LISTEN    0      511                                              0.0.0.0:8081                                              0.0.0.0:*                      users:(("nginx",pid=9947,fd=8),("nginx",pid=9946,fd=8),("nginx",pid=9945,fd=8))

それぞれ Listen している内容に対して接続できることを確認してください

curl -s 127.0.0.1:8080 | grep default
実行結果サンプル
1     <h2>This is default html file path</h2>
curl -s 127.0.0.2:80 | grep default
実行結果サンプル
1     <h2>This is default html file path</h2>
curl -s 127.0.0.1:8081 | grep default
実行結果サンプル
1     <h2>This is default html file path</h2>
curl -s --unix-socket /var/run/nginx.sock http: | grep default
実行結果サンプル
1     <h2>This is default html file path</h2>

socketを削除し、NGINXが起動することを確認します

rm /var/run/nginx.sock
rm /etc/nginx/conf.d/default.conf
service nginx restart

6. server_name directive (10min)

server_name directiveを利用することにより、待ち受けるFQDNを指定することが可能です。

ラボで使用するファイルをコピーします

cp ~/f5j-nginx-plus-lab1-conf/lab/multi-server_name.conf /etc/nginx/conf.d/default.conf

設定内容を確認し、反映します

cat ~/f5j-nginx-plus-lab1-conf/lab/multi-server_name.conf

実行結果を確認します

実行結果サンプル
 1 server {
 2     server_name example.com;
 3     return 200 "example.com\n";
 4 }
 5
 6 server {
 7     server_name host1.example.com;
 8     return 200 "host1.example.com\n";
 9 }
10
11 server {
12         server_name www.example.*;
13     return 200 "www.example.*\n";
14 }
15 server{
16         server_name *.org;
17     return 200 "*.org\n";
18 }
19 server {
20         server_name *.example.org;
21     return 200 "*.example.org\n";
22 }
23
24 server {
25         listen 80;
26         server_name ~^(www2|host2).*\.example\.com$;
27    return 200 "~^(www2|host2).*\.example\.com\n";
28 }
29 server {
30         listen 80;
31         server_name ~^.*\.example\..*$;
32     return 200 "~^.*\.example\..*\n";
33 }
34 server {
35         listen 80;
36         server_name ~^(host2|host3).*\.example\.com$;
37     return 200 "~^(host2|host3).*\.example\.com\n";
38 }

設定を反映します

nginx -s reload

server_nameの処理順序は以下です

../../_images/nginx_server_name.jpg

以下のコマンドを実行し結果を確認します。 どのような処理が行われているか確認してください

完全一致する結果を確認します

curl localhost -H 'Host:host1.example.com'
実行結果サンプル
1 host1.example.com

Wild Cardの前方一致する結果を確認します

curl localhost -H 'Host:www.example.co.jp'
実行結果サンプル
1 www.example.*

正規表現のはじめに一致する結果を確認します

curl localhost -H 'Host:host2.example.co.jp'
実行結果サンプル
1 ~^.*\.example\..*
curl localhost -H 'Host:host2.example.com'
実行結果サンプル
1 ~^(www2|host2).*\.example\.com

7. location directive (10min)

ラボで使用するファイルをコピーします

cp ~/f5j-nginx-plus-lab1-conf/lab/multi-location.conf /etc/nginx/conf.d/default.conf

設定内容を確認し、反映します

cat ~/f5j-nginx-plus-lab1-conf/lab/multi-location.conf
実行結果サンプル
 1 server {
 2    listen 80;
 3    location / {
 4       return 200 "LOCATION: / , URI: $request_uri, PORT: $server_port\n";
 5    }
 6    location ~* \.(php|html)$ {
 7       return 200 "LOCATION: ~* \.(php|html), URI: $request_uri, PORT: $server_port\n";
 8    }
 9    location ^~ /app1 {
10       return 200 "LOCATION: ^~ /app1, URI: $request_uri, PORT: $server_port\n";
11    }
12    location ~* /app1/.*\.(php|html)$ {
13       return 200 "LOCATION: ~* /app1/.*\.(php|html), URI: $request_uri, PORT: $server_port\n";
14    }
15    location = /app1/index.php {
16            return 200 "LOCATION: = /app1/index.php, URI: $request_uri, PORT: $server_port\n";
17    }
18    location  /app2 {
19       return 200 "LOCATION: /app2, URI: $request_uri, PORT: $server_port\n";
20    }
21    location ~* /app2/.*\.(php|html)$ {
22       return 200 "LOCATION: ~* /app2/.*\.(php|html), URI: $request_uri, PORT: $server_port\n";
23    }
24
25 }

設定を反映します。

nginx -s reload

locationの処理順序は以下となります。

../../_images/nginx_location.jpg

期待した結果となることを確認してください

前方一致する結果を確認

curl http://localhost/app1/index.html
実行結果サンプル
1 LOCATION: ^~ /app1, URI: /app1/index.html, PORT: 80

正規表現で一致する結果を確認

curl http://localhost/app2/index.html
実行結果サンプル
1 LOCATION: ~* \.(php|html), URI: /app2/index.html, PORT: 80

8. Proxy (5min)

  • ../../_images/nginx_proxy.jpg
  • ../../_images/nginx_proxy2.jpg
  • ../../_images/nginx_proxy3.jpg

ラボで使用するファイルをコピーします

cp ~/f5j-nginx-plus-lab1-conf/lab/proxy.conf /etc/nginx/conf.d/default.conf

設定内容を確認し、反映します

cat ~/f5j-nginx-plus-lab1-conf/lab/proxy.conf
実行結果サンプル
 1 server {
 2     listen 80;
 3     location /app1 {
 4         proxy_pass http://backend1:81/otherapp;
 5     }
 6     location /app2 {
 7         proxy_pass http://backend1:81;
 8     }
 9
10 }

設定を反映します

nginx -s reload

以下のコマンドを実行し結果を確認します。 どのような処理が行われているか確認してください。

curl -s localhost/app1/usr1/index.php | jq .
実行結果サンプル
1 {
2   "request_uri": "/otherapp/usr1/index.php",
3   "server_addr": "10.1.1.8",
4   "server_port": "81"
5 }
curl -s localhost/app2/usr1/index.php | jq .
実行結果サンプル
1 {
2   "request_uri": "/app2/usr1/index.php",
3   "server_addr": "10.1.1.8",
4   "server_port": "81"
5 }

9. Load Balancing (5min)

../../_images/nginx_lb.jpg

ラボで使用するファイルをコピーします

cp ~/f5j-nginx-plus-lab1-conf/lab/lb-weight.conf /etc/nginx/conf.d/default.conf
cp ~/f5j-nginx-plus-lab1-conf/lab/lb-weight_plus_api.conf /etc/nginx/conf.d/plus_api.conf

設定内容を確認し、反映します

cat ~/f5j-nginx-plus-lab1-conf/lab/lb-weight.conf
実行結果サンプル
 1 upstream server_group {
 2     zone backend 64k;
 3     server backend1:81 weight=1;
 4     server backend2:82 weight=2;
 5 }
 6 server {
 7     listen 80;
 8     location / {
 9         proxy_pass http://server_group;
10     }
11 }

Note

API、APIを活用したDashboardの機能は NGINX Plus の機能となります。 NGINX OSS では利用できません。

cat ~/f5j-nginx-plus-lab1-conf/lab/lb-weight_plus_api.conf
実行結果サンプル
 1 server {
 2     listen 8888;
 3     access_log /var/log/nginx/mng_access.log;
 4
 5     location /api {
 6         api write=on;
 7         # directives limiting access to the API
 8     }
 9
10     location = /dashboard.html {
11         root   /usr/share/nginx/html;
12     }
13
14 }

設定を反映します

nginx -s reload

作業を行うホストからブラウザでNGINX Plus Dashboardを開く場合、 ``ubuntu01``の接続はメニューより ``PLUS DASHBOARD``をクリックしてください。 踏み台ホストから接続する場合、ブラウザで http://10.1.1.7:8888/dashboard.html を開いてください

../../_images/nginx_lb2.png

以下コマンドを実行し、適切に分散されることを確認します。

for i in {1..9}; do echo "==$i==" ; curl -s localhost | jq . ; sleep 1 ; done
実行結果サンプル
 1 ==1==
 2 {
 3   "request_uri": "/",
 4   "server_addr": "10.1.1.8",
 5   "server_port": "82"
 6 }
 7 ※省略※
 8 ==9==
 9 {
10   "request_uri": "/",
11   "server_addr": "10.1.1.8",
12   "server_port": "82"
13 }

Dashboardの結果が適切なweightで分散されていることを確認してください。

10. トラフィックの暗号化 (5min)

../../_images/nginx_ssl.jpg

ラボで使用するファイルをコピーします

cp -r ~/f5j-nginx-plus-lab1-conf/ssl /etc/nginx/conf.d
cp ~/f5j-nginx-plus-lab1-conf/lab/ssl.conf /etc/nginx/conf.d/default.conf

設定内容を確認し、反映します

cat ~/f5j-nginx-plus-lab1-conf/lab/ssl.conf
実行結果サンプル
1 server {
2     listen 80;
3         listen 443 ssl;
4         ssl_certificate_key conf.d/ssl/nginx-ecc-p256.key;
5         ssl_certificate conf.d/ssl/nginx-ecc-p256.pem;
6         location / {
7                 proxy_pass http://backend1:81;
8         }
9 }

設定を反映します

nginx -s reload

以下のコマンドを実行し結果を確認します。

HTTPでのアクセスを確認

curl -v http://localhost
実行結果サンプル
 1 *   Trying 127.0.0.1:80...
 2 * TCP_NODELAY set
 3 * Connected to localhost (127.0.0.1) port 80 (#0)
 4 > GET / HTTP/1.1
 5 > Host: localhost
 6 > User-Agent: curl/7.68.0
 7 > Accept: */*
 8 >
 9 * Mark bundle as not supporting multiuse
10 < HTTP/1.1 200 OK
11 < Server: nginx/1.21.3
12 < Date: Mon, 22 Nov 2021 15:05:35 GMT
13 < Content-Type: application/octet-stream
14 < Content-Length: 65
15 < Connection: keep-alive
16 <
17 * Connection #0 to host localhost left intact
18 { "request_uri": "/","server_addr":"10.1.1.8","server_port":"81"}

HTTPSでのアクセスを確認

curl -kv https://localhost
実行結果サンプル
 1 *   Trying 127.0.0.1:443...
 2 * TCP_NODELAY set
 3 * Connected to localhost (127.0.0.1) port 443 (#0)
 4 * ALPN, offering h2
 5 * ALPN, offering http/1.1
 6 * successfully set certificate verify locations:
 7 *   CAfile: /etc/ssl/certs/ca-certificates.crt
 8   CApath: /etc/ssl/certs
 9 * TLSv1.3 (OUT), TLS handshake, Client hello (1):
10 * TLSv1.3 (IN), TLS handshake, Server hello (2):
11 * TLSv1.2 (IN), TLS handshake, Certificate (11):
12 * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
13 * TLSv1.2 (IN), TLS handshake, Server finished (14):
14 * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
15 * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
16 * TLSv1.2 (OUT), TLS handshake, Finished (20):
17 * TLSv1.2 (IN), TLS handshake, Finished (20):
18 * SSL connection using TLSv1.2 / ECDHE-ECDSA-AES256-GCM-SHA384
19 * ALPN, server accepted to use http/1.1
20 * Server certificate:
21 *  subject: CN=localhost
22 *  start date: Mar 24 01:04:24 2021 GMT
23 *  expire date: Apr 23 01:04:24 2021 GMT
24 *  issuer: CN=localhost
25 *  SSL certificate verify result: self signed certificate (18), continuing anyway.
26 > GET / HTTP/1.1
27 > Host: localhost
28 > User-Agent: curl/7.68.0
29 > Accept: */*
30 >
31 * Mark bundle as not supporting multiuse
32 < HTTP/1.1 200 OK
33 < Server: nginx/1.21.3
34 < Date: Mon, 22 Nov 2021 15:05:49 GMT
35 < Content-Type: application/octet-stream
36 < Content-Length: 65
37 < Connection: keep-alive
38 <
39 * Connection #0 to host localhost left intact
40 { "request_uri": "/","server_addr":"10.1.1.8","server_port":"81"}