You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Nginx配置Odoo为HTTPS模式?配置后仍走HTTP的问题咨询

解决Odoo通过Nginx配置HTTPS无效的问题,以及域名必要性说明

首先直接给你答案:是的,配置Nginx的HTTPS站点前,你需要设置域名(或者至少有一个能匹配的主机标识),这也是你当前配置失效的核心原因之一,下面一步步帮你排查和解决:

为什么域名是必须的?

  1. SSL证书(哪怕是自签的)在生成时会绑定一个「Common Name(CN)」,浏览器会校验你访问的地址和证书里的CN是否一致,如果不匹配会直接拦截,甚至不会加载页面。
  2. Nginx的server_name指令是用来匹配请求的主机头的,如果你的请求没有携带正确的主机头(比如直接用IP访问),Nginx会使用默认的服务器配置块,而不是你写的这个HTTPS配置块,导致请求直接落到Odoo的HTTP端口(8069)上。

具体修正步骤

1. 先搞定域名(临时测试用hosts也行)

如果你还没有正式的公网域名,可以先通过本地hosts文件做临时测试:

  • 在你的本地电脑(Windows是C:\Windows\System32\drivers\etc\hosts,Linux/macOS是/etc/hosts)添加一行:
    你的服务器IP  odoo.example.com
    
  • 服务器本身也可以修改/etc/hosts添加同样的记录,方便本地测试。

2. 重新生成匹配的自签证书

你之前生成的证书的CN可能和server_name不匹配,重新生成一次:

# 先进入证书目录(如果之前没创建ssl目录,先执行sudo mkdir /etc/nginx/ssl)
cd /etc/nginx/ssl
sudo openssl genrsa -des3 -passout pass:odoo -out server.temp.key 2048
sudo openssl req -new -passin pass:odoo -key server.temp.key -out server.csr
# 这里注意!Common Name(CN)一定要填你用的域名,比如 odoo.example.com
sudo openssl rsa -in server.temp.key -out server.key
sudo rm server.temp.key
sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

3. 修正Nginx配置的细节

调整你的HTTPS配置块,同时添加HTTP转HTTPS的重定向:

upstream odoo {
    server localhost:8069 weight=1 fail_timeout=3000s;
}

# 新增HTTP转HTTPS的重定向块
server {
    listen 80;
    listen [::]:80;
    server_name odoo.example.com;
    return 301 https://$host$request_uri;
}

server {
    # 改用更规范的ssl写法,替代原来的ssl on;
    listen 443 ssl;
    listen [::]:443 ipv6only=on ssl;
    server_name odoo.example.com;

    ssl_ciphers ALL:!ADH:!MD5:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;

    client_max_body_size 200m;
    keepalive_timeout 60;
    proxy_buffers 16 64k;
    proxy_buffer_size 128k;

    location / {
        proxy_pass http://odoo;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_connect_timeout 3600;
        proxy_send_timeout 3600;
        proxy_read_timeout 3600;
        send_timeout 3600;
        proxy_redirect off;
    }

    location ~* /[0-9a-zA-Z_]*/static/ {
        proxy_cache_valid 200 60m;
        proxy_buffering on;
        expires 864000;
        proxy_pass http://odoo;
    }

    access_log /var/log/nginx/odoo-ssl.access.log;
    error_log /var/log/nginx/odoo-ssl.error.log;
}

4. 确认Odoo的代理模式配置

打开Odoo的配置文件(通常是/etc/odoo/odoo.conf),确保添加了:

proxy_mode = True

然后重启Odoo服务:

sudo systemctl restart odoo

5. 验证配置并重启Nginx

# 先检查Nginx配置是否有语法错误
sudo nginx -t
# 没问题的话重启Nginx
sudo systemctl restart nginx

现在你在浏览器访问https://odoo.example.com,浏览器会提示自签证书不安全(这是正常的,因为是自己生成的证书),选择信任后就能看到HTTPS模式的Odoo站点了。

内容的提问来源于stack exchange,提问作者Kiran

火山引擎 最新活动