配置 Apache 反向代理以在生产环境中托管 Laravel Echo 服务器

Posted

技术标签:

【中文标题】配置 Apache 反向代理以在生产环境中托管 Laravel Echo 服务器【英文标题】:Configuring Apache Reverse Proxy For Hosting Laravel Echo Server On Production 【发布时间】:2019-11-13 21:39:31 【问题描述】:

我需要托管一个通过 HTTPS 服务器使用 laravel-echo-server 的 laravel 应用程序。

我想使用 Apache 的反向代理将我的 /socket.io url 轮询重定向到端口 6001 上的 127.0.0.1,这是 laravel-echo-server 在同一域 url 中运行的位置。

例如在https://example.com 上,当我的laravel-echo-server 将url 轮询发送到https://example.com/socket.io 时,apache 应该将其重定向到同一域内的http://127.0.0.1:6001

通知

我没有在根目录中托管我的 laravel 应用程序,而是在我的 cpanel 中的子目录中。

我的服务器是 VPS,我从一个子域主机托管,该主机运行在与主服务器主机不同的 IP 地址上。

假设我的主要主机是host.mydomain.com,具有指向/home/... 目录的唯一IP 地址。这运行在http

我现在有一个 domestic.mydomain.com,其唯一的 IP 地址指向 /home/domestic/... 目录,这是我托管我的 laravel 应用程序的地方。这在 https 上运行。

但我的 cpanel 登录来自我访问 domestic.mydomain.com 文件管理器的host.mydomain.com IP 地址

我的laravel-echo-server.json 是什么样子的:


    "authHost": "https://example.com",
    "authEndpoint": "/broadcasting/auth",
    "clients": [
        
            "appId": "xxxx",
            "key": "xxxxxxxx"
        
    ],
    "database": "redis",
    "databaseConfig": 
        "redis": ,
        "sqlite": 
            "databasePath": "/database/laravel-echo-server.sqlite"
        
    ,
    "devMode": false,
    "host": "127.0.0.1",
    "port": "6001",
    "protocol": "http",
    "socketio": ,
    "sslCertPath": "",
    "sslKeyPath": "",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "subscribers": 
        "http": true,
        "redis": true
    ,
    "apiOriginAllow": 
        "allowCors": false,
        "allowOrigin": "",
        "allowMethods": "",
        "allowHeaders": ""
    

我如何部署我的laravel-echo

import Echo from "laravel-echo";
window.io = require('socket.io-client');
// Have this in case you stop running your laravel echo server
if (typeof io !== 'undefined') 
  window.Echo = new Echo(
    broadcaster: 'socket.io',
    host: window.location.hostname,
  );

  window.Echo.channel('session-expired')
  .listen('sessionExpired', (e) => 
    setTimeout(location.reload(), 3000);
  );

当我运行laravel-echo-server start 时,它成功初始化并显示running on 127.0.0.1 on port 6001

然后这是我的 apache 反向代理配置/etc/httpd/conf/httpd.conf

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
# mod_proxy setup.
ProxyRequests Off
ProxyPass /socket.io http://127.0.0.1:6001
ProxyPassReverse /socket.io http://127.0.0.1:6001
<Location "/socket.io">
  Order allow,deny
  Allow from all
</Location>

我的问题是,当我打开我的网站时,投票同时返回一组 OK404 响应,但它没有加入我的 socket.io 中的任何频道。经过大量测试后,我发现代理确实重定向了,但我怀疑它是否击中了我想要的特定代理。

这是我的 404 的 html 响应,这不是我的服务器配置的 404 响应:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot POST /</pre>
</body>
</html>

它在我的本地服务器上完美运行,但我需要让它在我的生产服务器上运行。

【问题讨论】:

【参考方案1】:

终于明白了。

虽然我的网站仍然必须使用 SSL,但解决方案是让 Apache/socket.io 重定向到已为 redis 配置的 http://localhost:6001/socket.io。然后使用2.2.3 版本的socket io

所以我的laravel-echo-server.json 没有配置 SSL。

这是我的laravel-echo-server.json


   "authHost": "https://domainName.com",
   "authEndpoint": "/broadcasting/auth",
   "clients": [
      
        "appId": "xxxxxxx",
        "key": "xxxxxxxxxxx"
      
   ],
   "database": "redis",
   "databaseConfig": 
      "redis": ,
      "sqlite": 
          "databasePath": "/database/laravel-echo-server.sqlite"
      
   ,
   "devMode": false,
   "host": null,
   "port": "6001",
   "protocol": "http",
   "socketio": ,
   "sslCertPath": "",
   "sslKeyPath": "",
   "sslCertChainPath": "",
   "sslPassphrase": "",
   "subscribers": 
       "http": true,
       "redis": true
   ,
   "apiOriginAllow": 
   "allowCors": true,
   "allowOrigin": "*",
   "allowMethods": "GET, POST",
   "allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"

我如何使用 laravel-echo-server.json:

import Echo from "laravel-echo";
window.io = require('socket.io-client');
// Have this in case you stop running your laravel echo server
if (typeof io !== 'undefined') 
  window.Echo = new Echo(
    broadcaster: 'socket.io',
    host: window.location.hostname,
  );


我的 SSL virtualhost 中我的 apaxhe 配置为我的域:

RewriteEngine On
RewriteCond %REQUEST_URI  ^/socket.io            [NC]
RewriteCond %QUERY_STRING transport=websocket    [NC]
RewriteRule /(.*)           ws://localhost:6001/$1 [P,L]

ProxyPass        /socket.io http://localhost:6001/socket.io
ProxyPassReverse /socket.io http://localhost:6001/socket.io 

此外,它还需要一个 Node js 进程管理器来保持laravel-echo-server 的运行。于是我创建了echo-server.json,并放置了如下代码。


  "name": "apps",
  "script": "laravel-echo-server",
  "args": "start"

接下来,我安装pm2 进程管理器。 npm install pm2 -g 并开始了我的服务pm2 start echo-server.json --name="apps"

最后,我使用pm2 list 查看我的所有服务并使用pm2 startup 保持我的服务运行。

【讨论】:

嘿,你能帮帮我吗?我为此苦苦挣扎:(所以我的 laravel 队列侦听器捕获了事件,我看到 pm2 控制台中的内存使用量正在增加,但是,如果没有任何响应,什么都不起作用 我之前手动启动了 laravel-echo-server 并没有响应。用户从未加入任何频道 尝试使用socket io client 2.2.0 @TyomaInagamov 没有帮助(我厌倦了这个问题..还有其他建议吗?@Ikechukwu 我看到该事件即将到来 php artisan queue:listen --timeout=0,但它没有出现在 laravel-echo-server 上。两个用户都没有加入他的频道

以上是关于配置 Apache 反向代理以在生产环境中托管 Laravel Echo 服务器的主要内容,如果未能解决你的问题,请参考以下文章

Vue Nginx反向代理配置 解决生产环境跨域

配置LANMP环境-- 配置nginx反向代理,与配置apache虚拟主机

Varnish缓存代理简介与配置

varnish 4.0 缓存代理配置

Varnish4.0缓存代理配置

varnish4.0缓存代理配置