使用 nginx 重定向后,docker cockpit 出现错误

使用 nginx 重定向后,docker cockpit 出现错误

发行版:Arch Linux,服务应用程序:systemctl,(cockpit 是一个基于 Web 的系统管理和 docker 容器管理器)。

我最近在 VPS 上安装了 cockpit,在 IP:9090 上运行良好,后来我发现它以 http 形式为来自本地主机的连接提供服务,但当从远程连接时,它使用 https 和随机生成的 ssl,我想在 cockpit.domain.com 这样的子域上提供服务。所以我通过 nginx 使用代理虚拟块来实现,效果很好。

但是我登录后,它显示“服务器已关闭连接。”

如何配置驾驶舱以在代理上提供远程连接?

server {
       listen         80;
       server_name    www.cockpit.domain.com cockpit.domain.com;
       return         301 https://$server_name$request_uri;
}

server {
    listen 443;
    server_name www.cockpit.domain.com cockpit.domain.com;

        ssl on;
        ssl_certificate /path/to/certificate;
        ssl_certificate_key /path/to/key;

    location / {
        proxy_pass http://127.0.0.1:9090;
        include /etc/nginx/proxy_params;
    }
}

答案1

cockpit 使用 websocket 在服务器和客户端之间来回推送活动数据,比如内存、cpu、交换、存储使用情况,但是当代理位于中间时,必须进行配置。

要通过 NGINX 配置 Cockpit 代理,请创建一个服务器虚拟块,并向其中添加以下几行。此配置将提供一组特定的工作环境。请根据您的自定义需求更改配置。

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

upstream websocket {
    server 127.0.0.1:9090;
}

server {
    listen 80;
    server_name cockpit.domain.tld www.cockpit.domain.tld;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443;
    server_name www.cockpit.domain.tld cockpit.domain.tld;

    ssl on;
    ssl_certificate /path/to/certificate;
    ssl_certificate_key /path/to/key;

    location / {
        proxy_pass http://127.0.0.1:9090;
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        # needed for websocket
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        # change scheme of "Origin" to http
        proxy_set_header Origin http://$host;
    }

}

默认情况下,Cockpit 使用 http 协议连接到 localhost,由于我们的代理可能驻留在 localhost 上,因此我们会将所有 http 客户端请求重定向到 https 返回301 https://$server_name$request_uri

默认情况下,cockpit 会生成一个 ssl 证书,该证书存储在 /etc/cockpit/ws-certs.d/ 中。在我们的例子中,我们将使用 NGINX 来完成所有 TLS 加密工作。使用您自己的 ssl 服务器和客户端密钥编辑这些行。ssl_certificate /path/to/certificate; ssl_certificate_key /path/to/key; (您也可以使用存储在 /etc/ws-certs.d/ 中的证书)这将使我们能够通过此代理主机重定向到 Cockpit。

相关内容