web-dev-qa-db-ja.com

Webサーバーの起動時にWebSocketをサービスとして実行し、常に実行されるように監視するにはどうすればよいですか?

サーバーがプロセスを再起動/停止/開始するたびに、PHP 24/7/365でスクリプト化されたPHP WebSocketをサービスとして自動的に実行する必要があります。プロセスは自動的に起動する必要があります

ブラウザからtest.phpにアクセスすると、つまりwww.example.com/libraries/server/test.phpが起動し、ポート8080で実行を継続するとします

ただし、以下のコマンドで強制終了してプロセスを終了しようとするとします

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

自動的に起動する必要があります

1日ごとまたは特定の日にcronジョブを使用してスケジューラーとして実行する予定がある場合。サーバーのダウンタイムだけでなく、サーバーのアップタイムによる補償をどのように妥協しますか?または、1秒ごとにcronジョブを実行しようとした場合にオプションがどれも残っていない場合、WebSocketがポート8080で実行されているかどうかにかかわらず、コードをスクリプト化するにはどうすればShell_exec()またはvia exec()コマンド

これが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'); 
?>

HTTPサーバーの起動時に自動化されたサービスとしてプロセスを実行するにはどうすればよいですか?

バックグラウンドで起動して実行し続けるsupervisorまたはsystemdの助けを借りて。 SSH経由で実行する必要があるLinuxコマンドは何ですか?

2
Nishanth ॐ

systemdを使用してPHPをデーモン/サービスとして実行する

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

ターミナルから

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#

更新しました:

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

コマンドは次のとおりです

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'

サービスの再起動間でファイルログを保持し、新しいログ行を追加するだけの場合は、代わりに次を使用します。

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は、フォークせずにリダイレクトを設定した後、シェルプログラムがmy_binaryプログラムに置き換えられることを意味します。したがって、ExecStart=の直後にmy_binaryを実行するのと何の違いもありません。

ファイアウォールで

着信トラフィックのシステムポリシー他のすべての着信トラフィックを許可する

OR

カスタムルールを作成します。

WebSocketsはポート8080/tcp、8080/udpのすべてからの着信を許可します

2
Nishanth ॐ