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

Типичные ошибки развёртывания сайтов

Оказывается, так тяжело работать техподдержкой :) На днях один товарищ решил установить себе LAMP и на него попробовать мою кассу для ведения семейного бюджета. Я её делал, в основном для себя, поэтому настойчиво никому не рекомендую, но кто хочет - тот себе её устанавливает и пользуется. Исходники открыты. Таких человек, которые не стали пользоваться имеющимися в интернете бесплатными решениями, а решили опробовать мой велосипед, оказалось двое - МБТСирожа и товарищ Слава Пэ. Оба ни разу не веб-разработчики, поэтому наступали на грабли, которые я научился обходить на автомате ещё несколько лет назад и, разумеется, про которые я их не предупредил :) Я же изо всех сил старался им помочь, общаясь посредством мгновенных сообщений, и, в итоге, оба, кажется, всё же преуспели :)

Поэтому потом я решил написать этот пост, посвящённый основным проблемам и ошибкам, с которыми все сталкиваются во время развёртывания сайтов на платформе LAMP.

1) нехватка прав доступа.
Ошибка 403 чаще всего свидетельствует именно об этом. Апач и пхп просто не имеют прав доступа на чтение файлов и доступа в поддиректории. Обычно все ставят на директории права 755, а на файлы - 644. Причём права надо ставить рекурсивно. Может быть так, что расположенный в корне файл php запускается, но вываливается с фатальной ошибкой при первой же попытке подключить другой файл (командой require() или require_once()), хотя вы твёрдо уверены, что требуемый файл присутствует именно там, где надо. А всё дело в том, что файл-то требуемый, хоть и лежит, где надо, но либо в папке, куда апач не может зайти, либо сам файл запрещён для чтения апачу.

2) суровый AllowOverride.
В конфиге апача есть директива AllowOverride. Она указывается для каждой директории и её влияние распространяется рекурсивно на все поддиректории. По умолчанию AllowOverride имеет значение None, что запрещает какое-либо изменение настроек и параметров для любых поддиректорий сайта. И, само собой, в таком случае всё содержимое файла .htaccess будет проигнорировано. Я уже говорил о том, что пишу AllowOverride All и не беспокоюсь о том, что .htaccess не подцепится.

3) забытые модули апача.
Это ну просто наитипичнейшая ошибка :) В папке /etc/apache2/mods-enabled лежат симлинки (символические ссылки) на файлики из /etc/apache2/mods-available, который загружают и конфигурируют модули для апача. Если сайт работает на php, то там должны присуисивовать @php5.conf и @php5.load. А если используется реврайт, то и @rewrite.load.

Но иногда попадаются совсем странные ошибки. Например, как-то раз я не мог понять, почему require_once() выдаёт ошибку, хотя требуемый файл лежит там, где надо, и права доступа к нему есть. Оказывается, путь к нему выглядел как /var/www/site-folder//subdir/file.php - обратите внимание на двойной слэш - и потому и не подцеплялся. Причина была в том, что функция выглядела так:
require_once($_SERVER['DOCMENT_ROOT'].'/subdir/file.php');
А $_SERVER['DOCUMENT_ROOT'] берётся из директивы DocumentRoot из конфигурационного файла апача. Стоило там убрать закрывающий слэш и перезапустить апач, как всё заработало.
Причём сейчас на Ubuntu 10.10 Maverick Meerkat (2.6.35-23) + Apache 2.2.16 + PHP 5.3.3 подобное я повторить не смог (может, какая-то настройка у пхп есть по убиранию двойных слешей, или патч какой-то в glibc, я не знаю), а вот несколько месяцев тому назад ошибка легко воспроизводилась.

Комментариев нет:

Отправить комментарий

Ублюдочный Гугл поломал форму комментариев. Извините.