Page 7 of 23

Re: MySQL падает

Posted: Mon Jan 27, 2014 6:25 pm
by imperio
limit_req_zone
директива отвечает за количество обращений с одного ip адреса за секунду.
директива относится к nginx
Соответственно указывается в конфигурационном файле nginx в секции http

Re: MySQL падает

Posted: Thu Feb 13, 2014 10:07 pm
by Metallurg.IT
Ткните палкой админы если чтото нарушаю, но для себя и Вас шпаргалкой объединил информацию собранную с нескольких тем Вашего сайта и парочки других по оптимизации.

Шпаргалка на моём сайте http://hooked-hands.ru/2014/02/142/ - для проверки можете потыкать F5 хоть минуту (кстати был бы благодарен описанному результату, он же послужит поводом доработки конфигов.)

Собственно Шпаргалка.
------------------------------------------------------------------------------------------------------------------------------

Решение проблем с падением Apache + MySQL на VPS с 512 Мб.

nano /etc/my.cnf

Code: Select all


[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
#max_connections=40
#max_user_connections=20
wait_timeout=10
interactive_timeout=50
long_query_time=5
#log-queries-not-using-indexes
#log-slow-queries=/var/log/mysql/log-slow-queries.log

key_buffer_size = 64M
myisam_sort_buffer_size = 32M
join_buffer_size=1M
read_buffer_size=1M
sort_buffer_size=2M
table_cache=512
thread_cache_size=8
interactive_timeout=25
connect_timeout=5
max_allowed_packet=1M
max_connect_errors=1000
query_cache_limit=2M
query_cache_size=128M
query_cache_type=1
tmp_table_size=16M

#innodb_use_native_aio = 0
innodb_file_per_table

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

nano /home/USER-NAME/conf/web/nginx.conf

Заменить на своё:

1. USER_NAME
2. YOU_DOMAIN_NAME.COM
3. YOU_IP_ADRESS_SERVER

Code: Select all


server {
listen YOU_IP_ADRESS_SERVER:80;
server_name YOU_DOMAIN_NAME.COM www.YOU_DOMAIN_NAME.COM;
error_log /var/log/httpd/domains/YOU_DOMAIN_NAME.COM.error.log error;

location / {
limit_req zone=dyn burst=10;
proxy_pass http://YOU_IP_ADRESS_SERVER:8080;
}

location ~* ^.+\.(jpg|jpeg|gif|png|ico|svg|css|zip|tgz|gz|rar|bz2|exe|pdf|doc|xls|ppt|txt|odt|ods|odp|odf|tar|bmp|rtf|js|mp3|avi|mpeg|flv|html|htm)$ {
root /home/USER_NAME/web/YOU_DOMAIN_NAME.COM/public_html;
access_log /var/log/httpd/domains/YOU_DOMAIN_NAME.COM.log combined;
access_log /var/log/httpd/domains/YOU_DOMAIN_NAME.COM.bytes bytes;
expires max;
try_files $uri @fallback;
}

location /error/ {
alias /home/USER_NAME/web/YOU_DOMAIN_NAME.COM/document_errors/;
}

location @fallback {
proxy_pass http://YOU_IP_ADRESS_SERVER:8080;
}

location ~ /\.ht {return 404;}
location ~ /\.svn/ {return 404;}
location ~ /\.git/ {return 404;}
location ~ /\.hg/ {return 404;}
location ~ /\.bzr/ {return 404;}

include /home/USER_NAME/conf/web/nginx.YOU_DOMAIN_NAME.COM.conf*;
}



chkconfig iptables

nano /etc/sysconfig/iptables

Code: Select all


*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [16807:31509796]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -m state --state NEW -m recent --rcheck --seconds 6000 --name BLOCK --rsource -j DROP
-A INPUT -p tcp -m tcp --dport 21 -m state --state NEW -m hashlimit --hashlimit-above 2/min --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name BLOCK -m recent --set --name BLOCK --rsource -j DROP
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --rcheck --seconds 6000 --name BLOCK --rsource -j DROP
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit-above 2/min --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name BLOCK -m recent --set --name BLOCK --rsource -j DROP
-A INPUT -p tcp -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m limit --limit 600/min --limit-burst 100 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -m limit --limit 600/min --limit-burst 100 -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK RST -m limit --limit 1/sec -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK RST -j DROP
-A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

И в завершении применяем все нововведения перезагрузкой сервисов.

service iptables restart

service nginx restart
service mysqld restart
service httpd restart

Re: MySQL падает

Posted: Thu Feb 13, 2014 10:29 pm
by Metallurg.IT
Полный поход в душ с зажатой спичкой F5 вылетела страница 500, ещё одно нажатие F5 и отобразился сайт.

Сайт - CMS WordPress
Плагин - WP Super Cache - Кэширование выключено.
Кстати если не ошибаюсь без шаманства этот плагин 1 раз генерирует страницу, и в последствии по запросу хоть сотни человек отдаёт её в формате html через Ngnix, пока Apache релаксирует от отсутствия запросов.

Re: MySQL падает

Posted: Fri Feb 14, 2014 5:41 am
by akifievaa
Можно на странице ошибки сделать редирект на основную страницу.

Ну или в конфиге @fallback сразу сделать куда надо.

Тогда наверное и 500 страница не выскочит.

Тестируйте сайт на устойчивость к нагрузке:

Loaddy
Loadimpact
Perfload

Если их несколько на VPS то можно вообще параллельно все три сервиса каждый на свой сайт натравить и из под консоли (top) смотреть на загрузку памяти, проца и т.д.

Re: MySQL падает

Posted: Mon Feb 17, 2014 10:37 am
by demian
Metallurg.IT wrote: Шпаргалка на моём сайте http://hooked-hands.ru/2014/02/142/ - для проверки можете потыкать F5 хоть минуту (кстати был бы благодарен описанному результату, он же послужит поводом доработки конфигов.)

Собственно Шпаргалка.
------------------------------------------------------------------------------------------------------------------------------

Решение проблем с падением Apache + MySQL на VPS с 512 Мб.

nano /etc/my.cnf

Code: Select all


[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
#max_connections=40
#max_user_connections=20
wait_timeout=10
interactive_timeout=50
long_query_time=5
#log-queries-not-using-indexes
#log-slow-queries=/var/log/mysql/log-slow-queries.log

key_buffer_size = 64M
myisam_sort_buffer_size = 32M
join_buffer_size=1M
read_buffer_size=1M
sort_buffer_size=2M
table_cache=512
thread_cache_size=8
interactive_timeout=25
connect_timeout=5
max_allowed_packet=1M
max_connect_errors=1000
query_cache_limit=2M
query_cache_size=128M
query_cache_type=1
tmp_table_size=16M

#innodb_use_native_aio = 0
innodb_file_per_table

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

nano /home/USER-NAME/conf/web/nginx.conf

Code: Select all


location / {
limit_req zone=dyn burst=10;
proxy_pass http://YOU_IP_ADRESS_SERVER:8080;
}


nano /etc/sysconfig/iptables

Code: Select all


-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m limit --limit 600/min --limit-burst 100 -j ACCEPT

1. не совсем внимательно очевидно смотрели... my.cnf неправильный для дефолной установки панели, т.е. для mysql 5.5:
я приводил правильный конфиг для 512М:
1.1 строчки max_connections не советую копентировать, будет выставлено дефолтное 151 конект это лишняя оперативка которая нужна будет для других целей.
1.2 отсутствует директива innodb_buffer_pool = 8M по умолчанию он 128M
1.3 sort_buffer_size=2M слишком жирно для wordpress... 265k достаточно - 2M*151= 302M, вместо 40M

итог: только mysql с такими параметрами будет отжирать 500+ оперативки.

2. директива nginx

Code: Select all

limit_req zone=dyn burst=10; 
и директива iptables

Code: Select all

 -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m limit --limit 600/min --limit-burst 100 -j ACCEPT 
Хорошо, что взяли настройки для iptables которые я постил, НО опции nginx и iptables, выше, одно и тоже --limit 600/min = 10 конектов в сукунду в одного IP, с той лиш разницей что --limit-burst 100 блокировка на 100 секунд можно управлять по необходимости и в принципе не пропускает шквал новых конектов до web служб, тем самым не загружая лишнюю память.

ЗЫ: результат сваливание сервера в swap или ddos

ЗЫЫ: самое главное nano /home/USER-NAME/conf/web/nginx.conf ни в коем случае так не делать.

Re: MySQL падает

Posted: Wed Feb 19, 2014 4:44 pm
by Metallurg.IT
Забыл дописать в инструкции выше:

В файл добавить пару строчек в блок http

Code: Select all

nano /etc/nginx/nginx.conf

Code: Select all

http {
        #Эта директива ограничивает количество запросов от одного клиента до 10 запросов в секунду
        #!!! Попробовать проставить 5 запросов.
        limit_req_zone $binary_remote_addr zone=dyn:10m rate=10r/s;
За коментарии спасибо, попозже внимательно перечитаю и внесу корректировки в общий гайд настроек.

Re: MySQL падает

Posted: Wed Feb 19, 2014 9:10 pm
by Metallurg.IT
demian wrote:
Metallurg.IT wrote: ЗЫЫ: самое главное nano /home/USER-NAME/conf/web/nginx.conf ни в коем случае так не делать.
Можно поподробнее что тут не так?

И нашёл ваш старый пост, его использовать как основу?

Code: Select all

#####
# From mysql 5.5 low memory use 231M 
#####

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
max_connections=70
max_user_connections=30
wait_timeout=10
interactive_timeout=50
slow_query_log = 0
long_query_time= 5
log-queries-not-using-indexes
slow_query_log_file=/var/log/mysql/log-slow-queries.log

key_buffer_size = 8M
myisam_sort_buffer_size = 4M
join_buffer_size = 512K
read_buffer_size = 512K
sort_buffer_size = 1M
table_cache = 2048
thread_cache_size = 128
max_allowed_packet = 16M
query_cache_limit = 2M
query_cache_size = 8M
tmp_table_size = 16M


#innodb_use_native_aio = 0
innodb_file_per_table
innodb_buffer_pool_size = 8M


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Re: MySQL падает

Posted: Thu Feb 20, 2014 5:04 am
by demian
да этот конфиг

slow_query_log_file = /var/log/mysql/log-slow-queries.log - можно поменять под себя... и файл по этому пути должен присутствовать иначе будет ругаться с лог

Code: Select all

mkdir /var/log/mysql/
touch /var/log/mysql/log-slow-queries.log
chown mysql.mysql /var/log/mysql/log-slow-queries.log

Re: MySQL падает

Posted: Thu Feb 20, 2014 5:09 am
by demian
nano /home/USER-NAME/conf/web/nginx.conf - редактировать подобные файлы не стоит... т.к. манипуляции с сайтом через панель может вызвать перезапись конфига в соответствии с шаблоном.

лучше создать шаблон с необходимыми параметрами и применить его к сайту

Re: MySQL падает

Posted: Thu Feb 20, 2014 7:52 am
by Metallurg.IT
demian wrote:да этот конфиг

slow_query_log_file = /var/log/mysql/log-slow-queries.log - можно поменять под себя... и файл по этому пути должен присутствовать иначе будет ругаться с лог

Code: Select all

mkdir /var/log/mysql/
toucn /var/log/mysql/log-slow-queries.log
chown mysql.mysql /var/log/mysql/log-slow-queries.log
Ошибочка орфографии.

Code: Select all

touch /var/log/mysql/log-slow-queries.log