首页 > 解决方案 > Laravel-websockets 无法通过 nginx 在 plesk 的 VPS 服务器上运行

问题描述

我正在使用 laravel-websockets 和 pusher 包在我的应用程序中运行一个简单的聊天功能。我设法使用代客开发环境的 ssl 证书使其在本地工作。现在,我处于开发的最后阶段,我将应用程序放在我的 VPS 服务器上,创建了 ssl 证书,一切正常,但我无法让 websockets 服务器正常工作。我正在使用带有 plesk 的 ubuntu 服务器,并通过 nginx 运行我的应用程序。 目前在控制台中收到此错误

广播.php

 'pusher' => [
        'driver' => 'pusher',
        'key' => env('PUSHER_APP_KEY'),
        'secret' => env('PUSHER_APP_SECRET'),
        'app_id' => env('PUSHER_APP_ID'),
        'options' => [
            'cluster' => env('PUSHER_APP_CLUSTER'),
            'useTLS' => true,
            'encrypted' => true,
            'host' => '127.0.0.1',
            'port' => 6001,
            'scheme' => 'https',
            'curl_options' => [
                CURLOPT_SSL_VERIFYHOST => 0,
                CURLOPT_SSL_VERIFYPEER => 0,
            ]
        ],
    ],

引导程序.js

import Echo from 'laravel-echo';

window.Pusher = require('pusher-js');

window.Echo = new Echo({
  broadcaster: 'pusher',
  wsHost: window.location.hostname,
  wsPort: 6001,
  wssPort: 6001,
  key: process.env.MIX_PUSHER_APP_KEY,
  cluster: process.env.MIX_PUSHER_APP_CLUSTER,
  disableStats: true,
  forceTLS: true
});

.env(我将在生产中更改推送器凭据)

PUSHER_APP_ID=12345
PUSHER_APP_KEY=ABCDEFG
PUSHER_APP_SECRET=HIJKLMNOP
PUSHER_APP_CLUSTER=mt1

LARAVEL_WEBSOCKETS_SSL_LOCAL_CERT=localhost.crt
LARAVEL_WEBSOCKETS_SSL_LOCAL_PK=localhost.key

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

标签: laravelnginxpleskpusherlaravel-websockets

解决方案


根据我的经验,我在 Plesk 和 Nginx+Apache 上遇到过类似的问题。经过大量研究和测试,我找到了这个解决方案,它在 prod env 中工作:

登录到 plesk 并打开您的域配置 > Apache 和 Nginx 设置 > HTTPS 的附加设置

(也许是不同的,因为我的服务器语言不是英语。)

在那个盒子里放:

# When Upgrade:websocket header is present, redirect to ws
# Using NC flag (case-insensitive) as some browsers will pass Websocket
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule ^/chat_ws/(.*)    ws://<your_domain>:6001 [P,L]

在此之后,您必须使用 http://<your_domain>/chat_ws/ 作为聊天 websocket 服务器端点(在您的 javascript 中)

根据我的记忆,在我的情况下工作正常:nginx 将反向代理请求,并且不允许直接通过 https 的 websocket


推荐阅读