Search code examples
phplaravelwebsocketsupervisordpusher-js

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


I am new to dealing with something like a supervisor on the CentOS server I ask for help to solve this issue.


I am facing issue with Laravel websockets (beyondco). In localhost, everything works well but in production, I started to install the supervisor package for centos 7 and I follow the steps in the documentation step by step.

After I install the supervisor package am going to directory /etc/supervisord.d and create websockets.conf and vim the file with the following:


websockets.conf (i guess that this file has misconfiguration)

[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

Then am check the status of the supervisor by running command systemctl status supervisor and the result is

    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

But when am try to run supervisorctl start websockets it 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 configuration

/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,
});

Am sorry for the long post but I don't have a background about supervisor and I follow the documentation but am not getting the successful result so I share all info to catch if there is something still missing.


Solution

  • Note I voted to close this question as a typo, bcs that's all it is. But there are other details that would not fit in a comment.

    In your websockets.conf, this line has a typo:

    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 is a PHP file, in the root of your Laravel project. You run it by calling php artisan. So we can see your websockets command is missing a space:

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

    You can see this in the Laravel documentation about supervisord configuration.

    I also notice this line:

    numprocs=1 autostart=true
    

    Is really 2 parameters on one line. I don't know if supervisor supports that, but why risk it when it is clear 1 parameter per line is expected:

    numprocs=1
    autostart=true
    

    Lastly, note that supervisor requires you to re-read and update when you change the config (I guess a hard service shutdown/restart should also work):

    supervisorctl reread
    supervisorctl update