0. Introducción
Para aumentar la eficiencia de Odoo se va a colocar un servidor web como Nginx para descargar el caché, comprimir y servir ficheros estáticos. Para ello se instalará Nginx y se configurará com "reverse proxy".
NOTA: Esto permite que Nginx pase las peticiones a varios servidores, repartiendo la carga y permitiendo escalar la infraestructura
1. Parar el servicio de apache2 en nuestro ubuntu
#1. Parar el servicio
sudo systemctl stop apache2
#2. Ver el estado del servicio
sudo systemctl status apache2
Vamos a un navegador y teclemaos http://localhost:80 y no tendria que aparecer nadfa
2. Conseguir los certificados
En este caso disponemos de un certificado en formato pkcs#12 (extension ".p12"). Parece ser que Nginx prefiere tener el certificado en ficheros, uno con extensión ".crt" y otro, la clave , con extensión ".key".
Para convertir de format pkcs#12 al último formato ejecutamos:
#1. Extract certificate in crt format
openssl pkcs12 -in ./MyCert.p12 -clcerts -nokeys -out wildcard2023Nginx.crt
#2. Extract key in rsa format
openssl pkcs12 -in ./MyCert.p12 -nocerts -nodes -out wildcard2023Nginx.rsa
En este caso, el nombre se debe a que es un certificado wildcard que valida cualquier ordenador con el dominio "poblacion.es", como por ejemplo "odoo.poblacion.es" . En el proceso anterior nos pide la contraseña, por tanto ya tenemos este par de certificado y clave:
- wildcard2023Nginx.crt y
- wildcard2023Nginx.rsa
3. Crear la estructura de carpetas
4. Guardar los certificados en la carpeta nginx/certs
5. Crear el fichero de configuración nginx/odoo-nginx.conf
Que tendrá este contenido. OJO los nombres del host se obtienen del partado aliases: que hay en el apartado network de cada servicio en el fichero docker-compose.yml.
Ojo: Se repite lo mismo tanto para el pueto 80 como el 443
server { listen 80; server_name nginx_host; # 2.1.3 nombre del servidor (Utilizamos VS Code y analizamos la red location / { proxy_pass http://odoo:8069; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location ~ /\.well-known/acme-challenge { allow all; root /var/www/certbot; default_type "text/plain"; try_files $uri =404; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }#--------------------------------------------------# REPETIMOS LOS MISMO PARA EL PUERTO https (443)#--------------------------------------------------server { # 2.1.1 puerto listen 443 ssl; # 2.1.2 certificados obtenidos en el punto 2 ssl_certificate /etc/nginx/certs/wildcard2023Nginx.crt; ssl_certificate_key /etc/nginx/certs/wildcard2023Nginx.rsa; # 2.1.3 nombre del servidor (Utilizamos VS Code y analizamos la red server_name nginx_host; # Obtenido del fichero docker-compose.yml apartado nginx.networks.odoo_network.aliases location / { proxy_pass http://odoo:8069; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location ~ /\.well-known/acme-challenge { allow all; root /var/www/certbot; default_type "text/plain"; try_files $uri =404; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
6. Crear el fichero docker-compose.yml en la carpeta del post anterior
Que tendrá este contenido y sustituirá al anterior docker-compose.yml y tendrá contenido único
version: '3'services:odoo:container_name: odoo16_boimage: odoo:16.0env_file: odoo16_pg13.env # environment filedepends_on:- postgresqlports:- "7069:8069" #port mapping(custom-port:8069)volumes:- ./odoo-data:/var/lib/odoo/:rw- ./odoo-conf:/etc/odoo/:rw- ./odoo-adds:/odoo/extra-addons/:rw #SAME AS odoo.conf addons_pathnetworks:- odoo_networkpostgresql:container_name: postgres_odoo_borestart: alwaysimage: postgres:13env_file: odoo16_pg13.env # environment fileports: - "127.0.0.1:9432:5432"volumes:- ./postgresql-data:/var/lib/postgresql/data/pgdata ##SAME AS odoo16_pg13.env PGDAT [4]networks:- odoo_networknginx:container_name: nginx_boimage: nginx:latestrestart: unless-stoppeddepends_on:- odooports:- "7080:80"- "7443:443"#1. Copiar la CARPETA de certificados a la carpeta ./nginx-certs#2. Copiar el FICHERO de configuración del proxy nginx.conf a la carpeta ./nginx-etc/nginx/conf.dvolumes:- ./nginx-certs:/etc/nginx/certs# - ./nginx-log:/var/log# - ./nginx-conf/odoo-nginx.conf:/etc/nginx/conf.d/odoo-nginx.conf- ./nginx-conf/odoo-nginx.conf:/etc/nginx/conf.d/default.confnetworks:- odoo_network# En este caso, tambien damos nombres a los volúmnes compartidosvolumes:odoo-data: {}odoo-conf: {}odoo-adds: {}postgresql-data: {}nginx-certs: {}networks: odoo_network: driver: bridge
Se definen los puertos a utilizar y los mapeos (volumenes docker) del servidor físico y el enlace al servidor virtual dockerizado.
7. ¿Como se pueden ver las direcciones IP?
En VS vamos al símbolo de docker - NETWORKS y en nuestra red apretamos el botón derecho del mouse y seleccionamos inspect
Y nos muestra un fichero de configuración json donde se puede ver las direcciones IP4
{
"Name": "prova04_odoo_network",
"Id": "79a4585b674d1e8d80a17073e91663206b8702a48c914800e022b152d2b9c013",
"Created": "2024-01-03T14:39:30.696893035+01:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.21.0.0/16",
"Gateway": "172.21.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"242451e0c89495d64305e186429508b79781aa939b714ebaceb9dbfdee2f38fd": {
"Name": "odoo16_02",
"EndpointID": "c47c3ff3e7d5e4269976963b47ecbb19ccd675ada631fd253344f37d6040c8ac",
"MacAddress": "02:42:ac:15:00:03",
"IPv4Address": "172.21.0.3/16",
"IPv6Address": ""
},
"5b727c3e15b40f7f5e6ae0f2a0b33f8e192a27757fd6e38dbd4cd74dcb3fd2ad": {
"Name": "postgres_odoo_02",
"EndpointID": "dda9bd062a5c735592d3d9f04786497bedf714528a0776d7dd38cc7192277c6a",
"MacAddress": "02:42:ac:15:00:02",
"IPv4Address": "172.21.0.2/16",
"IPv6Address": ""
},
"627344b0d41cc470d1c98a224ff02992d7bdd7ff38525acee4f2083c21ea9e73": {
"Name": "nginx_odoo_02",
"EndpointID": "ce2fad2cc3a0d12a89de56186cf82f742c099f02c3c4f7c2bed7dbadfc589c5f",
"MacAddress": "02:42:ac:15:00:04",
"IPv4Address": "172.21.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "odoo_network",
"com.docker.compose.project": "prova04",
"com.docker.compose.version": "1.29.2"
}
}
8. Ejecución
Ejecutamos "docker-compose" en la carpeta donde esta el "docker-compose.yml" (carpeta nginx)
docker-compose up
Y podemos utilizar en el navegador de la máquina local:
- https:/localhost:7443/ falla pues redirecciona a http://localhost/web
- https://localhost:7443/web redirecciona a https://localhost:7443/web/... y muestra la pantalla de aplicaciones
- http://localhost:7069/ redirecciona a http://localhost:7069/web/... y muestra la pantalla de aplicaciones
- http://localhost:7069/web redirecciona a http://localhost:7069/web/... y muestra la pantalla de aplicaciones
9. Parámetros nginx
1. X-Forwarded-Proto: valor siendo valor (http o https), se usa para definir el protocolo. Ejemplo de uso:
proxy_set_header X-Forwarded-Proto https;
2. X-Forwarded-For: <client>, <proxy1>, <proxy2> se utiliza para pasar la IP del cliente y si se quiere las Ips de los proxys por donde pasa, separadas por comas. Si se utiliza un proxy, en el ejemplo de abajo se pasa la dirección del proxy ($host)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
3. X-Real-IP <ip> Para indicar el nombre de dominio del servidor (para hosts virtuales) y el puerto. Ejemplo
proxy_set_header X-Real-IP $remote_addr;
4. Host: <host>:<port> Para indicar el nombre de dominio del servidor (para hosts virtuales) y el puerto. Ejemplo
proxy_set_header Host $host;
4. Upgrade: <host>:<port> Para indicar el nombre de dominio del servidor (para hosts virtuales) y el puerto. Ejemplo
10. Variables nginx
1. $host : Contiene en este orden de precedencia:
- nombre del host de la line de la request.
- nombre del host del campo "Host" de la cabecera de la request.
- nombre del servidor que coincide con una request.
2. $http_host: Contiene el valor del campo "Host" de una cabecera http de una request
3. $server_name: Nombre del servidor virtual que procesó la request. Si "server" contiene múltiples nombres, solo se considerará el primero.
4. $http_upgrade: Tiene el valor del Header "Upgrade" que se utiliza para poder utilizar web sockets que mantienen la conexión abierta mucho tiempo
No hay comentarios :
Publicar un comentario