当前位置: 首页 > 面试题库 >

在Apache mod_proxy_wstunnel后面使用go-websocket

上官琦
2023-03-14
问题内容

注意:更新了配置,并在websocket路径中添加了斜杠。 还是同样的问题

是否可以在带有mod_proxy_wstunnel的Apache反向代理后面使用go-
websocket

我尝试并未能使事情正常进行。

我尝试在Apache反向代理(启用了mod_proxy_wstunnel)后面使用Chat示例。而且它不起作用。代理是成功的,而websocket部分根本不起作用。

我的Apache配置看起来与此类似:

<VirtualHost *:80>
    DocumentRoot /var/www/foobar
    ServerName foobar.com
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
    ProxyPass /ws/ ws://localhost:8080/ws/
    ProxyPassReverse /ws/ ws://localhost:8080/ws/
    ErrorLog logs/error_log-foobar
    CustomLog logs/access_log-foobar common
    LogLevel debug
</VirtualHost>

当然,我正在端口8080上运行聊天服务器。我已经使用SSH隧道对其进行了测试,并且一切正常。然后我转到了Apache。

我第一次尝试,javascript控制台抱怨如下:

NetworkError: 403 Forbidden - http://foobar.com/ws/

该请求似乎停留在原点检查中。然后我在注释掉原点检查后再次尝试,它得到以下结果:

NetworkError: 400 Bad Request - http://foobar.com/ws/

似乎聊天服务器根本没有收到升级请求。

我应该如何调试呢?我应该从哪里开始寻找?


问题答案:

我在CentOS 7上的Apache 2.4.18之后使用Go安全WebSocket(wss://)服务器。以下是设置:

确保系统具有mod_proxy_wstunnel:

#查找/ usr / lib64 / httpd / modules / | grep ws

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

在00-proxy.conf中添加以下行:

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

LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so

重新启动Apache:

#systemctl重新启动httpd

检查设置:

#httpd -M | grep -iE’代理’

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

编辑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.myhtml" target="_blank">domain.com-error_log"
    CustomLog "/var/log/httpd/go.mydomain.com-access_log" common
</VirtualHost>


 类似资料:
  • 问题内容: Go 的用途是什么?语言文档说它在周围的函数返回时执行。为什么不将代码放在给定函数的末尾? 问题答案: 我们通常用来关闭或释放资源。 周围的函数会在返回之前执行所有延迟的函数调用,即使它会慌乱。如果仅将函数调用放在周围函数的末尾,则在发生紧急情况时将跳过该调用。 而且,延迟函数调用可以通过调用内置函数来处理紧急情况。这不能通过函数结尾处的普通函数调用来完成。 每个延迟的调用都放在堆栈中

  • 问题内容: 我想使用Go模板以及VueJS进行数据绑定。有人整合过吗? 我希望主要将VueJS用于Ajax调用,因为手动(或使用jQuery)总是使我的代码混乱。 更具体地说,如果我有一个简单的标签,其值是从Go模板生成的,如下所示: 现在我想像这样绑定到值 : 两者都用于同一标签。 问题答案: 如果要将Vue.js与另一个模板系统混合,则可以选择使用其他方式更改插值定界符(默认情况下)。 现在,

  • 问题内容: 我正在尝试在Go项目中使用专有的DLL。 DLL的方法描述之一如下所示: 在我的测试Go项目中,我正在执行以下操作: 库被调用,出现错误消息“路径不存在”,但是我认为我的路径类型不正确。这就是为什么库看不到该文件夹​​的原因。 也许有更好的方法可以做到这一点?也许这是Go使用情况的坏案例,我应该找到一些软件包甚至语言? 问题答案: 您的路径可能需要NUL终止:

  • 面试时长整整一小时 手写代码题 goroutine交替打印1 - 100 以内的奇数偶数 ******************** (有一些修改,大致一样) 八股文 项目中使用go语言遇到过哪些问题 在go语言中 chan 有什么作用 select的作用(举了实际的例子具体的实现)(比如说满足第一个case 会进第二个case吗) context的作用(举了实际的例子具体的实现) 数组和切片的切片

  • 自身情况:半年经验,985本,公司裁员离开了,经过一个月左右的面试总算上岸了 由于工作经验的硬伤,最大的关卡在简历关。 还有就是社招的流程真的很快很快,想同时走十几家公司的流程根本不可能,因为面试过了基本会在一天内通知你,然后进入下一场面试,建议在有一定面试经验后,按照求职期望从高到低分批次投递,不然选offer时会很麻烦。。。 以下是面试问题的整理: 一,Go语言相关 1,Go里有哪些数据结构是

  • 自我介绍 Q:你现在在重庆,我们这边在北京,有问题吗? 答:没问题,开始扯谎说没课,巴拉巴拉 Q:我看你是信息安全的,你现在是完全不想做信息安全了吗 答:做开发的,巴拉巴拉 Q:有完整做一个项目吗,然后介绍技术栈 答:大概把业务和技术栈介绍了一下 Q:CI/CD 怎么做的? 答:就是用github action,然后编写yaml文件,运行工作流 Q:整个ELK这部分是自己搭建的吗? 答:就是我是d