これはこのフォーラムの最初の投稿であり、この質問の性質のためにここに来なければなりませんでした。私と上司は何が起こっているのか混乱し、ここで専門家に会わなければなりませんでした。
はじめに私は小規模企業のジュニアWeb開発者であり、会社のサーバー構成に直接アクセスできません。私のすべての作業はDockerでローカルに行われ、承認のために上司に送信されます。設定に関する特定の詳細が必要な場合は、必要な内容を投稿に更新します。
とにかく、この記事のタイトルに示すように、Apache2を使用するDebian StretchからApache 2を使用するDebian BullseyeにWebアプリケーションをゆっくり移行してきました。
私たちはこのサーバー環境で3つのWebアプリケーションを実行しています。2つはPHPで、1つはPerlです。どちらもユーザーにファイルアップロード機能を提供します。
状況をより複雑にするために、私の上司は3つのWebサーバーを運営しています。 web01とweb02は動作しているStretchバージョンを実行しています。その後、彼はソフトディストリビューションと小規模ユーザーテストのためにweb03のBullseyeアップデートを開始しようとしました。
これで、ジュニア開発者としてローカルDocker環境でテストするときにこのエラーを完全に無視しました。私の上司はweb03にデプロイした後にこのアップロードの問題を見つけました。このアップロードの問題はPHPとPerlのWebアプリケーションの両方に影響を与えるため、コードではなく設定に関連しているようです。 Bullseyeディストリビューションの他のすべての項目は正常に実行されますが、ファイルのアップロードと検索が私たちを悩ませる唯一のバグであり、この特定の問題を抱えている他の人が見つかりません。
以下はPerlプログラムの簡単なコードスニペットです。この行で失敗するのが好きで、/ tmpディレクトリがすでに存在していても変更できないと主張します。
open(my $fh, "<", "/tmp/$csvfile") or die "Can't open $csvfile: $!";
これは彼が見たことを説明する私の上司の直接の引用です。
奇妙な問題が発生したため、/ tmpにアップロードされたファイルが見つかりません。私はsystemdがapache2 /tmpを使って奇妙なことをし、それを別の個人用フォルダとして指定することを知っていますが、すでにそのようなケースが増えています。夕方の何かがそれをさらに壊すように見えました。アプリケーション1とアプリケーション2の両方が影響を受けるため、これはPerlまたはPHPに限定されません。 jobtrackerで「/tmp/xxxxx.csvファイルが見つかりません」エラーが発生します。アプリケーション2はディスク容量が不足していると文句を言いますが、これはアップロードされるファイルのサイズを確認できないため、基本的なエラーにすぎません。
何かをアップロードすると、/tmp/systemd-..../tmp/パスのタイムスタンプが更新されていることが明らかになります。だから何かをしているのにどこで失敗するのかわかりません。
バックエンドの知識の限界にはっきりと到達しましたが、本当に上司を助け、世界を救ってボーナスポイントを獲得したいと思います。
この記事を投稿するのに適した場所があるかどうか教えてください。しかし、私の直感では、2つの異なる言語のアプリケーションに同じファイルアップロードの問題がある場合は、DebianまたはApache2の設定の問題のようです。
私の上司は、3つのWebサーバーがすべて同時に実行されるため、最初はこれがロードバランシングの問題である可能性があると思いましたが、web03がweb01および02環境とは独立して実行されているにもかかわらず、アップロードの問題を再現しました。データベースアクセスを除いて、私のDocker環境で同じエラーが発生します。自己ローカライズされた環境で実行する必要があります。そうですか?
より多くの背景情報が必要な人がいる場合は、お気軽にお問い合わせください。背景情報を提供しようとします。
ベストアンサー1
Debian 11ランタイムのApache設定は次のセクションに含まれていますsystemd
。/lib/systemd/system/apache2.service
[Service]
PrivateTmp=true
録音されたように:
PrivateTmp=
ブールパラメータを使用します。もし本当なら、新しいファイルシステムの名前空間の設定 実行されたプロセスと 名前空間外のプロセスで共有されていない個人ディレクトリと
/tmp/
内部ディレクトリをマウントします。/var/tmp/
。これは、プロセスの一時ファイルに安全にアクセスするのに役立ちますが、/tmp/
またはを通じてプロセス間の共有/var/tmp/
はできません。。 trueの場合、サービスが停止した後、そのディレクトリからサービスによって生成されたすべての一時ファイルが削除されます。デフォルトは偽です。
[...]
したがって、元のホストとは隠されていてapache2
異なります。/tmp/
/tmp/
もちろん、これらの設定を上書きすることはできますが(を使用してsysctl edit apache2
サービスセクションを使用して追加するPrivateTmp=false
)ことはお勧めできません。プライベート/tmp
はセキュリティを強化するためのものであり、他のパッケージアプリは同じ設定を持つ可能性が高く、設定も変更する必要があります(これは真ではないようですphp-fpm
)。このディレクトリを共有し、それに応じてアプリケーションを再構成するための専用ディレクトリを持つことをお勧めします。
単にデバッグのために、または単に隠されたファイルがどこにあるかを調べるためには、プロセスのマウントネームスペースを使わずにプロセスのマウントネームスペースにアクセスできるショートカットがありますunshare -m
。/proc/<pid>/root/
このプロセスによってマウントされた名前空間/マウントポイントへの直接リンク。たとえば、pgrep -u root ^apache2$
12345などのPID結果が与えられた場合(または生成されたapache2 PIDの1つがランダムに選択されている場合)、隠しls /proc/12345/root/tmp/
コンテンツが表示されます/tmp/
。このようにファイルをコピーすることも可能ですが、深刻な用途には使用しないでください。この内容は次のように記録されます。man proc
。