Posterous theme by Cory Watilo

Filed under: FreeBSD

FreeBSD IP address change

In FreeBSD ip address is written in /etc/rc.conf.

If you changed it and want to restart network interfaces with latest changes, just run

/etc/rc.d/netif restart

But this wouldn’t affect routing. So if you changed default gateway too, you need to run

/etc/rc.d/routing stop
/etc/rc.d/routing start

To view routing table run

netstat -rn

And, finally, to add gateway by hand exec

route add default 192.168.1.254

Many thanks to VIVEK GITE for his post on nixCraft.

Server moving adventures

Второй день занимаюсь переездом содержимого одного сервера на другой. Другой - VPS под FreeBSD (привет, ДЦ Воля). В общем, это последний раз когда я до оплаты сказал что он неплох. Теперь только реальные сервера. Ну и может VDS под Linux... В общем, именно эта реализация ужасна. Меня мало интересует как и что - факт налицо.
Первая ласточка - mysql. Сообщение о нехватке памяти в логах: [cc lang="text"] 080806 13:39:10 [ERROR] /usr/local/libexec/mysqld: Out of memory (Needed 1043824 bytes) [/cc] Судя по найденому в гугле и попыткам что-либо изменить, это вылазит из-за дефолтного в i386 FreeBSD значения максимального количества памяти на процесс. И изменить его у меня не удалось. В результате куцые буфера, и веселые запросы толпятся в очереди, а MySQL уверенно пухнет. И опухает: [cc lang="text"] [root@vps ~]# ps axu | grep mysql bash: fork: Cannot allocate memory [/cc] Причем, такое поведение я уже встречал ранее. Дважды. Тогда еще и файловые дескрипторы заканчивались (привет phpbb с кучей плагинов). Но все был бы ничего, однако базы в большинстве своем живут в MyISAM, но самая тяжелая - как и полагается, в InnoDB. И вот любой запрос с джоинами на ней ложил тачку. Во время разборок с мускулем был применен киллер, найденый в темном переулке на форумах мускуля: [cc lang="php"] #!/usr/local/bin/php 10 && $row['User']!='root' ) { $sql="KILL $process_id"; mysql_query($sql); } } ?> [/cc] Теперь появилось время на мысли. mtop помог отследить, что во всем виновата одна эта БД. После запора в ней более-менее тяжелые запросы в других БД тоже застряют. Результатом был переезд этой большой базы на другой хост, и использование ее оттуда. Сервер с двухядреным оптероном и 4ГБ памяти не заметил появления балласта: запросы пролетали мгновенно. И это без попыток тюнинговать мускуль.
Далее начались проблемы с милой связкой nginx+apache. Как описано у Алексея, все заработало. Но некоторые странички отказывались показываться - браузер ругался на невозможность понять что же ему пришло. Такой ошибки я не встречал, и как оказалось никто из моего контакт-листа тоже. А получилось следующее: обожаемый ExpressionEngine (и тебе привет) пытался все отдать за-gzip-леное. Апач справедливо отдавал это как HTTP/1.1 Transfer-Encoding: chunked. Но это в ответ на запрос HTTP/1.0 от nginx! Последний нифига не понимал и результирующий фарш доставлялся браузеру. Еще бы, он не хотел это нечто отображать... Выключением опции gzip-сжатия в ExpressionEngine 1.5.3 это полечилось, однако...
... приключения с этим белым и пушистым зверьком не закончились. В форуме при публикации сообщения символы кириллицы отсутствовали. Долго я искал помощи через гугль, пока не полез в код. А в коде методом тыка нашел, что это все виноват xss_clean в версии 1.5.3. Заменив строки с [cc lang="php"] ... $str = preg_replace('#(&\#*\w+)[\x00-\x20]+;#u',"\\1;",$str); ... $str = preg_replace('#(&\#x*)([0-9A-F]+);*#iu',"\\1\\2;",$str); ... [/cc] на [cc lang="php"] $str = preg_replace('#(&\#?[0-9a-z]+)[\x00-\x20]*;?#i', "\\1;", $str); ... $str = preg_replace('#(&\#x?)([0-9A-F]+);?#i',"\\1\\2;",$str); [/cc] проблему вылечил. С нетерпением жду что обнаружится дальше...

ssh bruteforce prevention

Некоторое время назад начали приходить сообщения мониторилки о том, что сервис ssh недоступен на одном из серверов. И он таки был недоступен, потом поднялся сам. Как показал просмотр логов - по ssh активно шел перебор паролей. Я решил блочить нарушителей, а не перевесить ssh на другой порт.

Read the rest of this post »

replace freebsd with linux via ssh

Имея в своем распоряжении несколько серверов решил привести их к одной платформе, а именно - Ubuntu Linux. Вдохновленный этим описанием я решил попробовать повторить его. Сразу скажу - к серверу я таки поехал. Я забыл сделать fstab, но до него дело не дошло - не завелся grub. Хочу выразить глубокую признательность берсеркеру за статью, идею и подсказки! [cc lang="text"] ВНИМАНИЕ! Все что тут описано Вы делаете на свой страх и риск. [/cc] Итак, что получилось.

Read the rest of this post »

Server monitoring tool

Стояли у меня разные сервера, и для мониторинга сервисов на них стоял monit. Со своей задачей он справлялся - если что-то упало - поднять указанным скриптом. Но чего нехватало - так центра, в котором я бы мог озирать со своего места все сервера.

Read the rest of this post »

FreeBSD upgrade

Был когда-то админ, который держал вэб-сервера в компании. А я в ту пору работал там же вэб-программером. Но потом он ушел - и все бразды правления серверами былипереданы мне до нахождения нового админа. Было это месяцев 8 назад. С тех пор я и админю эти сервера и программлю. Так вот еще в те далекие времена на один из продакшен-серверов была поставлена FreeBSD 6.1 RELEASE. И были у нее иногда (раз-два в месяц) странные сбои - она спонтанно несколько раз уходила в ребут. Память там целая, да и рейд-массив не сбоит. Все логи чистые. Как я смог наконец-то выяснить - такое поведение встречалось у некоторых других серверов с этой же версией фри, а также и с какой-то версией 5ки - вроде бы тоже 5.1.

Read the rest of this post »

to find magic

Как удалить все логи, которые старше трех дней? В *NIX это можно сделать скриптом в одну строку: [cc lang="bash"] # cat ./clean_logs.sh #!/bin/sh DIR=/usr/local/www/data/www.example.com/cron /usr/bin/find $DIR -maxdepth 3 -mindepth 1 -type f -name "*.log" -ctime +3 -print0 | xargs -r -0 /bin/rm -f [/cc] Собственно, так файлики удалятся из текущей папки и из подпапок.

MySQL, FreeBSD and incorrect time

Баг: выполняем в консоли [cc lang="bash"] $date Tue Sep 4 20:26:45 EEST 2007 [/cc] а выполнив в mysql [cc lang="sql"] select now(); +---------------------+ | now() | +---------------------+ | 2007-09-04 17:26:45 | +---------------------+ [/cc] Сразу понятно, что проблема во временных зонах. И правда, [cc lang="sql"] show variables like 'system_time_zone'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | system_time_zone | UTC | +------------------+-------+ [/cc] Бороться с этим можно двумя способами - или в переменную окружения TZ перед запуском mysqld_safe установить значение EET (или в какой зоне находитесь Вы), или запуская mysql_safe с ключиком --timezone=EET. Второе помогло. Спасибо за наводку DKAnze