发行版: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。