简体   繁体   English

尝试使用代理在Apache上运行Faye websocket

[英]Trying to run Faye websocket on Apache using a proxy

I'm trying to use Faye gem on thin server with Rails in a production environment but I cannot make it work. 我正在尝试在生产环境中使用Rails的瘦服务器上使用Faye gem,但我无法使其工作。 I'm using apache 2.4 and ws_tunnel also proxy modules are enabled. 我正在使用apache 2.4和ws_tunnel也启用了代理模块。 My setup is like below. 我的设置如下。

Apache configuration Apache配置

<VirtualHost *:443>
    ServerName mysite.example.com
    ServerAlias mysite.example.com
    DocumentRoot /var/www/html/mysite/current/public

    SSLEngine on
    SSLCertificateFile "/etc/httpd/conf/keys/ServerCertificate.cer"
    SSLCertificateKeyFile "/etc/httpd/conf/keys/example.com.key"
    SSLCertificateChainFile "/etc/httpd/conf/keys/CACertificate-1.cer"

    RewriteEngine On
    SSLProxyEngine On
    ProxyRequests off
    ProxyPreserveHost on

    ProxyPass /faye !
    ProxyPassReverse /faye !

    ProxyPass / balancer://thinservers/
    ProxyPassReverse / balancer://thinservers/
    <Proxy *>
        Require all granted
    </Proxy>

    <Location /faye>
         ProxyPass ws://localhost:9292
         ProxyPassReverse ws://localhost:9292
    </Location>

    RequestHeader set X_FORWARDED_PROTO 'https'
    # Custom log file locations
    ErrorLog  /etc/httpd/logs/error-unilever.log
    CustomLog /etc/httpd/logs/access-unilever.log combined
 </VirtualHost>

Faye.ru file Faye.ru文件

require 'faye'

Faye::WebSocket.load_adapter('thin')

app = Faye::RackAdapter.new(:mount => '/faye', :timeout => 25)

run app

And I'm starting faye with the following command 我正在使用以下命令启动faye

rackup faye.ru -E production -s thin 

This way I can reach the faye.js by typing the following url from the browser. 这样我就可以通过在浏览器中输入以下URL来访问faye.js。

https://mysite.example.com/faye/faye.js

But When I type https://mysite.example.com/faye/ for example, I get the following result 但是当我输入https://mysite.example.com/faye/时 ,我得到以下结果

Sure you're not looking for /faye ?<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>500 Internal Server Error</title>
</head><body>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error or
misconfiguration and was unable to complete
your request.</p>
<p>Please contact the server administrator at 
root@localhost to inform them of the time this error occurred,
and the actions you performed just before this error.</p>
<p>More information about this error may be available
in the server error log.</p>
</body></html>

which is strange because I only get "Sure you're not looking for /faye ?" 这很奇怪,因为我只得到“当然你不是在寻找/ faye?” in the development. 在发展中。

I'm calling the Faye in application.js as 我在application.js中称为Faye

client = new Faye.Client("https://mysite.example.com/faye/faye")

And I get an error like 而且我得到了一个错误

POST https://mysite.example.com/faye/faye 400 (Bad Request)

I also tried to use the wss protocol in the proxy settings and also giving my certificate paths to thin to start with SSL but nothing worked. 我还尝试在代理设置中使用wss协议,并将我的证书路径设置为瘦以从SSL开始,但没有任何效果。

I assume this may be happening because of the proxy or the ws_tunnel module because when I run the following command from the shell in the server 我假设由于代理或ws_tunnel模块可能会发生这种情况,因为当我从服务器中的shell运行以下命令时

curl http://localhost:9292

I get only "Sure you're not looking for /faye ?" 我只得到“当然你不是在寻找/ faye?” message. 信息。

Does anyone came accross something like this? 有没有人来过这样的事情?

I would appreciate if someone could help me. 如果有人能帮助我,我将不胜感激。

Thanks in advance. 提前致谢。

For those who's having the same issue, my advice is to no matter which version of Apache you are using, just change it to nginx without any hesitation. 对于那些有同样问题的人,我的建议是无论你使用的是哪个版本的Apache,只需毫不犹豫地将其更改为nginx。 It's been very easy to configure and run it. 配置和运行它非常容易。

I'm using the below configuration for my app named example. 我正在使用以下配置为我的app命名示例。 After setting up nginx correctly, everything else worked quite well. 正确设置nginx后,其他一切都运行良好。

hope this helps someone 希望这有助于某人

# app: example
# locally running on port 7000
upstream example {
    server 127.0.0.1:7000;
    server 127.0.0.1:7001;
}

# Faye is set to run on port 9292
upstream example_socket{
    server 127.0.0.1:9292;
}

server {
    # listen 80 if it's a non SSL site
    listen 443;
    server_name www.example.com;
    location /faye {
        proxy_pass http://example_socket;
        # Including common configurations
        include /etc/nginx/conf.d/proxy.conf;
        include /etc/nginx/conf.d/proxy_socket.conf;
   }

    location / {
        root /var/www/vhost/example/current/public;
        proxy_pass http://example;
        # Including common configurations
        # can be found on Internet easily
        include /etc/nginx/conf.d/proxy.conf;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM