Ошибка в работе pcre (preg_match) во FreeBSD

April 22nd, 2010

В версиях php5-pcre 5.2 и ниже возможна ошибка проявляющаяся как:

Warning: preg_match() [function.preg-match]: Internal pcre_fullinfo() error

Причина этого проста – при сборке этого порта забыли поставить галочку для поддержки апача. Т.е. надо просто сделать make config этому порту и переустановить его.

Разные внешние IP для разных OpenVPN-клиентов

April 19th, 2010

Иногда появляется необходимость сделать для разных подключающихся клиентов разные исходящие IP-адреса. Большая часть настройки такая же как в статье “Установка OpenVPN на Linux“. Покажу лишь отличия в ситуации с двумя клиентами:
В server.conf:

server 10.10.0.0 255.255.0.0
client-config-dir /etc/openvpn/ccd

/etc/openvpn/ccd/client1:

ifconfig-push 10.10.10.1 10.10.10.2
iroute 10.10.10.0 255.255.255.0

/etc/openvpn/ccd/client2:

ifconfig-push 10.10.20.1 10.10.20.2
iroute 10.10.20.0 255.255.255.0

Ну и правил для ната должно быть тоже два:

iptables -t nat -A POSTROUTING -s 10.10.10.0/255.255.255.0 -o venet0 -j SNAT --to-source first-ext-ip
iptables -t nat -A POSTROUTING -s 10.10.20.0/255.255.255.0 -o venet0 -j SNAT --to-source second-ext-ip

Простой бэкап MyISAM таблиц MySQL без остановки сервера

April 14th, 2010

Суть в том, что мы не прерываем выполнение запросов на чтение, но в то же время получаем консистентный бэкап.
Делаем:

mysql -p

В mysql-консоли:

FLUSH TABLES WITH READ LOCK;

Ждем пока выполнится запрос.
В другой консоли просто копируем папку с нужной базой (базами) в бэкап.
В mysql-консоли:

UNLOCK TABLES;

Примеры использования ffmpeg

April 12th, 2010

Показать информацию по файлу:

ffmpeg -i sample.avi

Склеить изображений в видео:

ffmpeg -f image2 -i image%d.jpg video.mpg

Все картинки из текущей директории с именами файлов image1.jpg, image2.jpg и т.д. будут преобразованы в один ролик video.mpg.

Разложение видеоряда на кадры:

ffmpeg -i video.mpg image%d.jpg

Будут сгенерированы файлы image1.jpg, image2.jpg и т.д… Поддерживаемые графические форматы: PGM, PPM, PAM, PGMYUV, JPEG, GIF, PNG, TIFF, SGI.

Кодирование видеоряда для Apple iPod/iPhone:

ffmpeg -i source_video.avi input -acodec aac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x180 -title X final_video.mp4

Извлечение звука из видео с последующим сохранением в MP3:

ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3

Преобразование WAV в MP3:

ffmpeg -i son_original.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 son_final.mp3

AVI в MPG:

ffmpeg -i video_source.avi video_final.mpg

MPG в AVI:

ffmpeg -i video_source.mpg video_final.avi

Конвертация AVI-файла в несжатый анимированный GIF:

ffmpeg -i video_source.avi gif_anime.gif

Смешение аудио- и видеопотока в один результирующий файл:

ffmpeg -i son.wav -i video_source.avi video_final.mpg

Преобразование AVI в FLV:

ffmpeg -i video_source.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv video_final.flv

FLV в AVI:

ffmpeg -i video_source.flv -ab 56 -ar 44100 -b 200 -s 320x240 video_final.avi

Некоторые проблемы при установке VMWare Server 2 на linux

April 1st, 2010

После установки VMWare Server может не открываться веб-консоль сыпя в логе такими сообщениями:

'Proxysvc' 3086011280 warning] SSL Handshake on client connection failed:

Тут могут помочь две вещи:
1. Если открываем консоль через Firefox, то надо вернуть в нем поддержку SSL2 в about:config

security.enable.ssl2 from false into true

2. Если открываем консоль через Internet Explorer то подключаться надо по доменному имени, на которое сгенерирован SSL сертификат, а не по IP.

Еще вмварный management-демон может иногда падать. Вот здесь человек разобрал как это дело полечить.

Перенос базы пользователей FreeBSD

March 11th, 2010

Чтобы перенести всех системных пользователей на другой сервер надо просто скопировать поверх файлы /etc/master.passwd и /etc/group, и затем на новом сервере выполнить команду

pwd_mkdb master.passwd

Простая установка VPN-сервера MPD на FreeBSD

February 25th, 2010

Ставим из портов:

cd /usr/ports/net/mpd5 && make install

У файлов из /usr/local/etc/mpd5/ делаем копии без .sample

В mpd.secret удаляем все и прописываем имя и пароль в открытом виде через табуляцию.

В mpd.conf:
В секции startup: комментируем строчки set web.
В default заменяем на load pptp_server
В секции pptp_server:
меняем set ippool add pool1 на пул не пересекающийся с нашими локальными адресами.
set ipcp dns 8.8.8.8
set ipcp ranges – адрес сервера
set pptp self – адрес на котором будет слушать сервер.
set ipcp nbns – можно удалить

В /etc/rc.conf

mpd_enable="YES"
ipnat_enable="YES"
ipnat_rules="/etc/ipnat.rules"
gateway_enable="YES"

В /etc/ipnat.rules:

map bge0 192.168.6.0/24 -> 0/32

где bge0 внешний интерфейс сервера.

Запускаем:

/etc/rc.d/ipnat start
sysctl net.inet.ip.forwarding=1
/usr/local/etc/rc.d/mpd5 start

Все, можно подключаться стандартным виндовым клиентом.

Установка eAccelerator на CentOS с DirectAdmin

February 16th, 2010

Перед установкой вам может понадобиться php-devel, autoconf. Тогда просто ставим их через yum

yum install php-devel
yum install autoconf
cd /usr/local/src
mkdir eAccelerator
cd eAccelerator
wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2
tar -xvjf eaccelerator-0.9.6.tar.bz2
cd eaccelerator-0.9.6
export PHP_PREFIX="/usr/local"
$PHP_PREFIX/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=$PHP_PREFIX/bin/php-config
make
make install
cd /tmp
mkdir eaccelerator
chmod 0777 eaccelerator

Теперь правим php.ini. Например, при установленных ZendOptimizer, ionCube и eAccelerator он должен быть примерно таким (порядок подключения модулей важен!):

extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613"

[eAccelerator]
extension="eaccelerator.so"
eaccelerator.shm_size="64"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="100"
eaccelerator.shm_prune_period="1800"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

[Zend]
zend_extension = /usr/lib64/ioncube/ioncube_loader_lin_5.2.so
zend_extension_manager.optimizer=/usr/local/Zend/lib/Optimizer-3.3.3
zend_extension_manager.optimizer_ts=/usr/local/Zend/lib/Optimizer_TS-3.3.3
zend_optimizer.version=3.3.3
zend_extension=/usr/local/Zend/lib/ZendExtensionManager.so
zend_extension_ts=/usr/local/Zend/lib/ZendExtensionManager_TS.so

Теперь проверяем и релоадим апач:

php -i |grep eacc
/etc/init.d/httpd reload

Добавление диапазона IP адресов в CentOS

February 12th, 2010

Если надо добавить непрерывный диапазон IP адресов на интерфейс, то создаем файл /etc/sysconfig/network-scripts/ifcfg-eth0-range0 с содержимым:

IPADDR_START=192.168.0.101
IPADDR_END=192.168.0.120
NETMASK=255.255.255.255
CLONENUM_START=1
NO_ALIASROUTING=yes

Где
IPADDR_START – первый IP, который вы хотите добавить
IPADDR_END – последний IP, который вы хотите добавить
CLONENUM_START – число, с которого будет начинаться виртуальный интерфейс, например от eth0:1 до eth0:20

/etc/init.d/network restart

Расследование странного глюка с HTTP Basic авторизацией

February 10th, 2010

Иногда бывают такие ситуации, когда несколько глюков наложившись один на другой составляют проблему весьма и весьма загадочную на первый взгляд.
Ситуация была такая:
Проводился перенос сайтов с ВПС-а (на LAMP платформе) на дедик с таким же LAMP только еще с DirectAdmin-ом. Контент сайтов и базы данных были перенесены на новый хост. На одном из сайтов был установлен WordPress и в подпапке /st/ некий скрипт доступ к которому был ограничен в файле .htaccess лежащем в той же папке. Вот содержимое того .htaccess

Order allow,deny
Allow from all
AuthType Basic
AuthName "admin"
AuthUserFile /home/username/domains/domain.com/public_html/st/.htpasswd
Require valid-user

Вроде все очень просто и правильно. Но, при попытке доступа к domain.com/st/ мы стабильно получаем ошибку “404 – File Not Found” и отсутствие какого либо запроса на авторизацию. В логах этого виртуалхоста никаких ошибок, только 404 ответы. Все пути проверены и перепроверены. Авторизационные модули апача точно присутствуют:

apachectl -M |grep auth
 authn_file_module (static)
Syntax OK
 authn_default_module (static)
 authz_host_module (static)
 authz_groupfile_module (static)
 authz_user_module (static)
 authz_default_module (static)
 auth_basic_module (static)

В конфигах апача точно разрешено переопределение директив для этой папки AllowOverride All.
Расследование вывело на .htaccess лежащий в корне этого сайта и строки от вордпресса:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . - [L]
RewriteRule  ^([_0-9a-zA-Z-]+/)?(wp-.*) $2 [L]
RewriteRule  ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

Комментируя последнюю строчку мы получали работающую авторизацию. Но при чем тут она?! =)
Пытался отключать наследование работы mod_rewrite прописывая в “нижний” .htaccess директив RewriteEngine Off – не помогало. Да и на старом ВПС-е все работало. Очень странно.
Для уточнения работы правил реврайта пришлось в виртуалхост добавить директивы:

RewriteLog "/var/log/httpd/rewrite.log"
RewriteLogLevel 3

Оказалось, что при открытии проблемного УРЛ mod_rewrite пытался преобразовать адрес uri ‘401.shtml’. Что и указало на суть проблемы. А проблема на самом деле была в том, что при переносе сайта из ДиректАдминовского каталога /public_html были удалены дефолтные файлы – обработчики ошибок:
400.shtml, 401.shtml, 403.shtml … которые были назначены в конфиге апача обработчиками соответствующих ошибок. И происходило следующее: при запросе проблемного урла апач отвечал 401 – как и должен был, и пытался отдать страницу 401.shtml, но так как она была удалена .htaccess из корня сайта преобразовывал запрос на вордпрессовый index.php отдавая 404 из-за отсутствующего 401.shtml.
Возвращение на место *.shtml файлов вернуло все в работающее состояние.
Мораль: изменять дефолтные настройки всяких сложных панелей нужно очень аккуратно.

Проблема с php5-ffmpeg на FreeBSD

January 28th, 2010

На сегодняшний день имеется проблема выражающаяся в том, что одна из основных функций toGDImage() не работает выдавая ошибку “ffmpeg.so: Undefined symbol img_convert”
Этот патч проблему не решил.
Помогло следующее: порт multimedia/ffmpeg должен быть собран без swscaler. Для этого нужно поправить Makefile. Т.е. сделать –disable-swsсale. После пересборки самого ffmpeg, пересобрать и php-ffmpeg.

Восстановление системных файлов в Windows Server 2003

January 25th, 2010

Такая потребность может возникнуть в случае подозрения на изменения системных файлов вирусами. К счастью, нам поможет встроенное средство. Запускаем проверку и замену:

sfc /scannow

Если есть установочный CD, то его надо вставить. А если дистрибутив скопирован на диск, то надо в ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup изменить ключ SourcePath указав путь к дистрибутиву.

Fedora на сервере и NetworkManager

January 19th, 2010

При эксплуатации на сервере Fedora Linux рекомендуется отключать дефолтный NetworkManager и включать используемый по умолчанию в CentOS network тогда никаких глюков с добавлением алиасов на интерфейсы и прочим не будет:

chkconfig network on
chkconfig NetworkManager off
service network restart

IPtables и пассивный режим работы FTP-сервера

January 19th, 2010

Чтобы на сервере закрытом iptables заработал пассивный режим на ФТП-сервере надо:
В /etc/sysconfig/iptables-config добавить модуль:

IPTABLES_MODULES="ip_conntrack_ftp"

Рестартим:

/etc/init.d/iptables restart

Конечно среди правил iptables должно быть подобное:

-p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

Отображение ошибок в PHP

January 11th, 2010

Включить отображение ошибок в PHP-скриптах можно несколькими способами:
Внести изменения в php.ini и релоаднуть апач. Эти изменения затронут все сайты.

error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
log_errors_max_len = 1024
error_log = /var/log/php-error.log

Внести в .htaccess расположенный в папке скрипта. Это рекомендуемый способ:

php_value display_errors 1
php_value display_startup_errors 1

Внести изменения в сам скрипт:

ini_set("display_errors","1");
ini_set("display_startup_errors","1");
ini_set('error_reporting', E_ALL);

С этим методом такой нюанс: ошибки типа не закрытых скобок и не проставленных ; все равно будут приводить к белому экрану. Это происходит потому, что парсинг файла на синтаксическую корретность происходит до его выполнения и, соответственно, установки директив.
Это можно обойти подобным образом:

<?php
 error_reporting(E_ALL);
 ini_set("display_errors", 1);
 include("file_with_errors.php");
?>

Документация по соответствующим директивам PHP

Активация сервера терминалов в Windows Server 2003

December 26th, 2009

Если вдруг возникнет необходимость активировать сервер терминалов в Windows Server 2003 то вот здесь отличная статья на эту тему

Ставим простой и легкий прокси – privoxy

December 25th, 2009

Иногда бывает нужно посмотреть выдачу для другой страны или еще что-нибудь для чего удобно было бы использовать прокси на своем сервере/впс. Сквид – большой и тяжелый, поэтому разумно будет поставить privoxy. Он есть и в репозиториях для RHEL/CentOS и в портах FreeBSD. Бонусом privoxy является то, что он фильтрует всякую рекламу и подозрительные скрипты. Ставим:

yum install privoxy

В конфиге /etc/privoxy/config пишем строчку

permit-access [свой внешний ип]
listen-address  [внешний ип сервера]:8118

И далее:

chkconfig privoxy on
/etc/init.d/privoxy start

Все, можно подключаться.

Настройка штатного PPTP VPN на Windows Server 2003

December 15th, 2009

Иногда приходится заниматься и таким =)
1. Останавливаем и дизаблим службу Windows Firewall/Internet Connection Sharing (ICS)
2. Включаем Routing and Remote Access в режиме Custom -> VPN.
3. В свойствах “Routing and Remote Access” на вкладке IP добавляем диапазон адресов, которые будут выдаваться клиентам. Надо чтобы они не пересекались ни с какими другими диапазонами в клиентской сети.
4. Создаем специального пользователя и ставим ему в “Dial-in” -> “Allow access”.
5. Все.

Нюансы по WordPress

December 14th, 2009

Проблемы с кодировками может помочь решить в wp-config.php

define('DB_CHARSET', 'utf8');

Часто автоматическое обновление плагинов глючит и тогда имеет смысл переключить его с обновления через фтп на локальное. После этого надо проверить права для веб-сервера на папки plugins, wp-content

define('FS_METHOD', 'direct');

Так же будет иметь смысл поставить такие права.

define('FS_CHMOD_FILE',0777);
define('FS_CHMOD_DIR',0777);

Иногда бывает, что WordPress не подхватывает прописанные ему временные директории через конфиг апача

php_admin_value open_basedir /home/domain.com
php_admin_value upload_tmp_dir /home/domain.com/wp-tmp
php_admin_value session.save_path /home/domain.com/wp-tmp

И временные файлы все равно пытается закачать в /var/tmp
тогда надо:

define('WP_TEMP_DIR', ini_get('upload_tmp_dir'));

Для увеличения лимита используемой памяти:

define('WP_MEMORY_LIMIT', '96M');

Всякие другие полезные переменные для wordpress

Настройка SSL в nginx

December 9th, 2009

В nginx настроить SSL для домена еще проще чем в Апаче. Для начала генерим закрытый ключ, запрос на сертификат и подписываем его как указано в статье настройка SSL на Apache

Теперь конфиг:

server {
        listen 1.2.3.1:443;
        keepalive_timeout    70;

        server_name .domain.com;

        ssl                  on;
        ssl_protocols        SSLv3 TLSv1;
        ssl_ciphers          AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
        ssl_certificate      /etc/nginx/vhosts/www.domain.crt;
        ssl_certificate_key  /etc/nginx/vhosts/www.domain.key;
        ssl_session_cache    shared:SSL:10m;
        ssl_session_timeout  20m;

        location ~* \.(JPG|jpg|jpeg|gif|png|ico|zip|doc|gz|rar|bz2|swf|avi|mpg|vmw|wmv|mpeg|mkv|js)$ {
            root /usr/local/www/domain.com;
            expires max;
        }

        location / {
            proxy_pass         http://127.0.0.1:80/;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For $remote_addr;
        }
    }

Нюансы такие:
Файл с закрытым ключем придется делать без пароля. Если он у вас с паролем, то снять пароль можно так:

openssl rsa -in key.pem -out keyout.pem

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