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

Ike*_*alu 5 apache redis socket.io laravel laravel-echo

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

我想使用 Apache 的反向代理将我的/socket.iourl 轮询重定向到在同一域 url 内运行的端口127.0.0.16001laravel-echo-server

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

注意

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

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

假设我的主主机有host.mydomain.com一个指向该/home/...目录的唯一 IP 地址。这运行于http

我现在有一个domestic.mydomain.com指向该/home/domestic/...目录的唯一 IP 地址,这就是我托管 Laravel 应用程序的位置。这运行在https.

但我的 cpanel 登录是从host.mydomain.com我访问domestic.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": ""
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何部署我的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);
  });
}
Run Code Online (Sandbox Code Playgroud)

当我运行时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>
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我打开网站时,民意调查会同时返回一组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>
Run Code Online (Sandbox Code Playgroud)

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

Ike*_*alu 2

终于明白了。

虽然我的网站仍必须带有 SSL,但解决方案是重定向Apache/socket.iohttp://localhost:6001/socket.io配置的redis. 然后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"
}
Run Code Online (Sandbox Code Playgroud)

}

我如何利用 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,
  });

}
Run Code Online (Sandbox Code Playgroud)

virtualhost我的域SSL 中的 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 
Run Code Online (Sandbox Code Playgroud)

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

{
  "name": "apps",
  "script": "laravel-echo-server",
  "args": "start"
}
Run Code Online (Sandbox Code Playgroud)

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

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