私はほぼ間違いなく初心者の質問です。この質問を書いているときに問題を見つけると思っていましたが、まだ行き詰っています。
ApacheのDocumentRootを変更したいのですが、「DocumentRoot must a a directory」というエラーメッセージが表示され続けます。
状況:
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で機能することを確認しました)、特権が問題にならないことを確認するために食い止めました。
Stackoverflow
スタックオーバーフローの回答はいくつかありますが、そのほとんどは「エラーメッセージを読んでください。ディレクトリが実際には存在しないと言っています」と言っています。他の人は、最後に悪いスラッシュが続くかもしれないと暗示しました。
他のウェブサイト
私が見つけた最も有用なのは this アドバイスした
SELinux拡張機能のために実際にはディレクトリであっても、「DocumentRoot must a directory」エラーが表示される可能性があります。 system-config-securitylevel(またはredhat-config-securitylevel)を実行して、httpdのSELinuxを無効にするか、そのディレクトリに対するSELinuxパーミッションを付与します。chcon -R -h -t httpd_sys_content_t/path/to/directory *
私のバージョンのLinuxはSecurity Enhanced Linuxではないため、理解することなく試してみましたが、効果はありません。
現在の状況
試したいアイデアが足りないので、診断に関する質問やアドバイスは大歓迎です
「その他のWebサイト」の下に投稿したリンクは、問題の根本原因である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
この変更を行った後、サーバーを再起動することをお勧めします。
SELinuxを無効にするだけではいけません。
Httpd_enable_homedirsをonに設定する必要があります。
yum -y install policycoreutils-python
setsebool -P httpd_enable_homedirs on
今日もこの問題に遭遇しました。それは、DocumentRootを/ var/www/htmlから/ srv/www/htmlに移動したためです。セキュリティポリシーの一部として、SELinuxを無効にするオプションはありません。
私が発見したように、私の修正は、/ srvのSELinuxファイルコンテキストを/ varに一致するように変更することでした。妥協はありますが、それを完全に無効にするよりはましです。それ以外...私は/ srv/wwwとすべてのサブフォルダーが/ var/wwwの下のフォルダーに一致するhttpd_sys_content_tを持っていることを確認しました。
これは基本的にDavidのものと同じ答えですが、少し明確になっていますが、http提供ディレクトリに間違ったSELinuxセキュリティコンテキストが設定されています。
これを修正する完全な説明はこちら http://mybroadband.co.za/vb/showthread.php/588183-Fix-403-Forbidden-on-newly-configured-CentOS-6-5-httpd -server-(または-13-10-Ubuntu-LAMP)
私の問題は、/ var/www /のdocumentrootパスとは異なるディレクトリ内にWebサイトを格納していたため、上記のリンクの3番目のオプションに従って修正する必要があったことです。/websites /ディレクトリの同じファイルコンテキストを/ var/www /のそれと一致するように設定します。奇妙なことに、CentOS 5.5の以前のバージョンではSELinuxがインストール/有効化されていてはなりませんでした。他のサーバーではこれに問題はなく、コマンドでls -Zを実行すると、プロンプトはそれらのフォルダーを「ラベルなし」として表示していました。
公式マーケットプレイスの最小インストールからAWSでCentOS 6.5を実行しています。そのため、フォルダーでls -Zコマンドを実行すると、上記のリンクが表示される可能性のある問題を正確に確認できました。
Chconコマンドを実行すると問題が解決しました!
Html /を使用したいディレクトリに置き換えてください!
chcon -Rv --type = httpd_sys_content_t html /
chcon -Rv --user = system_u html /
また、ルーティングを機能させるためにiptablesを無効にする必要がありましたが、デフォルトでは空白ページが表示されていました。
サービスiptables停止
同じ問題を抱えている人に役立つことを願っています。
まず、この問題を解決するためにselinuxをオフにする理由はまったくなく、selinuxファイルのコンテキストを変更するだけです。
第二に、selinuxファイルコンテキストを変更する場合、そのパスにpermanentルールを設定する必要があります。これにより、新しいファイルがコピーされたり既存のファイルを置き換えたりすると、restorecon
が実際に修正されますchcon
のみを使用する場合のように、問題を破壊する代わりに。
したがって、シンボリックリンクされたDocumentRootの場合(この例では、ディレクトリへの実際のフルパスを「/ media/myDoc」として指定します)、次の2つのコマンドを実行します。
semanage fcontext -a -t httpd_sys_content_t "/media/myDoc(/.*)?"
restorecon -R /media/myDoc
この方法でsemanageを使用する場合、フルパスが必要であることに注意してください。問題を修正するだけでなく、将来restorecon
(または自動再ラベル付け)を実行しても問題は解決しません。
環境:Linux-HDD上のSSD DocumentRoot上のルートファイルシステムとfstabを介してマウントされるブート後にApache2を再起動する-問題なしfstabのマウントが完了する前にApacheが起動するタイミングの問題のようです。
回避策:正しい所有者、グループ、およびアクセス許可を使用して、ルートファイルシステムのDocumentRootディレクトリを定義します。ディレクトリは空かもしれません。