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
 |