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 Xeon
dengan 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.conf
di /etc/nginx/nginx.conf
dengan 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
Dan kemudian reload atau restart nginx Anda
nginx -s reload
/etc/init.d/nginx reload|restart
Anda dapat menguji konfigurasi ini dengan tsung
dan saat Anda puas dengan hasil yang dapat Anda pukul Ctrl+C
karena dapat berjalan berjam-jam.
HTTP / 1.1 dan yang lebih baru: Permintaan Range
DoSSecara default max_ranges
tidak 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_chunk
batas, satu koneksi cepat bisa memanfaatkan proses pekerja sepenuhnya.
References:
- http://www.codestance.com/tutorials-archive/nginx-tuning-for-best-performance-255
- https://gist.github.com/denji/8359866
- https://www.keycdn.com/support/tcp-fast-open/
- https://www.masv.io/enabling-tcp-fast-open-nginx-centos-7/
https://www.52os.net/articles/nginx-anti-ddos-setting-2.html- https://github.com/h5bp/server-configs-nginx
- https://github.com/nginx-boilerplate/nginx-boilerplate
- https://www.nginx.com/blog/thread-pools-boost-performance-9x/
- https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/
- https://www.nginx.com/blog/performing-ab-testing-nginx-plus/
- https://www.nginx.com/blog/10-tips-for-10x-application-performance/
- https://nginx.org/r/pcre_jit
- https://nginx.org/r/ssl_engine (
openssl engine -t
) - https://www.nginx.com/blog/mitigating-ddos-attacks-with-nginx-and-nginx-plus/
- https://www.nginx.com/blog/tuning-nginx/
- https://www.maxcdn.com/blog/nginx-application-performance-optimization/
- https://www.linode.com/docs/websites/nginx/configure-nginx-for-optimized-performance