Для этой конфигурации вы можете использовать веб-сервер, который вам нравится, я решил, поскольку работаю в основном с ним, использовать nginx.
Правильно настроенный nginx может обрабатывать до 400K - 500K запросов в секунду (кластеризованный). Большинство серверов способны обрабатывать от 50K до 80K (некластеризованных) запросов в секунду и 30% загрузка процессора.
Вы должны понимать, что этот конфиг используется в тестовой среде, а не в производственной, поэтому вам нужно будет найти способ реализовать большинство этих функций как можно лучше для ваших серверов.
Создайте резервную копию исходных конфигураций и можете приступать к их перенастройке. Вам нужно будет открыть файл nginx.conf по адресу /etc/nginx/nginx.conf с помощью вашего любимого редактора.
1 | nano /etc/nginx/nginx.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | # вы должны установить рабочие процессы на основе ваших ядер процессора, nginx не выиграет, если установит большее количество. worker_processes auto; # последние версии вычисляют его автоматически # количество файловых дескрипторов, используемых для nginx # ограничение на максимальное количество FD на сервере обычно устанавливается ОС. # если вы не установите FD, то будут использоваться настройки ОС, которые по умолчанию равны 2000 worker_rlimit_nofile 100000; # регистрировать только критические ошибки error_log /var/log/nginx/error.log crit; # предоставляет контекст конфигурационного файла, в котором задаются директивы, влияющие на обработку соединений. events { # определяет, сколько клиентов будет обслуживаться на одного рабочего # max clients = worker_connections * worker_processes # max clients также ограничено количеством сокетных соединений, доступных в системе (~64k) worker_connections 4000; # оптимизирован для обслуживания многих клиентов каждым потоком, что важно для linux -- для тестовой среды use epoll; # принимать как можно больше соединений, при слишком низком значении может переполнить рабочие соединения -- для тестовой среды multi_accept on; } http { # кэш-информация о FD, часто используемых файлах # может увеличить производительность, но вам нужно проверить эти значения. open_file_cache max=200000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; # для увеличения ввода-вывода (I/O) на HDD мы можем отключить журналы доступа access_log off; # копирует данные между одним FD и другим из ядра # быстрее, чем read() + write() sendfile on; # отправлять заголовки одним куском, это лучше, чем отправлять их по одному tcp_nopush on; # уменьшение объема данных, которые необходимо передавать по сети -- для тестовой среды 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; # разрешить серверу закрывать соединение на не отвечающем клиенте, это освободит память reset_timedout_connection on; # таймаут запроса - по умолчанию 60 client_body_timeout 10; # если клиент перестал отвечать, освободить память -- по умолчанию 60 send_timeout 2; # сервер закроет соединение через это время - по умолчанию 75 keepalive_timeout 30; # количество запросов, которые клиент может сделать в режиме keep-alive -- для тестовой среды keepalive_requests 100000; } |
Теперь вы можете сохранить конфигурацию и выполнить следующую команду
1 2 | nginx -s reload /etc/init.d/nginx restart |
Если вы хотите сначала протестировать конфигурацию, вы можете выполнить команду
1 2 | nginx -t /etc/init.d/nginx configtest |
Просто из соображений безопасности
1 | server_tokens off; |
Увеличение максимального количества открытых файлов (nofile limit) - Linux
Есть два способа увеличить лимит nofile/max открытых файлов/файловых дескрипторов/файловых дескрипторов для NGINX в RHEL/CentOS 7+. При запущенном NGINX проверьте текущее ограничение на главном процессе
1 2 | $ cat /proc/$(cat /var/run/nginx.pid)/limits | grep open.files Max open files 1024 4096 files |
найти рабочие процессы
1 | ps --ppid $(cat /var/run/nginx.pid) -o %p|sed '1d'|xargs -I{} cat /proc/{}/limits|grep open.files |
Попытка с директивой worker_rlimit_nofile в {,/usr/local}/etc/nginx/nginx.conf не удалась, поскольку политика SELinux не разрешает setrlimit. Это показано в /var/log/nginx/error.log
1 | [alert] 12066#0: setrlimit(RLIMIT_NOFILE, 2342) failed (13: Permission denied) |
И в /var/log/audit/audit.log
1 | 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 без Systemd
1 2 3 | # /etc/security/limits.conf # /etc/default/nginx (ULIMIT) nano /etc/security/limits.d/nginx.conf |
1 2 | nginx soft nofile 65536 nginx hard nofile 65536 |
1 | sysctl -p |
nolimit с помощью Systemd
1 | mkdir -p /etc/systemd/system/nginx.service.d |
1 | nano /etc/systemd/system/nginx.service.d/nginx.conf |
1 2 | [Service] LimitNOFILE=30000 |
1 2 | systemctl daemon-reload systemctl restart nginx.service |
SELinux boolean httpd_setrlimit to true(1)
Это установит ограничения fd для рабочих процессов. Оставьте директиву worker_rlimit_nofile в {,/usr/local}/etc/nginx/nginx.conf и выполните следующее от имени root
1 | setsebool -P httpd_setrlimit 1 |