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),请改用这些名称。

/etc/odoo.confini
proxy_mode = True

保存文件并重启 Odoo 服务:

终端
sudo systemctl restart odoo

更改绑定接口

此步骤是可选的,但这是一个良好的安全实践。

默认情况下,Odoo 服务器在所有接口上监听端口 8069。要禁用对您的 Odoo 实例的直接访问,请打开 Odoo 配置文件,并在文件末尾添加以下行,将 HTTP 接口绑定到 localhost:

/etc/odoo.confini
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 上游。