Using go-websocket behind Apache mod_proxy_wstunnel

后端 未结 2 1517
醉梦人生
醉梦人生 2020-12-05 16:11

Note: Updated config and added trailing slash to websocket path. Still same problem

Is it possible to use go-websocket behind a Apache reverse proxy with mo

相关标签:
2条回答
  • 2020-12-05 16:36

    I am using Go secure WebSocket (wss://) server behind Apache 2.4.18 on CentOS 7. Here are the settings:

    Make sure the system has mod_proxy_wstunnel:

    # find /usr/lib64/httpd/modules/ | grep ws

    /usr/lib64/httpd/modules/mod_proxy_wstunnel.so
    

    Add the following line in 00-proxy.conf:

    # vim /etc/httpd/conf.modules.d/00-proxy.conf

    LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
    

    Restart Apache:

    # systemctl restart httpd

    Check the setting:

    # httpd -M | grep -iE 'proxy'

     proxy_module (shared)
     proxy_fcgi_module (shared)
     proxy_http_module (shared)
     proxy_wstunnel_module (shared)
    

    Edit httpd-vhosts.conf:

    # vim /etc/httpd/conf.d/httpd-vhosts.conf

    <VirtualHost *:443>
        ServerName go.mydomain.com:443
    
        ProxyPreserveHost On
        ProxyRequests off
    
        SSLProxyEngine On
        SSLCertificateFile "/etc/pki/tls/certs/mydomain.com/mydomain.crt"
        SSLCertificateKeyFile "/etc/pki/tls/certs/mydomain.com/mydomain.key"
    
        ### The configured ProxyPass and ProxyPassMatch rules are checked
        ### in the order of configuration. The first rule that matches wins.
        ProxyPassMatch ^/(ws(/.*)?)$ wss://192.168.0.1:443/$1
    
        ProxyPass / https://192.168.0.1:443/
        ProxyPassReverse / https://192.168.0.1:443/
    
        ErrorLog "/var/log/httpd/go.mydomain.com-error_log"
        CustomLog "/var/log/httpd/go.mydomain.com-access_log" common
    </VirtualHost>
    
    <VirtualHost *:80>
        ServerName go.mydomain.com:80
    
        ProxyPreserveHost On
        ProxyRequests off
    
        ###
        ProxyPassMatch ^/(ws(/.*)?)$ ws://192.168.0.1:80/$1
    
        ProxyPass / http://192.168.0.1:80/
        ProxyPassReverse / http://192.168.0.1:80/
    
        ErrorLog "/var/log/httpd/go.mydomain.com-error_log"
        CustomLog "/var/log/httpd/go.mydomain.com-access_log" common
    </VirtualHost>
    
    0 讨论(0)
  • 2020-12-05 16:51

    Thanks everyone! After taking several advices above, I found the solution.

    And for someone who might have similar issue, here is the solution to my question:

    1. As Aralo suggested, trailing slash must be added to the WebSocket path (in my case: "/ws/"). It looks Apache will only handle WebSocket with a valid GET request.

    2. James Henstridge was right. The order of ProxyPass relevant. ProxyPass of /ws/ must be put before the / line.

    3. After consulting the Chat example code, I found an origin check in the function ServeWs() and removed.

    Everything works now.

    And thanks covener, reading logs does help.

    0 讨论(0)
提交回复
热议问题