368 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Markdown
		
	
	
			
		
		
	
	
			368 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Markdown
		
	
	
| nginx
 | |
| =====
 | |
| 
 | |
| This role installs and configures the nginx web server. The user can specify
 | |
| any http configuration parameters they wish to apply their site. Any number of
 | |
| sites can be added with configurations of your choice.
 | |
| 
 | |
| [](https://travis-ci.org/jdauphant/ansible-role-nginx)
 | |
| [](https://galaxy.ansible.com/jdauphant/nginx/)
 | |
| 
 | |
| Requirements
 | |
| ------------
 | |
| 
 | |
| This role requires Ansible 2.0 or higher and platform requirements are listed
 | |
| in the metadata file. (Some older version of the role support Ansible 1.4)
 | |
| For FreeBSD a working pkgng setup is required (see: https://www.freebsd.org/doc/handbook/pkgng-intro.html )
 | |
| 
 | |
| Install
 | |
| -------
 | |
| 
 | |
| ```sh
 | |
| ansible-galaxy install jdauphant.nginx
 | |
| ```
 | |
| 
 | |
| Role Variables
 | |
| --------------
 | |
| 
 | |
| The variables that can be passed to this role and a brief description about
 | |
| them are as follows. (For all variables, take a look at [defaults/main.yml](defaults/main.yml))
 | |
| 
 | |
| ```yaml
 | |
| # The user to run nginx
 | |
| nginx_user: "www-data"
 | |
| 
 | |
| # A list of directives for the events section.
 | |
| nginx_events_params:
 | |
|  - worker_connections 512
 | |
|  - debug_connection 127.0.0.1
 | |
|  - use epoll
 | |
|  - multi_accept on
 | |
| 
 | |
| # A list of hashes that define the servers for nginx,
 | |
| # as with http parameters. Any valid server parameters
 | |
| # can be defined here.
 | |
| nginx_sites:
 | |
|  default:
 | |
|      - listen 80
 | |
|      - server_name _
 | |
|      - root "/usr/share/nginx/html"
 | |
|      - index index.html
 | |
|  foo:
 | |
|      - listen 8080
 | |
|      - server_name localhost
 | |
|      - root "/tmp/site1"
 | |
|      - location / { try_files $uri $uri/ /index.html; }
 | |
|      - location /images/ { try_files $uri $uri/ /index.html; }
 | |
|  bar:
 | |
|      - listen 9090
 | |
|      - server_name ansible
 | |
|      - root "/tmp/site2"
 | |
|      - location / { try_files $uri $uri/ /index.html; }
 | |
|      - location /images/ {
 | |
|          try_files $uri $uri/ /index.html;
 | |
|          allow 127.0.0.1;
 | |
|          deny all;
 | |
|        }
 | |
| 
 | |
| # A list of hashes that define additional configuration
 | |
| nginx_configs:
 | |
|   proxy:
 | |
|       - proxy_set_header X-Real-IP  $remote_addr
 | |
|       - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
 | |
|   upstream:
 | |
|       - upstream foo { server 127.0.0.1:8080 weight=10; }
 | |
|   geo:
 | |
|       - geo $local {
 | |
|           default 0;
 | |
|           127.0.0.1 1;
 | |
|         }
 | |
|   gzip:
 | |
|       - gzip on
 | |
|       - gzip_disable msie6
 | |
| 
 | |
| # A list of hashes that define configuration snippets
 | |
| nginx_snippets:
 | |
|   error_pages:
 | |
|     - error_page 500 /http_errors/500.html
 | |
|     - error_page 502 /http_errors/502.html
 | |
|     - error_page 503 /http_errors/503.html
 | |
|     - error_page 504 /http_errors/504.html
 | |
| 
 | |
| # A list of hashes that define user/password files
 | |
| nginx_auth_basic_files:
 | |
|    demo:
 | |
|      - foo:$apr1$mEJqnFmy$zioG2q1iDWvRxbHuNepIh0 # foo:demo , generated by : htpasswd -nb foo demo
 | |
|      - bar:$apr1$H2GihkSo$PwBeV8cVWFFQlnAJtvVCQ. # bar:demo , generated by : htpasswd -nb bar demo
 | |
| 
 | |
| ```
 | |
| 
 | |
| Examples
 | |
| ========
 | |
| 
 | |
| ## 1) Install nginx with HTTP directives of choice, but with no sites configured and no additional configuration:
 | |
| 
 | |
| ```yaml
 | |
| - hosts: all
 | |
|   roles:
 | |
|   - {role: nginx,
 | |
|      nginx_http_params: ["sendfile on", "access_log /var/log/nginx/access.log"]
 | |
|                           }
 | |
| ```
 | |
| 
 | |
| ## 2) Install nginx with different HTTP directives than in the previous example, but no
 | |
| sites configured and no additional configuration.
 | |
| 
 | |
| ```yaml
 | |
| - hosts: all
 | |
|   roles:
 | |
|   - {role: nginx,
 | |
|      nginx_http_params: ["tcp_nodelay on", "error_log /var/log/nginx/error.log"]}
 | |
| ```
 | |
| 
 | |
| Note: Please make sure the HTTP directives passed are valid, as this role
 | |
| won't check for the validity of the directives. See the nginx documentation
 | |
| for details.
 | |
| 
 | |
| ## 3) Install nginx and add a site to the configuration.
 | |
| 
 | |
| ```yaml
 | |
| - hosts: all
 | |
| 
 | |
|   roles:
 | |
|   - role: nginx
 | |
|     nginx_http_params:
 | |
|       - sendfile "on"
 | |
|       - access_log "/var/log/nginx/access.log"
 | |
|     nginx_sites:
 | |
|       bar:
 | |
|         - listen 8080
 | |
|         - location / { try_files $uri $uri/ /index.html; }
 | |
|         - location /images/ { try_files $uri $uri/ /index.html; }
 | |
|     nginx_configs:
 | |
|       proxy:
 | |
|         - proxy_set_header X-Real-IP  $remote_addr
 | |
|         - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
 | |
| ```
 | |
| 
 | |
| ## 4) Install nginx and add extra variables to default config
 | |
| 
 | |
| ```yaml
 | |
| -hosts: all
 | |
|   vars:
 | |
|     - my_extra_params:
 | |
|       - client_max_body_size 200M
 | |
| # retain defaults and add additional `client_max_body_size` param
 | |
|   roles:
 | |
|     - role: jdauphant.nginx
 | |
|       nginx_http_params: "{{ nginx_http_default_params + my_extra_params }}"
 | |
| ```
 | |
| 
 | |
| Note: Each site added is represented by a list of hashes, and the configurations
 | |
| generated are populated in /etc/nginx/site-available/ and linked from /etc/nginx/site-enable/ to /etc/nginx/site-available.
 | |
| 
 | |
| The file name for the specific site configuration is specified in the hash
 | |
| with the key "file_name", any valid server directives can be added to the hash.
 | |
| Additional configurations are created in /etc/nginx/conf.d/
 | |
| 
 | |
| ## 5) Install Nginx, add 2 sites (different method) and add additional configuration
 | |
| 
 | |
| ```yaml
 | |
| ---
 | |
| - hosts: all
 | |
|   roles:
 | |
|     - role: nginx
 | |
|       nginx_http_params:
 | |
|         - sendfile on
 | |
|         - access_log /var/log/nginx/access.log
 | |
|       nginx_sites:
 | |
|          foo:
 | |
|            - listen 8080
 | |
|            - server_name localhost
 | |
|            - root /tmp/site1
 | |
|            - location / { try_files $uri $uri/ /index.html; }
 | |
|            - location /images/ { try_files $uri $uri/ /index.html; }
 | |
|          bar:
 | |
|            - listen 9090
 | |
|            - server_name ansible
 | |
|            - root /tmp/site2
 | |
|            - location / { try_files $uri $uri/ /index.html; }
 | |
|            - location /images/ { try_files $uri $uri/ /index.html; }
 | |
|       nginx_configs:
 | |
|          proxy:
 | |
|             - proxy_set_header X-Real-IP  $remote_addr
 | |
|             - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
 | |
| ```
 | |
| 
 | |
| ## 6) Install Nginx, add 2 sites, add additional configuration and an upstream configuration block
 | |
| 
 | |
| ```yaml
 | |
| ---
 | |
| - hosts: all
 | |
|   roles:
 | |
|     - role: nginx
 | |
|       nginx_error_log_level: info
 | |
|       nginx_http_params:
 | |
|         - sendfile on
 | |
|         - access_log /var/log/nginx/access.log
 | |
|       nginx_sites:
 | |
|         foo:
 | |
|            - listen 8080
 | |
|            - server_name localhost
 | |
|            - root /tmp/site1
 | |
|            - location / { try_files $uri $uri/ /index.html; }
 | |
|            - location /images/ { try_files $uri $uri/ /index.html; }
 | |
|         bar:
 | |
|            - listen 9090
 | |
|            - server_name ansible
 | |
|            - root /tmp/site2
 | |
|            - if ( $host = example.com ) { rewrite ^(.*)$ http://www.example.com$1 permanent; }
 | |
|            - location / {
 | |
|              try_files $uri $uri/ /index.html;
 | |
|              auth_basic            "Restricted";
 | |
|              auth_basic_user_file  auth_basic/demo;
 | |
|            }
 | |
|            - location /images/ { try_files $uri $uri/ /index.html; }
 | |
|       nginx_configs:
 | |
|         proxy:
 | |
|             - proxy_set_header X-Real-IP  $remote_addr
 | |
|             - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
 | |
|         upstream:
 | |
|             # Results in:
 | |
|             # upstream foo_backend {
 | |
|             #   server 127.0.0.1:8080 weight=10;
 | |
|             # }
 | |
|             - upstream foo_backend { server 127.0.0.1:8080 weight=10; }
 | |
|       nginx_auth_basic_files:
 | |
|         demo:
 | |
|            - foo:$apr1$mEJqnFmy$zioG2q1iDWvRxbHuNepIh0 # foo:demo , generated by : htpasswd -nb foo demo
 | |
|            - bar:$apr1$H2GihkSo$PwBeV8cVWFFQlnAJtvVCQ. # bar:demo , generated by : htpasswd -nb bar demo
 | |
| ```
 | |
| 
 | |
| ## 7) Install Nginx, add a site and use special yaml syntax to make the location blocks multiline for clarity
 | |
| 
 | |
| ```yaml
 | |
| ---
 | |
| - hosts: all
 | |
|   roles:
 | |
|     - role: nginx
 | |
|       nginx_http_params:
 | |
|         - sendfile on
 | |
|         - access_log /var/log/nginx/access.log
 | |
|       nginx_sites:
 | |
|         foo:
 | |
|            - listen 443 ssl
 | |
|            - server_name foo.example.com
 | |
|            - set $myhost foo.example.com
 | |
|            - |
 | |
|              location / {
 | |
|                proxy_set_header Host foo.example.com;
 | |
|              }             
 | |
|            - |
 | |
|              location ~ /v2/users/.+?/organizations {
 | |
|                if ($request_method = PUT) {
 | |
|                  set $myhost bar.example.com;
 | |
|                }
 | |
|                if ($request_method = DELETE) {
 | |
|                  set $myhost bar.example.com;
 | |
|                }
 | |
|                proxy_set_header Host $myhost;
 | |
|              }             
 | |
| ```
 | |
| ## 8) Example to use this role with my ssl-certs role to generate or copie ssl certificate ( https://galaxy.ansible.com/list#/roles/3115 )
 | |
| ```yaml
 | |
|  - hosts: all
 | |
|    roles:
 | |
|      - jdauphant.ssl-certs
 | |
|      - role: jdauphant.nginx
 | |
|        nginx_configs:
 | |
|           ssl:
 | |
|                - ssl_certificate_key {{ssl_certs_privkey_path}}
 | |
|                - ssl_certificate     {{ssl_certs_cert_path}}
 | |
|        nginx_sites:
 | |
|           default:
 | |
|                - listen 443 ssl
 | |
|                - server_name _
 | |
|                - root "/usr/share/nginx/html"
 | |
|                - index index.html
 | |
| ```
 | |
| ## 9) Site configuration using a custom template.
 | |
| Instead of defining a site config file using a list of attributes,
 | |
| you may use a hash/dictionary that includes the filename of an alternate template.
 | |
| Additional values are accessible within the template via the `item.value` variable.
 | |
| ```yaml
 | |
| - hosts: all
 | |
| 
 | |
|   roles:
 | |
|   - role: nginx
 | |
|     nginx_sites:
 | |
|       custom_bar:
 | |
|         template: custom_bar.conf.j2
 | |
|         server_name: custom_bar.example.com
 | |
| ```
 | |
| Custom template: custom_bar.conf.j2:
 | |
| ```handlebars
 | |
| # {{ ansible_managed }}
 | |
| upstream backend {
 | |
|   server 10.0.0.101;
 | |
| }
 | |
| server {
 | |
|   server_name {{ item.value.server_name }};
 | |
|   location / {
 | |
|     proxy_pass http://backend;
 | |
|   }
 | |
| }
 | |
| ```
 | |
| Using a custom template allows for unlimited flexibility in configuring the site config file.
 | |
| This example demonstrates the common practice of configuring a site server block
 | |
| in the same file as its complementary upstream block.
 | |
| If you use this option:
 | |
| * _The hash **must** include a `template:` value, or the configuration task will fail._
 | |
| * _This role cannot check tha validity of your custom template.
 | |
| If you use this method, the conf file formatting provided by this role is unavailable,
 | |
| and it is up to you to provide a template with valid content and formatting for NGINX._
 | |
| 
 | |
| ## 10) Install Nginx, add 2 sites, use snippets to configure access controls
 | |
| ```yaml
 | |
| ---
 | |
| - hosts: all
 | |
|   roles:
 | |
|     - role: nginx
 | |
|       nginx_http_params:
 | |
|         - sendfile on
 | |
|         - access_log /var/log/nginx/access.log
 | |
|       nginx_snippets:
 | |
|         accesslist_devel:
 | |
|           - allow 192.168.0.0/24
 | |
|           - deny all
 | |
|       nginx_sites:
 | |
|         foo:
 | |
|            - listen 8080
 | |
|            - server_name localhost
 | |
|            - root /tmp/site1
 | |
|            - include snippets/accesslist_devel.conf
 | |
|            - location / { try_files $uri $uri/ /index.html; }
 | |
|            - location /images/ { try_files $uri $uri/ /index.html; }
 | |
|         bar:
 | |
|            - listen 9090
 | |
|            - server_name ansible
 | |
|            - root /tmp/site2
 | |
|            - location / { try_files $uri $uri/ /index.html; }
 | |
|            - location /images/ { try_files $uri $uri/ /index.html; }
 | |
| ```
 | |
| 
 | |
| Dependencies
 | |
| ------------
 | |
| 
 | |
| None
 | |
| 
 | |
| License
 | |
| -------
 | |
| BSD
 | |
| 
 | |
| Author Information
 | |
| ------------------
 | |
| 
 | |
| - Original : Benno Joy
 | |
| - Modified by : DAUPHANT Julien
 |