【问题标题】:Apache Zeppelin behind Apache reverse proxyApache 反向代理背后的 Apache Zeppelin
【发布时间】:2017-01-23 19:36:45
【问题描述】:

我在 Apache 网络服务器后面运行我的 Apache Zeppelin 实例,其中网络服务器仅用作保留代理。

如果我正在浏览反向代理站点https://my-domain.com/zeppelin/,我将获得一个包含资产和按钮以及所有内容的网站,但 Zeppelin 的 websocket 将无法连接。 Browser-Dev-Tools 对 URL https://my-domain.com/zeppelin/ws405 HTTP method GET is not supported by this URL

如果我直接访问 Zeppelin 网站(例如 http://priv.my-domain.com/zeppelin),一切正常。所以看起来这不是 Zeppelin-Code 中的错误,而是反向代理配置中的问题。

我的 Apache 反向代理配置如下:

<VirtualHost *:443>
    ServerName my-domain.com
    # don't loose time with IP address lookups
    HostnameLookups Off
    ProxyRequests Off
    ProxyPreserveHost Off
    SSLEngine On
    SSLProxyEngine On
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    ...
    ssl cert stuff
    ...
    <Location /zeppelin/ws>

        ProxyPass ws://priv.my-domain.com:8080/zeppelin/ws
        ProxyPassReverse ws://priv.my-domain.com:8080/zeppelin/ws

        Order deny,allow
        Deny from all

        Allow from <my-ip>

    </Location>

    <Location /zeppelin/>

        ProxyPass http://priv.my-domain.com:8080/zeppelin/
        ProxyPassReverse http://priv.my-domain.com:8080/zeppelin/

        Order deny,allow
        Deny from all

        Allow from <my-ip>

    </Location>
    <Proxy *>
        AddDefaultCharset Off
        Order deny,allow
        Allow from all
    </Proxy>
</VirtualHost>

如果我从配置中删除第一个 ws-location 没有区别。 你有什么想法吗?

编辑解决方案:在下面的答案之后,我修改了我的 conf 文件,它现在可以工作了!非常感谢!

我的工作会议:

<VirtualHost *:443>
    ServerName my-domain.com
    # don't loose time with IP address lookups
    HostnameLookups Off
    ProxyRequests Off
    ProxyPreserveHost Off
    SSLEngine On
    SSLProxyEngine On
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    ...
    ssl cert stuff
    ...
    <Location /zeppelin/>

        ProxyPass http://priv.my-domain.com:8080/zeppelin/
        ProxyPassReverse http://priv.my-domain.com:8080/zeppelin/

        Order deny,allow
        Deny from all

        Allow from <my-ip>

    </Location>
    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} =WebSocket [NC,NV]
    RewriteRule ^/(.*) ws://priv.my-domain.com:8080/$1 [P]
    <Proxy *>
        AddDefaultCharset Off
        Order deny,allow
        Allow from all
    </Proxy>
</VirtualHost>

【问题讨论】:

    标签: apache websocket reverse-proxy apache-zeppelin


    【解决方案1】:

    这是我正在使用的配置文件,其中有一些不一定适用于您的需求:
    - mesos 集群前的服务发现
    - 每个用户一个实例并根据凭据路由用户

    <VirtualHost *:3128>
        <Location "/"> 
          AuthUserFile  /.............../users
          AuthName "xxxxxxxxxxxxx" 
          AuthGroupFile /dev/null 
          AuthType Basic 
          Require valid-user
        </Location> 
        ServerName xxxxxxxxxxxxxxxxxxxxxxxxxxx
        # SSLEngine on
        # SSLCertificateFile "/.............../xxxxx.crt"
        # SSLCertificateKeyFile "/.............../xxxxx.key"
    
      #RewriteRules for datalab with user
      RewriteCond %{HTTP:Upgrade} =WebSocket [NC,NV]
      RewriteCond %{LA-U:REMOTE_USER} (aaaa)
      RewriteRule ^/(.*) ws://azerty01:31321/$1 [P]
      RewriteCond %{LA-U:REMOTE_USER} (aaaa)
      RewriteRule ^/(.*) http://azerty01:31321/$1 [P,QSA,L]
      ProxyPassReverse / http://azerty01:31321
    
      #RewriteRules for datalab with user
      RewriteCond %{HTTP:Upgrade} =WebSocket [NC,NV]
      RewriteCond %{LA-U:REMOTE_USER} (bbbb)
      RewriteRule ^/(.*) ws://azerty02:31901/$1 [P]
      RewriteCond %{LA-U:REMOTE_USER} (bbbb)
      RewriteRule ^/(.*) http://azerty02:31901/$1 [P,QSA,L]
      ProxyPassReverse / http://azerty02:31901
    
    </VirtualHost>
    

    【讨论】:

    • 谢谢,现在可以使用了!有关没有用户身份验证的简化重写部分,请参阅我的编辑。
    【解决方案2】:

    这是我想反向代理时创建的包含文件 齐柏林服务器。如果愿意,您可以或多或少地将其剪切并粘贴到 vhosts conf 文件中。

    #
    # Apache Reverse Proxy settings for Zeppelin server.
    # note:
    #  Change ZEPPELING_IP_OR_HOST and ZEPPELIN_PORT as appropriate.
    #
    # FreeBSD put into /usr/local/etc/apache24/Includes directory,
    # Linux may vary.
    
    # This is for your-host.your-domain.com/zeppelin 
    # if you want zeppelin.your-host.your-domain.com
    # Put this into a vhosts file.
    
    RequestHeader set X_FORWARDED_PROTO 'https'
    ProxyPreserveHost On
    RequestHeader set X-Forwarded-Port "443"
    ProxyRequests     Off
    ProxyVia Off
    AllowEncodedSlashes NoDecode
    
    
    <Location /zeppelin/ws>
        ProxyPass  ws://ZEPPELIN_IP_OR_HOST:ZEPPELIN_PORT/zeppelin/ws 
        ProxyPassReverse ws://ZEPPELIN_IP_OR_HOST:ZEPPELIN_PORT/zeppenlin/ws
    </Location>
    
    ProxyPass        /zeppelin     http://ZEPPELIN_IP_OR_HOST:ZEPPELIN_PORT/zeppelin 
    ProxyPassReverse /zeppelin     http://ZEPPELIN_IP_OR_HOST:ZEPPELIN_PORT/zeppelin
    

    【讨论】:

      【解决方案3】:

      补充一点,我可以使用 Apache2 和下面的配置来重新路由到我的 zeppelin 实例。重要的部分是 websocket 连接。

      确保添加

      sudo a2enmod proxy_wstunnel
      

      到模组。然后我运行了以下内容:

      sudo a2dissite 000-default
      sudo nano /etc/apache2/sites-available/proxy-host.conf
          # Insert the following into the proxy-host.conf file
          <VirtualHost *:80>
            ServerName '<Zeppelin Public IP>:8080'
            RewriteEngine On
            RewriteCond %{HTTP:Upgrade} =websocket [NC]
            RewriteRule /(.*)           ws://<Zeppelin Public IP>:8080/$1 [P,L]
            RewriteCond %{HTTP:Upgrade} !=websocket [NC]
           RewriteRule /(.*)           http://<Zeppelin Public IP>:8080/$1 [P,L]
           ProxyPassReverse / http://<Zeppelin Public IP>:8080/
          </VirtualHost>
          # / text insert
      sudo a2ensite proxy-host
      sudo nano /etc/apache2/ports.conf
         #Add this to the ports.conf file and cntrl+X to save & exit  
         Listen 8080
      sudo /etc/init.d/apache2 restart
      

      然后,当您转到 http://reverseproxypublicIP/ 时,它会重新路由到您的 Zeppelin 实例。希望这对某人有帮助!

      【讨论】:

        【解决方案4】:

        我发现位置指令的顺序很重要。如果您先定义 zeppelin,然后定义 zeppelin/ws,如下所示,那么一切正常。但是,颠倒的顺序不起作用。

           <Location /zeppelin/>
                ProxyPass http://priv.my-domain.com:8080/zeppelin/
                ProxyPassReverse http://priv.my-domain.com:8080/zeppelin/
            </Location>
            <Location /zeppelin/ws>
                ProxyPass ws://priv.my-domain.com:8080/zeppelin/ws
                ProxyPassReverse ws://priv.my-domain.com:8080/zeppelin/ws
            </Location>
        

        【讨论】:

          猜你喜欢
          • 2017-07-09
          • 1970-01-01
          • 2022-01-22
          • 2017-08-09
          • 2019-06-13
          • 1970-01-01
          • 2018-01-16
          • 2016-09-22
          • 1970-01-01
          相关资源
          最近更新 更多