インストール時に設定ファイルを作成する

Note

同環境でNGINXをアンインストール後に本作業を行う場合、設定ファイルの情報が残っている場合があります。
完全に削除する場合には以下コマンドを参考に削除してください。
sudo apt remove nginx-plus --purge

Note

Ansibleでjinja templateを利用し、NGINXの設定を行う場合、エラーとなる場合があります。
エラーを回避するためには、Pythonのパッケージマネージャである pip をインストールし、 jinja2 のパッケージをアップデートする必要があります。
詳細は Jinja Templateが正しく動作しない場合 を参照してください。

1. インストール、設定ファイル作成

NGINX Plus, NAP WAF/DoSインストールと同時に設定ファイルを作成することが可能です。 プロジェクトで共通の設定や初期設定がある場合にはこの方法が便利です。

ライセンス、Playbookなど正しく配置していることを想定し説明を進めます。 確認が必要な場合 1. 事前確認 を参照してください。

Playbookの内容を確認します

## cd ~/f5j-nginx-ansible-lab
cat playbook/deploy-nginx-plus-app-protect-waf-dos-proxyconf.yaml
実行結果サンプル
  1---
  2- hosts: all
  3  collections:
  4    - nginxinc.nginx_core
  5  tasks:
  6    - name: Install NGINX Plus
  7      ansible.builtin.include_role:
  8        name: nginx
  9      vars:
 10        nginx_type: plus
 11        nginx_license:
 12          certificate: ~/nginx-repo.crt
 13          key: ~/nginx-repo.key
 14        nginx_remove_license: false
 15
 16    - name: Install NGINX App Protect WAF/DoS
 17      ansible.builtin.include_role:
 18        name: nginx_app_protect
 19      vars:
 20        nginx_app_protect_waf_enable: true
 21        nginx_app_protect_dos_enable: true
 22        nginx_app_protect_install_signatures: true
 23        nginx_app_protect_install_threat_campaigns: true
 24        nginx_app_protect_setup_license: false
 25        nginx_app_protect_remove_license: false
 26
 27    - name: Configure NGINX
 28      ansible.builtin.include_role:
 29        name: nginx_config
 30      vars:
 31        nginx_config_modules:
 32          - modules/ngx_http_app_protect_module.so
 33          - modules/ngx_http_app_protect_dos_module.so
 34        nginx_config_http_template_enable: true
 35        nginx_config_http_template:
 36          - template_file: http/default.conf.j2
 37            deployment_location: /etc/nginx/conf.d/default.conf
 38            config:
 39              upstreams:
 40                - name: upstr
 41                  least_conn: true
 42                  servers:
 43                    - address: 0.0.0.0:8081
 44                    - address: 0.0.0.0:8082
 45              servers:
 46                - core:
 47                    listen:
 48                      - port: 80
 49                    server_name: localhost
 50                  app_protect_waf:
 51                    enable: true
 52                    security_log_enable: true
 53                  app_protect_dos:
 54                    enable: true
 55                  log:
 56                    access:
 57                      - path: /var/log/nginx/access.log
 58                        format: main
 59                  locations:
 60                    - location: /
 61                      proxy:
 62                        pass: http://upstr/
 63                        set_header:
 64                          field: Host
 65                          value: $host
 66                - core:
 67                    listen:
 68                      - port: 8081
 69                    server_name: localhost
 70                  log:
 71                    access:
 72                      - path: /var/log/nginx/access.log
 73                        format: main
 74                  locations:
 75                    - location: /
 76                      core:
 77                        root: /usr/share/nginx/html
 78                        index: server_one.html
 79                  sub_filter:
 80                    sub_filters:
 81                      - string: server_hostname
 82                        replacement: $hostname
 83                      - string: server_address
 84                        replacement: $server_addr:$server_port
 85                      - string: server_url
 86                        replacement: $request_uri
 87                      - string: remote_addr
 88                        replacement: '$remote_addr:$remote_port'
 89                      - string: server_date
 90                        replacement: $time_local
 91                      - string: client_browser
 92                        replacement: $http_user_agent
 93                      - string: request_id
 94                        replacement: $request_id
 95                      - string: nginx_version
 96                        replacement: $nginx_version
 97                      - string: document_root
 98                        replacement: $document_root
 99                      - string: proxied_for_ip
100                        replacement: $http_x_forwarded_for
101                    once: false
102                - core:
103                    listen:
104                      - port: 8082
105                    server_name: localhost
106                  log:
107                    access:
108                      - path: /var/log/nginx/access.log
109                        format: main
110                  locations:
111                    - location: /
112                      core:
113                        root: /usr/share/nginx/html
114                        index: server_two.html
115                  sub_filter:
116                    sub_filters:
117                      - string: server_hostname
118                        replacement: $hostname
119                      - string: server_address
120                        replacement: $server_addr:$server_port
121                      - string: server_url
122                        replacement: $request_uri
123                      - string: remote_addr
124                        replacement: '$remote_addr:$remote_port'
125                      - string: server_date
126                        replacement: $time_local
127                      - string: client_browser
128                        replacement: $http_user_agent
129                      - string: request_id
130                        replacement: $request_id
131                      - string: nginx_version
132                        replacement: $nginx_version
133                      - string: document_root
134                        replacement: $document_root
135                      - string: proxied_for_ip
136                        replacement: $http_x_forwarded_for
137                    once: false
138
139        nginx_config_html_demo_template_enable: true
140        nginx_config_html_demo_template:
141          - template_file: www/index.html.j2
142            deployment_location: /usr/share/nginx/html/server_one.html
143            web_server_name: Ansible NGINX collection - Server one
144          - template_file: www/index.html.j2
145            deployment_location: /usr/share/nginx/html/server_two.html
146            web_server_name: Ansible NGINX collection - Server two
  • 29行目で nginx_config のロールを指定し、以降パラメータを指定し設定ファイルを生成します

  • 31-33行目で、 nginx_config_modules により、利用するモジュールを指定します。この内容は nginx.conf の先頭に記述されます

  • 34行目で、 nginx_config_http_template_enable により、HTTPを制御するNGINXの設定を記述することを指定していします

  • 35行目の nginx_config_http_template に続き36行目から設定内容を記述します

    • 36行目 template_file : 利用するHTTP Teamplateを指定します

    • 37行目 deployment_location : 生成したファイルの保存場所を指定します

    • 38行目 config : 以降、設定ファイルに記述する内容を指定します

  • 139行目で、 nginx_config_html_demo_template_enable により、HTMLファイルの内容記述することを指定していします

  • 140行目の nginx_config_html_demo_template に続き36行目からHTMLの内容を記述します

    • 141,144行目 template_file : 利用するHTML Teamplateを指定します

    • 142,145行目 deployment_location : 生成したファイルの保存場所を指定します

    • 143,146行目 web_server_name : サーバ名を指定します

  • 入力されたパラメータの結果以下のような設定が反映されます

    • Port 80 で待ち受けるServerブロックでローカルホストの8081、8082に通信を転送する

    • Port 8081 、 Port 8082 それぞれで、指定したHTMLを応答するWEBサーバとして動作する

  • その他の詳細は GitHub ansible-role-nginx-config を参照してください

NGINX Plus、NGINX App Protect WAF/DoS をインストール

## cd ~/f5j-nginx-ansible-lab
ansible-playbook -i inventories/hosts -l nginx1 playbook/deploy-nginx-plus-app-protect-waf-dos-proxyconf.yaml --private-key="~/.ssh/id_rsa"  --become
実行結果サンプル
 1PLAY [all] ******************************************************************************************************************************************************************************************************************************************************************
 2
 3TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************************************************
 4ok: [10.1.1.7]
 5
 6TASK [Install NGINX Plus] ***************************************************************************************************************************************************************************************************************************************************
 7
 8** 省略 **
 9
10PLAY RECAP ******************************************************************************************************************************************************************************************************************************************************************
1110.1.1.7                   : ok=56   changed=8    unreachable=0    failed=0    skipped=58   rescued=0    ignored=0

実際に生成されたファイルの内容を確認します

nginx.conf の先頭行を確認し、モジュールのロードを行うコマンドについて確認します

head /etc/nginx/nginx.conf
実行結果サンプル
1load_module modules/ngx_http_app_protect_dos_module.so;
2load_module modules/ngx_http_app_protect_module.so;
3
4user  nginx;
5worker_processes  auto;
6
7error_log  /var/log/nginx/error.log notice;
8pid        /var/run/nginx.pid;
  • 1,2行目に、指定したモジュールを読み込む設定が記述されています

生成した default.conf の内容を確認します

cat /etc/nginx/conf.d/default.conf
実行結果サンプル
 1#
 2# Ansible managed
 3#
 4
 5upstream upstr {
 6    server 0.0.0.0:8081;
 7    server 0.0.0.0:8082;
 8    least_conn;
 9}
10
11server {
12    listen 80;
13    server_name localhost;
14
15    app_protect_enable on;
16    app_protect_security_log_enable on;
17
18    app_protect_dos_enable on;
19
20    access_log /var/log/nginx/access.log main;
21
22    location / {
23        proxy_pass http://upstr/;
24        proxy_set_header Host $host;
25
26
27    }
28}
29server {
30    listen 8081;
31    server_name localhost;
32
33    access_log /var/log/nginx/access.log main;
34
35    sub_filter server_hostname $hostname;
36    sub_filter server_address $server_addr:$server_port;
37    sub_filter server_url $request_uri;
38    sub_filter remote_addr $remote_addr:$remote_port;
39    sub_filter server_date $time_local;
40    sub_filter client_browser $http_user_agent;
41    sub_filter request_id $request_id;
42    sub_filter nginx_version $nginx_version;
43    sub_filter document_root $document_root;
44    sub_filter proxied_for_ip $http_x_forwarded_for;
45    sub_filter_once off;
46
47    location / {
48        root /usr/share/nginx/html;
49        index server_one.html;
50
51
52    }
53}
54server {
55    listen 8082;
56    server_name localhost;
57
58    access_log /var/log/nginx/access.log main;
59
60    sub_filter server_hostname $hostname;
61    sub_filter server_address $server_addr:$server_port;
62    sub_filter server_url $request_uri;
63    sub_filter remote_addr $remote_addr:$remote_port;
64    sub_filter server_date $time_local;
65    sub_filter client_browser $http_user_agent;
66    sub_filter request_id $request_id;
67    sub_filter nginx_version $nginx_version;
68    sub_filter document_root $document_root;
69    sub_filter proxied_for_ip $http_x_forwarded_for;
70    sub_filter_once off;
71
72    location / {
73        root /usr/share/nginx/html;
74        index server_two.html;
75
76
77    }
78}
  • 改めてAnsible Playbookの内容を確認すると、config配下で、 upstreamservers というパートに分かれ、更に servers の配下に3つの core が記述されていることが確認できます

  • 設定ファイルの内容は大きく、 upstream ブロック、 3つの server ブロックが記述されていることが確認でき、Playbookとの対比がわかります

  • Playbookの core と設定ファイルの server は、listenに指定されているポート番号から確認できます

grep コマンドで Ansible の文字列を指定し、HTMLファイルの出力結果を確認します

grep Ansible /usr/share/nginx/html/*html
実行結果サンプル
1/usr/share/nginx/html/server_one.html:<!-- Ansible managed -->
2/usr/share/nginx/html/server_one.html:<title>Hello World - Ansible NGINX collection - Server one</title>
3/usr/share/nginx/html/server_one.html:<p><span>Web Server name:</span> <span> Ansible NGINX collection - Server one </span></p>
4/usr/share/nginx/html/server_two.html:<!-- Ansible managed -->
5/usr/share/nginx/html/server_two.html:<title>Hello World - Ansible NGINX collection - Server two</title>
6/usr/share/nginx/html/server_two.html:<p><span>Web Server name:</span> <span> Ansible NGINX collection - Server two </span></p>
  • 1-3行目が server_one.html 、 4-6行目が server_two.html の内容です

  • 3,6行目に title 、 4,7行目に span で それぞれ指定した web_server_name の文字列が挿入されています

2. 動作確認

Curlコマンドを実行し、応答結果を確認します

for i in {1..3}; do echo "==$i==" ; curl -s localhost | grep -e Ansible -e "<span>"  ; sleep 1 ; done
実行結果サンプル
 1==1==
 2<!-- Ansible managed -->
 3<title>Hello World - Ansible NGINX collection - Server one</title>
 4<p><span>Web Server name:</span> <span> Ansible NGINX collection - Server one </span></p>
 5<p><span>Server name:</span> <span>ip-10-1-1-7</span></p>
 6<p><span>Server address:</span> <span>127.0.0.1:8081</span></p>
 7<p><span>User Agent:</span> <span><small>curl/7.68.0</small></span></p>
 8<p class="smaller"><span>URI:</span> <span>/</span></p>
 9<p class="smaller"><span>Doc Root:</span> <span>/usr/share/nginx/html</span></p>
10<p class="smaller"><span>Date:</span> <span>15/Sep/2022:11:28:56 +0900</span></p>
11<p class="smaller"><span>NGINX Front-End Load Balancer IP:</span><span>127.0.0.1:34952</span></p>
12<p class="smaller"><span>Client IP:</span> <span></span></p>
13<p class="smaller"><span>NGINX Version:</span> <span>1.21.6</span></p>
14==2==
15<!-- Ansible managed -->
16<title>Hello World - Ansible NGINX collection - Server two</title>
17<p><span>Web Server name:</span> <span> Ansible NGINX collection - Server two </span></p>
18<p><span>Server name:</span> <span>ip-10-1-1-7</span></p>
19<p><span>Server address:</span> <span>127.0.0.1:8082</span></p>
20<p><span>User Agent:</span> <span><small>curl/7.68.0</small></span></p>
21<p class="smaller"><span>URI:</span> <span>/</span></p>
22<p class="smaller"><span>Doc Root:</span> <span>/usr/share/nginx/html</span></p>
23<p class="smaller"><span>Date:</span> <span>15/Sep/2022:11:28:57 +0900</span></p>
24<p class="smaller"><span>NGINX Front-End Load Balancer IP:</span><span>127.0.0.1:54620</span></p>
25<p class="smaller"><span>Client IP:</span> <span></span></p>
26<p class="smaller"><span>NGINX Version:</span> <span>1.21.6</span></p>
27==3==
28<!-- Ansible managed -->
29<title>Hello World - Ansible NGINX collection - Server one</title>
30<p><span>Web Server name:</span> <span> Ansible NGINX collection - Server one </span></p>
31<p><span>Server name:</span> <span>ip-10-1-1-7</span></p>
32<p><span>Server address:</span> <span>127.0.0.1:8081</span></p>
33<p><span>User Agent:</span> <span><small>curl/7.68.0</small></span></p>
34<p class="smaller"><span>URI:</span> <span>/</span></p>
35<p class="smaller"><span>Doc Root:</span> <span>/usr/share/nginx/html</span></p>
36<p class="smaller"><span>Date:</span> <span>15/Sep/2022:11:28:58 +0900</span></p>
37<p class="smaller"><span>NGINX Front-End Load Balancer IP:</span><span>127.0.0.1:34960</span></p>
38<p class="smaller"><span>Client IP:</span> <span></span></p>
39<p class="smaller"><span>NGINX Version:</span> <span>1.21.6</span></p>
  • forで3回 Curl コマンドによるリクエストを実行します

  • 1,14,27行目に、コマンドを実行した回数が表示され、その番号以降がその結果となります

  • 3,17,30行目の内容が、Playbookで指定した web_server_name となり、 one , two , one と交互に表示されていることがわかります

  • <span> で表示される要素は、 sub_filter により値が置換されていることが確認できます

3. 環境の削除

環境を削除する場合、 3. NGINX Plus、NAP WAF/DoSのアンインストール の内容を参考にコマンドを実行してください