
此为本人特定操作记录,适度参考
§先查看当前监听地址
plainroot@vm1:~# ss -tlp | grep cockpit
LISTEN 0 4096 *:9090 0.0.0.0:* users:(("cockpit-tls",pid=173610,fd=3),("systemd",pid=1,fd=48))
LISTEN 0 64 127.0.0.1:37147 0.0.0.0:* users:(("cockpit-bridge",pid=173632,fd=9))
§修改配置文件
可参考官方配置文件说明。
编辑 /etc/cockpit/cockpit.conf 文件,写入如下配置项。
ini[WebService]
# 允许的来源,以空格分隔
Origins = http://127.0.0.1:9090 https://server-id.my-domain.com
# 协议
ProtocolHeader = X-Forwarded-Proto
# 实际来源,如果不正确配置此项,反代后出现多次错误登入会屏蔽反代本身导致无法使用
ForwardedForHeader = X-Forwarded-For
# 取消"登入到"
LoginTo = false
# 允许不安全的访问(HTTP)
AllowUnencrypted = true
修改完成后先执行 systemctl restart cockpit.socket
重启 cockpit 试试能否继续使用 127.0.0.1 登入,成功了再进行下一步,否则进行错误检查。
§修改单元配置文件
可参考官方单元说明。
编辑或创建 /etc/systemd/system/cockpit.socket.d/listen.conf 文件,写入如下配置项。
ini[Socket]
# 使用一个空地址来取消默认的 *:9090 监听
ListenStream =
# 再指派一个监听
ListenStream = 127.0.0.1:9090
# 允许使用任意接口(IP)
FreeBind = yes
修改完成后执行 systemctl daemon-reload
重载单元,再执行 systemctl restart cockpit.socket
重启 cockpit,不出意外已经无法使用之前的地址进入。
plainroot@vm1:~# ss -tlp | grep cockpit
LISTEN 0 4096 127.0.0.1:9090 0.0.0.0:* users:(("cockpit-tls",pid=173610,fd=3),("systemd",pid=1,fd=48))
LISTEN 0 64 127.0.0.1:37147 0.0.0.0:* users:(("cockpit-bridge",pid=173632,fd=9))
(可选)如果 http 服务端是容器承载的,并且 cockpit 监听在容器网桥上,需要让容器网桥在 cockpit 之前就已经存在,否则 cockpit 会绑定套接字失败。docker 容器环境样例为编辑 /etc/systemd/system/cockpit.socket.d/after.conf 文件,写入如下配置项。
ini[Unit]
After = docker.socket
修改完成后执行 systemctl daemon-reload
重载单元,再执行 systemctl restart cockpit.socket
重启 cockpit。
§创建 nginx 配置文件
这里是用 docker 下的 openresty,并挂载配置文件夹到数据卷 /var/lib/docker/volumes/openresty-site/_data/。
编辑 /var/lib/docker/volumes/openresty-site/_data/cockpit.mydomain.com.conf 文件,写入如下配置项(不要照抄此配置)。
nginxupstream upstream-cockpit {
# 这里的 127.0.0.1 自行替换为容器网桥地址
server 127.0.0.1:9090;
keepalive 3;
}
server {
listen 80;
listen 443 ssl http2;
server_name cockpit.mydomain.com;
gzip on;
access_log off;
error_log off;
ssl_certificate /certificate/default.crt;
ssl_certificate_key /certificate/default.key;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_cache shared:SSL:5m;
ssl_session_timeout 5m;
# 这里是 acme 证书管理拓展,自行移除
ssl_certificate_by_lua_block {
require("resty.acme.autossl").ssl_certificate()
}
# 这里是 acme 证书管理拓展,自行移除
location /.well-known {
content_by_lua_block {
require("resty.acme.autossl").serve_http_challenge()
}
}
# http => https
if ($scheme = http) {
return 307 https://$host$request_uri;
}
# websocket
location /cockpit/socket {
proxy_http_version 1.1;
proxy_pass http://upstream-cockpit/cockpit/socket;
proxy_set_header Host cockpit.mydomain.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Connection 'upgrade';
proxy_set_header Upgrade $http_upgrade;
more_clear_headers Strict-Transport-Security;
}
# 网页文件
location / {
proxy_http_version 1.1;
proxy_pass http://upstream-cockpit;
proxy_set_header Host cockpit.mydomain.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Connection '';
more_clear_headers Strict-Transport-Security;
}
}