配置 Apache 和 Passenger 以使用 websocket

Posted

技术标签:

【中文标题】配置 Apache 和 Passenger 以使用 websocket【英文标题】:Configure Apache and Passenger to use websocket 【发布时间】:2021-05-13 13:06:12 【问题描述】:

我正在尝试将 apache 设置为在 Rails Web 套接字上与乘客一起使用 ruby​​。我知道Passenger + Apache不支持Action Cable,所以我尝试使用反向代理解决方案: https://www.phusionpassenger.com/library/deploy/standalone/reverse_proxy.html

主应用程序应继续使用Passenger Apache 模块,而websocket 应使用Passenger Standalone。

我启用了反向代理并更改了虚拟主机配置。

<VirtualHost *:80>
...

 PassengerRuby /home/rails/.rvm/gems/ruby-2.5.1/wrappers/ruby

  <Location "/cable">
     ProxyPass "ws://127.0.0.1:4000/cable"
     ProxyPassReverse http://127.0.0.1:4000/
     ProxyPreserveHost on
  </Location>

...
</VirtualHost>

当我从命令行启动乘客时

bundle exec passenger start --daemonize --address 127.0.0.1 --port 4000

它工作正常,但是当我在 Ubuntu 18.04.5 LTS 中使用 systemd 创建服务时

...
[Service]
Type=forking
WorkingDirectory=/mnt/xfeature/srv/www/f3.xxxx.xxx/current
Environment=RAILS_ENV=feature

User=rails
Group=www-data
UMask=0002
ExecStart=/home/rails/.rvm/bin/rvm-shell -c 'bundle exec passenger start --daemonize -e feature --address 127.0.0.1 --port 4000 --log-level 5'
ExecStop=/home/rails/.rvm/bin/rvm-shell -c 'bundle exec passenger stop --port 4000'

....

它通常会因为这个错误而失败。

[ E 2021-05-13 09:52:13.3607 21447/Tz age/Cor/App/Implementation.cpp:221 ]: Could not spawn process for application /mnt/xfeature/srv/www/f3.xxx.xxx/releases/20210513094622: An operating system error occurred while preparing to start a preloader process: Cannot change the directory '/tmp/passenger.spawn.XXXXgMx55z/envdump' its UID to 1001 and GID to 1001: Operation not permitted (errno=1)
  Error ID: 847da63a
  Error details saved to: /tmp/passenger-error-5S5Syq.html

并且无法建立 websocket 连接。我检查了 /tmp 权限,一切正常。

有什么建议吗?

【问题讨论】:

【参考方案1】:

我们最近在 Apache 和 Passenger 上遇到了一些奇怪的问题。事实证明 Apache 自动更新并将 PrivateTmp 设置更改为 true,这导致了类似的错误消息。

我不确定这是否是导致您的错误的原因,但您可以检查以验证 PrivateTmp 是否设置为 false。

我们的配置是:

/etc/systemd/system/apache2.service.d/override.conf

override.conf 内容:

PrivateTmp=false

我不确定 override.conf 文件是如何加载的。我假设某处有一个配置正在寻找覆盖文件并且它正在使用它。

【讨论】:

以上是关于配置 Apache 和 Passenger 以使用 websocket的主要内容,如果未能解决你的问题,请参考以下文章

简单 Rails 4 ActionController::Live 示例不适用于 Apache + Passenger

实战Puppet 集中配置管理系统——Puppet dashboard与nginx+passenger安装配置

apache与redmine整合-使用passenger

Rails 3.1.1 HTTP 流与 Apache + Passenger

我应该为我的 Rails 应用程序使用 Apache 还是 Nginx &Passenger 或 Mongrel

Rails 3 + Passenger + Apache:如何将 SSL 的端口从 443 更改为 8443?