Как найти причину ошибки 504 на сервере?
Здравствуйте, уважаемые программисты. Не прошу никого делать за меня мою работу, но нужен реальный совет. Уже как несколько дней, сервер работает некорректно. Часто выдает на всех ресурсах ошибку 504. Смотрел за работой сервера по ssh вижу такую картину как всплески нагрузки на процессор со стороны mysql.
какой сайт это делает я вычислил. Сервер выделенный. Сайты все свои, посторонних с доступом к серверу нет.
Но, раньше все работало нормально и не было таких проблем. На атаку не похоже. Остальные показатели в норме. В коде на сайте правок не было. как вообще в таком случае действовать? Как анализировать mysql вообще не понимаю, разные утилиты есть, но они толком же не показывают какой запрос именно создает такую нагрузку. Нужен реальный совет как попытаться это вычислить. Сервер связка nginx+apache. Просьба не хамить, не флудить. Если есть чем подсобить, буду рад. А для остального, думаю, другие ветки найдутся. Прикрепляю скриншот
Дополнительно:
На скриншоте не похоже на большую нагрузку. 504 это всё же ошибка веб сервера и чаще такое связано с с настройками php-fpm
Вижу что на сервере стоит ispmanager 5 и он по умолчанию для fpm выставляет ограниченное кол-во воркеров которых может не хватать в часы пик при росте посещаемости.
чаще такое связано с с настройками php-fpm
Настройки базовые, ничего не корректировалось, на сколько я знаю
Вижу что на сервере стоит ispmanager 5 и он по умолчанию для fpm выставляет ограниченное кол-во воркеров которых может не хватать в часы пик при росте посещаемости.
Насчет посещаемости, то ничего не было такого ранее, а тут одним днем началось. Что-то можно посмотреть в этом направлении?
Ответы:
mysql slow log
- Спасибо, может какие-то конкретные советы подскажете?
- Александр, это в вашем случае максимально конкретный совет - понять, какие запросы тормозят и дальше диагностировать, почему. Мы же хотим не симптомы лечить, а проблему - правда же?
- ky0, согласен, Вам огромное спасибо что присоединились и не прошли мимо. Но как конкретно это сделать, знаний пока не хватает. Да и смущает что раньше такого не было. ничего не менялось в коде, но ситуация проявилась. А как именно эти запросы вычислить, я пока не понимаю. Все когда-то учились, в данном случае я прошу совета как это сделать. Как проанализировать, какие есть способы? Пытался про mysql искать в интернете, то так и не увидел, как именно увидеть эти запросы.
- slow log может не помочь, если это например фоновый процесс который генерит множество запросов в моменте. Например пересчёт чего-то, синхронизация товаров и пр.
В дополнение к совету включить и проанализировать slow query log (который и ответит на вопрос ""какой запрос именно создает такую нагрузку ), советую посмотреть на конфигурацию mysql.
Если я правильно вижу, у вас бежит несколько процессов mysql - пришлите пож-ста вывод "ps -ef | grep mysql" чтобы точно проверить. Я бы использовал один процесс и дал ему больше памяти - это помогает mysql работать эффективнее.
- root 11558 1 0 фев22 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql 12022 11558 21 фев22 ? 16:54:57 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
securix 23238 25724 0 19:05 pts/0 00:00:00 grep mysqlВсе что я увидел
- Александр, Понял.
Тогда советую поменять в my.cnf и перестартовать.
Почему раньше работало лучше? - из-за двух причин: база была меньше, и/или запросов было меньше.1) innodb_buffer_pool_size=1G
2) включить slow query log (подробнее например здесь https://ixnfo.com/slow-query-log-mysql.html )
slow_query_log=ON
slow_query_log=/var/log/mysql/slow.log
long_query_time=0.5 - Vitaly Karasik, Спасибо огромное . Сейчас нет возможности. Завтра обязательно отпишусь
Скорее всего криво настроенный MySQL. После какого то количества больших запросов база данных сьедает всю память. Покажите конфиг my.cnf
- Прошу прощения, выпал тут на несколько дней
конфиг#
# The MySQL database server configuration file.
#
# You can copy this to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.
#.
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# dev.mysql.com/doc/mysql/en/server-system-variables.html# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain "#" chars...
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
port<--><------>= 3306
socket<><------>= /var/run/mysqld/mysqld.sock# Here is entries for some specific programs
# The following values assume you have at least 32M ram# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
log-error=/var/log/mysql.log
socket<><------>= /var/run/mysqld/mysqld.sock
nice<--><------>= 0[mysqld]
collation-server = utf8_general_ci
character-set-server = utf8
local-infile=0
innodb_file_per_table = 1
#
# * Basic Settings
#
user<--><------>= mysql
pid-file<------>= /var/run/mysqld/mysqld.pid
socket<><------>= /var/run/mysqld/mysqld.sock
port<--><------>= 3306
basedir><------>= /usr
datadir><------>= /var/lib/mysql
tmpdir<><------>= /tmp
lc-messages-dir>= /usr/share/mysql
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address<--><------>= 127.0.0.1
#
# * Fine Tuning
#
key_buffer<----><------>= 16M
max_allowed_packet<---->= 16M
thread_stack<--><------>= 192K
thread_cache_size = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover = BACKUP
#max_connections = 100
#table_cache = 64
#thread_concurrency = 10
#
# * Query Cache Configuration
#
query_cache_limit<----->= 1M
query_cache_size = 16M
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file = /var/log/mysql/mysql.log
#general_log = 1
#
# Error log - should be very few entries.
#
log_error = /var/log/mysql/error.log
#
# Here you can see queries with especially long duration
slow_query_log_file = /var/log/mysql/mysql-slow.log
slow_query_log = 1
long_query_time = 1
#log_queries_not_using_indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
#server-id<----><------>= 1
#log_bin<------><------><------>= /var/log/mysql/mysql-bin.log
expire_logs_days<------>= 10
max_binlog_size = 100M
bind-address = 127.0.0.1
#binlog_do_db<-><------>= include_database_name
#binlog_ignore_db<----->= include_database_name
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem[mysqldump]
quick
quote-names
max_allowed_packet<---->= 16M[mysql]
#no-auto-rehash># faster start of mysql but no tab completition[isamchk]
key_buffer<----><------>= 16M#
# * IMPORTANT: Additional settings that can override those from this file!
# The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/ - Скачайте: https://github.com/major/MySQLTuner-perl или "wget mysqltuner.pl -O mysqltuner.pl".
И прогоните тест, в конце теста будут подсказки по настройке и рекомендованные параметры my.cnf.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для того чтобы найти причину ошибки 504 Gateway Timeout на сервере, следует выполнить следующие шаги:
1. Проверьте настройки сервера: убедитесь, что сервер правильно настроен и способен обрабатывать запросы в разумные сроки. Проверьте логи сервера на наличие ошибок или уведомлений о превышении времени ожидания.
2. Проверьте наличие проблем с сетью: убедитесь, что проблема не связана с сетевыми настройками или ограничениями. Попробуйте проверить скорость и стабильность соединения с сервером.
3. Оптимизируйте код: если проблема возникает при выполнении определенного запроса или скрипта, убедитесь, что код оптимизирован и не вызывает излишних задержек. Проверьте производительность запросов и ищите узкие места в коде.
4. Используйте инструменты мониторинга: для более детального анализа причин ошибки 504 можно использовать специальные инструменты мониторинга производительности сервера. Они позволят выявить узкие места и оптимизировать работу сервера.
5. Проверьте конфигурацию прокси-сервера: если сервер работает через прокси, убедитесь, что конфигурация прокси-сервера корректна и не вызывает задержек при передаче запросов.
6. Обновите программное обеспечение: убедитесь, что все используемые программные компоненты (веб-сервер, база данных, язык программирования и т. д.) обновлены до последних версий, чтобы избежать известных проблем с производительностью.
7. Обратитесь к провайдеру хостинга: если все вышеперечисленные действия не помогли найти причину ошибки 504, обратитесь к провайдеру хостинга. Возможно, проблема связана с настройками сервера или инфраструктурой провайдера.
Следуя этим шагам, вы сможете найти причину ошибки 504 на сервере и принять необходимые меры для ее устранения.