解決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的提示,那么首要的是增大前一個參數的大小.