nginx

sbog/nginx

Статус сборки Ansible Роль Оценка качества Ansible Ansible Роль GitHub

Эта роль устанавливает и настраивает веб-сервер nginx. Пользователь может задать любые параметры конфигурации http, которые он хочет применить к своему сайту. Можно добавить любое количество сайтов с конфигурациями на ваш выбор.

Требования

Эта роль требует Ansible 2.4 или выше, а требования к платформе указаны в файле метаданных. (Некоторые старые версии роли поддерживают Ansible 1.4) Для FreeBSD требуется рабочая установка pkgng (см. https://www.freebsd.org/doc/handbook/pkgng-intro.html) Установка агента Nginx Amplify поддерживается только на дистрибутивах CentOS, RedHat, Amazon, Debian и Ubuntu.

Установка

ansible-galaxy install sorrowless.nginx

Переменные роли

Переменные, которые могут быть переданы этой роли и их краткое описание следующие. (Для всех переменных посмотрите defaults/main.yml)

# Пользователь для запуска nginx
nginx_user: "www-data"

# Список директив для секции событий.
nginx_events_params:
 - worker_connections 512
 - debug_connection 127.0.0.1
 - use epoll
 - multi_accept on

# Список хешей, которые определяют серверы для nginx,
# как и параметры http. Здесь можно задать любые допустимые параметры сервера.
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;
       }

# Список хешей, которые определяют дополнительную конфигурацию
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

# Список хешей, которые определяют фрагменты конфигурации
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

# Список хешей, которые определяют файлы пользователя/пароля
nginx_auth_basic_files:
   demo:
     - foo:$apr1$mEJqnFmy$zioG2q1iDWvRxbHuNepIh0 # foo:demo , сгенерировано: htpasswd -nb foo demo
     - bar:$apr1$H2GihkSo$PwBeV8cVWFFQlnAJtvVCQ. # bar:demo , сгенерировано: htpasswd -nb bar demo

# Включить Real IP для запросов CloudFlare
nginx_set_real_ip_from_cloudflare: True

# Включить Nginx Amplify
nginx_amplify: true
nginx_amplify_api_key: "ваш_ключ_api_здесь"
nginx_amplify_update_agent: true

# Определите модули для включения в конфигурацию
#
# Nginx, установленный через EPEL и APT репозитории, также автоматически установит некоторые модули.
# Для использования официального репозитория Nginx вам потребуется установить пакеты модулей вручную.
#
# При использовании с EPEL и APT репозиториями, укажите этот раздел в виде списка файлов конфигурации,
# без расширения .conf.

# При использовании официального репозитория Nginx, укажите этот раздел как список имен файлов модуля,
# без расширения .so.
#
# Доступные конфигурационные файлы модуля в EPEL и APT репозиториях:
# (APT на самом деле имеет несколько дополнительных, см. https://wiki.debian.org/Nginx/)
# - mod-http-geoip
# - mod-http-image-filter
# - mod-http-perl
# - mod-http-xslt-filter
# - mod-mail
# - mod-stream
#
# Доступные имена файлов модулей в официальном репозитории NGINX:
# - ngx_http_geoip_module
# - ngx_http_image_filter_module
# - ngx_http_perl_module
# - ngx_http_xslt_filter_module
# - ngx_http_js_module
#
# Пользовательские скомпилированные модули также допустимы, если .so файл находится в том же месте, что и упакованный модуль:
# - ngx_http_modsecurity_module
#
nginx_module_configs:
  - mod-http-geoip

Примеры

1) Установить nginx с выбранными директивами HTTP, но без сконфигурированных сайтов и дополнительной конфигурации:

- hosts: all
  roles:
  - {role: nginx,
     nginx_http_params: ["sendfile on", "access_log /var/log/nginx/access.log"]
                          }

2) Установить nginx с различными директивами HTTP, чем в предыдущем примере, но без

сайтов и дополнительной конфигурации.

- hosts: all
  roles:
  - {role: nginx,
     nginx_http_params: ["tcp_nodelay on", "error_log /var/log/nginx/error.log"]}

Примечание: Пожалуйста, убедитесь, что переданные директивы HTTP являются действительными, так как эта роль не проверяет их правильность. Смотрите документацию nginx для подробностей.

3) Установить nginx и добавить сайт в конфигурацию.

- 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) Установить nginx и добавить дополнительные переменные в стандартную конфигурацию

- hosts: all
  vars:
    - my_extra_params:
      - client_max_body_size 200M
# сохранить стандартные параметры и добавить дополнительный параметр `client_max_body_size`
  roles:
    - role: sorrowless.nginx
      nginx_http_params: "{{ nginx_http_default_params + my_extra_params }}"

Примечание: Каждый добавленный сайт представлен списком хешей, а сгенерированные конфигурации заполняются в /etc/nginx/site-available/ и ссылаются из /etc/nginx/site-enable/ на /etc/nginx/site-available.

Имя файла для конкретной конфигурации сайта указывается в хеше с ключом "file_name", любые допустимые директивы сервера могут быть добавлены в хеш. Дополнительные конфигурации создаются в /etc/nginx/conf.d/

5) Установить Nginx, добавить 2 сайта (другой метод) и добавить дополнительную конфигурацию

---
- 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) Установить Nginx, добавить 2 сайта, добавить дополнительную конфигурацию и блок конфигурации upstream

---
- 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:
            # В результате будет:
            # 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 , сгенерировано: htpasswd -nb foo demo
           - bar:$apr1$H2GihkSo$PwBeV8cVWFFQlnAJtvVCQ. # bar:demo , сгенерировано: htpasswd -nb bar demo

7) Установить Nginx, добавить сайт и использовать специальный синтаксис yaml для упрощения многострочных блоков location

---
- 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) Пример использования этой роли с моей ролью ssl-certs для генерации или копирования ssl сертификата (https://galaxy.ansible.com/sorrowless/ssl-certs)

 - hosts: all
   roles:
     - jdauphant.ssl-certs
     - role: sorrowless.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) Конфигурация сайта с использованием пользовательского шаблона.

Вместо определения конфигурационного файла сайта с помощью списка атрибутов, вы можете использовать хеш/словарь, который включает имя файла альтернативного шаблона. Дополнительные значения доступны в шаблоне через переменную item.value.

- hosts: all

  roles:
  - role: nginx
    nginx_sites:
      custom_bar:
        template: custom_bar.conf.j2
        server_name: custom_bar.example.com

Пользовательский шаблон: custom_bar.conf.j2:

# {{ ansible_managed }}
upstream backend {
  server 10.0.0.101;
}
server {
  server_name {{ item.value.server_name }};
  location / {
    proxy_pass http://backend;
  }
}

Использование пользовательского шаблона позволяет неограниченную гибкость в настройке конфигурационного файла сайта. Этот пример демонстрирует общую практику конфигурации блока сервера сайта в том же файле, что и его сопутствующий блок upstream. Если вы используете этот вариант:

  • Хеш должен включать значение template:, в противном случае задача конфигурации не выполнится.
  • Эта роль не может проверить правильность вашего пользовательского шаблона. Если вы используете этот метод, форматирование конфигурационного файла, предоставленное этой ролью, недоступно, и вам необходимо предоставить шаблон с допустимым содержанием и форматированием для NGINX.

10) Установить Nginx, добавить 2 сайта и использовать фрагменты для настройки контроля доступа

---
- 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; }

Зависимости

Нет

Лицензия

BSD

Информация об авторе

  • Оригинал : Benno Joy
  • Модифицировано : DAUPHANT Julien
  • Переработано : Stan Bogatkin
О проекте

Ansible role to install Nginx.

Установить
ansible-galaxy install sorrowless/ansible_nginx
Лицензия
bsd-2-clause
Загрузки
9071
Владелец
Barocco-style deployment engineer