Ansible-role-nginx-config: Ejemplo de terminación de SSL con proxy inverso nginx

Creado en 24 may. 2020  ·  13Comentarios  ·  Fuente: nginxinc/ansible-role-nginx-config

¿Tu solicitud de función está relacionada con un problema?
Mas o menos. Deseo terminar ssl con nginx y aplicarlo simultáneamente como proxy inverso. No veo un ejemplo de esto en los documentos, incluso creo que es un escenario bastante común.

Describa la solución que le gustaría
Solo una configuración de ejemplo sobre cómo terminar ssl con proxy inverso

Describa las alternativas que ha considerado
He considerado aplicar el proxy inverso nginx con terminación SSL sin este rol. Como simplemente configurar manualmente nginx, si es demasiado difícil con esto.

documentation

Comentario más útil

Puede tomar los ejemplos y expandirlos con los objetos dict tomados de los valores predeterminados de las plantillas: https://github.com/nginxinc/ansible-role-nginx/blob/master/defaults/main/template.yml

Algo como esto:

nginx_http_template_enable: true
nginx_http_template:
  jira_mydomain_net:
    conf_file_name: jira_mydomain_net.conf
    servers:
      first:
        listen:
          listen_public:
            ip: 0.0.0.0
            port: 443
            ssl: true
        server_name: jira.mydomain.net
        ssl:
          cert: /etc/ssl/certs/jira.mydomain.net.crt
          key: /etc/ssl/private/jira.mydomain.net.key
        access_log:
          - name: combined
            location: /var/log/nginx/jira.mydomain.net_access.log
        error_log:
          location: /var/log/nginx/jira.mydomain.net_error.log
          level: warn
        reverse_proxy:
          locations:
            default:
              location: /
              proxy_pass: http://jira01.local.mydomain.net:8080

Omití los cifrados SSL, dhparam, proxy_set_header, etc., ya que los configuré en la configuración principal, pero puede tomarlos de los ejemplos o valores predeterminados. Lo mismo para usar aguas arriba.

Todos 13 comentarios

Puede tomar los ejemplos y expandirlos con los objetos dict tomados de los valores predeterminados de las plantillas: https://github.com/nginxinc/ansible-role-nginx/blob/master/defaults/main/template.yml

Algo como esto:

nginx_http_template_enable: true
nginx_http_template:
  jira_mydomain_net:
    conf_file_name: jira_mydomain_net.conf
    servers:
      first:
        listen:
          listen_public:
            ip: 0.0.0.0
            port: 443
            ssl: true
        server_name: jira.mydomain.net
        ssl:
          cert: /etc/ssl/certs/jira.mydomain.net.crt
          key: /etc/ssl/private/jira.mydomain.net.key
        access_log:
          - name: combined
            location: /var/log/nginx/jira.mydomain.net_access.log
        error_log:
          location: /var/log/nginx/jira.mydomain.net_error.log
          level: warn
        reverse_proxy:
          locations:
            default:
              location: /
              proxy_pass: http://jira01.local.mydomain.net:8080

Omití los cifrados SSL, dhparam, proxy_set_header, etc., ya que los configuré en la configuración principal, pero puede tomarlos de los ejemplos o valores predeterminados. Lo mismo para usar aguas arriba.

@xTrekStorex tiene toda la razón. En algún momento también me gustaría tener ejemplos de trabajo para la mayoría de los casos de uso cubiertos en los libros de jugadas de Molecule, incluido SSL (usando certificados autofirmados) si es posible.

Estoy tratando de generar esta configuración a continuación sin suerte. Me pregunto si es compatible.

ubicación /aplicación1/ {
proxy_pass http://localhost :6000;
}
ubicación /aplicación2/ {
proxy_pass http://localhost :5000;
}

Definitivamente debería funcionar. ¿Está utilizando la última versión o principal? Si está en main, consulte https://github.com/nginxinc/ansible-role-nginx-config/blob/main/molecule/default/converge.yml#L153 -L290 -- verá que hay dos bloques de ubicación con proxy_pass . Puede eliminar todas las demás variables que se están probando y establecer los valores que mencionó para location y proxy_pass . (Nota al margen: es posible que desee crear un nuevo problema, su pregunta no está relacionada con ssl por lo que sé).

Tampoco puedo configurar un proxy inverso simple. En el ejemplo anterior no reconozco el

proxy_inverso:

sección.

Cuando trato de usar proxy_pass en lugar de root en un servidor que he definido, obtengo

TemplateAssertionError: no test named 'boolean'

Un ejemplo de trabajo sería apreciado.

La sección reverse_proxy ya no existe. Se refactorizó en los diccionarios proxy que ahora puede encontrar en main (y 0.4.0 ). ¿Revisaste los ejemplos de moléculas en el comentario anterior? Además, proxy_pass no está permitido dentro de un contexto de servidor. Siempre tiene que estar dentro de un location https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass.

Ejemplo:

nginx_config_http_template_enable: true
    nginx_config_http_template:
      - template_file     : http/default.conf.j2
        conf_file_name    : '{{ my_server_name }}.conf'
        conf_file_location: /etc/nginx/conf.d/
        servers:
          - listen:
              - port: 443
                ssl : true
                opts: []
            server_name: '{{ my_server_name }}'
            ssl:
              cert                 : '/etc/ssl/certs/{{ my_ssl_prefix }}.nginx.bundle.crt'
              key                  : '/etc/ssl/private/{{ my_ssl_prefix }}.key'
              protocols            : '{{ NGINX_PROTOCOLS }}'
              prefer_server_ciphers: true
              ciphers              : '{{ NGINX_CIPHERS   }}'
              stapling             : true
              stapling_verify      : true
            autoindex : false
            locations :
              - location: /
                root    : '{{ my_root_folder }}'
              - location: /backend
                proxy_pass: http://127.0.0.1:8080/
                proxy:
                  set_header:
                     - field: Host
                       value: $host
                     - field: X-Real-IP
                       value: $remote_addr
                     - field: X-Forwarded-For
                       value: $proxy_add_x_forwarded_for
                     - field: X-Forwarded-Proto
                       value: $scheme

Esto resulta en

failed: [testing-snap05.MYDOMAIN.TLD] (item={'template_file': 'http/default.conf.j2', 'conf_file_name': 'testing-snap05.staging.MYDOMAIN.TLD.conf', 'conf_file_location': '/etc/nginx/conf.d/', 'servers': [{'listen': [{'port': 443, 'ssl': True, 'opts': []}], 'server_name': 'testing-snap05.staging.MYDOMAIN.TLD', 'ssl': {'cert': '/etc/ssl/certs/star.staging.MYDOMAIN.TLD.nginx.bundle.crt', 'key': '/etc/ssl/private/star.staging.MYDOMAIN.TLD.key', 'protocols': 'TLSv1.3', 'prefer_server_ciphers': True, 'ciphers': 'HIGH:!aNULL:!MD5', 'stapling': True, 'stapling_verify': True}, 'autoindex': False, 'locations': [{'location': '/', 'root': '/usr/share/nginx/html'}, {'location': '/backend', 'proxy_pass': 'http://127.0.0.1:8080/', 'proxy': {'set_header': [{'field': 'Host', 'value': '$host'}, {'field': 'X-Real-IP', 'value': '$remote_addr'}, {'field': 'X-Forwarded-For', 'value': '$proxy_add_x_forwarded_for'}, {'field': 'X-Forwarded-Proto', 'value': '$scheme'}]}}]}]}) => {"ansible_loop_var": "item", "changed": false, "item": {"conf_file_location": "/etc/nginx/conf.d/", "conf_file_name": "testing-snap05.staging.MYDOMAIN.TLD.conf", "servers": [{"autoindex": false, "listen": [{"opts": [], "port": 443, "ssl": true}], "locations": [{"location": "/", "root": "/usr/share/nginx/html"}, {"location": "/backend", "proxy": {"set_header": [{"field": "Host", "value": "$host"}, {"field": "X-Real-IP", "value": "$remote_addr"}, {"field": "X-Forwarded-For", "value": "$proxy_add_x_forwarded_for"}, {"field": "X-Forwarded-Proto", "value": "$scheme"}]}, "proxy_pass": "http://127.0.0.1:8080/"}], "server_name": "testing-snap05.staging.MYDOMAIN.TLD", "ssl": {"cert": "/etc/ssl/certs/star.staging.MYDOMAIN.TLD.nginx.bundle.crt", "ciphers": "HIGH:!aNULL:!MD5", "key": "/etc/ssl/private/star.staging.MYDOMAIN.TLD.key", "prefer_server_ciphers": true, "protocols": "TLSv1.3", "stapling": true, "stapling_verify": true}}], "template_file": "http/default.conf.j2"}, "msg": "TemplateAssertionError: no test named 'boolean'"}

Correcto. Intente actualizar a la última versión de Jinja2. Las plantillas requieren Jinja2 2.11.x para funcionar correctamente. Lo más probable es que esto esté relacionado con los errores que encontró en https://github.com/nginxinc/ansible-role-nginx-config/issues/94.

Gracias. ¿Existe como paquete para Ubuntu 20.04? De lo contrario, ¿cuál es el método de actualización recomendado?

Jinja2 es un paquete de Python. Puedes intentar ejecutar pip install -U Jinja2 . Puede leer más aquí https://jinja.palletsprojects.com/en/2.11.x/intro/#installation

Hola,

Tener el mismo problema en python 2.7 y ansible 2.9.6:
"TemplateAssertionError: no test named 'boolean'"

En python 3.6 y ansible 2.9.6 todo funciona bien.

Variables:

nginx_config_http_template_enable: true
nginx_config_http_template:
  - template_file: http/default.conf.j2
    conf_file_name: 50_example.com.conf
    conf_file_location: /etc/nginx/conf.d/

    servers:
      - listen:
          - ip: 0.0.0.0
            port: 80

          - ip: 0.0.0.0
            port: 443
            ssl: true

        ssl:    
          cert: /etc/pki/tls/certs/example.com.crt
          key: /etc/pki/tls/private/example.com.key

        server_name: example.com
        error_page: /usr/share/nginx/html
        autoindex: false
        http_demo_conf: false

        access_log:
          - name: json
            location: /var/log/nginx/example.com-access.json.log
        error_log:
          level: warn
          location: /var/log/nginx/example.com-error.log

        locations:
          - location: /
            proxy_pass: http://127.0.0.1
            proxy:
              bind: false
              set_header:
                - field: Host
                  value: $host
                - field: X-Forwarded-For
                  value: $proxy_add_x_forwarded_for
                - field: X-Real-IP
                  value: $remote_addr
                - field: REMOTE_ADDR
                  value: $remote_addr

Resultados a:

+#
+# Ansible managed
+#
+
+
+
+
+server {
+    listen 0.0.0.0:80;
+    listen 0.0.0.0:443 ssl;
+    server_name example.com;
+    ssl_certificate /etc/pki/tls/certs/example.com.crt;
+    ssl_certificate_key /etc/pki/tls/private/example.com.key;
+    location / {
+        proxy_bind off;
+        proxy_set_header Host $host;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header REMOTE_ADDR $remote_addr;
+
+        proxy_pass http://127.0.0.1;
+
+    }
+    # redirect server error pages to the static page /50x.html
+    #
+    error_page   500 502 503 504  /50x.html;
+    location = /50x.html {
+        root   /usr/share/nginx/html;
+    }
+    access_log  /var/log/nginx/example.com-access.json.log  json;
+    error_log /var/log/nginx/example.com-error.log warn;
+}

Intenta actualizar Jinja2. No está utilizando la última versión (v2.11).

@alessfg ¡Gracias!

No hubo salida roja, por lo que no me di cuenta de que en realidad tengo problemas para actualizar Jinja2 localmente:

bash-3.2$ pip install -U Jinja2
Collecting Jinja2
  Using cached https://files.pythonhosted.org/packages/7e/c2/1eece8c95ddbc9b1aeb64f5783a9e07a286de42191b7204d67b7496ddf35/Jinja2-2.11.3-py2.py3-none-any.whl
Requirement not upgraded as not directly required: MarkupSafe>=0.23 in /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages (from Jinja2) (0.23)
Installing collected packages: Jinja2
  Found existing installation: Jinja2 2.10.1
    Uninstalling Jinja2-2.10.1:
      Successfully uninstalled Jinja2-2.10.1
  Rolling back uninstall of Jinja2

You are using pip version 10.0.0, however version 20.3.4 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

En un virtualenv limpio con Python 2.7 y Jinja2 2.11.3 todo funciona bien:

(py27) bash-3.2$ pip freeze 
ansible==2.9.6
cffi==1.14.5
cryptography==3.3.2
enum34==1.1.10
ipaddress==1.0.23
Jinja2==2.11.3
MarkupSafe==1.1.1
pycparser==2.20
PyYAML==5.4.1
six==1.15.0
¿Fue útil esta página
0 / 5 - 0 calificaciones