FastNetMon

Tuesday, 13 April 2010

Как YouTube борется с неприемлемым видео?


Каждую минуту на YouTube загружается более 20 часов видео, что составляет сотни тысяч видеороликов ежедневно. Для поддержания постоянной работы сервиса в таком масштабе, мы физически не можем просматривать весь загружаемый контент перед его публикацией. Точно так же как и телефонная компания не может отслеживать звонки перед тем, как они совершены. Вместо этого YouTube разработал инновационную и надежную систему мониторинга – пользователи помогают отслеживать и отмечать неприемлемый контент. Глобальное сообщество YouTube никогда не спит: люди, составляющие это сообщество, находятся на всех континентах и во всех часовых поясах. Пользователи YouTube - самая авторитетная для нас группа людей в том, что касается отслеживания контента, нарушающего Принципы сообщества. Миллионы пользователей сообщают о неприемлемом контенте, кликая на флажок «Отметить как неуместное» под самим роликом. Команда YouTube круглосуточно рассматривает все отмеченные таким образом видео. Если видеоролик нарушает правила, его незамедлительно удаляют с сайта. Аккаунты пользователей, нарушающих принципы сообщества YouTube, будут заблокированы.


взято с: http://feedproxy.google.com/~r/blogspot/LMWz/~3/AqlyW0L0PuA/youtube.html

Украинский стартап: Prom.ua

http://www.developers.org.ua/archives/max/2010/04/12/prom-ua-startup/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+DevelopersOrgUa+(Developers.Org.Ua+Updates)&utm_content=Google+Reader

Ребята супер! За тех часть зачот :)

Включение Register_Globals при использовании HTScanner

Чтобы включить Register_Globals для определенного сайта добавьте в корневой .htaccess следующие строки:
php_value register_globals 1


После этого подождите 2 минуты, пока применятся настройки и Register_Globals включиться только для этого сайта. Если хотите применить настройки срочно - откройте настройки любого www домена и не изменяя их сохраните их, это приведет к перезапуску Апача и немедленному применению настроек.

Zero tolerance

Вот так и везде надо: http://m-0-r-u-s.livejournal.com/150701.html

ISPManager: No such file or directory: Timeout connecting daemon

Вот заметил в логах такую ересь:
[Mon Apr 12 22:32:52 2010] [error] [client xx.xx.xx..xx] (2)No such file or directory: Timeout connecting daemon, referer: https://xxxx.info/manager/


Чем это может быть вызвано?

Поиск аномальных записей в логах ошибок Nginx и Apache

В логах ошибок Апача и Нгинкса тонны записей, но полезных среди них очень мало и они почти теряются на фоне ошибок "No such directory" и прочих, что делает просмотр логов очень неудобным и допускающим пропуск важных записей. Чтобы просматривать логи в удобном виде, необходимо отфильтровать лишние записи каким-либо образом, например грепом. Все примеры ниже будут для Debian.

Nginx:

cat /var/log/nginx/error.log | grep -v '2: No such file or directory' | grep -v 'failed (20: Not a directory' | grep -v ' access forbidden by rule' | egrep -v 'conflicting server name.*ignored' | grep -v 'Connection refused' | grep -v 'upstream timed out' | grep -v 'Connection reset by peer' | grep -v 'upstream prematurely closed connection while reading response header'



Apache:

cat /var/log/apache2/error.log /var/log/httpd/error_log | grep -v '\[notice\] mod_fcgid: call' | grep -v 'Init: SSL server IP/port conflict' | grep -v 'RSA server certificate wildcard' | grep -v 'suEXEC mechanism enabled' | grep -v 'Init: You should not use name-based virtual hosts in conjunction with SSL' | grep -v 'mod_ssl/2.2.9 OpenSSL/0.9.8g configured -- resuming normal operations' | grep -v 'File does not exist' | grep -v 'RSA server certificate is a CA certificate' | grep -v 'RSA server certificate CommonName ' | grep -v 'Graceful restart requested, doing restart' | grep -v 'caught SIGTERM, shutting down' | grep -v 'Digest: done' | grep -v 'Digest: generating secret for digest authentication' | grep -v 'configured -- resuming normal operations' | grep -v 'Could not reliably determine the server' | egrep -v 'DocumentRoot.*does not exist' | egrep -v 'mod_fcgid: process.*terminated by calling exit\(\), return code: 0' | grep -v 'No such file or directory: Timeout connecting daemon' | grep -v 'process.*going graceful shutdown, sending SIGTERM' | grep -v 'process.*graceful shutdown timeouted, sending SIGKILL' | grep -v 'mod_fcgid: cleanup zombie process' | grep -v 'mod_fcgid: too much' | grep -v 'process.*exit(communication error)' | grep -v 'process.*exit(shutting down)' | grep -v 'Premature end of script headers: ispmgr' | egrep -v 'script.*not found or unable to stat' | grep -v 'client denied by server configuration' | grep -v 'mod_fcgid: process.*exit(lifetime expired)' | grep -v 'mod_fcgid: process.*exit(idle timeout)' | grep -v 'mod_fcgid: process.*exit(busy timeout)'


ISPManager:
cat /usr/local/ispmgr/var/ispmgr.log | grep Error -i | grep -v 'error.log' | grep -v 'location_error' | grep -v 'fdata='



Поиск аномалий по клиентским логам:
for i in `find /var/www/*/data/logs | grep 'error.log'`; do file $i | grep -q 'gzip compressed data'; if [ $? -eq 0 ]; then zcat $i ; else cat $i; fi ; done | grep -v 'File does not exist' | grep -v 'client denied by server configuration' | grep -v 'script not found or unable to stat' | grep -v 'not found or unable to stat' | grep -v 'No such file or directory: Timeout connecting daemon' | grep -v 'File name too long' | grep -v 'Directory index forbidden by Options directive' | grep -v 'attempt to invoke directory as script' | grep -v 'mod_fcgid: server is restarted' | grep -v 'Permission denied: file permissions deny server access' | egrep -v 'script.*not found or unable to stat' | grep -v "Permission denied: Can't open directory for index" | grep -v 'stderr: WordPress database error' | grep -v 'mod_fcgid: read data timeout in 40 seconds' | grep -v 'Premature end of script headers' | grep -v 'Request exceeded the limit of 10 internal redirects'

Установка PHP htscanner на Debian - поддержка php_flag в .htaccess для PHP FastCGI / CGI

Офсайт проекта: http://pecl.php.net/package/htscanner

Ставим зависимости:
apt-get install -y php5-dev make patch


cd /usr/src
wget http://pecl.php.net/get/htscanner-0.9.0.tgz
# или зеркало
wget http://fastvps.googlecode.com/svn/trunk/packages/htscanner-0.9.0.tgz
tar -xf htscanner-0.9.0.tgz
cd htscanner-0.9.0
# накладываем патч, без него не будет работать php_flag
wget http://fastvps.googlecode.com/svn/trunk/patches/htscanner.patch
patch -p0 < htscanner.patch # следом накладываем патч для запрета перекрыти memory_limit wget http://fastvps.googlecode.com/svn/trunk/patches/deny_values.patch patch -p0 < deny_values.patch phpize ./configure make



Устанавливаем:
cp modules/htscanner.so /usr/lib/php5/20060613/


Или
make install


Но этого недостаточно, чтобы модуль подключился:
php -m | grep htscanner


Создаем конфиг:
vi /etc/php5/conf.d/htscanner.ini


[htscanner]
extension="htscanner.so"
; The configuration file htscanner needs to scan for php_* directives
config_file=".htaccess"
; The fallback docroot when htscanner can't determine the current docroot
default_docroot="/"
default_ttl=300
; Stop when an error occured in RINIT (no document root, cannot get path_translated,...)
stop_on_error = 0


Теперь создаем в корне сайта .htaccess со следующими строками (поиски по Гуглу и опрос знакомых подтвердили, у htscanner php_flag не работает в принципе):
php_flag register_globals On

но это не сработает почему-то :( А вот такой вариант отлично пашет:

php_value register_globals 1


Обращаю внимание, что после изменения .htaccess необходимо перезапустить рабочие процессы PHP, чтобы изменения применились:
killall -u username


В процессе поиска фикса насткнулся на следующие патчи для htscanner 0.9.0:
http://yourserveradmin.com/ik/htscanner-0.9.0.eol.patch и вот http://blog.hbis.fr/2009/04/02/htscanner-parser-patch/patch-htscanner-parser-20090401/ (как раз, вроде, на мою проблему).

Debian: не работает Apache Mod_Expires

Имеем вот такие настройки в .htaccess:

62 <IfModule mod_expires.c>
63 # Enable expirations.
64 ExpiresActive On
65
66 # Cache all files for 2 weeks after access (A).
67 ExpiresDefault A1209600
68
69 # Do not cache dynamically generated pages.
70 ExpiresByType text/html A1
71 </IfModule>


То есть все файлы с типом text/html должны выдаваться с заголовками, разрешающими их кэширование, это можно проверять командой (обязательно, чтобы 1.html был статикой, иначе никаких директив мы не поулчим! Апач не дописывает директивы к выдаче скриптов):
wget http://domain.ru:80/1.html --server-response -O/dev/null


Но выдаются только следующие заголовки на бэкэнде:

HTTP/1.1 200 OK
Date: Tue, 13 Apr 2010 07:21:32 GMT
Server: Apache
Last-Modified: Tue, 13 Apr 2010 07:19:25 GMT
ETag: "5258883-5-4841914cef940"
Accept-Ranges: bytes
Content-Length: 5
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html


А на фронтэнде nginx:
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 13 Apr 2010 07:21:34 GMT
Content-Type: text/html
Connection: keep-alive
Last-Modified: Tue, 13 Apr 2010 07:19:25 GMT
ETag: "5258883-5-4841914cef940"
Accept-Ranges: bytes
Content-Length: 5
Vary: Accept-Encoding


Как видите, ничего близкого к кэшированию тут нету.

Чтобы кэширование все же заработало, необходимо включить соответствующий модуль:
a2enmod expires
/etc/init.d/apache restart


После этого получаем от бэкэнда:

HTTP/1.1 200 OK
Date: Tue, 13 Apr 2010 07:24:53 GMT
Server: Apache
Last-Modified: Tue, 13 Apr 2010 07:19:25 GMT
ETag: "5258883-5-4841914cef940"
Accept-Ranges: bytes
Content-Length: 5
Cache-Control: max-age=1
Expires: Tue, 13 Apr 2010 07:24:54 GMT
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html


И фронтэнда:

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 13 Apr 2010 07:25:20 GMT
Content-Type: text/html
Connection: keep-alive
Last-Modified: Tue, 13 Apr 2010 07:19:25 GMT
ETag: "5258883-5-4841914cef940"
Accept-Ranges: bytes
Content-Length: 5
Cache-Control: max-age=1
Expires: Tue, 13 Apr 2010 07:25:21 GMT
Vary: Accept-Encoding


Как видите, появились новые директивы:
Cache-Control: max-age=1
Expires: Tue, 13 Apr 2010 07:25:21 GMT

Как получить http заголовки (хидеры, headers) от сервера?

Вот так:
wget domain.com --server-response -O/dev/null

PHP FastCGI + php_admin_value, php_admin_flag, php_value, php_flag

Как известно, эти команды указываются в .htaccess и должны поидее читаться модулем PHP для Апача, но когда последний не используется, а используются, скажем, PHP FastCGI / CGI, то эти директивы будут просто-напросто проигнорированы и эффекта не возымеют.

Но есть проблема - есть фикс! Вот что говорят ребята из Zend: http://kb.zend.com/index.php?View=entry&EntryID=259

А именно:

Using htscanner - htaccess support for PHP
Description: Allow one to use htaccess-like file to configure PHP per directory, just like apache's htaccess.
It is especially useful with fastcgi.


А вот ссылка на этот самый HTScanner: http://pecl.php.net/package/htscanner

Краткое описание от авторов этого самого мегаэкстеншена:
Allow one to use htaccess-like file to configure PHP
per directory, just like apache's htaccess. It is especially useful with fastcgi (ISS5/6/7, lighttpd, etc.).
This package was originally developed by Bart Vanbrabant. Old versions are available
from: http://files.zoeloelip.be/htscanner


Еще есть фича - если у Вас используется FastCGI, но при этом подключен PHP как модуль Апача, то все будет ок - php_* директивы будут проигнорированы, а вот если используется только FastCGI и PHP модуль в принципе отключен, то будет ошибка :) Но тут приходит на модуль модуль mod_fakephp, который подавляет выдачу ошибок при обнаружении опций PHP в .htaccess: http://www.dmi.me.uk/code/apache/mod_fakephp/

За наводку огромный респект arp`у: http://highloaded.blogspot.com/2010/04/htaccess-phpflag-with-fastcgi-on-debian.html и вот еще отличная статья с интересным подходом: http://dromok.ru/?p=104

Вот мой мануал по настройке этого чуда: http://phpsuxx.blogspot.com/2010/04/php-htscanner-debian-phpflag-htaccess.html А вот мануал в моем блоге: http://phpsuxx.blogspot.com/2011/01/modfakephp-debian.html