Ansible-role-nginx-config: Exemple de terminaison ssl avec proxy inverse nginx

Créé le 24 mai 2020  ·  13Commentaires  ·  Source: nginxinc/ansible-role-nginx-config

Votre demande de fonctionnalité est-elle liée à un problème ?
Type de. Je souhaite mettre fin à ssl avec nginx et l'appliquer simultanément en tant que proxy inverse. Je ne vois pas d'exemple de cela dans la documentation, même si je pense que c'est un scénario assez courant.

Décrivez la solution que vous souhaitez
Juste un exemple de configuration sur la façon de mettre fin à SSL avec un proxy inverse

Décrivez les alternatives que vous avez envisagées
J'ai envisagé d'appliquer le proxy inverse nginx avec terminaison ssl sans ce rôle. Comme simplement configurer manuellement nginx, si c'est trop difficile avec ça.

documentation

Commentaire le plus utile

Vous pouvez prendre les exemples et les développer avec les objets dict tirés des valeurs par défaut des modèles : https://github.com/nginxinc/ansible-role-nginx/blob/master/defaults/main/template.yml

Quelque chose comme ça:

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

J'ai laissé de côté les chiffrements ssl, dhparam, proxy_set_header, etc. puisque je les ai définis dans la configuration principale, mais vous pouvez simplement les prendre à partir des exemples ou des valeurs par défaut. Idem pour l'utilisation des amonts.

Tous les 13 commentaires

Vous pouvez prendre les exemples et les développer avec les objets dict tirés des valeurs par défaut des modèles : https://github.com/nginxinc/ansible-role-nginx/blob/master/defaults/main/template.yml

Quelque chose comme ça:

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

J'ai laissé de côté les chiffrements ssl, dhparam, proxy_set_header, etc. puisque je les ai définis dans la configuration principale, mais vous pouvez simplement les prendre à partir des exemples ou des valeurs par défaut. Idem pour l'utilisation des amonts.

@xTrekStorex a tout à fait raison. À un moment donné, j'aimerais également avoir des exemples de travail pour la plupart des cas d'utilisation couverts dans les playbooks Molecule, y compris SSL (en utilisant des certificats auto-signés) si possible.

J'essaie de générer cette configuration ci-dessous sans succès. Je me demande si c'est supporté.

emplacement /app1/ {
proxy_pass http://localhost :6000;
}
emplacement /app2/ {
proxy_pass http://localhost :5000;
}

Devrait certainement fonctionner. Utilisez-vous la dernière version ou principale ? Si sur main, vérifiez https://github.com/nginxinc/ansible-role-nginx-config/blob/main/molecule/default/converge.yml#L153 -L290 - vous verrez qu'il y a deux blocs d'emplacement avec proxy_pass . Vous pouvez supprimer toutes les autres variables en cours de test et définir les valeurs que vous avez mentionnées pour location et proxy_pass . (Remarque : vous voudrez peut-être créer un nouveau problème, votre question n'est pas liée à ssl pour autant que je sache.)

Je suis également incapable de configurer un proxy inverse simple. Dans l'exemple ci-dessus, je ne reconnais pas le

reverse_proxy :

section.

Lorsque j'essaie d'utiliser proxy_pass au lieu de root sur un serveur que j'ai défini, j'obtiens

TemplateAssertionError: no test named 'boolean'

Un exemple de travail serait apprécié.

La section reverse_proxy n'existe plus. Il a été refactorisé dans les dictionnaires proxy que vous pouvez maintenant trouver sur main (et 0.4.0 ). Avez-vous vérifié les exemples de molécules dans le commentaire précédent ? De plus, proxy_pass n'est pas autorisé dans un contexte de serveur. Il doit toujours être dans un location https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass.

Exemple:

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

Cela se traduit par

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'"}

À droite. Essayez de mettre à jour vers la dernière version de Jinja2. Les modèles nécessitent Jinja2 2.11.x pour fonctionner correctement. Ceci est probablement lié aux erreurs que vous avez trouvées sur https://github.com/nginxinc/ansible-role-nginx-config/issues/94.

Merci. Existe-t-il en tant que package pour Ubuntu 20.04 ? Sinon, quelle est la méthode de mise à jour recommandée ?

Jinja2 est un package Python. Vous pouvez essayer d'exécuter pip install -U Jinja2 . Vous pouvez en savoir plus ici https://jinja.palletsprojects.com/en/2.11.x/intro/#installation

Bonjour,

Ayant le même problème sur python 2.7 et ansible 2.9.6 :
"TemplateAssertionError: no test named 'boolean'"

Sur python 3.6 et ansible 2.9.6, tout fonctionne bien.

Variable :

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

Résultats à :

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

Essayez de mettre à jour Jinja2. Vous n'utilisez pas la dernière version (v2.11).

@alessfg Merci !

Il n'y avait pas de sortie rouge, donc je n'ai pas remarqué que j'avais des problèmes pour mettre à jour Jinja2 localement :

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.

Dans un environnement virtuel propre avec Python 2.7 et Jinja2 2.11.3, tout fonctionne correctement :

(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
Cette page vous a été utile?
0 / 5 - 0 notes