Задать вопрос

Почему тормозит веб сервер?

Добрый день. Имеется сервер nextcloud на debian 11, с базой postgresql.
После перехода на https - начались (через пару дней) дикие тормоза... сайт вываливает 502\504 ошибку
Клиентов - 30 человеков, файлов суммарно 100гб.
300 "приставок" на Linux,которые в N часов запрашивают разные папки для синхронизации, с помощью rclone, по webdav
Так же настроен общий календарь, привязан к смартам iOS\Android этих 30юзверей.
Проблема началась, если я правильно понял, после перехода на https... (что требовалось для включения синхр календарей)

Использовался nginx, всё было хорошо. Теперь же раз в N дней\часов php-fpm уходит в какой то "загул", дико загружая ЦП (50% от 8ядерного Интела), и кладет веб сервер... в логах NGINX - коонект таймат, что логично... в логах php-fpm - тишина

Решил что проблема с NGINX, перевел быстро всё на апач.... Та же хрень, создается куча процессов апача, идет большая нагрузка. Но апач хотя бы как то работает.. со скрипом пускает. При том после первого логина - дальше всё летает...

postgresql 13
php - 8 версия
apache2 и nginx - последние доступные, для debian11 в стандартных репо...
Процессор свободен, оперативки дофига, с дисками все ок, сеть не загружена
Стоит защита от брутфорса(встроенная от некстклауд) фаерволом закрыто всё кроме 80 и 443 портов(и ssh к моему IP)

Поможите кто чем может, уже всю голову сломал...

Конфиг апача SSL
spoiler




ServerName domain.ru
ServerAlias www.domain.ru
# ServerAdmin admin@domain.ru
DocumentRoot /var/www/html/nextcloud

ErrorLog ${APACHE_LOG_DIR}/domain.ru.log
CustomLog ${APACHE_LOG_DIR}/domain.ru.log combined


Options FollowSymlinks
AllowOverride All
Require all granted


SSLCertificateFile /etc/letsencrypt/live/domain.ru-0001/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain.ru-0001/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf




Конфиг NGINX для сайта
spoiler

server {
listen 80;
# listen [::]:80;
server_name domain.ru;

# Add headers to serve security related headers
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header Referrer-Policy no-referrer;

#I found this header is needed on Ubuntu, but not on Arch Linux.
add_header X-Frame-Options "SAMEORIGIN";

# Path to the root of your installation
root /var/www/html/nextcloud/;

access_log /var/log/nginx/nextcloud.access;
error_log /var/log/nginx/nextcloud.error;

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

# The following 2 rules are only needed for the user_webfinger app.
# Uncomment it if you're planning to use this app.
#rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
#rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json
# last;

location = /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}

location ~ /.well-known/acme-challenge {
allow all;
}

# set max upload size
client_max_body_size 512M;
fastcgi_buffers 64 4K;

# Disable gzip to avoid the removal of the ETag header
gzip off;

# Uncomment if your server is build with the ngx_pagespeed module
# This module is currently not supported.
#pagespeed off;

error_page 403 /core/templates/403.php;
error_page 404 /core/templates/404.php;

location / {
rewrite ^ /index.php;
}

location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
deny all;
}
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}

location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
try_files $fastcgi_script_name =404;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
#Avoid sending the security headers twice
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}

location ~ ^/(?:updater|ocs-provider)(?:$|/) {
try_files $uri/ =404;
index index.php;
}

# Adding the cache control header for js and css files
# Make sure it is BELOW the PHP block
location ~* \.(?:css|js)$ {
try_files $uri /index.php$uri$is_args$args;
add_header Cache-Control "public, max-age=7200";
# Add headers to serve security related headers (It is intended to
# have those duplicated to the ones above)
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header Referrer-Policy no-referrer;
# Optional: Don't log access to assets
access_log off;
}

location ~* \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$ {
try_files $uri /index.php$uri$is_args$args;
# Optional: Don't log access to other assets
access_log off;
}
}
server {
listen 443 ssl http2;
# listen [::]:443 ssl http2;
ssl_certificate /etc/letsencrypt/live/domain.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.ru/privkey.pem;
# Add headers to serve security related headers
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header Referrer-Policy no-referrer;

#I found this header is needed on Ubuntu, but not on Arch Linux.
add_header X-Frame-Options "SAMEORIGIN";

# Path to the root of your installation
root /var/www/html/nextcloud/;

access_log /var/log/nginx/nextcloud.access;
error_log /var/log/nginx/nextcloud.error;

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

# The following 2 rules are only needed for the user_webfinger app.
# Uncomment it if you're planning to use this app.
#rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
#rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json
# last;

location = /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}

location ~ /.well-known/acme-challenge {
allow all;
}

# set max upload size
client_max_body_size 512M;
fastcgi_buffers 64 4K;

# Disable gzip to avoid the removal of the ETag header
gzip off;

# Uncomment if your server is build with the ngx_pagespeed module
# This module is currently not supported.
#pagespeed off;

error_page 403 /core/templates/403.php;
error_page 404 /core/templates/404.php;

location / {
rewrite ^ /index.php;
}

location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
deny all;
}
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}

location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
try_files $fastcgi_script_name =404;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
#Avoid sending the security headers twice
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}

location ~ ^/(?:updater|ocs-provider)(?:$|/) {
try_files $uri/ =404;
index index.php;
}

# Adding the cache control header for js and css files
# Make sure it is BELOW the PHP block
location ~* \.(?:css|js)$ {
try_files $uri /index.php$uri$is_args$args;
add_header Cache-Control "public, max-age=7200";
# Add headers to serve security related headers (It is intended to
# have those duplicated to the ones above)
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header Referrer-Policy no-referrer;
# Optional: Don't log access to assets
access_log off;
}

location ~* \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$ {
try_files $uri /index.php$uri$is_args$args;
# Optional: Don't log access to other assets
access_log off;
}
}


UPD в коменте
  • Вопрос задан
  • 1982 просмотра
Подписаться 3 Средний 1 комментарий
Решения вопроса 1
@Drno Автор вопроса
Вообщем. после увеличения скорости сети на 1000мб и комментирования RewriteEngine в конфиге апача ошибки исчезли... так же удален php-fpm, все работает на модуле mod_php
Стал нормально грузиться http, без ожидания в 20-30 сек...

конфиг апача 80 (в котором заккоментил строки)
spoiler



ServerName domen.ru
ServerAlias www.domen.ru
# ServerAdmin admin@
DocumentRoot /var/www/html/nextcloud

ErrorLog ${APACHE_LOG_DIR}/domen.ru.log
CustomLog ${APACHE_LOG_DIR}/domen.ru.log combined


Options FollowSymlinks
AllowOverride All
Require all granted

## вот отсюда закоментил временно
#RewriteEngine on
#RewriteCond %{SERVER_NAME} =domen.ru [OR]
#RewriteCond %{SERVER_NAME} =www.domen.ru
#RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]



апач ssl
spoiler




ServerName domen.ru
ServerAlias www.domen.ru
# ServerAdmin admin@
DocumentRoot /var/www/html/nextcloud

ErrorLog ${APACHE_LOG_DIR}/domen.ru.log
CustomLog ${APACHE_LOG_DIR}/domen.ru.log combined


Options FollowSymlinks
AllowOverride All
Require all granted


SSLCertificateFile /etc/letsencrypt/live/domen.ru-0001/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domen.ru-0001/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf




Смысл в том что мне надо чтоб работало http и https, т.к. много клиентов которые на http, их еще не перенастроили

Если кто то знает как сделать лучше\правильнее - жду с советом
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Так вам же и Apache ругается
WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
, и Nginx ругается
[mpm_prefork:error] [pid 70323] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting
на одно и то же, а вы в упор не видите?

База данных тоже ругается
HINT: See server log for query details.\nCONTEXT: while rechecking updated tuple (4,118) in relation "oc_file_locks"
, один запрос обновляет записи (и этим заблокировал таблицы), другие запросы ждут окончания блокировки и не могут дождаться.

Кстати, в логах видны $1, $2 и т.д. Это вы заменили, или это база данных так запрос видит? Или это в коде ошибка, и в запрос вообще не подставляются нужные значения?
И ещё, почему "lock" вместо кошерного SQL-ного `lock`?
Ответ написан
2ord
@2ord
Какие HTTP запросы тормозят?
Какие файловые операции вызывают эти запросы?
Что происходит с БД в это время?
Сколько одновременных запросов от клиентов во время таких нагрузок?

Я бы постарался получить графики различных параметров во времени, от чего можно отталкиваться для решения проблемы.

Можно установить какой-нибудь munin-node или другие системы мониторинга.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы