Press "Enter" to skip to content

Konfigurasi Nginx Untuk Performa Terbaik

0

 

Konfigurasi Nginx Untuk Performa Terbaik

Umumnya, nginx yang dikonfigurasi dengan benar dapat menangani permintaan hingga 400K sampai 500K per detik (berkerumun), sebagian besar yang saya lihat adalah permintaan 50K sampai 80K (non-cluster) per detik dan beban CPU 30%, tentu saja, ini terkait 2 x Intel Xeondengan HyperThreading, namun itu bisa bekerja tanpa masalah pada mesin yang lebih lambat.

Anda harus mengerti bahwa konfigurasi ini digunakan dalam pengujian lingkungan dan tidak diproduksi sehingga Anda perlu menemukan cara untuk menerapkan sebagian besar fitur tersebut sebaik mungkin untuk server Anda.

Pertama, Anda perlu menginstal nginx

yum install nginx 
apt install nginx

Backup konfigurasi asli Anda dan Anda bisa mulai mengkonfigurasi ulang konfigurasi Anda. Anda akan perlu untuk membuka Anda nginx.confdi /etc/nginx/nginx.confdengan editor favorit Anda.

# Anda harus mengatur proses pekerja berdasarkan inti CPU Anda, nginx tidak mendapatkan keuntungan dari setting lebih dari yang 
worker_processes auto; # beberapa versi terakhir menghitungnya secara otomatis 
# jumlah deskriptor file yang digunakan untuk nginx 
# batas maksimum FD pada server biasanya ditentukan oleh OS. 
# jika Anda tidak mengatur FD maka pengaturan OS akan digunakan yaitu secara default 2000 
worker_rlimit_nofile  100000 ; # hanya kesalahan kritis log error_log /var/log/nginx/error.log crit ; # menyediakan konteks file konfigurasi dimana arahan yang mempengaruhi pemrosesan koneksi ditentukan. acara {
# menentukan berapa banyak klien yang akan dilayani per pekerja 
    # max clients = worker_connections * worker_processes 
    # max clients juga dibatasi oleh jumlah koneksi socket yang tersedia pada sistem (~ 64k) 
    worker_connections  4000 ; # optmized untuk melayani banyak klien dengan setiap thread, penting untuk linux - untuk menguji lingkungan menggunakan epoll ; # menerima sebanyak mungkin koneksi, dapat membanjiri koneksi pekerja jika diatur terlalu rendah - untuk menguji lingkungan multi_accept on ; 
} # Informasi cache tentang FD, file yang sering diakses # dapat meningkatkan kinerja, namun Anda perlu menguji nilai-nilai open_file_cache
max = 200000 inactive = 20s; 
open_file_cache_valid  30s ; 
open_file_cache_min_uses  2 ;
open_file_cache_errors on ; # untuk meningkatkan I / O pada HDD kita dapat menonaktifkan access log access_log off ; # menyalin data antara satu FD dan yang lainnya dari dalam kernel # lebih cepat kemudian baca () + write () sendfile on ; # mengirim header dalam satu kedamaian, lebih baik kemudian mengirimkannya satu per satu tcp_nopush on ; # Tidak buffer data yang dikirim, baik untuk semburan data kecil secara real time TCP_NODELAY pada ;
# Mengurangi data yang perlu dikirim melalui jaringan - untuk pengujian lingkungan 
gzip pada ;
gzip_min_length  10240 ;
gzip_proxied kedaluwarsa no-cache tidak ada penyimpanan pribadi;
gzip_types teks / teks biasa / teks css / xml teks / aplikasi javascript / aplikasi x-javascript / aplikasi json / xml;
gzip_disable msie6; # Memungkinkan server untuk menutup koneksi non client menanggapi, ini akan membebaskan memori reset_timedout_connection pada ; # permintaan habis waktunya - default 60 client_body_timeout 10 ; # jika klien berhenti merespons, membebaskan memori - default 60 send_timeout 2
 ; # server akan menutup koneksi setelah waktu ini - default 75 keepalive_timeout 30 ; # jumlah permintaan klien dapat membuat lebih dari tetap-hidup - untuk pengujian lingkungan keepalive_requests 100000 ;
 

Sekarang Anda bisa menyimpan config dan run bottom command

nginx -s reload
/etc/init.d/nginx start|restart

Jika anda ingin melakukan test config terlebih dahulu anda bisa menjalankannya

nginx -t
/etc/init.d/nginx configtest

Hanya untuk Alasan Keamanan

server_tokens off ;

Nginx Simple DDoS Defense

Ini jauh dari pertahanan DDoS yang aman tapi bisa memperlambat beberapa DDoS kecil. Konfigurasi tersebut juga ada di lingkungan pengujian dan Anda harus melakukan nilai-nilai Anda.

# Batasi jumlah koneksi per satu IP 
limit_conn_zone  $ binary_remote_addr zone = conn_limit_per_ip: 10m; # batasi jumlah permintaan untuk sesi yang diberikan limit_req_zone $ binary_remote_addr zone = req_limit_per_ip: 10m rate = 5r / s; # zone yang ingin kita batasi dengan nilai atas, kita ingin membatasi seluruh server server {
     limit_conn conn_limit_per_ip 10 ;
    limit_req zone = req_limit_per_ip burst = 10 nodelay; 
} # jika ukuran permintaan tubuh lebih besar dari ukuran buffer, maka seluruh (atau sebagian) # body permintaan ditulis ke file sementara client_body_buffer_size 128k
  ; # ukuran headerbuffer untuk request header dari client - untuk testing environment client_header_buffer_size 3m ; # jumlah maksimum dan ukuran buffer untuk header besar untuk dibaca dari permintaan klien large_client_header_buffers 4 256k ; # baca batas waktu untuk meminta badan dari klien - untuk menguji lingkungan client_body_timeout 3m ; # berapa lama menunggu klien mengirim header permintaan - untuk menguji lingkungan client_header_timeout 3m ;
 

Sekarang bisa anda lakukan lagi test config

nginx -t # /etc/init.d/nginx configtest
nginx -s reload
/etc/init.d/nginx reload|restart

Anda dapat menguji konfigurasi ini dengan tsungdan saat Anda puas dengan hasil yang dapat Anda pukul Ctrl+Ckarena dapat berjalan berjam-jam.

DoS HTTP / 1.1 dan yang lebih baru: Permintaan Range

Secara default max_rangestidak terbatas. Serangan DoS bisa banyak Range-Requests (Dampak terhadap stabilitas I / O).

Socket Sharding di NGINX 1.9.1+ (DragonFly BSD dan Linux 3.9+)

Tipe soket Latency (ms) Latency stdev (ms) Beban CPU
Default 15.65 26.59 0,3
accept_mutex mati 15.59 26.48 10
reuseport 12.35 3.15 0,3

Thread Pools di NGINX Meningkatkan Kinerja 9x! (Linux)

Pengiriman file multi-threaded saat ini hanya didukung Linux. Tanpa sendfile_max_chunkbatas, satu koneksi cepat bisa memanfaatkan proses pekerja sepenuhnya.

References: