尝试使用代理在 Apache 上 运行 Faye websocket
Trying to run Faye websocket on Apache using a proxy
我正在尝试在瘦服务器上使用 Faye gem,在生产环境中使用 Rails,但我无法使其工作。我使用的是 apache 2.4,ws_tunnel 也启用了代理模块。我的设置如下。
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 文件
require 'faye'
Faye::WebSocket.load_adapter('thin')
app = Faye::RackAdapter.new(:mount => '/faye', :timeout => 25)
run app
我将使用以下命令启动 faye
rackup faye.ru -E production -s thin
这样我就可以通过在浏览器中输入以下 url 来访问 faye.js。
https://mysite.example.com/faye/faye.js
但是当我键入 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>
这很奇怪,因为我在开发中只得到 "Sure you're not looking for /faye ?"。
我在application.js中称王菲为
client = new Faye.Client("https://mysite.example.com/faye/faye")
然后我收到类似
的错误
POST https://mysite.example.com/faye/faye 400 (Bad Request)
我还尝试在代理设置中使用 wss 协议,并将我的证书路径设置为 thin 以从 SSL 开始,但没有任何效果。
我假设这可能是由于代理或 ws_tunnel 模块而发生的,因为当我 运行 来自服务器 shell 的以下命令时
curl http://localhost:9292
我只收到 "Sure you're not looking for /faye ?" 条消息。
有人遇到过这样的事情吗?
如果有人能帮助我,我将不胜感激。
提前致谢。
对于遇到同样问题的朋友,我的建议是无论你使用的是哪个版本的Apache,都可以毫不犹豫的换成nginx。配置和 运行 非常容易。
我正在为我的应用命名示例使用以下配置。正确设置nginx后,其他一切都很好。
希望这对某人有所帮助
# 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;
}
}
我正在尝试在瘦服务器上使用 Faye gem,在生产环境中使用 Rails,但我无法使其工作。我使用的是 apache 2.4,ws_tunnel 也启用了代理模块。我的设置如下。
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 文件
require 'faye'
Faye::WebSocket.load_adapter('thin')
app = Faye::RackAdapter.new(:mount => '/faye', :timeout => 25)
run app
我将使用以下命令启动 faye
rackup faye.ru -E production -s thin
这样我就可以通过在浏览器中输入以下 url 来访问 faye.js。
https://mysite.example.com/faye/faye.js
但是当我键入 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>
这很奇怪,因为我在开发中只得到 "Sure you're not looking for /faye ?"。
我在application.js中称王菲为
client = new Faye.Client("https://mysite.example.com/faye/faye")
然后我收到类似
的错误POST https://mysite.example.com/faye/faye 400 (Bad Request)
我还尝试在代理设置中使用 wss 协议,并将我的证书路径设置为 thin 以从 SSL 开始,但没有任何效果。
我假设这可能是由于代理或 ws_tunnel 模块而发生的,因为当我 运行 来自服务器 shell 的以下命令时
curl http://localhost:9292
我只收到 "Sure you're not looking for /faye ?" 条消息。
有人遇到过这样的事情吗?
如果有人能帮助我,我将不胜感激。
提前致谢。
对于遇到同样问题的朋友,我的建议是无论你使用的是哪个版本的Apache,都可以毫不犹豫的换成nginx。配置和 运行 非常容易。
我正在为我的应用命名示例使用以下配置。正确设置nginx后,其他一切都很好。
希望这对某人有所帮助
# 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;
}
}