بالنسبة لهذا التكوين ، يمكنك استخدام خادم الويب الذي تريده ، لقد قررت ، لأنني أعمل في الغالب لاستخدام Nginx.
بشكل عام ، يمكن لـ NGINX المكونة بشكل صحيح التعامل مع ما يصل إلى 400 ألف إلى 500 ألف طلب في الثانية (مجمعة). معظم ما رأيته يتراوح من 50 ألفًا إلى 80 ألف طلبات (غير مرسومة) في الثانية وحمل وحدة المعالجة المركزية بنسبة 30 ٪ ، بالطبع ، كان هذا 2 x Intel Xeon مع تمكين فرط التأثير ، ولكن يمكن أن يعمل دون مشكلة على آلات أبطأ.
يجب أن تفهم أن هذا التكوين يستخدم في بيئة اختبار وليس في الإنتاج ، لذلك ستحتاج إلى إيجاد طريقة لتنفيذ معظم هذه الميزات قدر الإمكان لخوادمك.
أولاً ، ستحتاج إلى تثبيت nginx
yum install nginx
apt install nginx النسخ الاحتياطي لتكويناتك الأصلية ويمكنك البدء في إعادة تكوين التكوينات الخاصة بك. ستحتاج إلى فتح nginx.conf at /etc/nginx/nginx.conf مع المحرر المفضل لديك.
# you must set worker processes based on your CPU cores, nginx does not benefit from setting more than that
worker_processes auto; #some last versions calculate it automatically
# number of file descriptors used for nginx
# the limit for the maximum FDs on the server is usually set by the OS.
# if you don't set FD's then OS settings will be used which is by default 2000
worker_rlimit_nofile 100000 ;
# only log critical errors
error_log /var/log/nginx/error.log crit ;
# provides the configuration file context in which the directives that affect connection processing are specified.
events {
# determines how much clients will be served per worker
# max clients = worker_connections * worker_processes
# max clients is also limited by the number of socket connections available on the system (~64k)
worker_connections 4000 ;
# optimized to serve many clients with each thread, essential for linux -- for testing environment
use epoll ;
# accept as many connections as possible, may flood worker connections if set too low -- for testing environment
multi_accept on ;
}
http {
# cache informations about FDs, frequently accessed files
# can boost performance, but you need to test those values
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s ;
open_file_cache_min_uses 2 ;
open_file_cache_errors on ;
# to boost I/O on HDD we can disable access logs
access_log off ;
# copies data between one FD and other from within the kernel
# faster than read() + write()
sendfile on ;
# send headers in one piece, it is better than sending them one by one
tcp_nopush on ;
# don't buffer data sent, good for small data bursts in real time
# https://brooker.co.za/blog/2024/05/09/nagle.html
# https://news.ycombinator.com/item?id=10608356
#tcp_nodelay on;
# reduce the data that needs to be sent over network -- for testing environment
gzip on ;
# gzip_static on;
gzip_min_length 10240 ;
gzip_comp_level 1 ;
gzip_vary on ;
gzip_disable msie6;
gzip_proxied expired no-cache no-store private auth;
gzip_types
# text/html is always compressed by HttpGzipModule
text/css
text/javascript
text/xml
text/plain
text/x-component
application/javascript
application/x-javascript
application/json
application/xml
application/rss+xml
application/atom+xml
font/truetype
font/opentype
application/vnd.ms-fontobject
image/svg+xml;
# allow the server to close connection on non responding client, this will free up memory
reset_timedout_connection on ;
# request timed out -- default 60
client_body_timeout 10 ;
# if client stop responding, free up memory -- default 60
send_timeout 2 ;
# server will close connection after this time -- default 75
keepalive_timeout 30 ;
# number of requests client can make over keep-alive -- for testing environment
keepalive_requests 100000 ;
}يمكنك الآن حفظ التكوين وتشغيل الأمر أدناه
nginx -s reload
/etc/init.d/nginx start|restart
إذا كنت ترغب في اختبار التكوين أولاً ، يمكنك التشغيل
nginx -t
/etc/init.d/nginx configtest
server_tokens off ;هذا بعيدًا عن دفاع DDOs آمن ولكنه يمكن أن يتباطأ بعض DDOs الصغيرة. هذا التكوين مخصص لبيئة اختبار ويجب عليك استخدام قيمك الخاصة.
# limit the number of connections per single IP
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
# limit the number of requests for a given session
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
# zone which we want to limit by upper values, we want limit whole server
server {
limit_conn conn_limit_per_ip 10 ;
limit_req zone=req_limit_per_ip burst=10 nodelay;
}
# if the request body size is more than the buffer size, then the entire (or partial)
# request body is written into a temporary file
client_body_buffer_size 128k ;
# buffer size for reading client request header -- for testing environment
client_header_buffer_size 3m ;
# maximum number and size of buffers for large headers to read from client request
large_client_header_buffers 4 256k ;
# read timeout for the request body from client -- for testing environment
client_body_timeout 3m ;
# how long to wait for the client to send a request header -- for testing environment
client_header_timeout 3m ;الآن يمكنك اختبار التكوين مرة أخرى
nginx -t # /etc/init.d/nginx configtestثم إعادة تحميل أو أعد تشغيل nginx
nginx -s reload
/etc/init.d/nginx reload|restart
يمكنك اختبار هذا التكوين باستخدام tsung وعندما تكون راضيًا عن النتيجة ، يمكنك الضغط على Ctrl+C لأنه يمكن تشغيله لساعات.
nofile ) - Linuxهناك طريقتان لرفع الحد الأقصى للملفات/الواصفات/الملفات المفتوحة NoFile/Max لـ NGINX في RHEL/CentOS 7+. مع تشغيل NGINX ، تحقق من الحد الحالي في العملية الرئيسية
$ cat /proc/$(cat /var/run/nginx.pid)/limits | grep open.files
Max open files 1024 4096 files
ps --ppid $(cat /var/run/nginx.pid) -o %p|sed '1d'|xargs -I{} cat /proc/{}/limits|grep open.files
Max open files 1024 4096 files
Max open files 1024 4096 files
المحاولة مع توجيه worker_rlimit_nofile في {,/usr/local}/etc/nginx/nginx.conf لأن سياسة selinux لا تسمح setrlimit . يظهر هذا في /var/log/nginx/error.log
015/07/24 12:46:40 [alert] 12066#0: setrlimit(RLIMIT_NOFILE, 2342) failed (13: Permission denied)
type=AVC msg=audit(1437731200.211:366): avc: denied { setrlimit } for pid=12066 comm="nginx" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:httpd_t:s0 tclass=process
nolimit بدون نظام # /etc/security/limits.conf
# /etc/default/nginx (ULIMIT)
$ nano /etc/security/limits.d/nginx.conf
nginx soft nofile 65536
nginx hard nofile 65536
$ sysctl -p
nolimit مع systemd $ mkdir -p /etc/systemd/system/nginx.service.d
$ nano /etc/systemd/system/nginx.service.d/nginx.conf
[Service]
LimitNOFILE=30000
$ systemctl daemon-reload
$ systemctl restart nginx.service
httpd_setrlimit إلى true (1) سيؤدي ذلك إلى تعيين حدود FD لعمليات العمال. اترك توجيه worker_rlimit_nofile في {,/usr/local}/etc/nginx/nginx.conf وقم بتشغيل ما يلي كجذر
setsebool -P httpd_setrlimit 1
بشكل افتراضي max_ranges غير محدود. يمكن أن تخلق هجمات DOS العديد من اختبارات المدى (التأثير على الاستقرار I/O).
| نوع المقبس | الكمون (MS) | زمن الانتقال stdev (MS) | تحميل وحدة المعالجة المركزية |
|---|---|---|---|
| تقصير | 15.65 | 26.59 | 0.3 |
| قبول arch_mutex | 15.59 | 26.48 | 10 |
| reuseport | 12.35 | 3.15 | 0.3 |
يتم دعم إرسال ملفات متعددة الخيوط حاليًا فقط في Linux. بدون حد sendfile_max_chunk ، قد يستول واحد سريع على عملية العمال بالكامل.
map $ssl_preread_protocol $upstream {
"" ssh.example.com:22;
"TLSv1.2" new.example.com:443;
default tls.example.com:443;
}
# ssh and https on the same port
server {
listen 192.168.0.1:443;
proxy_pass $upstream ;
ssl_preread on;
}openssl engine -t )q_disc ) مع BBR.tcp_bbr افتراضيًا: modprobe tcp_bbr && echo ' tcp_bbr ' >> /etc/modules-load.d/bbr.conf
echo ' net.ipv4.tcp_congestion_control=bbr ' >> /etc/sysctl.d/99-bbr.conf
# Recommended for production, but with Linux v4.13rc1+ can be used not only in FQ (`q_disc') in BBR mode.
echo ' net.core.default_qdisc=fq ' >> /etc/sysctl.d/99-bbr.conf
sysctl --system