0

我已将 Portainer UI 设置为 docker 容器,如果我将浏览器连接到端口 9000(如http://foo.bar.com:9000中),它会很好地工作。我可以毫无问题地浏览 UI 并打开容器控制台(使用 websockets)。

但是,我需要做的是连接 SSL(如https://foo.bar.com中)。

我在同一台机器上设置了一个 httpd 容器,并给了它以下配置文件:

<VirtualHost *:443>
  ServerName foo.bar.com

  ProxyPass / http://foo.bar.com:9000/
  ProxyPassReverse / http://foo.bar.com:9000/
  RequestHeader set X-Forwarded-Proto "https"

  <Location /api/websocket/>
    RewriteEngine on
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
    RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
    RewriteRule /api/websocket/(.*) ws://foo.bar.com:9000/api/websocket/$1 [P]
  </Location>
  
  ## SSL directives
  SSLEngine on
  SSLCertificateFile      "/usr/local/apache2/conf/server.crt"
  SSLCertificateKeyFile   "/usr/local/apache2/conf/server.key"

  ## Logging
  ServerSignature Off
  ErrorLog "logs/error_ssl.log"
  CustomLog "logs/access_ssl.log" common 

</VirtualHost>

httpd 和 portainer 都由单独的 docker-compose.yml 文件启动。

现在,Portainer 网页仍然可以正常显示,但容器的控制台无法正常工作。不知何故,我上面的 websocket 配置被破坏了。关于我可能做错了什么的任何想法?

4

1 回答 1

1

在玩了几个小时之后,我终于把它弄好了,想分享一下。首先,至少在 httpd 2.4 中,您需要显式加载 mod_proxy_wstunnel.so,因此请确保并放入 LoadModule。除非您这样做,否则将无法正常工作。

这是成功的httpd配置:

<VirtualHost *:443>
  ServerName foo.bar.com
  ProxyPreserveHost on
  ProxyPreserveHost On
  ProxyRequests Off

  # allow for upgrading to websockets
  RewriteEngine On
  RewriteCond %{HTTP:Upgrade} =websocket [NC]
  RewriteRule ^/?(.*) ws://foo.bar.com:9000/$1 [P,L]
  RewriteCond %{HTTP:Upgrade} !=websocket [NC]
  RewriteRule ^/(.*)           http://foo.bar.com:9000/$1 [P,L]

  ProxyPass "/" "http://foo.bar.com:9000/"
  ProxyPassReverse "/" "http://foo.bar.com:9000/"

  ## SSL directives
  SSLEngine on
  SSLCertificateFile "/usr/local/apache2/conf/server.crt"
  SSLCertificateKeyFile "/usr/local/apache2/conf/server.key"

  ## Logging
  ServerSignature Off
  ErrorLog "logs/error_ssl.log"
  CustomLog "logs/access_ssl.log" common 

</VirtualHost>
于 2020-09-29T20:02:00.563 回答