Odoo 是世界上最受欢迎的商业软件平台之一,它包含许多有用的模块,例如客户关系管理(CRM)、销售点、项目管理、库存管理、自动开票、会计和电子商务。
Odoo 自带一个内置的 Web 服务器,但在大多数情况下,建议在其前面放置一个反向代理,作为客户端与 Odoo 服务器之间的中介。
本指南提供有关如何使用 Nginx 作为 Odoo 的 SSL 终止和反向代理的说明。
先决条件
在继续本教程之前,请确保您已满足以下先决条件:
- 您已安装 Odoo。如果没有,请按照我们在 Ubuntu 上安装 Odoo 的指南进行操作。
- 您有一个指向您的 Odoo 安装的域名。在本文中,我们将使用
odoo.example.com。 - 您已安装 Nginx。如果没有,请查看 Nginx 安装指南。
- 您已为您的域名安装了 SSL 证书。您可以按照本指南安装免费的 Let’s Encrypt SSL 证书。
将 Nginx 配置为反向代理
使用反向代理可以为您带来许多好处,例如负载均衡、SSL 终止、缓存、压缩和提供静态内容。
以下是一个示例 Nginx 配置文件(服务器块),您可将其用于您的 Odoo 安装。它监听标准 HTTPS 端口,将所有 HTTP 请求重定向到 HTTPS,代理实时聊天 WebSocket 连接,为静态资源配置浏览器缓存标头,并启用 GZip 压缩。
打开您的文本编辑器并创建以下文件:
终端sudo nano /etc/nginx/sites-available/odoo.example.com/etc/nginx/sites-available/odoo.example.comnginx# Odoo servers
upstream odoo {
server 127.0.0.1:8069;
}
upstream odoochat {
server 127.0.0.1:8072;
}
# HTTP -> HTTPS redirect
server {
listen 80;
listen [::]:80;
server_name odoo.example.com;
return 301 https://odoo.example.com$request_uri;
}
# Main server block
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name odoo.example.com;
# SSL parameters
ssl_certificate /etc/letsencrypt/live/odoo.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/odoo.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/odoo.example.com/chain.pem;
# Log files
access_log /var/log/nginx/odoo.access.log;
error_log /var/log/nginx/odoo.error.log;
# Proxy timeouts
proxy_read_timeout 720s;
proxy_connect_timeout 720s;
proxy_send_timeout 720s;
# Proxy headers
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
# Websocket (live chat)
location /websocket {
proxy_pass http://odoochat;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# Handle / requests
location / {
proxy_redirect off;
proxy_pass http://odoo;
}
# Static file browser caching
location ~* /web/static/ {
proxy_buffering on;
expires 864000;
proxy_pass http://odoo;
}
# Gzip compression
gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
gzip on;
}信息将 odoo.example.com 替换为您自己的域名,并更新 SSL 证书路径以匹配您的安装。上述路径与 Let’s Encrypt 使用的默认位置一致。通过创建指向 sites-enabled 目录的符号链接来启用该站点:
sudo ln -s /etc/nginx/sites-available/odoo.example.com /etc/nginx/sites-enabled/测试配置是否存在语法错误:
终端sudo nginx -t如果没有错误,请重启 Nginx 服务以应用更改:
终端sudo systemctl restart nginx让 Odoo 使用代理
当 Odoo 在反向代理后面运行时,您需要启用代理模式,以便 Odoo 信任 Nginx 发送的 X-Forwarded-* 标头。如果不启用,Odoo 可能会构建错误的 URL 并通过纯 HTTP 重定向。
打开 Odoo 配置文件并添加以下行。如果您的安装使用带版本的配置文件名和服务名(例如 /etc/odoo19.conf 和 odoo19),请改用这些名称。
proxy_mode = True保存文件并重启 Odoo 服务:
终端sudo systemctl restart odoo更改绑定接口
此步骤是可选的,但这是一个良好的安全实践。
默认情况下,Odoo 服务器在所有接口上监听端口 8069。要禁用对您的 Odoo 实例的直接访问,请打开 Odoo 配置文件,并在文件末尾添加以下行,将 HTTP 接口绑定到 localhost:
http_interface = 127.0.0.1保存配置文件并重启 Odoo 服务器以使更改生效:
终端sudo systemctl restart odoo现在 Odoo 仅接受来自本机的连接,所有流量都必须经过 Nginx。
故障排除
如果重新加载 Nginx 后出现问题,原因通常是以下之一:
502 Bad Gateway
Nginx 无法访问 Odoo。确认 Odoo 服务正在运行并监听端口 8069。如果您将接口绑定到 127.0.0.1,请确保 Nginx 和 Odoo 运行在同一主机上。检查 /var/log/nginx/odoo.error.log 以获取确切的上游错误。
实时聊天或通知无法正常工作
实时聊天使用端口 8072 上的 WebSocket 连接。验证 /websocket location 是否存在并代理到 odoochat 上游,以及是否设置了 Upgrade 和 Connection 标头。在低于 16 的 Odoo 版本中,该端点的名称为 /longpolling 而不是 /websocket,因此请使用该 location 名称并将其代理到端口 8072。
重定向次数过多
重定向循环通常意味着 Odoo 不知道请求是通过 HTTPS 到达的。确保在 Odoo 配置中设置了 proxy_mode = True,并且 Nginx 转发了 X-Forwarded-Proto 标头。
样式缺失或资源损坏
如果页面加载时没有 CSS,请在禁用浏览器缓存的情况下重新加载页面,并确认 /web/static/ location 代理到 odoo 上游。