1. ホーム
  2. LINUX

Apache の一般的な設定エラー

2022-02-19 10:06:27

よくあるApacheの設定ミス

このページでは、#apacheでよく見られる設定ミスと、それがなぜ間違っているのかを説明します。

#Note: このページでは、#apache でよく見られる設定ミスと、それがなぜ間違っているのかを説明します。

  1. Apacheのよくある設定ミス   
      1. 名前ベースのバーチャルホスト           
        1. NameVirtualHostの値と対応する<VirtualHost>ブロックが一致しない。
        2. バーチャルホストにServerNameが設定されていない。
        3. 非ポートベースのバーチャルホストとポート名ベースのバーチャルホストが混在している。
        4. 同じListenやNameVirtualHostを複数回使用する。
        5. 同じインターフェイスに複数のSSL名前ベースのバーチャルホストがある。
      2. スコープ           
        1. ディレクトリへのアクセスおよびオプションの追加/制限 />
        2. 古いDocumentRootの<Directory>ブロックを更新せずにDocumentRootの値を変更する
        3. スクリプト・エイリアスされたディレクトリにディレクトリとインデックスのオプションを設定しようとしている。

<スパン ネームベースバーチャルホスト NameVirtualHostの値が対応する<Virtual>ブロックと一致しない。

# Note: Nameベースのバーチャルホストの定義にある <Virtual XXX> は NameVirtualHost で指定された ip アドレス/ポートとは一致しません。

NameVirtualHost *:80 # Note: Specifies listening on port 80 at all addresses

# これは間違っています。NameVirtualHost some.domain.com の行にマッチするものがありません。

<VirtualHost some.domain.com> # Note: But here some.domain.com is an outside address

# Options and stuff defined here.

</VirtualHost>

# これは正しいでしょう。

<VirtualHost *:80> # Note: Something like this is the match for NameVirtualHost

ServerName some.domain.com

# Options and stuff defined here.

</VirtualHost>

いくつかの点で間違っています。最も明白なのは、最初の <VirtualHost> ブロックで使われている some.domain.com です。もう一つは、NameVirtualHost がドメインではなく、インターフェースを参照しているということです。NameVirtualHost 1.1.1.1:80 はポート 80 の 1.1.1.1 として定義されたインタフェースを捕らえることを意味します。NameVirtualHost some.domain.com/<VirtualHost some.domain.com>" の組み合わせを使うことはできますが、これは本当に意味がなく、使われません... 少なくともApache管理の経験がある人は使いません。

#注:実は、上記の例には2つの間違いがあります。

# -) 1. 明らかに、some.domain.com は NameVirtualHost で指定された *:80 と一致しない。

# -) 2.NameVirtualHostは固定のドメイン名を指しておらず、代わりに*を使っているので間違っている。一方、NameVirtualHostは明示的にIPアドレスまたはドメイン名を指定した方が良いだろう。

# 注:NameVirtualHost <some.domain.com:80> と <VirtualHost some.domain.com:80></VirtualHost> はもちろん使えますが、明らかに意味を成しません。

# 自分の管理下にないホストをコントロールすることはできないので、構文的には正しいだけで、実用的な効果はない、ということです

バーチャルホストにServerNameを設定しない

# 注意:ServerName は VirtualHost の定義で指定されていません。

NameVirtualHost *:80 

# これは正しいでしょう。

<VirtualHost *:80>

ServerName some.domain.com

# Options and stuff defined here.

</VirtualHost>

# これは間違いです。

<VirtualHost *:80>

# Options and stuff defined here, but no ServerName

</VirtualHost>

名前ベースのバーチャルホストを使う場合、ServerName は Apache がどのバーチャルホストの設定を使うかを決めるために使われるので、2 番目のバーチャルホストは間違っています。名前ベースのバーチャルホストを使うときのホストは、最初に定義されたバーチャルホストです。

# Note: これは名前ベースのバーチャルホストなので、ServerName を指定する必要があります。Apache は HTTP リクエストの Host: ヘッダに基づいて、ServerName にマッチするものを探します。

# バーチャルホストの数 (ServerName の値は Host: ヘッダの値と同じです)。バーチャルホストに ServerName を指定しない場合、Apache は決して

#2 番目のバーチャルホストの設定はデフォルトのバーチャルホストを使います (Name ベースのバーチャルホストが使われた場合、1 番目のバーチャルホストは自動的にデフォルトのバーチャルホストと呼ばれます)。

非ポートとポート名ベースのバーチャルホストを混在させる。

# 注意:名前ベースのバーチャルホストの定義では、あるポートは指定され、あるポートは指定されません。

NameVirtualHost * 

NameVirtualHost *:80

<VirtualHost *>

ServerName some.domain.com

# Optionen und andere Dinge werden hier definiert.

</VirtualHost>

<VirtualHost *:80>

ServerName some.domain2.com

# Optionen und andere Dinge werden hier definiert.

</VirtualHost>

NameVirtualHost * はすべてのポートですべてのインターフェイスをキャッチすることを意味するので、*:80 のバーチャルホストは決してキャッチされないでしょう。Apache へのすべてのリクエストは *:80 のバーチャルホストが使われることになります。

# 注意: 上記の例では、1つ目の NameVritualHost はすべてのポートのすべてのインターフェイスを listen することを意味するので、2つ目の NameVirtualHost は決して使われません。

# したがって、各リクエストは最初のバーチャルホストの設定を使って Apache に応答します。

同じListenやNameVirtualHostを複数回使用する。

# Note: Listen ディレクティブと NameVirtualHost ディレクティブの繰り返しの使用 (通常は複数のプロファイルのコンテキストで)

# Kann passieren, wenn mehrere Konfigurationsdateien verwendet werden. 

# In einer Konfigurationsdatei:

Listen 80

# In einer anderen Konfigurationsdatei:

Listen 80

# 上記のように、複数の設定ファイルを使用する場合に発生する可能性があります。

# In einer Konfigurationsdatei:

NameVirtualHost *:80

# In einer anderen Konfigurationsdatei:

NameVirtualHost *:80

Listen ディレクティブが複数ある場合、Apache は一度目はポート 80 にバインドし、二度目はポート 80 にバインドしようとします。これは、起動時に " Could not bind to port" エラーを発生させます。これは、初心者や、DebianベースのディストロがListen 80を持っている場合に起こるようです。これは、初心者や、Debianベースのディストロがports.confでListen 80を定義している場合に起こるようです。初心者はこれに気づかず、apache2.confにListen 80の行をもう一つ作ってしまう。

#注意:これは問題ないと思うかもしれませんが、残念ながらApacheは繰り返しポート80にバインドしようとするので、Apacheの起動時に "Could not bind to port" エラーを発生させます。

# メッセージが表示されます。Debina ディストリビューションでは、すでに ports.conf で Listen 80 が定義されているので、初めて利用する人は、apache2.conf でこれを確認します。

# で再度定義します。

複数のNameVirtualHost行で "NameVirtualHost *:80 has no VirtualHosts" という警告が発生します。これは複数のバーチャルホスト設定ファイルを使用していて、 特定の NameVirtualHost 行を一度だけ定義する必要があることを 理解していない場合に起こるようです。

# Note: Multiple NameVirtualHosts も動作しませんし、 'NameVirtualHost *:80 has no VirtualHosts"' というエラーも発生します、 Apache は 2 番目のディレクティブを無視して 1 番目の NameVirutalHost を使うだけです。

# 追記: 複数の NameVirtualHost が異なるアドレスでリッスンしている場合、これは許可されます。

同じインターフェイスに複数のSSL名前ベースのバーチャルホストが存在する。

# コメント 同じアドレス(ドメイン)を使用する複数のNameベースのバーチャルホストのSSLを有効にする

NameVirtualHost *:443 

<VirtualHost *:443>

ServerName some.domain.com

# SSL-Optionen, andere Optionen und andere Dinge werden hier definiert.

</VirtualHost>

<VirtualHost *:443>

ServerName some.domain2.com

# SSL-Optionen, andere Optionen und andere Dinge, die hier definiert werden.

</VirtualHost>

SSLはその性質上、最初にSSL接続を確立する際にホスト情報を使用しません。これは2番目のバーチャルホストにアクセスできないということではありませんが、ユーザーが some.domain2.com にアクセスしようとすると、証明書の不一致のポップアップ警告が常に表示されることになります。これについては http://httpd.apache.org/docs/2.2/ssl/ssl_faq.html#vhosts2。

     #注:SSLはHTTPとTCPの間の中間層であり、両端間の通信データを暗号化するため、これもよくある問題です。

     # SSL 接続が確立されるまで、HTTP リクエストの Host: を見る方法はなく、Host: ヘッダの値を見なければ、Apache は何をすればいいのかわかりません。

     # Nameベースのバーチャルホストで応答するため、Apacheは上記のようにNameベースのバーチャルホストで応答を修正します(以下を含む)

     # そのバーチャルホストで定義されたSSL証明書)。これは次の段落で見ることができます。

異なるSSLバーチャルホストを識別するために、名前ベースのバーチャルホストを使用することはなぜ不可能なのでしょうか?

ネームベースバーチャルホスティングは、異なるバーチャルホストを識別するための非常に一般的な方法です。人々が SSL に移行したとき、同じ方法でたくさんの異なる SSL 仮想ホストを持つことができると考えるのは自然なことだと思います。 同じ IP アドレスと同じポート番号を多くの異なるサイトに使うことができます。

<スパン それが不可能だと知って、むしろショックを受けています。

なぜなら、SSLプロトコルはHTTPプロトコルをカプセル化する別のレイヤーだからです。サーバは IP アドレス X とポート Y(通常 443)で SSL リクエストを受け取ります。SSL リクエストは Host: フィールドを含んでいないので、 サーバはどの SSL バーチャルホストを使うか決定する方法がありません。通常、サーバは指定されたポートと IP アドレスにマッチするものを最初に見つけます。

<スパン もちろん、名前ベースのバーチャルホストを使用して、多くの非SSLバーチャルホスト(例えば、すべてポート80上)を識別し、単一のSSLバーチャルホスト(ポート443上)を持つことができます。しかし、そうする場合は、NameVirtualHost ディレクティブに非 SSL のポート番号を必ず書いてください。

.
NameVirtualHost 192.168.1.1:80

その他の回避策としては、以下のようなものがあります。

<スパン 異なるSSLホストに対して、別々のIPアドレスを使用する。異なるSSLホストのために異なるポート番号を使用する .

ただし、Debian/UbuntuのHowtosでは、NameVirtualHost *:443の利用が一般的です。

# Note: また、SSLを使用しているので、通常このような共有ipは使用せず、SSLサーバーごとにipを1つ使用します。

# 詳しくは上の太字の部分をご覧ください

  # +++++++++++++++++++++++++++++++++++++++++++++++ スコープ <Directory /> のアクセスおよびオプションを追加/制限する。

# コメント ディレクトリ /> にアクセス制御文を追加します。

<Verzeichnis /> 

# Dies wurde von der Standardeinstellung AllowOverride None geändert.

AllowOverride FileInfo Indexes

# Standardrichtlinien sind unten definiert.

</Directory>

ファイルシステムのパスです。この <Directory> ブロックに変更を加えても、あなたのウェブサイトには何の影響もありません 上記の例では、どのような m

問題は、AllowOverrideのため、htaccessファイルは依然として無視されることです。   が間違った <Directory> ブロックに設定されています。

# 注意: <Directory /> は DocumentRoot が参照しているディレクトリではなく、実際のファイルシステム/ディレクトリであるためです。そのため、ここでの設定はDocumentRootで指定されたディレクトリに何の影響も与えません。

# DocumentRoot へのアクセスを制限したい場合は、 <Directory /var/www/html> または /var/www/html/.htaccess で行う必要があります。

# 追記: httpd.confにあるこれら2つのディレクトリのデフォルトの設定は以下の通りです。

# まず、"default" を非常に制限的に設定します。

# 特徴

#

<ディレクトリ />

    オプション FollowSymLinks

    AllowOverride なし

</Directory>

#

# この時点から、特に許可しなければならないことに注意してください。

# 特定の機能を有効にする - そのため、何かがうまくいかない場合

# あなたが期待するかもしれない、あなたが特にそれを有効にしているかどうか確認してください。

# 以下で説明します。

#

#

# これはDocumentRootを設定したものに変更する必要があります。

#

<Directory "/var/www/html">

#

# Options ディレクティブで指定可能な値は "None"、"All"です。

# または任意の組み合わせで

# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews

#

# "MultiViews" は *明示的* に --- "Options All" と名付けなければならないことに注意してください。

# はそれを与えない。

#

# Options ディレクティブは、複雑かつ重要です。

# http://httpd.apache.org/docs-2.0/mod/core.html#options

# をご覧ください。

#

オプション Indexes FollowSymLinks

#

# AllowOverride は .htaccess ファイルにどのようなディレクティブを置くことができるかを制御します。

# これは "All", "None" または任意のキーワードの組み合わせにすることができます。

# オプション FileInfo AuthConfig Limit

#

AllowOverride なし

#

# 誰がこのサーバーから物を取得できるかを制御します。

#

注文の許可、拒否

    すべてから許可する

</Directory>

<スパン

古いDocumentRootの<Directory>ブロックを更新せずにDocumentRootの値を変更する

# コメント DocumentRootの値を変更しましたが、古いDocumentRootの <Directory></Directory> 設定セグメントは更新されていません。

# Ihr alter DocumentRoot-Wert war /usr/local/apache2/htdocs. 

DocumentRoot /var/www/html

#

# Dies sollte auf den Wert geändert werden, auf den Sie DocumentRoot gesetzt haben.

#

<Verzeichnis /usr/local/apache2/htdocs>

# Optionen und Zugriff werden hier festgelegt.

</Verzeichnis>

Apacheでのアクセスやオプションは明示的に与える必要があります。新しいドキュメントルートには、アクセスやオプションを許可する <Directory> ブロックがないため、サイトにアクセスしようとするとパーミッションエラーが発生します。この場合、サイトにアクセスしようとすると、パーミッションエラーが発生します。

# Note: 上記のDocumentRootは/var/www/htmlを指していますが、リダイレクト先の設定セグメントには <Direcotry></Directory> は存在しません。

# だから403(Forbiden)エラーが発生するかもしれない

スクリプト・エイリアスされたディレクトリにディレクトリとインデックス・オプションを設定しようとしています。

# コメント ScriptAliasで指定したディレクトリでIndex関数を起動してみるか、DirectoryIndexを定義してください。

ScriptAlias /cgi-bin/ /var/www/cgi-bin/ 

<Verzeichnis /var/www/cgi-bin>

AllowOverride None

Optionen Indizes ExecCGI

VerzeichnisIndex index.cgi

# Andere Optionen definiert.

</Verzeichnis>

スクリプト・エイリアスされたディレクトリでは、オプション・インデックスで指定されたディレクトリのリストアップを行うことはできません。DirectoryIndex ディレクティブもスクリプトエイリアスディレクトリでは動作しません。ディレクトリリストや他のディレクトリインデックスオプションが本当に必要な場合の回避策は、 ScriptAlias の代わりに Alias を使用することです。

# 注意: ScriptAliasで指定されたディレクトリでは、インデックス作成を有効にしたり、 デフォルトのインデックスページを設定することができないので注意が必要です。これは明らかにセキュリティ上の理由からで、そうでなければ誰もがCGIスクリプトをダウンロードできてしまうからです。

# また、ScriptAlias で指定されたディレクトリにあるすべてのファイルは CGI プログラムとして試行されるため、ExecCGI オプションを手動で指定する必要はありませんが、本当に必要であれば Alias を代わりに使用してください

# ScriptAliasコマンドを使用しますが、このコマンドを使用しないことをお勧めします。

# 追記: cgi-bin/ ディレクトリのデフォルトの設定は以下の通りです。

# ScriptAlias: どのディレクトリにサーバースクリプトを格納するかを制御します。

# ScriptAliases は基本的に Aliases と同じですが、次の点が異なります。

# realnameディレクトリにあるドキュメントは、アプリケーションとして扱われ

# クライアントに送られるドキュメントとしてではなく、要求されたときにサーバーによって実行されます。

# ScriptAlias ディレクティブの末尾の "/" は、以下のディレクティブと同じルールが適用されます。

# エイリアス

#

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

#

# "/var/www/cgi-bin" は、ScriptAliased のものに変更する必要があります。

# CGI ディレクトリが設定されている場合、存在します。

#

<Directory "/var/www/cgi-bin">

    AllowOverride なし

    オプション なし

    許可、拒否の順序

    すべてから許可する

</Directory>

Alias /cgi-bin/ /var/www/cgi-bin/ 

<Verzeichnis /var/www/cgi-bin>

AllowOverride None

Optionen Indizes ExecCGI

AddHandler cgi-Skript .cgi

VerzeichnisIndex index.cgi

# Andere Optionen definiert.

</Verzeichnis>

上記のオプションが動作するようになりました。

から取得した。 http://www.ubooo.com/Article/view-1259.html