Snickersmix
@Snickersmix
Web-разработчик

Как настроить nginx под 800 запросов в секунду?

Морда сайта на NUXT и апи на php.
NUXT запущен через pm2 в режиме кластера в колличесве 10 штук.
апи крутится на php-fpm и проксируется через nginx
сейчас в какой то момент при серверном рендеринге некоторые запросы провисают и nginx рвет соединение в итоге часть запросов к сайту падает.
как настроить nginx под такую нагрузку? mysql справляется
htop показывает загрузку системы на 30-50% тоесть потенциал еще есть, а как его использовать непонятно

/etc/nginx/nginx.conf
user www-data;
worker_processes 2;
pid /run/nginx.pid;

events {
	use epoll;
	worker_connections 25000;
    multi_accept on;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	keepalive_requests 100;
	types_hash_max_size 2048;
	reset_timedout_connection on;
	client_body_timeout 10;
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	access_log off;
	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/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}


/etc/php/5.6/fpm/pool.d

listen = /run/php/php5.6-fpm.sock
pm = ondemand
pm.max_children = 5000
pm.start_servers = 2
pm.max_spare_servers = 10
pm.min_spare_servers = 2
pm.process_idle_timeout = 100s;
pm.max_requests = 5000
rlimit_files = 1024
rlimit_core = 5


nginx конфиг морды
server {

	listen 80;
	listen [::]:80;


	root /home/nuxt;

	access_log /home/nuxt/faucetAccess.log;
	error_log /home/nuxt/faucetErrors.log;

	location / {
		gzip off;
	    proxy_pass http://localhost:3007;
	}
}

pm2
{
  "apps": [
    {
      "name": "app",
      "script": "../app/node_modules/nuxt/bin/nuxt-start",
      "instances": "10",
      "exec_mode": "cluster",
	  "cwd": "./",
      "env": {
        "PORT": 3007,
        "NODE_ENV": "production"
      }
    }
  ]
}


nginx конфиг сервера
server {
	listen 2052;
	server_name api.localhost;

	root /home/public_html/;
	index index.php 
	
	access_log /home/nuxt/nginxAccess.log;
	error_log /home/nuxt/nginxErrors.log;

	location / {
        try_files $uri $uri/ /index.php?$args;
    }
	location ~ \.php$ {
           try_files $uri =404;
           fastcgi_pass unix:/run/php/php5.6-fpm.sock;
           fastcgi_index index.php;
           fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
           include fastcgi_params;
                
     }
}
  • Вопрос задан
  • 3883 просмотра
Пригласить эксперта
Ответы на вопрос 4
Так, во первых у тебя сколько ядер на машине? Почему кластеров 10, а nginx воркер процессов 2(оба значения должны быть раны количеству ядер)? Во вторых вместо ПМ 2 можно использовать upstream в нигсе. В него же можно подсунуть другие серваки если этот не справляется. 800 подключений это не много, но уже требует кэширования, так что надо в нигсе в upstream, proxy и выдачу прописать кэширование. Ну и смотреть код курить логи с манами. Удачи.
Ответ написан
@hckn
сейчас в какой то момент при серверном рендеринге некоторые запросы провисают


А при чем тут nginx? Если это Express захлебывается, который рендерит твой Нукст.

Кеширование настраивал где-то?
Как производится тестирование?
Ответ написан
@maxtm
Make money, not job
сейчас в какой то момент при серверном рендеринге некоторые запросы провисают и nginx рвет соединение в итоге часть запросов к сайту падает.


Даже голый инстанс nginx тяжело убить всего-лишь 800 рпс. Пусть это даже будет одноядерное гамно.
Мне кажется, думать о тюнинге самого nginx пока рано, по опыту - 4-5к рпс на 1 ноду nginx не создает никаких проблем для обычного 2х ядерного DO'шного сервака за 15$.

Проблема не веб-сервера, проблема бэкенда, который стоит за ним.

Соединение рвется с кем? То что с клиентом - понятно, какой ответ отдает nginx, наверное 504?
Рвет соединение с клиентом он скорее всего потому-что бэкенд отвалился. Кто отваливается из бэка?
Если с пыхой - ковырять пыху.
Если с нодой - ноду.

Обрывать соединения nginx может по ряду причин:
- connection timeout при общении с бэкендом
- обрыв соединения с бэкендом
- некорректный (ошибочный) ответ бэкенда
- туева хуча ошибок при общении с клиентом (это опускаем)

Обо всем этом nginx успешно пишет в свои логи, посмотрите что там происходит.
Также, сам пых и ноду можно настроить логи на отладку.
У пыхи есть трейсинг слоу-логов, логирование каждого запроса и прочее.

Маны и бубень в руки. Удачи!
Ответ написан
ttys
@ttys
DevOps Jedi
может вопрос должен звучать так: "как настроить/потюнить пхпфпм что бы он не умирал?"
энджинкс искаробки обрабатывает достаточно много запросов

количество ядер конечно играет роль, но и время ответа тоже т.к. если 1 ядро и ответ будет генерится 10 секунд то о чём можно говорить?
ЗЫ ну и надо понимать что пхп это однопоточное УГ от которого много ждать не стоит если не использовать какой нибудь hacklang от фейсбука для компиляции пхпшного кода в бинари!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
LOFT Москва
от 80 000 до 120 000 ₽
PitchMe Санкт-Петербург
от 150 000 до 250 000 ₽