web-dev-qa-db-fra.com

Comment puis-je exécuter WebSockets en tant que service lorsque le serveur Web démarre et le surveiller pour s'assurer qu'il est toujours actif?

Je dois exécuter le PHP WebSocket scripté dans PHP 24/7/365 en tant que service automatiquement à chaque fois que le serveur redémarre/arrête/démarre le processus. Le processus doit invoquer automatiquement

Supposons que si nous accédons au fichier test.php à partir du navigateur, c'est-à-dire www.example.com/libraries/server/test.php, il démarre et continue de s'exécuter avec le port 8080.

Cependant, supposons que si nous essayons de terminer le processus en éliminant avec les commandes ci-dessous

# kill $(lsof -t -i:8080)
# lsof -i:8080

Il doit être invoqué automatiquement

Si nous prévoyons de fonctionner en tant que planificateur avec un travail cron toutes les secondes ou tous les jours. Comment pouvons-nous compromettre avec la compensation supportée par le temps de disponibilité du serveur ainsi que par les temps d'arrêt du serveur? ou si aucune des options n'est laissée, supposons que si nous essayons d'exécuter le travail cron toutes les secondes, comment puis-je écrire le code dans le code, que WebSocket s'exécute avec le port 8080, s'il n'est pas exécuté, Shell_exec() ou via exec() commandes

Voici le code pour test.php

<?php 
# The maximum execution time, in seconds. If set to zero, no time limit is imposed.
set_time_limit(0);

# Make sure to keep alive the script when a client disconnect.
ignore_user_abort(true);

error_reporting(E_ALL);
ini_set('display_errors', 'On');
error_reporting(-1); // reports all errors
ini_set("display_errors", "1"); // shows all errors
ini_set("log_errors", 1);
ini_set("error_log", "/var/www/vhosts/somedomain.com/httpdocs/websocket.log");

echo "Script start at: " . date('h:i:s') . "\n"; 
exec('bash -c "exec Nohup php websocket_server.php >> /var/www/vhosts/somedomain.com/httpdocs/websocket.log 2>&1 &"');
Shell_exec('Nohup php /var/www/vhosts/somedomain.com/httpdocs/proj_ci/application/libraries/server/websocket_server.php 2>&1 >> /var/www/vhosts/somedomain.com/httpdocs/websocket.log &');
echo "Script end at: " . date('h:i:s'); 
?>

Alors, comment dois-je exécuter le processus en tant que service automatisé au démarrage du serveur HTTP?

À l’aide de supervisor ou systemd, qui le lance en arrière-plan et le maintient en marche. Quelles devraient être les commandes Linux à exécuter via SSH?

2
Nishanth ॐ

Utilisation de systemd pour exécuter PHP en tant que démon/service

php_socketme.sh

#!/bin/bash
Nohup /usr/bin/php /var/www/vhosts/somedomain.com/httpdocs/libraries/server/test.php >> /var/www/vhosts/somedomain.com/httpdocs/php_socketme.log 2>&1

php_socketme.service

[Unit]
Description=RunningPHPWebSockets(socketme.io)

[Service]
User=root
ExecStart=/var/www/vhosts/somedomain.com/httpdocs/libraries/server/php_socketme.sh

[Install]
WantedBy=multi-user.target

Du terminal

root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# ./php_socketme.sh
-bash: ./php_socketme.sh: Permission denied
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# chmod a+x socketme.sh
chmod: cannot access 'socketme.sh': No such file or directory
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# chmod a+x php_socketme.sh
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# ./php_socketme.sh
-bash: ./php_socketme.sh: /bin/bash^M: bad interpreter: No such file or directory
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# dos2unix php_socketme.sh
dos2unix: Datei php_socketme.sh wird ins Unix-Format umgewandelt ...
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# chmod 755 test.php
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# cp php_socketme.service /etc/systemd/system/php_socketme.service
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl daemon-reload
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl start php_socketme.service
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl status  php_socketme.service
● php_socketme.service - RunningPHPWebSockets(socketme.io)
   Loaded: loaded (/etc/systemd/system/php_socketme.service; disabled; vendor preset: enabled)
   Active: active (running) since Fr 2018-11-16 16:06:18 IST; 4min 9s ago
 Main PID: 29799 (myphp.sh)
   CGroup: /system.slice/php_socketme.service
           ├─29799 /bin/bash /var/www/vhosts/somedomain.com/httpdocs/libraries/server/myphp.sh
           └─29800 /usr/bin/php /var/www/vhosts/somedomain.com/httpdocs/libraries/server/myservice.php
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl stop php_socketme.service
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl status  php_socketme.service
● php_socketme.service - RunningPHPWebSockets(socketme.io)
   Loaded: loaded (/etc/systemd/system/php_socketme.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl enable php_socketme.service
Created symlink from /etc/systemd/system/multi-user.target.wants/php_socketme.service to /etc/systemd/system/php_socketme.service.
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl is-enabled php_socketme.service
enabled
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server#

Mis à jour:

webs.sh

#!/bin/bash
### BEGIN INIT INFO
# Provides:          webSocket
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: php webSocket
# Description:       php webSocket
### END INIT INFO
Nohup /usr/bin/php /var/www/vhosts/somedomain.com/httpdocs/libraries/server/websocket_server.php >> /var/www/vhosts/somedomain.com/httpdocs/custom_logs/webssh.log 2>&1

websocket.service

[Unit]
Description=php webSocket
After=syslog.target network.target

[Service]
User=root

Type=simple
ExecStart=/var/www/vhosts/somedomain.com/httpdocs/libraries/server/webs.sh >> /var/www/vhosts/somedomain.com/httpdocs/custom_logs/AllStandardOutput.log>> /var/www/vhosts/somedomain.com/httpdocs/custom_logs/AllStandardError.log
TimeoutStopSec=20
KillMode=process
Restart=always
RestartSec=2
StandardOutput=file:/var/www/vhosts/somedomain.com/httpdocs/custom_logs/StandardOutput.log
StandardError=file:/var/www/vhosts/somedomain.com/httpdocs/custom_logs/StandardError.log

[Install]
WantedBy=multi-user.target
Alias=websocket.service

Les commandes sont comme suit

cp websocket.service /etc/systemd/system/websocket.service 
systemctl daemon-reload 

systemctl start websocket.service
systemctl status websocket.service 
systemctl stop websocket.service
systemctl restart websocket.service

systemctl enable websocket.service 
systemctl is-enabled websocket.service 
systemctl disable websocket.service

lsof -i:8080

ExecStart=/bin/sh -c '/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server 2>&1 > /var/log.log' 
ExecStart=/usr/bin/sh -c 'exec /usr/bin/my_binary [arguments] >>/var/log/flume-ng/log1.log 2>>/var/log/flume-ng/log2.log'

Si vous souhaitez conserver le journal des fichiers entre les redémarrages du service et y ajouter simplement les nouvelles lignes enregistrées, utilisez plutôt:

ExecStart=/usr/bin/sh -c 'exec /usr/bin/my_binary [arguments] >>/var/log/flume-ng/log1.log 2>>/var/log/flume-ng/log2.log'

exec signifie que le programme shell sera remplacé par le programme my_binary après la configuration des redirections sans forking. Donc, il ne sera pas différent d'exécuter my_binary directement après ExecStart=.

Dans le pare-feu

Stratégie système pour le trafic entrant Autoriser tout autre trafic entrant

OR

créer une règle personnalisée:

WebSockets Autoriser les entrées de tous sur les ports 8080/tcp, 8080/udp

2
Nishanth ॐ