Ansible-role-nginx-config: مثال على إنهاء ssl مع الوكيل العكسي nginx

تم إنشاؤها على ٢٤ مايو ٢٠٢٠  ·  13تعليقات  ·  مصدر: nginxinc/ansible-role-nginx-config

هل طلب الميزة الخاص بك متعلق بمشكلة؟
نوعا من. أرغب في إنهاء ssl بـ nginx ، وتطبيقه في نفس الوقت كبديل عكسي. لا أرى مثالًا على ذلك في المستندات ، حتى أنني أعتقد أنه سيناريو شائع جدًا.

صِف الحل الذي تريده
مجرد مثال على التكوين حول كيفية إنهاء SSL باستخدام وكيل عكسي

صِف البدائل التي فكرت فيها
لقد فكرت في تطبيق nginx reverse proxy مع إنهاء ssl بدون هذا الدور. مثل ضبط nginx يدويًا ، إذا كان الأمر صعبًا جدًا مع هذا.

documentation

التعليق الأكثر فائدة

يمكنك أخذ الأمثلة وتوسيعها باستخدام كائنات ديكت المأخوذة من الإعدادات الافتراضية للقوالب: https://github.com/nginxinc/ansible-role-nginx/blob/master/defaults/main/template.yml

شيء من هذا القبيل:

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

لقد تركت أصفار ssl و dhparam و proxy_set_header وما إلى ذلك منذ أن قمت بتعيينها في التكوين الرئيسي ، ولكن يمكنك فقط أخذها من الأمثلة أو الإعدادات الافتراضية. نفس الشيء لاستخدام المنبع.

ال 13 كومينتر

يمكنك أخذ الأمثلة وتوسيعها باستخدام كائنات ديكت المأخوذة من الإعدادات الافتراضية للقوالب: https://github.com/nginxinc/ansible-role-nginx/blob/master/defaults/main/template.yml

شيء من هذا القبيل:

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

لقد تركت أصفار ssl و dhparam و proxy_set_header وما إلى ذلك منذ أن قمت بتعيينها في التكوين الرئيسي ، ولكن يمكنك فقط أخذها من الأمثلة أو الإعدادات الافتراضية. نفس الشيء لاستخدام المنبع.

xTrekStorex صحيح تمامًا. في مرحلة ما ، أرغب أيضًا في الحصول على أمثلة عملية لمعظم حالات الاستخدام المغطاة في كتيبات لعب Molecule ، بما في ذلك SSL (باستخدام الشهادات الموقعة ذاتيًا) إن أمكن.

أحاول إنشاء هذا التكوين أدناه بدون حظ. أتساءل عما إذا كان مدعومًا.

الموقع / التطبيق 1 / {
proxy_pass http: // localhost : 6000 ؛
}
الموقع / التطبيق 2 / {
proxy_pass http: // localhost : 5000 ؛
}

يجب أن تعمل بالتأكيد. هل تستخدم أحدث إصدار أم رئيسي؟ إذا كان على main ، فتحقق من https://github.com/nginxinc/ansible-role-nginx-config/blob/main/molecule/default/converge.yml#L153 -L290 - سترى أن هناك كتلتان للمواقع بـ proxy_pass . يمكنك حذف جميع المتغيرات الأخرى التي يتم اختبارها وتعيين القيم التي ذكرتها لـ location و proxy_pass . (ملاحظة جانبية: قد ترغب في إنشاء عدد جديد ، سؤالك ليس متعلقًا بـ ssl بقدر ما أستطيع أن أخبرك.)

أنا أيضًا غير قادر على تكوين وكيل عكسي بسيط. في المثال أعلاه لا أتعرف على

عكسي:

الجزء.

عندما أحاول استخدام proxy_pass بدلاً من الجذر على خادم قمت بتحديده

TemplateAssertionError: no test named 'boolean'

سيكون موضع تقدير مثال عملي.

لم يعد القسم reverse_proxy موجودًا. تمت إعادة تشكيله في قواميس proxy التي يمكنك العثور عليها الآن في main0.4.0 ). هل قمت بفحص أمثلة الجزيء في التعليق السابق؟ بالإضافة إلى ذلك ، proxy_pass غير مسموح به ضمن سياق الخادم. يجب أن يكون دائمًا داخل location https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass.

مثال:

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

وينتج عنه

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

حق. حاول التحديث إلى أحدث إصدار من Jinja2. تتطلب القوالب Jinja2 2.11.x لتعمل بشكل صحيح. يرتبط هذا على الأرجح بالأخطاء التي عثرت عليها على https://github.com/nginxinc/ansible-role-nginx-config/issues/94.

شكرا لك. هل هو موجود كحزمة لـ Ubuntu 20.04؟ وإلا ما هي طريقة التحديث الموصى بها؟

Jinja2 عبارة عن حزمة Python. يمكنك محاولة تشغيل pip install -U Jinja2 . يمكنك قراءة المزيد هنا https://jinja.palletsprojects.com/en/2.11.x/intro/#installation

مرحبا،

وجود نفس المشكلة في python 2.7 و ansible 2.9.6:
"TemplateAssertionError: no test named 'boolean'"

في python 3.6 و ansible 2.9.6 ، كل شيء يعمل بشكل جيد.

المتغيرات:

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

نتائج إلى:

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

حاول تحديث Jinja2. أنت لا تستخدم أحدث إصدار (v2.11).

alessfg شكرا!

لم يكن هناك إخراج أحمر ، لذلك لم ألاحظ أنني أواجه بالفعل مشكلات في تحديث Jinja2 محليًا:

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.

في بيئة افتراضية نظيفة مع Python 2.7 و Jinja2 2.11.3 ، كل شيء يعمل بشكل جيد:

(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
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات