インストール時に設定ファイルを作成する
Note
sudo apt remove nginx-plus --purge
Note
pip をインストールし、 jinja2 のパッケージをアップデートする必要があります。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配下で、
upstreamとserversというパートに分かれ、更に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のアンインストール の内容を参考にコマンドを実行してください