суббота, 11 декабря 2010 г.

Indexed Search или эпопея с InnoDB


Казалось бы, какая связь между Indexed Search и InnoDB? Но...

Переносил я тут недавно один свой TYPO3-сайт на новый хостинг... Как говорится, перенес один в один. Но все пошло не так гладко как казалось на первый взгляд - перестал работать поиск на сайте, организованный экстом - indexed_search.

Слёту я решил переустановить (uninstall+install), а затем и обновить версию indexed_search, но это не помогло.

Правильное направление поиска причин возникновения проблемы, задала такая вещь. Каждый раз, при проверке настроек экста - indexed_search в менеджере расширений, он предлагал мне сделать update некоторых своих таблиц. Причем, суть данного апдейта сводилась не к созданию отсутствующих таблиц или полей, а смене движка для некоторых таблиц на InnoDB. Ну тут и начался несколько пролонгированный и довольно "сексуальный" курс повышения квалификации в области MySQL.

У меня сразу возник вопрос, а поднят ли этот движок на моем хостинге. Зайдя на консоль мускула я набрал следующую команду:
mysql> show engines;
и увидел ответ:
InnoDB |DISABLED
набрал еще другую команду, которая подтвердила наличие трабл с InnoDB:
mysql> show engine innodb status;
ERROR 1235 (42000): Cannot call SHOW INNODB STATUS because skip-innodb is defined

Немного погуглив, я сделал следующее:
1. Остановил MySQL, с помощью команды: /etc/init.d/mysql stop
2. Переименовал 2 лог-файла - ib_logfile0 и ib_logfile1:
mv /var/lib/mysql/ib_logfile0 /var/lib/mysql/ib_logfile0.bak
mv /var/lib/mysql/ib_logfile1 /var/lib/mysql/ib_logfile1.bak
3. Запустил MySQL: /etc/init.d/mysql start. При запуске на консоли стали появляться довольно страшные сообщения:
101027 20:59:45 InnoDB: Error: page 513 log sequence number 0 972453278
InnoDB: is in the future! Current system log sequence number 0 544625838.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.0/en/forcing-recovery.html
InnoDB: for more information.

Хотя, когда я опять из консоли MySQL выполнил знакомую нам команду:
mysql> show engines;
то увидел более приятное сообщение:
MyISAM | DEFAULT
InnoDB | YES

Таким образом я оживил InnoDB на своем сервере, но моя база оставалась "паламатая".

Вылечил базу мускула я следующими действиями:
1. В конфигурационный файл MySQL - /etc/mysql/my.cnf добавил параметр, который блокирует все Insert и Update на сервере:
innodb_force_recovery = 4
(это позволяет нам, как бы, заморозить базу в исходном состоянии на какое-то время). Заодно можно запомнить или записать значение параметра datadir из my.cnf, указывающий на местонахождение файлов БД и которое будет нужно в дальнейшем.

Если вы не знаете где находится файл my.cnf, то воспользуйтесь командой: find / -name my.cnf.

2. Рестартовал MySQL:
/etc/init.d/mysql stop
/etc/init.d/mysql start

3. Дополнительной утилитой мускула сделал дамп своей базы данных:
mysqldump --force --compress --triggers --routines --create-options -uroot -pROOTPASSWORD --databases DATABASENAME > /usr/mydb.sql

4. В очередной раз остановил сервер MySQL:
/etc/init.d/mysql stop
есть также и другой способ остановки сервиса:
mysqladmin -uroot -pROOTPASSWORD shutdown

5. Нашел физическое местонахождение директории с файлами БД (можно с помощью find / -name DATABASENAME) и записал на листике её имя, имя ее собственника (owner) и сумму прав на неё (rwx------, или 700). Все это может показать команда ls -l

6. Удалил полностью эту директорию (а точнее переместил в другое место - береженого бог бережет, как говорится :):
rm -fdr /var/lib/mysql/DATABASENAME/
БУДЬТЕ ОЧЕНЬ ВНИМАТЕЛЬНЫ, НЕ ЗАХВАТИТЕ НИЧЕГО ЛИШНЕГО!!!

7. Тут же создал директорию с таким же именем и задал её овнера и права:
mkdir /var/lib/mysql/DATABASENAME/
chown -R mysql:mysql /var/lib/mysql/DATABASENAME/
chmod -R 700 /var/lib/mysql/DATABASENAME/

8. Специальной утилитой mysql_install_db создал новые таблицы привилегий MySQL:
/usr/local/bin/mysql_install_db
и на всякий случай повторил присвоение овнера и установку прав:
chown -R mysql:mysql /var/lib/mysql/DATABASENAME/
chmod -R 700 /var/lib/mysql/DATABASENAME/

9. Убрал параметр innodb_force_recovery из конфигурационного файла - my.cnf

10. Запустил mysql:
/etc/init.d/mysql start

11. Импортировал данные обратно в базу данных:
mysql -uroot --compress < /usr/mydb.sql

12. Напоследок, обновил таблицы привилегий mysql:
/usr/bin/mysqladmin -uroot flush-privileges

Ну, вот и всё парни, а точнее мужики если дочитали эту статью до конца. Вы не поверите, но indexed_search у меня заработал.
Неужели для indexed_search так важно иметь движок InnoDB для некоторых своих таблиц?
Чтобы ответить себе на этот вопрос у меня уже не оставалось ни времени, ни сил, ни большого желания.

P.S. Все пути к директориям, которые есть в данной статье, скорее всего у вас будут другими. Поэтому, если вам нужно выполнить какую-то утилиту или найти файл, то используйте команду find / -name file_or_dir_name, она действительно рулит.

 

среда, 10 ноября 2010 г.

SEO и общие рекомендации



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

1. Рекомендации по основным элементам страниц сайта.

Как уже было сказано в предыдущих статьях, для СЕО очень важны 3 вещи - title страницы, meta-тег description и meta-тег keywords.

Что касается длины этих параметров, то общие рекомендации для заточки под Google такие:

Title - должен содержать не более 12 слов, общая длина которых должна составлять от 70 до 80 символов (наиболее важные слова располагайте первыми).
Description - рекомендуемая длина содержимого этого МЕТА-тега – 150 символов и она не должна превышать 200 символов (это должен быть текст описывающий контент вашей страницы, а не набор ключевых слов и словосочетаний).
Keywords - этот тег должен содержать около 200 символов, во всяком случае, длина не должна превышать 250 символов.

На сайте не должно быть страниц с повторяющимися Title и Description!

2. Рекомендации по контенту сайта.

Для каждой страницы может быть только один тег <H1>, несколько тегов <H2> и <H3> (причем тегов <H2> и <H3> может не быть вообще). Желательно, чтобы внутри тегов <H1>, <H2>, <H3> не содержались другие теги (например, <H1><em>текст</em></H1>), а также дополнительные атрибуты (например, <H2 class="red-italic">).

Оформление заголовков <H1>, <H2>, <H3> необходимо переносить в таблицу или файл-стилей.

Оформление текста, который является ссылкой, должно отличаться от оформления основного текста страницы, например подчеркиванием, цветом и т.п.

Оформление текста, помещенного в теги <STRONG>, должно отличаться от оформления основного текста страницы, например полужирным начертанием, курсивом, цветом и т.п.

Все картинки <IMG> должны иметь атрибут - alt.

Для внешних ссылок, которые не являются партнерскими, желательно добавить атрибут rel=”nofollow”, что позволит сократить отток PR с Ваших страниц.

Ключевые слова, которые встречаются в ваших текстах, желательно выделять либо полужирным начертанием, с помощью тегов <B> и <STRONG>, либо курсивом - тегами <I> и <EM>.

По возможности делайте слоганы не графическими а текстовыми.

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

Очень важно! Запомните, недопустимо полное или частичное использование текстов сайта в качестве рекламных текстов, пресс-релизов и т.п. на внешних ресурсах (в т.ч. контекстная реклама, доски объявлений и т.д.), а также недопустимо дублирование текстов внутри самого ресурса. Старайтесь как можно меньше передирать контент с других ресурсов.

Для правильного и оперативного определения поисковой системой региона сайта, настоятельно рекомендую внести на страницу с контактной информацией сайта полные контактные данные, включая индекс и название города в формате:
49000, г. Днепропетровск, ул. Короленко, д. 123.
А также номера телефонов, включая префикс, в формате:
+38 (067) 123-1234, +38 (0562) 111-222 (факс).
Если на сайте не указаны региональные контактные координаты, то может возникнуть ситуация, при которой поисковые системы (например, Яндекс) будут присваивать сайту не соответствующий регион, что приведет к некорректному положению сайта при выдаче результатов поиска.


3. Технические рекомендации.

Каждый сайт должны иметь 3 обязательных файла: robots.txt, sitemap.xml и favicon.ico (думаю, что все знают их назначение). Первые два файла запрашивают все поисковые боты, а последний - все клиентские браузеры, поэтому не нужно их огорчать ;)).

При запросе любых URLs, содержащих неосновные хосты (например, http://domain.com/ или http://domain.com/page.html без префикса WWW) необходимо сделать полный редирект на URL, с ответом сервера HTTP/1.1 301 Moved Permanently, содержащий основной хост - http://www.domain.com/.
Пример решения:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/robots\.txt$
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

На сайте не должны присутствовать повторяющиеся страницы, например главная страница по двум адресам http://www.domain.com/ и http://www.domain.com/index.html. Необходимо оставить http://www.domain.com/ страницу, а для страниц-дубликатов настроить переадресацию с ответом сервера HTTP/1.1 301 Moved Permanently на соответствующие страницы, либо HTTP/1.1 404 Not Found. Необходимо, чтобы каждая страница была доступна только по одному адресу.
Пример решения:
Redirect 301 /index.html http://www.domain.com/

При обращении к заведомо несуществующей странице, например http://www.domain.com/bla-bla-bla сервер не должен выдавать: HTTP/1.1 302 Found. Необходимо настроить сервер так, чтобы при обращении к несуществующей странице он выдавал: HTTP/1.1 404 Not Found.
Некорректная обработка данного запроса может привести к неправильной индексации сайта поисковыми системами и к проблемам с индексацией вообще, вплоть до полного исключения сайта из индекса поисковой системы.


P.S. На SEO влияет также и скорость работы сайта, но это уже тема для отдельного будущего разговора.

 

понедельник, 27 сентября 2010 г.

TYPO3 и SEO (часть вторая - tt_news)

В предыдущей статье, а точнее в первой части темы TYPO3 и SEO, я рассказывал о том, как в Typo3 с помощью дополнительных плагинов и TypoScript можно формировать Title и Description обычных страниц системы - page. Но сайт на Typo3 может иметь и другие страницы...

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

Я покажу как это можно сделать.

Предположим, что мы имеем следующие страницы на сайте:




Причем, уникальные идентификаторы страниц (uid) имеем следующие:
Новости - 12
Новости сайта - 37 (страница единичного просмотра)
Новости и статьи - 4 (Sysfolder со списком новостей)

Typo3 шаблон для страницы Новости и Новости сайта:
plugin.tt_news.code >
# Не индексируем страницу со списком новостей
config.index_enable = 0

plugin.tt_news {
code = LIST
}
[globalVar = TSFE:id = 70]
# На данной странице показываем только архивные новости
plugin.tt_news.archive = 1
[else]
plugin.tt_news.archive = -1
[global]

[globalVar = GP:tx_ttnews|tt_news > 0]
# Страница единичной новости
plugin.tt_news.code = SINGLE
# Страницу единичной новости - индексируем!
config.index_enable = 1
# Для единичной новости или статьи создаем мета-теги по нашим правилам
config.noPageTitle = 2

# Для description страницы используем subheader - подзаголовок новости
page.meta.description >
page.meta.description.data = register:newsSubheader

# Запросом находим title - заголовок новости
lib.meta_news=CONTENT
lib.meta_news.table = tt_news
lib.meta_news.select {
pidInList = 4
andWhere.data = GP:tx_ttnews|tt_news
andWhere.intval = 1
andWhere.wrap = uid=|
}

# Это будет перенос на новую строку (см. далее)
lib.meta_news.renderObj = COA
lib.meta_news.renderObj.5 = TEXT
lib.meta_news.renderObj.5.value (

)

lib.meta_news.renderObj.10 = TEXT
lib.meta_news.renderObj.10 {
field = title
wrap = <title>| : Имя сайта</title>
}
lib.meta_news.renderObj.10.append < lib.meta_news.renderObj.5

# Ручная генерация мета-тега - description
# (если кому-то интересно - можно разкомментировать, но убрать page.meta.description выше)
#lib.meta_news.renderObj.20 = TEXT
#lib.meta_news.renderObj.20 {
# field = short
# wrap = <meta name="description" content="|" />
#}
#lib.meta_news.renderObj.20.append < lib.meta_news.renderObj.5

# Записываем в заголовок мета данные
page.headerData.776 >
page.headerData.776 < lib.meta_news

[global]

# Остальные настройки новостей
plugin.tt_news.stdWrap.wrap =
|

plugin.tt_news.templateFile = fileadmin/templates/tt_news_v3_template.html
# Указываем id папки с новостями
plugin.tt_news.pid_list = 4
# Указываем страницу для детального просмотра
plugin.tt_news.singlePid = 37
# Количество новостей в списке
plugin.tt_news.limit = 6
# Задаем формат даты
plugin.tt_news.displayList.date_stdWrap.strftime = %d.%m.%Y
# Если у новости нет подзаголовка, то в режиме списка новостей отображаем первые 250 символов её "тела"
plugin.tt_news.displayList.subheader_stdWrap {
crop = 250 | ... | 1
ifEmpty.field = bodytext
}
lib.newsContent < plugin.tt_news

О себе

Моя фотография
Вадим Гиркало
Фрилансер, веб-разработчик сайтов на базе бесплатной, мощнейшей и очень гибкой CMS системы - TYPO3.
Просмотреть профиль

Позвонить мне в Skype

TOP - 3