Ansible-role-nginx-config: Exemplo de terminação SSL com proxy reverso nginx

Criado em 24 mai. 2020  ·  13Comentários  ·  Fonte: nginxinc/ansible-role-nginx-config

Sua solicitação de recurso está relacionada a um problema?
Tipo de. Desejo encerrar o SSL com o nginx e aplicá-lo simultaneamente como proxy reverso. Não vejo um exemplo disso nos documentos, mesmo acho que é cenário bastante comum.

Descreva a solução desejada
Apenas uma configuração de exemplo sobre como encerrar o ssl com proxy reverso

Descreva as alternativas que você considerou
Eu considerei aplicar o proxy reverso nginx com terminação SSL sem essa função. Como configurar manualmente o nginx, se for muito difícil com isso.

documentation

Comentários muito úteis

Você pode pegar os exemplos e expandi-los com os objetos dict retirados dos padrões de modelos: https://github.com/nginxinc/ansible-role-nginx/blob/master/defaults/main/template.yml

Algo assim:

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

Deixei de fora as cifras ssl, dhparam, proxy_set_header etc desde que as configurei na configuração principal, mas você pode apenas pegá-las nos exemplos ou padrões. O mesmo para usar upstreams.

Todos 13 comentários

Você pode pegar os exemplos e expandi-los com os objetos dict retirados dos padrões de modelos: https://github.com/nginxinc/ansible-role-nginx/blob/master/defaults/main/template.yml

Algo assim:

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

Deixei de fora as cifras ssl, dhparam, proxy_set_header etc desde que as configurei na configuração principal, mas você pode apenas pegá-las nos exemplos ou padrões. O mesmo para usar upstreams.

@xTrekStorex está totalmente certo. Em algum momento, eu também gostaria de ter exemplos de trabalho para a maioria dos casos de uso cobertos nos playbooks da Molecule, incluindo SSL (usando certificados autoassinados), se possível.

Estou tentando gerar esta configuração abaixo sem sorte. Gostaria de saber se é suportado.

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

Deve definitivamente funcionar. Você está usando a versão mais recente ou principal? Se estiver no main, verifique https://github.com/nginxinc/ansible-role-nginx-config/blob/main/molecule/default/converge.yml#L153 -L290 -- você verá que há dois blocos de localização com proxy_pass . Você pode excluir todas as outras variáveis ​​que estão sendo testadas e definir os valores mencionados para location e proxy_pass . (Observação: talvez queira criar um novo problema, sua pergunta não está relacionada a ssl até onde eu sei.)

Também não consigo configurar um proxy reverso simples. No exemplo acima eu não reconheço o

proxy_reverso:

seção.

Quando tento usar proxy_pass em vez de root em um servidor que defini, recebo

TemplateAssertionError: no test named 'boolean'

Um exemplo de trabalho seria apreciado.

A seção reverse_proxy não existe mais. Ele foi refatorado nos dicionários proxy que agora você pode encontrar em main (e 0.4.0 ). Você verificou os exemplos de moléculas no comentário anterior? Além disso, proxy_pass não é permitido em um contexto de servidor. Sempre tem que estar dentro de um location https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass.

Exemplo:

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

Isto resulta em

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

Direito. Tente atualizar para a versão mais recente do Jinja2. Os modelos requerem Jinja2 2.11.x para funcionar corretamente. Isso provavelmente está relacionado aos erros que você estava encontrando em https://github.com/nginxinc/ansible-role-nginx-config/issues/94.

Obrigada. Existe como um pacote para o Ubuntu 20.04? Caso contrário, qual é o método de atualização recomendado?

Jinja2 é um pacote Python. Você pode tentar executar pip install -U Jinja2 . Você pode ler mais aqui https://jinja.palletsprojects.com/en/2.11.x/intro/#installation

Olá,

Tendo o mesmo problema em python 2.7 e ansible 2.9.6:
"TemplateAssertionError: no test named 'boolean'"

Em python 3.6 e ansible 2.9.6 tudo funciona bem.

Variáveis:

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 para:

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

Tente atualizar o Jinja2. Você não está usando a versão mais recente (v2.11).

@alesfg Obrigado!

Não havia saída vermelha, então não percebi que estou tendo problemas para atualizar o 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.

Em um virtualenv limpo com Python 2.7 e Jinja2 2.11.3 tudo funciona bem:

(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
Esta página foi útil?
0 / 5 - 0 avaliações