Nginx সেটিং সার্ভার_নাম_হ্যাশ_ম্যাক্স_সাইজ এবং সার্ভার_নাম_হ্যাশ_বকেট_সাইজ


22

আমরা এনগিনেক্সকে এমন একটি পরিষেবাতে অ্যাপাচে বিপরীত প্রক্সি হিসাবে ব্যবহার করছি যা কাউকে নিজের ওয়েবসাইট দেয়। অ্যাকাউন্ট তৈরির সময়, সিস্টেমটি ডোমেনের জন্য একটি নতুন এনগিনেক্স কনফাইব ফাইল তৈরি করে যেখানে দুটি এন্ট্রি রয়েছে, একটি পোর্ট 80 এর জন্য, অন্যটি 443-র জন্য।

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 টি ডোমেন এবং ক্রমবর্ধমান সহ আমাদের সার্ভার_নাম_হ্যাশ_ম্যাক্স আকারটি 4112-এ আপ করতে হয়েছে এবং উদ্বিগ্ন যে এটি ভালভাবে স্কেল হচ্ছে না concerned এই কনফিগারেশনগুলি কীভাবে কাজ করে এবং এই পদ্ধতিটি ব্যবহার করে আমরা কয়েক হাজার ডোমেইনে উন্নত হতে পারি তা নিশ্চিত করার জন্য সর্বোত্তম সেটিংস কী হবে তা আমি বুঝতে চাই।

এছাড়াও, সেই হ্যাশ আকারে এনজিনেক্স পুনরায় লোড হতে কয়েক সেকেন্ড সময় নিতে শুরু করেছে যা সিস্টেমটি পুনরায় চালু হওয়ার সময় সিস্টেমটি অনুপলব্ধ হয়ে উঠছে।

এখানে সামগ্রিক সেটিংস (উবুন্টু সার্ভারে চলছে 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;
}

(এবং একটি নমুনা ব্যবহারকারী কনফ ফাইল)

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

serverNginx যে নামগুলি দেয় সেগুলির তালিকা দ্রুত দেখার জন্য একটি হ্যাশ টেবিলে সঞ্চিত । আপনি প্রবেশের সংখ্যা বাড়ানোর সাথে সাথে আপনাকে হ্যাশ টেবিলের আকার এবং / অথবা টেবিলে হ্যাশ বালতির সংখ্যা বাড়াতে হবে।

আপনার সেটআপের প্রকৃতি দেওয়া, serverআপনি টেবিলে যে নাম সংরক্ষণ করছেন তা সহজেই হ্রাস করার জন্য আমি কোনও উপায়ের জন্য ভাবতে পারি না । যদিও আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি "এনজিঙ্কস" পুনরায় চালু করবেন না, বরং এটির কনফিগারেশনটি পুনরায় লোড করুন। এই ক্ষেত্রে:

service nginx reload

ধন্যবাদ প্রশ্নের উত্তর অংশের জন্য এটি দুর্দান্ত। সুতরাং আমার কি উদ্বিগ্ন হওয়া উচিত যে সার্ভার_নাম_হ্যাশ_ম্যাক্স_সাইজটি 10000 ডোমেনগুলি পেতে 20000 এর কাছাকাছি হবে?
জেসনসপ্লেস

আপনি যখন Nginx পুনরায় চালু করবেন তখন এটি কেবল একটি সমস্যা। আমি যেমন বলেছি, reloadপরিবর্তে যখনই সমস্যা এড়ানো সম্ভব।
মাইকেল হ্যাম্পটন

23

সোর্স কোডটি তৈরি করেছিলাম এমন কয়েকটি প্রযুক্তিগত বিশদ:

  • সাধারণ সুপারিশটি হ'ল উভয় মান যতটা সম্ভব ছোট রাখা।
  • এনজিনেক্স যদি অভিযোগ করে max_sizeততক্ষণ বাড়বে । যদি সংখ্যাটি কিছু বড় সংখ্যার বেশি হয় (উদাহরণস্বরূপ 32769), bucket_sizeআপনার প্ল্যাটফর্মের যতক্ষণ না এটি অভিযোগ করবে ততক্ষণ আপনার ডিফল্ট মানের একাধিকতে বৃদ্ধি করুন। যদি এটি আর অভিযোগ না করে তবে যতক্ষণ না এটি অভিযোগ না করে max_sizeফিরে আসুন আপনার সার্ভারের নামের সেটগুলির জন্য এখন আপনার সেরা সেটআপ রয়েছে (সার্ভার_নামের প্রতিটি সেট আলাদা আলাদা সেটআপের প্রয়োজন হতে পারে)।
  • বড় max_sizeঅর্থ হ'ল আরও মেমরি গ্রাস করা হয়েছে (একবার প্রতি কর্মী বা সার্ভারে, জানা থাকলে মন্তব্য করুন)।
  • বৃহত্তর bucket_sizeঅর্থ আরও সিপিইউ চক্র (প্রতিটি ডোমেন নাম দেখার জন্য) এবং প্রধান মেমরি থেকে ক্যাশে আরও স্থানান্তর।
  • max_sizeসরাসরি সার্ভার_নামের সংখ্যার সাথে সম্পর্কিত নয়, সার্ভারের সংখ্যা দ্বিগুণ হলে max_sizeসংঘর্ষ এড়াতে আপনার 10 গুণ বা তারও বেশি পরিমাণ বাড়তে হতে পারে। এগুলি এড়াতে না পারলে আপনাকে বাড়াতে হবে bucket_size
  • bucket_size বলা হয় যে এটি দুটি পরবর্তী ক্ষমতায় উন্নীত হবে, উত্স কোড থেকে আমি বিচার করব এটি ডিফল্ট মানকে একাধিক করার পক্ষে যথেষ্ট হওয়া উচিত, এটি ক্যাশে অনুকূল স্থানান্তরিত হওয়া উচিত।
  • গড় ডোমেন নামটি হ্যাশ অ্যারের ওভারহেড এমনকি 32 বাইটের মধ্যে মাপসই করা উচিত। যদি আপনি bucket_size512 বাইটে বৃদ্ধি করেন তবে এটি সংঘর্ষযুক্ত হ্যাশ কী সহ 16 টি ডোমেন নাম অন্তর্ভুক্ত করবে। এটি আপনি চান এমন কিছু নয়, যদি সংঘর্ষ হয় তবে এটি রৈখিকভাবে অনুসন্ধান করে । আপনি যতটা সম্ভব কম সংঘর্ষে থাকতে চান।
  • আপনার যদি max_size 10000 এরও কম বা ছোট হয় bucket_size, আপনি দীর্ঘ লোডিং সময় জুড়ে আসতে পারেন কারণ এনজিনেক্স একটি লুপের মধ্যে অনুকূল হ্যাশ আকার খুঁজতে চেষ্টা করবে।
  • আপনার যদি max_size10000 এরও বেশি বড় হয়, অভিযোগ করার আগে এখানে "কেবল" 1000 লুপ করা হবে।

এটি দুর্দান্ত তথ্য; গবেষণা এবং লেখার জন্য ধন্যবাদ।
দোলা

@ ব্রাবলসি আমি জানতে আগ্রহী যে আপনি কীভাবে 32769 এ গিয়েছেন। বর্তমানের স্তূপের আকারটি কী দেখতে পাবে?
ইউহুল হোস্টিং

অধিগ্রহণ করা মেমরিটি সর্বোচ্চ_ সাইজ * বালতি_ আকার হবে (তবে এটি ভাগ করা বা প্রতি কর্মী কিনা তা আমি জানি না)। আমার 8000 সার্ভারের নাম ছিল এবং 32769 ইতিমধ্যে খুব বেশি অনুভূত হয়েছে। তবে আপনার যদি অনেক স্মৃতি থাকে তবে আপনি আরও উঁচুতে যেতে চাইতে পারেন।
brablc

4

আপনার nginx.conf এর ভিতরে "সার্ভার_নাম_হ্যাশ_বকেট_সাইজ" কনফিগারেশনটি বাড়ান।

আমি এটি 64 পেয়েছিলাম এবং 128 এ পরিবর্তিত হয়েছিল।

সমস্যা সমাধান.


2

@ মিশেল হ্যাম্পটন তার উত্তরের সাথে একদম ঠিক বলেছেন। এই হ্যাশ টেবিলটি পুনঃসূচনা বা পুনরায় লোডের সময় নির্মিত এবং সংকলিত এবং পরে এটি খুব দ্রুত চলছে। আমি অনুমান করি যে এই হ্যাশ টেবিলটি পারফরম্যান্সটিকে লক্ষ্যণীয় করে না করে আরও অনেক কিছু বাড়তে পারে। তবে আমি সি কোডের প্রকৃতির কারণে 4096 এর মতো দুটির মতো দুটি আকারের আকার ব্যবহার করার পরামর্শ দেব।


কোন ভিত্তি দিয়ে দু'জনের শক্তি, 512 এর ডিফল্ট গুণিতকগুলি বৃদ্ধি করা কি সঠিক?
জেসোনসপ্লেস

হ্যাঁ একেবারে.
ফ্লেশগ্রিন্ডার

1

আমি আপনার ক্ষেত্রে 100% নিশ্চিত নই, তবে আমি একই সতর্কতা পাচ্ছিলাম কারণ আমি এক্স-ফরওয়ার্ড-প্রোটোর জন্য দু'বার প্রক্সি_সেট_হেডার কল করেছিলাম:

proxy_set_header X-Forwarded-Proto ...;

এটি হচ্ছিল কারণ আমি প্রক্সি_প্যারামগুলি অন্তর্ভুক্ত করছিলাম এবং এতে অন্যদের মধ্যে এই লাইনটি রয়েছে:

proxy_set_header X-Forwarded-Proto $scheme;

আমার সাইটের কনফিগারেশন থেকে সেই লাইনটি সরিয়ে দিয়ে সতর্কতাটি দূরে সরে গেছে।


1
বাস্তব $$$ পরামর্শ, ধন্যবাদ
sjas

-2

পরিবর্তন

proxy_set_header X-Forwarded-For $remote_addr;

প্রতি

proxy_set_header X-Real-IP $remote_addr;

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.