[emerg] could not build server_names_hash, you should increase server_names_hash_bucket_size:32


解決nginx報錯
nginx: [emerg] could not build server_names_hash, you should increase server_nam
es_hash_bucket_size: 32
nginx: configuration file xxxx/conf/nginx.conf test failed

報錯原因
該報錯產生的原因主要是因為Nginx中的server配置中server_name的定義值過長產生的。
解決方法
在Nginx的http字段內添加如下代碼,放大默認bucket_size

http {
        server_names_hash_bucket_size 64;
        .....
    }
    注意:如果已經存在該字段信息,需要加大后面的數值。且數值必須是32的倍數

這時候可能有的同學要問了,他的默認值是多少。根據Nginx的官方文檔分析,server_names_hash_bucket_size的默認值有可能是32也有可能是64,或者是其他值,這個默認值的大小取決於CPU的緩存行長度,如果這個值是32,那么定義的如下代碼就會報錯

server {
        listen 80;
        server_name www.mslinux.zhongguolong.too.com;  # >=32就會報錯
}
如果域名數量=32報錯就和文檔中一致。此時就需要我們將指令值放大;
http {
        server_names_hash_bucket_size 64;
}
在執行nginx -t將會報錯解決

  如果定義了一條特別長的server_name。報錯如下面代碼所示

could not build the server_names_hash,
you should increase either server_names_hash_max_size: 512
or server_names_hash_bucket_size: 32
那么應該先嘗試設置server_names_hash_max_size的值差不多等於名字列表的名字總量。如果還不能解決問題,或者服務器啟動非常緩慢,再嘗試提高server_names_hash_bucket_size的值。

http {
        server_names_hash_max_size 【值為域名長度總和】;
        server_names_hash_bucket_size 【上升值】;
}

具體為什么要這么配置我也不太清楚原因,於是從網上找了一些資料,受限於自己的水平無法辨別真偽和准確度。

保存服務器名字的 `hash` 表是由指令 `server_names_hash_max_size` 和 server_names_hash_bucket_size 所控制的。參數hash bucket size總是等於hash表的大小,並且是一路處理器緩存大小的倍數。在減少了在內存中的存取次數后,使在處理器中加速查找hash表鍵值成為可能。如果 hash bucket size等於一路處理器緩存的大小,那么在查找鍵的時候,最壞的情況下在內存中查找的次數為2。第一次是確定存儲單元的地址,第二次是在存儲單元中查找鍵值。因此,如果Nginx給出需要增大 hash max size 或 hash bucket size的提示,那么首要的是增大前一個參數的大小.




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM