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