Laravel Websocket 无法在 centos 7 上使用 supervisor 进行生产连接

Laravel Websocket won't Connect on production using supervisor on centos 7

刚接触CentOS服务器上的supervisor之类的东西求助解决这个问题


我遇到了 Laravel websockets (beyondco) 的问题。 在 localhost 中,一切正常,但在生产中,我开始安装 centos 7 的 supervisor 软件包,并按照文档中的步骤逐步进行。

安装主管包后,我将进入目录 /etc/supervisord.d 并创建 websockets.conf 和 vim 文件,内容如下:


websockets.conf(我猜这个文件配置有误)

[program:websockets] 
command=/usr/bin/php/home/cpanel_real_user_name/artisan websockets:serve --host 0.0.0.0.0(cpanel-real -ip_address) --port 6001
numprocs=1 autostart=true
autorestart=true
user=root

然后我通过运行ning命令systemctl status supervisor查看supervisor的状态,结果是

    Loaded: loaded (/usr/lib/systemd/system/supervisord.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2021-11-12 20:38:56 EET; 29min ago
     Docs: http://supervisord.org
 Main PID: 18122 (supervisord)
   CGroup: /system.slice/supervisord.service
           └─18122 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf

但是当我尝试 运行 supervisorctl start websockets 它 returns websockets: ERROR (no such process)

supervisord.conf

[unix_http_server]
file=/var/run/supervisor/supervisor.sock   ; (the path to the socket file) 
;chmod=0700                 ; sockef file mode (default 0700) 
;chown=nobody:nogroup       ; socket file uid:gid owner 
;username=user              ; (default is no username (open server)) 
;password=123               ; (default is no password (open server)) 

;[inet_http_server]         ; inet (TCP) server disabled by default 
;port=127.0.0.1:9001        ; (ip_address:port specifier, *:port for all iface) 
;username=user              ; (default is no username (open server)) 
;password=123               ; (default is no password (open server)) 

[supervisord] 
logfile=/var/log/supervisor/supervisord.log  ; (main log file;default $CWD/supervisord.log) 
logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB) 
logfile_backups=10          ; (num of main logfile rotation backups;default 10) 
loglevel=info               ; (log level;default info; others: debug,warn,trace) 
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) 
nodaemon=false              ; (start in foreground if true;default false) 
minfds=1024                 ; (min. avail startup file descriptors;default 1024) 
minprocs=200                ; (min. avail process descriptors;default 200) 
;umask=022                  ; (process file creation umask;default 022) 
;user=chrism                 ; (default is current user, required if root) 
;identifier=supervisor       ; (supervisord identifier, default is 'supervisor') 
;directory=/tmp              ; (default is not to cd during start) 
;nocleanup=true              ; (don't clean up tempfiles at start;default false) 
;childlogdir=/tmp            ; ('AUTO' child log dir, default $TEMP) 
;environment=KEY=value       ; (key value pairs to add to environment) 
;strip_ansi=false            ; (strip ansi escape codes in logs; def. false) 

; the below section must remain in the config file for RPC 
; (supervisorctl/web interface) to work, additional interfaces may be 
; added by defining them in separate rpcinterface: sections 
[rpcinterface:supervisor] 
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface 

[supervisorctl] 
serverurl=unix:///var/run/supervisor/supervisor.sock ; use a unix:// URL  for a unix socket 
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket 
;username=chris              ; should be same as http_username if set 
;password=123                ; should be same as http_password if set 
;prompt=mysupervisor         ; cmd line prompt (default "supervisor") 
;history_file=~/.sc_history  ; use readline history if available 

; The below sample program section shows all possible program subsection values, 
; create one or more 'real' program: sections to be able to control them under 
; supervisor. 

;[program:theprogramname] 
;command=/bin/cat              ; the program (relative uses PATH, can take args) 
;process_name=%(program_name)s ; process_name expr (default %(program_name)s) 
;numprocs=1                    ; number of processes copies to start (def 1) 
;directory=/tmp                ; directory to cwd to before exec (def no cwd) 
;umask=022                     ; umask for process (default None) 
;priority=999                  ; the relative start priority (default 999) 
;autostart=true                ; start at supervisord start (default: true) 
;autorestart=true              ; retstart at unexpected quit (default: true) 
;startsecs=10                  ; number of secs prog must stay running (def. 1) 
;startretries=3                ; max # of serial start failures (default 3) 
;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2) 
;stopsignal=QUIT               ; signal used to kill process (default TERM) 
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10) 
;user=chrism                   ; setuid to this UNIX account to run the program 
;redirect_stderr=true          ; redirect proc stderr to stdout (default false) 
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO 
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB) 
;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10) 
;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0) 
;stdout_events_enabled=false   ; emit events on stdout writes (default false) 
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO 
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB) 
;stderr_logfile_backups=10     ; # of stderr logfile backups (default 10) 
;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0) 
;stderr_events_enabled=false   ; emit events on stderr writes (default false) 
;environment=A=1,B=2           ; process environment additions (def no adds) 
;serverurl=AUTO                ; override serverurl computation (childutils) 

; The below sample eventlistener section shows all possible 
; eventlistener subsection values, create one or more 'real' 
; eventlistener: sections to be able to handle event notifications 
; sent by supervisor.

;[eventlistener:theeventlistenername] 
;command=/bin/eventlistener    ; the program (relative uses PATH, can take args) 
;process_name=%(program_name)s ; process_name expr (default %(program_name)s) 
;numprocs=1                    ; number of processes copies to start (def 1) 
;events=EVENT                  ; event notif. types to subscribe to (req'd) 
;buffer_size=10                ; event buffer queue size (default 10) 
;directory=/tmp                ; directory to cwd to before exec (def no cwd) 
;umask=022                     ; umask for process (default None) 
;priority=-1                   ; the relative start priority (default -1) 
;autostart=true                ; start at supervisord start (default: true) 
;autorestart=unexpected        ; restart at unexpected quit (default: unexpected) 
;startsecs=10                  ; number of secs prog must stay running (def. 1)
;startretries=3                ; max # of serial start failures (default 3) 
;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2) 
;stopsignal=QUIT               ; signal used to kill process (default TERM) 
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10) 
;user=chrism                   ; setuid to this UNIX account to run the program 
;redirect_stderr=true          ; redirect proc stderr to stdout (default false) 
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO 
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB) 
;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10) 
;stdout_events_enabled=false   ; emit events on stdout writes (default false) 
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO 
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB) 
;stderr_logfile_backups        ; # of stderr logfile backups (default 10) 
;stderr_events_enabled=false   ; emit events on stderr writes (default false) 
;environment=A=1,B=2           ; process environment additions
;serverurl=AUTO                ; override serverurl computation (childutils)

; The below sample group section shows all possible group values, 
; create one or more 'real' group: sections to create "heterogeneous" 
; process groups.

;[group:thegroupname] 
;programs=progname1,progname2  ; each refers to 'x' in [program:x] definitions 
;priority=999                  ; the relative start priority (default 999) 

; The [include] section can just contain the "files" setting.  This 
; setting can list multiple files (separated by whitespace or 
; newlines).  It can also contain wildcards.  The filenames are 
; interpreted as relative to this file.  Included files *cannot* 
; include files themselves. 

[include] 
files = supervisord.d/*.ini (am try to change it to *.conf)

Laravel websockets 配置

/config/broadcasting

'connections' => [
    '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,
            'host' => 'real_cpanel_ip_adrress',
            'port' => 6001,
            'scheme' => 'https'
        ],
    ],

resources/js/bootstrap.js

import Echo from 'laravel-echo';

window.Pusher = require('pusher-js');
 
window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    wsHost: window.location.hostname,
    wsPort: 6001,
    forceTLS: true,
    disableStats: true,
});

很抱歉这么久 post 但我没有关于主管的背景知识并且我遵循了文档但没有得到成功的结果所以我分享所有信息以了解是否仍然缺少某些东西.

请注意,我投票决定将此问题作为打字错误关闭,仅此而已。但还有其他细节不适合评论。

在你的websockets.conf中,这一行有错别字:

command=/usr/bin/php/home/cpanel_real_user_name/artisan websockets:serve --host 0.0.0.0.0(cpanel-real -ip_address) --port 6001

artisan 是一个 PHP 文件,位于 Laravel 项目的根目录中。你 运行 它通过调用 php artisan。所以我们可以看到您的 websockets 命令缺少 space:

command=/usr/bin/php /home/cpanel_real_user_name/artisan websockets: ...
#                   ^ missing space!

您可以在 the Laravel documentation about supervisord configuration 中看到它。

我也注意到这一行:

numprocs=1 autostart=true

真的是一行2个参数。我不知道 supervisor 是否支持这一点,但是当明确每行 1 个参数时为什么要冒险:

numprocs=1
autostart=true

最后,请注意主管要求您在更改配置时 re-read and update(我想硬服务 shutdown/restart 也应该有效):

supervisorctl reread
supervisorctl update