Kami menggunakan Nginx sebagai proxy terbalik ke Apache dalam layanan yang memberikan situs web kepada siapa pun. Pada pembuatan akun, sistem membuat file conf nginx baru untuk domain dengan dua entri, satu untuk port 80, yang lain untuk 443. Kami memperhatikan bahwa pada setiap 30 atau lebih domain, kami mendapatkan kesalahan:
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.
Dengan sekitar 200 domain dan terus bertambah, kami harus menaikkan ukuran server_names_hash_max menjadi 4112 dan khawatir ini tidak akan skala dengan baik. Saya ingin memahami cara kerja konfigurasi ini dan pengaturan optimal apa yang akan memastikan kami dapat tumbuh hingga ribuan domain menggunakan metode ini.
Juga, pada ukuran hash nginx mulai mengambil detik untuk memuat ulang yang menyebabkan sistem tidak tersedia saat restart.
Berikut adalah pengaturan keseluruhan (berjalan pada server Ubuntu 10.10 nginx / 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;
}
(Di bawah cipher ada pasangan konfigurasi situs utama dan tangkapan semua):
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;
}
(Dan file conf pengguna sampel)
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;
}
}
Setiap bantuan dan arahan sangat dihargai !!
reload
alih-alih sedapat mungkin hindari masalah.Hanya beberapa detail teknis yang saya gali dari kode sumber:
max_size
pertama selama itu mengeluh. Jika angka tersebut melebihi angka besar (misalnya 32769), naikkanbucket_size
ke kelipatan nilai default pada platform Anda asalkan komplain. Jika tidak mengeluh lagi, kurangimax_size
kembali selama tidak mengeluh. Sekarang Anda memiliki setup terbaik untuk set nama server Anda (setiap set nama server mungkin memerlukan setup berbeda).max_size
berarti lebih banyak memori yang dikonsumsi (satu kali per pekerja atau server, beri komentar jika Anda tahu).bucket_size
berarti lebih banyak siklus CPU (untuk setiap pencarian nama domain) dan lebih banyak transfer dari memori utama ke cache.max_size
tidak terkait dengan jumlah nama server secara langsung, jika jumlah server berlipat ganda, Anda mungkin perlu menambahmax_size
10 kali atau bahkan lebih untuk menghindari tabrakan. Jika Anda tidak dapat menghindarinya, Anda harus meningkatbucket_size
.bucket_size
dikatakan meningkat ke kekuatan dua berikutnya, dari kode sumber saya akan menilai itu harus cukup untuk membuatnya kelipatan dari nilai default, ini harus menjaga transfer ke cache optimal.bucket_size
menjadi 512 byte, itu akan mengakomodasi 16 nama domain dengan kunci hash bertabrakan. Ini bukan sesuatu yang Anda inginkan, jika terjadi tabrakan pencarian itu secara linear . Anda ingin tabrakan sesedikit mungkin.max_size
kurang dari 10.000 dan kecilbucket_size
, Anda dapat menemukan waktu pemuatan yang lama karena nginx akan mencoba menemukan ukuran hash yang optimal dalam satu lingkaran.max_size
lebih dari 10.000, akan ada "hanya" 1000 loop dilakukan sebelum mengeluh.sumber
Tingkatkan konfigurasi "server_names_hash_bucket_size" di dalam nginx.conf Anda.
Saya memilikinya 64 dan berubah menjadi 128.
Masalah terpecahkan.
sumber
@Michael Hampton benar dengan jawabannya. Tabel hash ini dibangun dan dikompilasi selama restart atau memuat kembali dan setelah itu berjalan sangat cepat. Saya kira tabel hash ini bisa tumbuh lebih banyak tanpa menurunkan kinerja yang terlihat. Tapi saya sarankan menggunakan ukuran yang kekuatan dua, seperti 4096, karena sifat kode C.
sumber
Saya tidak 100% yakin dalam kasus Anda, tetapi saya mendapatkan peringatan yang sama karena saya menelepon proxy_set_header untuk X-Forwarded-Proto dua kali:
Ini terjadi karena saya termasuk proxy_params, dan ini berisi baris ini antara lain:
Menghapus baris itu dari konfigurasi situs saya membuat peringatan hilang.
sumber
Perubahan
proxy_set_header X-Forwarded-For $remote_addr;
untuk
proxy_set_header X-Real-IP $remote_addr;
sumber