nginx 反代 cockpit
nginx 反代 cockpit

此为本人特定操作记录,适度参考

§先查看当前监听地址

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;
  }
}
作者
ragnaroks
发布时间
2022-04-15
更新时间
2023-04-01
创作协议