なぜnginx server_nameディレクティブの最大長は14文字ですか?


13

次の仮想ホストがあります

server
{
  server_name abc.example.com;
  root /var/www/test/;
  index index.html;
}

実行するnginx -s reloadと、次のエラーが表示されます。

nginx:[emerg] server_names_hashを構築できませんでした。server_names_hash_bucket_sizeを増やす必要があります:32

15文字以上のserver_nameでも同様です。

server_nameをab.example.com(または15文字未満の任意の名前に)設定すると、問題は明らかになりません。

これを修正するために、以下を追加しました/etc/nginx/nginx.conf(以前は定義されていませんでした):

server_names_hash_bucket_size 64;

33に設定しても機能しましたが、32ではありませんでした。

server_nameのデフォルトの最大長が14文字であるのはなぜですか?

この制限は、nginxのデフォルト設定またはそれが実行されるシステムによって課されていますか?

server_nameの15は、ハッシュバケットの最大サイズにどのように影響しますか?(システムに定義されている仮想ホストは4つのみです)


内容はgrep "" /sys/devices/system/cpu/cpu?/cache/index?/coherency_line_size何ですか?
ザビエルルーカス

@XavierLucas:/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size:64 /sys/devices/system/cpu/cpu0/cache/index1/coherency_line_size:64 /sys/devices/system/cpu/cpu0/cache/index2/coherency_line_size:64
Virgiliu

回答:


11

このエラーは、server_name大きすぎてハッシュバケットに収まらない場合に発生します

のデフォルトserver_names_hash_bucket_sizeは、サーバーのCPUキャッシュラインサイズに応じて選択されます。特に、リクエストごとにsを検索する必要があるため、CPUキャッシュミスを減らすために、可能な限り小さくすることを意図していますserver_name

予想される31文字ではなく14文字に制限されている理由については、次の2つの可能性のいずれかが疑われます。

  • 構成ファイルは、UTF-8ではなくUTF-16エンコード(またはその他のエンコード)であり、生データのすべての文字の前後にヌルが表示され、サイズが2倍になります。これは、Windowsでファイルを編集する場合に発生する可能性があります。この場合は、何かiconvを修正するために使用してください。
  • nginxの未知のバグに遭遇しました。

Vimによれば、fileencoding = utf-8です。iconvを使用して変換を行い、エンコードがUTF8であることを確認しましたが、nginxの動作に変更はありません。私のVPSには非常に小さなキャッシュラインサイズのCPUがあるかもしれませんが、それをチェックする方法はありますか?
ヴィルギウ

妥当な値は、nginxが正常に起動する最小の2の累乗です。VPSをお持ちの場合は、ほぼ何でもできます...
マイケルハンプトン

6

デフォルトの長さは、使用中のサーバー名に応じて、起動時に自動的に決定される必要がありますが、reload操作中に更新される必要もあります。バケットサイズを手動で設定せずに、リロードではなく再起動を使用して動作するかどうかを確認します。

参照http://nginx.org/en/docs/hash.htmlをハッシュサイズが決定され、どのように学習するhttp://nginx.org/en/docs/http/server_names.htmlをサーバ名に使用するハッシュ読んします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.