Настройка обратного прокси-сервера Apache для размещения сервера Laravel Echo на производстве - PullRequest
2 голосов
/ 03 июля 2019

Мне нужно разместить приложение laravel, которое использует laravel-echo-сервер через HTTPS-сервер.

Я хочу использовать обратный прокси-сервер Apache, чтобы перенаправить мои /socket.io URL-опросы на 127.0.0.1 на порту 6001, где laravel-echo-server работает в пределах того же URL-адреса домена.

Например, более https://example.com, когда my laravel-echo-server отправляет опросы URL на https://example.com/socket.io. Apache должен перенаправить его на http://127.0.0.1:6001 в этом же домене.

УВЕДОМЛЕНИЕ

Я размещаю свое приложение laravel не в корневом каталоге, а в подкаталоге моей cpanel.

Мой сервер - VPS, и я размещаю хост с субдомена, который работает на IP-адресе, отличном от хоста основного сервера.

Допустим, мой главный хост - host.mydomain.com с уникальным IP-адресом, указывающим на каталог /home/.... Это работает на 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>

Моя проблема в том, что когда я открываю свой веб-сайт, опросы возвращают набор ответов OK и 404 одновременно, но он не присоединяется ни к одному каналу в моем socket.io. После большого количества испытаний я понял, что прокси-сервер выполняет перенаправление, но сомневаюсь, что он выбрал именно тот, который мне нужен.

Вот ответы HTML для моего 404, который не является настроенным ответом 404 моего сервера:

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

Он отлично работает на моем локальном сервере, но мне нужно, чтобы он работал на моем рабочем сервере.

1 Ответ

1 голос
/ 08 июля 2019

Наконец-то понял, вот мои laravel-echo-server.json:

{
    "authHost": "https://example-domain.com",
    "authEndpoint": "/broadcasting/auth",
    "clients": [
        {
            "appId": "xxxxxxx",
            "key": "xxxxxxxxxxxxxx"
        }
    ],
    "database": "redis",
    "databaseConfig": {
        "redis": {
            "port": "6379",
            "host": "localhost"
        },
        "sqlite": {}
    },
    "devMode": true,
    "host": "localhost",
    "port": "6001",
    "protocol": "http",
    "socketio": {},
    "sslCertPath": "/path/to/ssl/crt/crt.pem", // or .crt
    "sslKeyPath": "/path/to/ssl/key/crt.pem", // or .key
    "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,
  });

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

И мой apaxhe config в моем SSL virtualhost для моего домена:

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 
...