Ansible-role-nginx-config: Beispiel für SSL-Terminierung mit Nginx-Reverse-Proxy

Erstellt am 24. Mai 2020  ·  13Kommentare  ·  Quelle: nginxinc/ansible-role-nginx-config

Bezieht sich Ihre Feature-Anfrage auf ein Problem?
So'ne Art. Ich möchte SSL mit nginx beenden und es gleichzeitig als Reverse-Proxy anwenden. Ich sehe kein Beispiel dafür in den Dokumenten, auch wenn ich denke, dass es ein ziemlich häufiges Szenario ist.

Beschreiben Sie die gewünschte Lösung
Nur eine Beispielkonfiguration zum Beenden von SSL mit Reverse-Proxy

Beschreiben Sie Alternativen, die Sie in Betracht gezogen haben
Ich habe überlegt, Nginx-Reverse-Proxy mit SSL-Terminierung ohne diese Rolle anzuwenden. Wie das manuelle Konfigurieren von nginx, wenn dies zu schwierig ist.

documentation

Hilfreichster Kommentar

Sie können die Beispiele nehmen und sie mit den dict-Objekten aus den Standardeinstellungen der Vorlagen erweitern: https://github.com/nginxinc/ansible-role-nginx/blob/master/defaults/main/template.yml

Etwas wie das:

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

Ich habe SSL-Chiffren, dhparam, proxy_set_header usw. weggelassen, da ich sie in der Hauptkonfiguration gesetzt habe, aber Sie können sie einfach aus den Beispielen oder Standardwerten übernehmen. Gleiches gilt für die Verwendung von Upstreams.

Alle 13 Kommentare

Sie können die Beispiele nehmen und sie mit den dict-Objekten aus den Standardeinstellungen der Vorlagen erweitern: https://github.com/nginxinc/ansible-role-nginx/blob/master/defaults/main/template.yml

Etwas wie das:

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

Ich habe SSL-Chiffren, dhparam, proxy_set_header usw. weggelassen, da ich sie in der Hauptkonfiguration gesetzt habe, aber Sie können sie einfach aus den Beispielen oder Standardwerten übernehmen. Gleiches gilt für die Verwendung von Upstreams.

@xTrekStorex hat vollkommen recht. Irgendwann hätte ich auch gerne Arbeitsbeispiele für die meisten Anwendungsfälle, die in Molecule-Playbooks behandelt werden, einschließlich SSL (mit selbstsignierten Zertifikaten), wenn möglich.

Ich versuche, diese Konfiguration unten ohne Glück zu generieren. Ich frage mich, ob es unterstützt wird.

Standort /app1/ {
Proxy_pass http://localhost :6000;
}
Standort /app2/ {
Proxy_pass http://localhost :5000;
}

Sollte auf jeden Fall funktionieren. Verwenden Sie die neueste Version oder Hauptversion? Wenn Sie auf main sind, überprüfen Sie https://github.com/nginxinc/ansible-role-nginx-config/blob/main/molecule/default/converge.yml#L153 -L290 – Sie werden sehen, dass es zwei Positionsblöcke mit proxy_pass gibt location und proxy_pass festlegen. (Nebenbemerkung: Vielleicht möchten Sie ein neues Problem erstellen, Ihre Frage bezieht sich nicht auf ssl , soweit ich das beurteilen kann.)

Ich kann auch keinen einfachen Reverse-Proxy konfigurieren. Im obigen Beispiel erkenne ich die nicht

reverse_proxy:

Sektion.

Wenn ich versuche, auf einem von mir definierten Server proxy_pass anstelle von root zu verwenden, bekomme ich

TemplateAssertionError: no test named 'boolean'

Ein funktionierendes Beispiel wäre wünschenswert.

Der Abschnitt reverse_proxy existiert nicht mehr. Es wurde in die proxy Wörterbücher umgestaltet, die Sie jetzt auf main (und 0.4.0 ) finden können. Haben Sie die Molekülbeispiele im vorherigen Kommentar überprüft? Außerdem ist proxy_pass in einem Serverkontext nicht erlaubt. Es muss sich immer in einem location https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass befinden.

Beispiel:

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

Das führt zu

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

Richtig. Versuchen Sie, auf die neueste Version von Jinja2 zu aktualisieren. Die Vorlagen erfordern Jinja2 2.11.x , um richtig zu funktionieren. Dies hängt höchstwahrscheinlich mit den Fehlern zusammen, die Sie auf https://github.com/nginxinc/ansible-role-nginx-config/issues/94 gefunden haben.

Danke schön. Existiert es als Paket für Ubuntu 20.04? Was ist sonst die empfohlene Update-Methode?

Jinja2 ist ein Python-Paket. Sie können versuchen, pip install -U Jinja2 . Hier können Sie mehr lesen https://jinja.palletsprojects.com/en/2.11.x/intro/#installation

Hallo,

Das gleiche Problem mit Python 2.7 und Ansible 2.9.6:
"TemplateAssertionError: no test named 'boolean'"

Auf Python 3.6 und Ansible 2.9.6 funktioniert alles einwandfrei.

Variablen:

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

Ergebnisse zu:

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

Versuchen Sie, Jinja2 zu aktualisieren. Sie verwenden nicht die neueste Version (v2.11).

@alessfg Danke!

Es gab keine rote Ausgabe, also habe ich nicht bemerkt, dass ich tatsächlich Probleme habe, Jinja2 lokal zu aktualisieren:

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.

In einer sauberen virtuellen Umgebung mit Python 2.7 und Jinja2 2.11.3 funktioniert alles einwandfrei:

(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
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen