26

ほぼ間違いなく初心者の質問があります。この質問を書いている間に問題が見つかると思っていましたが、まだ行き詰まっています。

Apache の DocumentRoot を変更したいのですが、「DocumentRoot はディレクトリでなければなりません」というエラー メッセージが表示され続けます。

状況:

  • コードは仮想 VMWare マシン 4.0.4 build-744019 で実行されています。
  • Linux のバージョンは Scientific Linux リリース 6.4 (Carbon) です。
  • Apache のバージョンは Apache/2.2.15 (Unix) です (これは特別なことは何もない yum インストールです)

httpd.conf で

DocumentRoot "/home/stave/www"

再起動すると、メッセージが表示されます

Starting httpd: Syntax error on line 292 of /etc/httpd/conf/httpd.conf:
DocumentRoot must be a directory

これまでの手順:

ディレクトリが存在することを確認しました:

ls -asl /home/stave
4 drwxrwxrwx.  2 stave stave    4096 Feb  9 09:08 www
It even has a file in it "index.html", so I am very sure that the directory exists

特権の問題である可能性があると考えたため (これはインターネットから分離された仮想開発マシンであり、トラブルシューティングを行っているため、セキュリティについてはあまり心配していません) ご覧のとおり、特権を 777 に設定しました。

権限が問題にならないように、apache が実行されているユーザーを変更しました (そして、変更が ps で機能することを確認しました)。

スタックオーバーフロー

スタックオーバーフローの回答はいくつかありますが、ほとんどは「エラーメッセージを読んでください。ディレクトリが実際には存在しないと言っています」と言っています。他の人は、最後に悪いスラッシュがあるかもしれないとほのめかしました.

その他のウェブサイト

私が見つけた最も有用なものは、アドバイスしたこれでした

SELinux 拡張機能のために、実際にはディレクトリであっても、「DocumentRoot はディレクトリでなければなりません」というエラーが発生する可能性があります。system-config-securitylevel (または redhat-c​​onfig-securitylevel) を実行して httpd の SELinux を無効にするか、そのディレクトリに SELinux パーミッションを付与します: chcon -R -h -t httpd_sys_content_t /path/to/directory*

私の Linux のバージョンは Security Enhanced Linux ではないので、理解せずに試してみましたが、効果はありませんでした。

現在の状況

試すアイデアが尽きたので、診断に関する質問やアドバイスをいただければ幸いです。

4

6 に答える 6

21

「その他のウェブサイト」の下に投稿したリンクは、問題の根本原因である Selinux を強調しています。

サーバーが非常に安全な環境の一部でない限り、私は単純に Selinux を無効にします。

RedHat / CentOS / Scientific Linux では、これは /etc/sysconfig/selinux を編集することで簡単に実行できます。パラメータ「selinux」を見つけて、以下の抜粋に従ってオプション「enforcing」を「disabled」に変更します。

# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - No SELinux policy is loaded.
SELINUX=disabled

この変更を行った後、サーバーを再起動することをお勧めします。

于 2013-02-11T10:22:14.680 に答える
7

今日もこの問題に遭遇しました。これは、DocumentRoot を /var/www/html から /srv/www/html に移動したためです。セキュリティ ポリシーの一環として、SELinux を無効にするオプションはありません。

私の修正は、/srv の SELinux ファイル コンテキストを /var に一致するように変更することでした。はい、妥協ですが、完全に無効にするよりはましです。それ以外は... /srv/www とすべてのサブフォルダーに /var/www の下のフォルダーと一致する httpd_sys_content_t があることを確認しましたが、すべて問題ありません。

于 2013-04-26T15:13:51.667 に答える
0

Firstly, there is no reason at all to turn off selinux to fix this issue, just change the selinux file context.

Secondly, when changing selinux file context, you should to set up a permanent rule for that path, such that when new files are copied in and/or replace existing files, restorecon actually fixes the problem, instead of breaking it, as is the case when you only use chcon.

Thus, for a symlink'ed DocumentRoot (let's give the actual full path to the directory as '/media/myDoc' for this example), run these two commands:

semanage fcontext -a -t httpd_sys_content_t "/media/myDoc(/.*)?"

restorecon -R /media/myDoc

Note, the full path is required when using semanage this way. You will not only fix the problem, but it won't break again when you run restorecon (or auto-relabel) in the future.

于 2015-03-03T16:50:50.390 に答える
0

環境: Linux - SSD 上のルート ファイル システム DocumentRoot 上の HDD および fstab 経由でマウント 起動後に apache2 を再起動 - 問題なし fstab のマウントが完了する前に apache が開始されるのは、タイミングの問題のようです。

回避策: 正しい所有者、グループ、および権限を使用して、ルート ファイル システムに DocumentRoot ディレクトリを定義します。ディレクトリが空である可能性があります。

于 2015-02-10T12:46:24.957 に答える