¿Tu solicitud de función está relacionada con un problema?
Mas o menos. Deseo terminar ssl con nginx y aplicarlo simultáneamente como proxy inverso. No veo un ejemplo de esto en los documentos, incluso creo que es un escenario bastante común.
Describa la solución que le gustaría
Solo una configuración de ejemplo sobre cómo terminar ssl con proxy inverso
Describa las alternativas que ha considerado
He considerado aplicar el proxy inverso nginx con terminación SSL sin este rol. Como simplemente configurar manualmente nginx, si es demasiado difícil con esto.
Puede tomar los ejemplos y expandirlos con los objetos dict tomados de los valores predeterminados de las plantillas: https://github.com/nginxinc/ansible-role-nginx/blob/master/defaults/main/template.yml
Algo como esto:
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
Omití los cifrados SSL, dhparam, proxy_set_header, etc., ya que los configuré en la configuración principal, pero puede tomarlos de los ejemplos o valores predeterminados. Lo mismo para usar aguas arriba.
@xTrekStorex tiene toda la razón. En algún momento también me gustaría tener ejemplos de trabajo para la mayoría de los casos de uso cubiertos en los libros de jugadas de Molecule, incluido SSL (usando certificados autofirmados) si es posible.
Estoy tratando de generar esta configuración a continuación sin suerte. Me pregunto si es compatible.
ubicación /aplicación1/ {
proxy_pass http://localhost :6000;
}
ubicación /aplicación2/ {
proxy_pass http://localhost :5000;
}
Definitivamente debería funcionar. ¿Está utilizando la última versión o principal? Si está en main, consulte https://github.com/nginxinc/ansible-role-nginx-config/blob/main/molecule/default/converge.yml#L153 -L290 -- verá que hay dos bloques de ubicación con proxy_pass
. Puede eliminar todas las demás variables que se están probando y establecer los valores que mencionó para location
y proxy_pass
. (Nota al margen: es posible que desee crear un nuevo problema, su pregunta no está relacionada con ssl
por lo que sé).
Tampoco puedo configurar un proxy inverso simple. En el ejemplo anterior no reconozco el
proxy_inverso:
sección.
Cuando trato de usar proxy_pass en lugar de root en un servidor que he definido, obtengo
TemplateAssertionError: no test named 'boolean'
Un ejemplo de trabajo sería apreciado.
La sección reverse_proxy
ya no existe. Se refactorizó en los diccionarios proxy
que ahora puede encontrar en main
(y 0.4.0
). ¿Revisaste los ejemplos de moléculas en el comentario anterior? Además, proxy_pass
no está permitido dentro de un contexto de servidor. Siempre tiene que estar dentro de un location
https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass.
Ejemplo:
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
Esto resulta en
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'"}
Correcto. Intente actualizar a la última versión de Jinja2. Las plantillas requieren Jinja2 2.11.x
para funcionar correctamente. Lo más probable es que esto esté relacionado con los errores que encontró en https://github.com/nginxinc/ansible-role-nginx-config/issues/94.
Gracias. ¿Existe como paquete para Ubuntu 20.04? De lo contrario, ¿cuál es el método de actualización recomendado?
Jinja2 es un paquete de Python. Puedes intentar ejecutar pip install -U Jinja2
. Puede leer más aquí https://jinja.palletsprojects.com/en/2.11.x/intro/#installation
Hola,
Tener el mismo problema en python 2.7 y ansible 2.9.6:
"TemplateAssertionError: no test named 'boolean'"
En python 3.6 y ansible 2.9.6 todo funciona bien.
Variables:
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 a:
+#
+# 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;
+}
Intenta actualizar Jinja2. No está utilizando la última versión (v2.11).
@alessfg ¡Gracias!
No hubo salida roja, por lo que no me di cuenta de que en realidad tengo problemas para actualizar 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.
En un virtualenv limpio con Python 2.7 y Jinja2 2.11.3 todo funciona bien:
(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
Comentario más útil
Puede tomar los ejemplos y expandirlos con los objetos dict tomados de los valores predeterminados de las plantillas: https://github.com/nginxinc/ansible-role-nginx/blob/master/defaults/main/template.yml
Algo como esto:
Omití los cifrados SSL, dhparam, proxy_set_header, etc., ya que los configuré en la configuración principal, pero puede tomarlos de los ejemplos o valores predeterminados. Lo mismo para usar aguas arriba.