Analitycs

Показаны сообщения с ярлыком config. Показать все сообщения
Показаны сообщения с ярлыком config. Показать все сообщения

суббота, 24 ноября 2012 г.

Nginx accept() failed (24: Too many open files)

При достижения определенного уровня нагрузки на сайт Nginx начинает сыпать ошибками

2012/11/12 20:12:53 [alert] 5554#0: accept() failed (24: Too many open files) while accepting new connection on X.X.X.X:80

Диагноз

Диагноз, кстати -очевиден - слишком много открытых файлов

Лечение

Две строчки

1) в скрипт иницаилизации - например /etc/init.d/nginx

ulimit -n 65535

2) в конфиг nginx-  сразу после worker_processes

worker_rlimit_nofile 20480;

Рестарт.... и шерсть вашего любимца снова мягкая и шелковистая ;-) ;-)

среда, 4 июля 2012 г.

Как восстановить ну ОЧЕНЬ большой dump MySQL?

Если дамп базы с боевого сервера MySQL весит НУ ОЧЕНЬ много, то для ускорения импорта в mysqld имеет смысл ВРЕМЕННО выставить следующие значения в my.cnf

set autocommit=0

unique_checks=0

foreign_key_checks=0

и перезапустить сервер

#sudo service mysqld restart

После импорта дампа -  нужно вернуть на место родные значения.

Для восстановления из бекапов - этот способ не рекомендуется,  он скорее - для разработческих серверов/копий.

понедельник, 18 июня 2012 г.

Как скрыть версию nginx?

В конфиг nginx в раздел http добавляется строка

server_tokens off;

а в php.ini

expose_php = Off

понедельник, 30 января 2012 г.

Javascript+Flash мультизагрузчики картинок (SWFUpload, Uploadify) и Error #2038

Иногда мультизагрузчики изображений с использованием Flash (SWFUpload, Uploadify и т.д) дают ошибку #2038 при загрузке на случайных картинках без всяких видимых причин.

Как выяснилось - может быть целая куча разномастных серверных проблем - причем проблем преимущественно backend'овских.

TODO-list
  • обновляем Flash загрузчик до последней версии;
  • проверяем, что POST приходит на сервер в скрипт загрузки нормально - без всяких HTTP авторизаций, сессии нормально передаются, пользователь распознается залогиненным и т.д.;
  • и внимание - ЭПИЧНАЯ ОШИБКА: Размер разрешенных вложений должен быть <= размеру upload_max_filesize в php.ini;

И только потом лезем в настройки сервера - для nginx решение

Открываем nginx.conf и в http секцию добавляем директиву

client_max_body_size 500m;  

И удаляем из конфига директиву keepalive_timeout

Через некоторое время, когда у пользователей обновится кеш браузера - начинает все работать

пятница, 20 января 2012 г.

Как полноценно включить UTF-8 для MySQL?

Что нужно добавить в /etc/my.cnf для полноценной поддержки UTF-8 в MySQL, включая вывод данных в консоли mysql


[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci
character-set-server=utf8
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'
 
[client]
default-character-set=utf8
 
[client]
default-character-set=utf8

понедельник, 24 октября 2011 г.

Как включить MySQL innodb_file_per_table?

В продолжение темы насморков и гильотины оптимизации MySQL привожу рецепт по включению такой полезной функции как innodb_file_per_table.

Зачем это нужно?

MySQL по умолчанию все таблички innodb хранит в одном файле - когда их накапливается приличное количество - файл значительно разрастается. Плюс не забывайте, что при удалении данных в innodb - размер файла не уменьшается - он растет только в большую сторону. Так что если данных в базе у вас много или идет активное удаление - рано или поздно вы задумаетесь о том, чтобы выполнить подобное разделение

Что нужно сделать?

  1. Прежде всего - отрубаем нагрузку, выключаем связь сервер с внешним миром  - php и прочее беспокоить вас не должны - процесс не быстрый
  2. Теперь тщательно делаем ПОЛНЫЙ бекап всех баз данных и конфига
  3. Удаляем все таблицы из БД
  4. Выключаем mysqld
  5. В /etc/my.cnf удаляем старое значение innodb_data_file_path
    и добавляем

    innodb_data_file_path=ibdata1:10M:autoextend
    innodb_file_per_table=1

  6. удалаем cледующие файлы
    • /var/lib/ibdata1
    • /var/lib/ib_logfile0
    • /var/lib/ib_logfile1
    или сколько там файлов ibdata - оставлять старые logfile нельзя!!
  7. запускаем mysqld
  8. вкатываем таблицы обратно
  9. проверяем наличие свежесозданных файликов *.ibd
  10. PROFIT!!
Да, разумеется - операция опасная по сути, поэтому - бекап, бекап и еще раз бекап.

пятница, 21 октября 2011 г.

Настройка медленного MySQL - о насморках и гильотине

Последнее время часто вижу советы по оптимизации MySQL, в которых авторы сразу (не глядя на ситуацию) сразу рекомендуют - поставить Percona, поставить SSD.

Нет, конечно - варианты обновления софта и железа помогут - но этот как-то... лечить насморк гильотиной - быстро и точно пройдет. ;-) Давайте вспомним стоимость SSD - для компаний как бы пофиг, а для частного вебмастера - сумма в 500$ на дороге не валяется.


Мониторинг - всему голова

Разговор об оптимизации, на мой взгляд совершенно неразумно вести без мониторинга и построения графиков нагрузки по времени - я использую munin, кто-то любит zabbix, есть и другие. Ну да выбор - вопрос в большей степени религиозный, суть-то в следующем - некоторые админы очень любят поднять преждевременную панику при затормозившем сервере - дескать, вот я зашел!! у меня все тормозит !!!! и срочно кидаются все оптимизировать.

Стоять! ;-) Выдыхаем и думаем, теперь вдыхаем и продолжаем думать.

Вот если вы временно заболели насморком - следует ли вам прямо сейчас делать операцию по удалению гайморита? Вот и с сервером - не нужно делать скоропалительных выводов, основываясь на единичном срезе времени. В текущий момент может быть все что угодно - случайный всплеск активности ботов, забытый кем-то cron скрипт бекапа и так далее. "Ширше надо смотреть, товарищи" (с) Так что ставим мониторинг и смотрим как себя машина ведет в течении нескольких суток/недели.

Теперь немного советов для тех, кто не торопится с брутальными методами "а-ля гильотина" (с)

Прежде всего - запускаем скрипт-анализатор mysqld, мне известны два основных
После выполнения они дают рекомендации - что стоит подкрутить/изменить. Обязательно - сервер mysql перед анализом должен проработать под нагрузкой не менее 2 суток, а вообще-то - чем дольше, тем точнее будут выборки и рекомендации.

Дальше список типовых проблем mysqld

  • мало памяти на индексы (особенно критична нехватка памяти для таблиц InnoDB, MyISAM переживает ее более спокойно). Как косвенный признак - сильная загруженность диска - из-за нехватки памяти mysql отчаянно свапится/пишет tmp таблички на диск
  • много постоянно открытых коннектов к базе - уменьшаем - но опять таки - смотрим по времени - сколько РЕАЛЬНО используется.
  • для PHP - часто рекомендуют включать pconnect, на мой взгляд - оно того не стоит.
  • для InnoDB включаем innodb_table_per_file. Процесс миграции описан тут.
  • СПОРНО - если памяти много - рекомендуют загнать /tmp в RAM -> улучшится скорость работы с таблицами tmp, хотя мое мнение - если памяти хватает лучше просто дать базе памяти побольше - и временные таблички будут не нужны
  • смотрим внимательно на CurrentLockRation в результатах скрипта анализатора
    Current Lock Wait ratio = 1 : 8943
    Чем больше второе число - тем лучше.

Как увеличить Current Lock Wait? 

Тщательно изучать структуру своих таблиц и запросы - если часто идет запись, которая лочит таблицу - переводим на InnoDB, MyISAM оставляем для редко обновляющихся табличек, добавляем индексы и т.д.

Медленные запросы SQL

Ну и понятное дело - не забываем включить slow_query_log и просто оптимизировать кривые запросы - поверьте, их больше, чем можно предположить. 

У меня был случай, когда хороший грамотный фриленсер сделал мне задачу с некоторыми запросами - причем программист действительно неплохой, просто с нормальной посещаемостью  не работал. 

Через некоторое время сервер начал загибаться. При просмотре запросов к базе у меня зашевелились волосы на всех участках тела - там было что-то в стиле  JOIN ... GROUP BY CONCAT(SUBSTR(), SUBSTR())  и т.д. - уже сейчас точно не вспомню. 

Разумется, на тестовой установке у него все отрабатывало мгновенно - данных нет, нагрузки нет - отлично думает он и шлет мне код. А я дурак, его особо не читаю - проверяю, работает  и вкатываю на живой сервер - проблемы начались месяца через четыре, когда данные накопились...

Ну и пришлось переписывать код самому - с помошью нескольких простых запросов и мемкеша.

Итог

  • Мониторинг по времени
  • Изучение
  • И только потом - оптимизация


среда, 19 октября 2011 г.

Как настроить Nginx + php-fastcgi для Wordpress?

По просьбе Олега "TheAppleGeek" выкладываю рабочий конфиг Ngnix с php-fastcgi для Wordpress c включенным плагином W3 Total Cache
server {
    listen 80;
    server_name host.ru;
    index index.php;
    root /var/www/vhosts/host.ru/httpdocs;

    location ~ \.php$ {
                limit_conn three 20; 
                include         /etc/nginx/include.d/default_fastcgi_params.conf;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass    php;
    }

    location ~ /\.ht {
        deny all;
    }

    if (!-e $request_filename) {
        rewrite ^(.+)$  /index.php   last;
    }
}

и общий для всех хостов на машине /etc/nginx/include.d/default_fastcgi_params.conf
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

fastcgi_connect_timeout 60;
fastcgi_send_timeout 60;
fastcgi_read_timeout 60;

понедельник, 22 августа 2011 г.

Нет коннекта к MySQL сразу после установки - Host 'MachineName' is not allowed to connect to this MySql Server

MySQL по умолчанию ставится в "закукленном" состоянии без доступа снаружи - что бы открыть доступ снаружи, нужно в конфиге /etc/my.cnf заменить

#bind-address           = 127.0.0.1
bind-address = 0.0.0.0

ну или какой там нужный IP и открыть доступ для нужного пользователя MySQL

GRANT ALL PRIVILEGES ON *.* TO root@'hostname' IDENTIFIED BY 'root-password' 

P.S. Да, разумеется - это все для девелоперских машин - на публичных это делать не рекомендуется.

пятница, 19 августа 2011 г.

Mozilla Firefox не показывает картинки

Проблема - в настройках Firefox 4 и выше по умолчанию стоит излишняя безопасность

Вариант 1 - пользовательский

Идем на страниц в Firefox about:config (в адресной сроке). Дальше - соглашаемся с предупреждением, и в строке поиска ищем параметр: security.csp.enable Двойным щелчком переключаете на false и - вуаля!!! Всё заработало...

Вариант 2 - методически грамотный

Со стороны сервера нужно править HTTP заголовки. Для nginx - первая строчка будет
add_header X-Content-Security-Policy "allow 'self'; img-src *; script-src *;";

 add_header X-Frame-Options SAMEORIGIN;
 add_header X-XSS-Protection "1; mode=block";
Разумеется, если у админа включен параноидальный режим, то img-src *; script-src *; можно править на список одобренных доменов

четверг, 28 июля 2011 г.

Как защититься от SYN-флуда?

SYN флуд - один из способов DDOS-атаки на веб сервер.

Увеличеваем очередь "полуоткрытых" TCP-соединений:

sysctl -w net.ipv4.tcp_max_syn_backlog=1024

Уменьшаем время удержания "полуоткрытых" соединений:

sysctl -w net.ipv4.tcp_synack_retries=1

Включаем TCP syncookies:

sysctl -w net.ipv4.tcp_syncookies=1

Ограничиваем максимальное числа "полуоткрытых" соединений с одного IP к конкретному порту - в нашем случае http - 80:


iptables -I INPUT -p tcp --syn --dport 80 -m iplimit --iplimit-above 10 -j DROP

iptables -N syn-flood
iptables -A syn-flood -m limit --limit 100/second --limit-burst 150 -j RETURN
iptables -A syn-flood -j LOG --log-prefix "SYN flood: "
iptables -A syn-flood -j DROP


Да, разумеется - iplimit должен присутствовать в системе, иначе - никак ;-)


+ Добаляем в /etc/sysctl.conf следующие строки:

# Защита от спуфинга
net.ipv4.conf.default.rp_filter = 1
# Проверять TCP-соединение каждую минуту. Если на другой стороне - легальная машина, она сразу ответит. Дефолтовое значение - 2 часа.
net.ipv4.tcp_keepalive_time = 60
# Повторить пробу через десять секунд
net.ipv4.tcp_keepalive_intvl = 10
# Количество проверок перед закрытием соединения
net.ipv4.tcp_keepalive_probes = 5