配置 Apache 反向代理以在生产环境中托管 Laravel Echo 服务器
Configuring Apache Reverse Proxy For Hosting Laravel Echo Server On Production
我需要在 HTTPS 服务器上托管一个使用 laravel-echo-server 的 laravel 应用程序。
我想使用 Apache 的反向代理将我的 /socket.io
url 轮询重定向到端口 6001
上的 127.0.0.1
,这就是 laravel-echo-server
运行在同一个域内 url。
例如,在 https://example.com
上,当我的 laravel-echo-server
向 https://example.com/socket.io
发送 url 轮询时,apache 应将其重定向到同一域内的 http://127.0.0.1:6001
。
通知
我没有在根目录中托管我的 laravel 应用程序,而是在我的 cpanel 中的子目录中。
我的服务器是 VPS
,我从一个子域主机托管,该子域主机 运行 的 IP 地址与主服务器主机的 IP 地址不同。
假设我的主要主机是 host.mydomain.com
,具有指向 /home/...
目录的唯一 IP 地址。 http
上的 运行
我现在有一个 domestic.mydomain.com
,其唯一的 IP 地址指向 /home/domestic/...
目录,这是我托管我的 laravel 应用程序的地方。 https
上的 运行。
但我的 cpanel 登录名来自 host.mydomain.com
IP 地址,我在该地址访问 domestic.mydomain.com
文件管理器
我的 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>
我的问题是,当我打开我的网站时,投票 return 一组 OK
和 404
同时响应,但它没有加入我的 [=73] 中的任何频道=].经过大量测试后,我发现代理确实重定向了,但我怀疑它是否达到了我想要的特定目标。
这是我的 404 的 HTML 响应,这不是我的服务器配置的 404 响应:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot POST /</pre>
</body>
</html>
它 运行 在我的本地服务器上非常完美,但我需要在我的生产服务器上 运行。
终于明白了
虽然我的网站仍必须使用 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/ [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
保留我的服务 运行。
我需要在 HTTPS 服务器上托管一个使用 laravel-echo-server 的 laravel 应用程序。
我想使用 Apache 的反向代理将我的 /socket.io
url 轮询重定向到端口 6001
上的 127.0.0.1
,这就是 laravel-echo-server
运行在同一个域内 url。
例如,在 https://example.com
上,当我的 laravel-echo-server
向 https://example.com/socket.io
发送 url 轮询时,apache 应将其重定向到同一域内的 http://127.0.0.1:6001
。
通知
我没有在根目录中托管我的 laravel 应用程序,而是在我的 cpanel 中的子目录中。
我的服务器是 VPS
,我从一个子域主机托管,该子域主机 运行 的 IP 地址与主服务器主机的 IP 地址不同。
假设我的主要主机是 host.mydomain.com
,具有指向 /home/...
目录的唯一 IP 地址。 http
我现在有一个 domestic.mydomain.com
,其唯一的 IP 地址指向 /home/domestic/...
目录,这是我托管我的 laravel 应用程序的地方。 https
上的 运行。
但我的 cpanel 登录名来自 host.mydomain.com
IP 地址,我在该地址访问 domestic.mydomain.com
文件管理器
我的 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>
我的问题是,当我打开我的网站时,投票 return 一组 OK
和 404
同时响应,但它没有加入我的 [=73] 中的任何频道=].经过大量测试后,我发现代理确实重定向了,但我怀疑它是否达到了我想要的特定目标。
这是我的 404 的 HTML 响应,这不是我的服务器配置的 404 响应:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot POST /</pre>
</body>
</html>
它 运行 在我的本地服务器上非常完美,但我需要在我的生产服务器上 运行。
终于明白了
虽然我的网站仍必须使用 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/ [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
保留我的服务 运行。