Nginx Setting server_names_hash_max_size और server_names_hash_bucket_size


22

हम निगनेक्स को अपाचे में एक रिवर्स प्रॉक्सी के रूप में एक सेवा में उपयोग कर रहे हैं जो किसी को भी अपनी वेबसाइट देता है। खाता निर्माण के समय, सिस्टम दो प्रविष्टियों के साथ डोमेन के लिए एक नई nginx conf फ़ाइल बनाता है, एक पोर्ट 80 के लिए, दूसरा 443 के लिए। हम सूचित कर रहे हैं कि हर 30 या तो डोमेन में, हमें त्रुटि मिलती है:

Restarting nginx: nginx: [emerg] could not build the server_names_hash, 
you should increase either server_names_hash_max_size: 256 
or server_names_hash_bucket_size: 64.

लगभग 200 डोमेन और बढ़ते हुए हमें server_names_hash_max का आकार 4112 तक बढ़ाना पड़ा है और वे चिंतित हैं कि यह अच्छा नहीं होगा। मैं यह समझने के लिए देख रहा हूं कि ये कॉन्फ़िगरेशन कैसे काम करते हैं और यह सुनिश्चित करने के लिए इष्टतम सेटिंग्स क्या होंगी ताकि हम इस पद्धति का उपयोग करके हजारों डोमेन तक बढ़ सकें।

इसके अलावा, उस हैश के आकार के नगनेक्स को फिर से लोड करने के लिए सेकंड लगने शुरू हो रहे हैं, जिससे सिस्टम पुनरारंभ होने के दौरान अनुपलब्ध हो सकता है।

यहाँ समग्र सेटिंग्स हैं (उबंटू सर्वर 10.10 नगनेक्स / 1.0.4 पर चल रही हैं):

user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
    worker_connections 4096;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 300;
    types_hash_max_size 2048;
    # server_tokens off;

    server_names_hash_bucket_size 64;
    # server_name_in_redirect off;
    # server_names_hash_max_size 2056;
    server_names_hash_max_size 4112;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;

ssl_session_cache shared:SSL:10m;
ssl_ciphers ALL:!kEDH:-ADH:+HIGH:+MEDIUM:-LOW:+SSLv2:-EXP;
}

(नीचे सिफर युगल मुख्य साइट विन्यास और एक पकड़ है):

include /etc/user-nginx-confs/*;

server {
listen 80;
server_name .domain.com;
location / {
proxy_pass http://127.0.0.1:8011;
proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-SystemUse-Header 111;
}
}

server {
listen 443 ssl;
server_name .suredone.com;
ssl_certificate /etc/apache2/sddbx/sdssl/suredone_chained.crt;
ssl_certificate_key /etc/apache2/sddbx/sdssl/suredone.key;
location / {
proxy_pass http://127.0.0.1:44311;
proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-SystemUse-Header 111;
}
}

server {
listen 80 default_server;
listen 443 default_server ssl;
server_name _;
ssl_certificate /ssl/site_chained.crt;
ssl_certificate_key /ssl/site.key;
return 444;
}

(और एक नमूना उपयोगकर्ता conf फ़ाइल)

server {
listen 80;
server_name username.domain.com;
location / {
proxy_pass http://127.0.0.1:8011;
proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-SystemUse-Header 1111;
}
}

server {
listen 443 ssl;
server_name username.domain.com;
ssl_certificate /ssl/site_chained.crt;
ssl_certificate_key /ssl/site.key;
location / {
proxy_pass http://127.0.0.1:44311;
proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-SystemUse-Header 1111;
}
}

किसी भी मदद और निर्देश बहुत सराहना की है !!

जवाबों:


14

उन serverनामों की सूची, जो नगनेक्स परोसते हैं , को तेजी से देखने के लिए हैश तालिका में संग्रहीत किया जाता है । जैसे ही आप प्रविष्टियों की संख्या बढ़ाते हैं, आपको हैश तालिका का आकार और / या तालिका में हैश बाल्टी की संख्या को बढ़ाना होगा।

आपके सेटअप की प्रकृति को देखते हुए, मैं आसानी से serverआपके द्वारा तालिका में संग्रहित किए जाने वाले नामों की संख्या को कम करने के लिए किसी भी तरह से नहीं सोच सकता । मैं सुझाव दूंगा, हालांकि, कि आप नगनेक्स को "पुनः आरंभ" नहीं करते हैं, बल्कि इसके विन्यास को पुनः लोड करते हैं। उदाहरण के लिए:

service nginx reload

यह सवाल के उत्तरार्द्ध के लिए बहुत अच्छा है, धन्यवाद। तो क्या मुझे चिंतित होना चाहिए कि Server_names_hash_max_size लगभग 20000 से 10000 डोमेन तक पहुंच जाएगा?
jasonspalace

जब आप nginx को पुनरारंभ करते हैं तो यह केवल एक समस्या है। जैसा कि मैंने कहा, reloadइसके बजाय जब भी समस्या से बचने के लिए संभव है।
माइकल हैम्पटन

23

बस कुछ तकनीकी विवरण जो मैंने खोले हैं, स्रोत कोड बनाते हैं:

  • सामान्य अनुशंसा दोनों मानों को यथासंभव छोटा रखना होगा।
  • max_sizeजब तक शिकायत होती है, तब तक नगनेक्स की शिकायत बढ़ जाती है । यदि संख्या कुछ बड़ी संख्या (उदाहरण के लिए 32769) bucket_sizeसे अधिक है, तो जब तक यह शिकायत करता है, तब तक आपके प्लेटफ़ॉर्म पर कई डिफ़ॉल्ट मान बढ़ाएं । यदि यह अब शिकायत नहीं करता है, तब तक कम करें max_sizeजब तक कि यह शिकायत न करे। अब आपके पास सर्वर नामों के सेट के लिए सबसे अच्छा सेटअप है (प्रत्येक सर्वर_नाम के सेट को अलग सेटअप की आवश्यकता हो सकती है)।
  • बड़ी का max_sizeमतलब है अधिक मेमोरी खपत (एक बार प्रति कार्यकर्ता या सर्वर, कृपया टिप्पणी करें यदि आप जानते हैं)।
  • बड़ा का bucket_sizeअर्थ है अधिक CPU चक्र (प्रत्येक डोमेन नाम देखने के लिए) और मुख्य मेमोरी से कैश में अधिक स्थानान्तरण।
  • max_sizeसीधे सर्वर_नाम की संख्या से संबंधित नहीं है, यदि सर्वर की संख्या दोगुनी हो जाती है, तो आपको max_sizeटकराव से बचने के लिए 10 गुना या इससे भी अधिक वृद्धि करने की आवश्यकता हो सकती है । यदि आप उनसे बच नहीं सकते, तो आपको बढ़ाना होगा bucket_size
  • bucket_size कहा जाता है कि दो की अगली शक्ति तक बढ़ा दी जाएगी, स्रोत कोड से मैं यह निर्धारित करूंगा कि यह डिफ़ॉल्ट मूल्य के कई बनाने के लिए पर्याप्त होना चाहिए, इससे कैश को इष्टतम रखने के लिए स्थानान्तरण होना चाहिए।
  • औसत डोमेन नाम हैश सरणी ओवरहेड के साथ भी 32 बाइट्स में फिट होना चाहिए। यदि आप bucket_size512 बाइट्स तक बढ़ाते हैं , तो यह हैश कीज को टकराने के साथ 16 डोमेन नामों को समायोजित करेगा। यह कुछ ऐसा नहीं है जो आप चाहते हैं, अगर टक्कर होती है तो यह रैखिक रूप से खोज करता है । आप यथासंभव कम टकराव करना चाहते हैं।
  • यदि आपके पास max_size 10000 से कम और छोटा है bucket_size, तो आप लंबे समय तक लोडिंग समय पर आ सकते हैं क्योंकि nginx एक लूप में इष्टतम हैश आकार खोजने की कोशिश करेगा।
  • यदि आपके पास max_size10000 से बड़ा है, तो शिकायत करने से पहले "केवल" 1000 लूप का प्रदर्शन किया जाएगा।

यह महान जानकारी है; अनुसंधान और लिखने के लिए धन्यवाद।
Womble

@brablc मैं उत्सुक हूं कि आप उदाहरण के लिए 32769 पर कैसे पहुंचे। वर्तमान ढेर के आकार को व्हाट्स अप कहां देख सकता है?
यूएचएल होस्टिंग

कब्जा की गई मेमोरी अधिकतम होगी * bucket_size (लेकिन मुझे नहीं पता कि यह साझा है या प्रति कार्यकर्ता)। मेरे पास 8000 सर्वर नाम थे और 32769 पहले से ही उच्च महसूस कर रहे थे। लेकिन अगर आपके पास बहुत अधिक मेमोरी है तो आप उच्च स्तर पर जाना चाहते हैं।
brablc

4

अपने nginx.conf के अंदर "server_names_hash_bucket_size" कॉन्फ़िगरेशन बढ़ाएँ।

मेरे पास यह 64 था और बदलकर 128 हो गया।

समस्या सुलझ गयी।


2

@ मिचेल हैम्पटन अपने उत्तर के साथ बिल्कुल सही है। यह हैश टेबल पुनः आरंभ या पुनः लोड के दौरान निर्मित और संकलित किया जाता है और बाद में यह बहुत तेजी से चल रहा है। मुझे लगता है कि यह हैश तालिका प्रदर्शन को नीचा दिखाने के बिना बहुत अधिक बढ़ सकती है। लेकिन मैं एक आकार का उपयोग करने का सुझाव दूंगा जो कि सी कोड की प्रकृति के कारण 4096 की तरह दो की शक्ति है।


किस आधार के साथ दो की शक्ति, क्या यह 512 के डिफ़ॉल्ट के गुणकों में बढ़ने के लिए सही है?
jasonspalace 14

हाँ बिल्कुल।
फ्लेशग्राइंडर

1

मुझे आपके मामले में 100% यकीन नहीं है, लेकिन मुझे एक ही चेतावनी मिल रही थी क्योंकि मैं दो बार X- फॉरवर्ड-प्रोटो के लिए प्रॉक्सी_सेट_हीडर कह रहा था:

proxy_set_header X-Forwarded-Proto ...;

ऐसा इसलिए हो रहा था क्योंकि मैं प्रॉक्सी_परम सहित शामिल था, और इसमें यह लाइन दूसरों के बीच है:

proxy_set_header X-Forwarded-Proto $scheme;

मेरी साइट के कॉन्फ़िगरेशन से उस लाइन को हटाने से चेतावनी चली गई।


1
वास्तविक $ $ $ सलाह, धन्यवाद।
14

-2

परिवर्तन

proxy_set_header X-Forwarded-For $remote_addr;

सेवा

proxy_set_header X-Real-IP $remote_addr;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.