私は毎日深夜にライセンスを失います。

私は毎日深夜にライセンスを失います。

require私のPHPスクリプトの上部にファイルがあります。このファイルにはMySQL接続オブジェクトのみがあります。

$c->new mysqli('host','usr','pass','db')

ファイルに400権限があり、Webページのルート()から離れて-r-------- 移動しました。/etc/mysql//var/www/html

毎晩真夜中に動作が停止し、私のすべてのページに対して権限拒否エラーが発生することを除いて、うまく動作します。

Warning: require(/etc/mysql/.myfile.php): Failed to open stream: Permission denied in...

権限をに変更するには、444自分のサイトにログインして権限をもう一度変更してください400。翌日真夜中まで働きました。一日中何度も私のサイトにログインしてログアウトできますが、真夜中になると失敗します。

この問題の原因と解決策は何ですか?

root明らかにプレーンテキストのパスワードがあるので、ファイルを読むことができるように保管したいと思います。

答え1

これはコメントでなければなりません。しかし、スペースが限られており、フォーマットも同じです。

この状況について実際に良い説明を提供しません。

「権限を失った」と正常な作業を再開する方法について話しましたが、権限が何であるかは明らかではありませんでした。後ろに真夜中のイベント。

アクセス権を決定するときに所有権の詳細がない場合、権限は意味がありません。おそらく、ファイルはもともとWebサーバーuidが所有していました(実際にはWebサーバーで実行されているスクリプトがファイルにアクセスしたとは言いませんでした)。繰り返しますが、前と後は何ですか?

真夜中に止まったことをどうやって確認しましたか?イベントが発生した時期を正確に知ることは、トラブルシューティングのための有用な踏み石です。 00:00:00から00:03:00の間に発生した場合、スケジュールされたタスクが原因である可能性が高くなります。これも作ってくれるたくさんシステムログ(Webサーバーログを含む)とイベントを簡単に相互参照できます。

ただし、権限とアクセス権を考慮していただきありがとうございます。

選択した権限は適切ではありません。もう一度これがWebサーバーであると仮定すると、このファイルはrootユーザーのみを管理できます。サーバーを維持する唯一の人の場合、より良いアプローチは、所有権をbungee1980:wwwgrp(ここでwwwgrpはWebサーバーuidのデフォルトグループ)と権限-rw-r----(0750)に設定することです。

選択した場所が理想的ではありません。ほとんどの最新のオペレーティングシステムは、必要なアクセス制御メカニズム(RHELのSELinuxとその派生製品、Apparmorの他の場所)を介したファイルアクセスを制限しています。ネットワークサーバーは通常、その内容を含むディレクトリツリーにのみ制限されます。明らかな理由から、このファイルがドキュメントのルートにあることを望まないが、(通常)スクリプトが/ etcの他の多くのファイルから直接読み取ることはできません。

小さな問題はPHPですメカニズムを提供しますデフォルトの資格情報とデータベースの詳細を設定するために使用されます。追加の定型句コードの実行ターゲットスクリプトの前)。 Webサーバー構成で設定できることを考慮すると、これはより適切な資格情報ツールです。

答え2

権限を444に変更した場合は、自分のサイトにログインして権限を400に戻してください。

つまり、権限 400 ではスクリプトはファイルを読み取ることができませんが、権限 444 では読み取ることができます。その後、一部のプロセスは深夜までファイルを開いたままにするか、RAMに資格情報を保持します。この時点で真夜中までいくつかのイベントが発生します。再起動または一種のクリーンアップを実行します。

どのOS/ディストリビューションを使用しているかについては言及していませんが、まず/etc/cron.*関連ユーザーのcrontab(通常はcrontab/var/spool/cron[/crontabs]など)で真夜中に実行される毎日のcronジョブを確認します。たぶん古いPHPセッションを整理する何かがありますか?それとも、毎日のログローテーションスケジュールの一部としてlogrotate何か再起動をトリガできますか?php-fpm

また、システムでタイマー単位を使用している場合は、タイマー単位を確認してくださいsystemdsystemctl list-units --type=timerすべてのシステム全体のタイマーをリストしてsystemctl cat <name>.timer確認してください。


たとえば、Debian 12では、によってlogrotateトリガーされ、で指定された時間に実行でき/etc/cron.daily/logrotate、デフォルトはシステムが実行される07:30から23:30の間の最速の時間です。しかし、このスケジュールは実際に使用されていますanacron/etc/cron.d/anacronsystemd使用しない場合のみで指定したジョブは/etc/cron.d/anacron条件付きジョブなので/run/systemd/system いいえ既存の。

systemd代わりにlogrotate.timer、次のように指定します。

systemctl cat logrotate.timer 

# /lib/systemd/system/logrotate.timer
[Unit]
Description=Daily rotation of log files
Documentation=man:logrotate(8) man:logrotate.conf(5)

[Timer]
OnCalendar=daily
AccuracySec=1h
Persistent=true

[Install]
WantedBy=timers.target

に記載されているように、まさにman systemd.time毎日深夜をOnCalendar=daily意味します。このタイマーを00:00から01:00(ある場合)の間で動作する他のタイマーとマージして、省電力を最適化できます*-*-* 00:00:00AccuracySec=1h少なくとも私のシステムでは、最終結果は、システムがその時間にダウンしない限り、真夜中にログの回転が発生するようです。

を使用すると、systemctl status logrotate.timerタイマーの次のスケジュールされた動作時間を表示できます。

関連情報