Как настроить интернет: малоизвестные бэк-энд методы и секреты (2 часть).

New Perspectives on Coding

Примечание редактора: сегодня мы рады представить вам вторую часть статьи, созданной на основе одной из глав предстоящего печатного выпуска Smashing Book #4: новые взгляды на кодирование, написанной Полом Теро. Вы также можете прочитать первую часть этой статьи, которая вышла ранее. Также вы можете скачать полный вариант статьи из электронной Smashing библиотеки.

Прежде чем вы начнете читать эту статью, хотелось бы сделать маленькое напоминание: в 1 части мы изучали инфраструктуру интернета и веб-сервера. Мы остановились на этапе диагностики программного обеспечения веб-сервера и убедились в его работоспособности, выполнив проверку с помощью HTTP-запроса, и получили положительный ответ. Настало время для…

Идентификация веб-сайта.

Код 200 означает, что с вашей главной страницей все в порядке, и любой пользователь имеет возможность открыть её в браузере. Однако страница отображается не совсем корректно и совсем не так, как вы ожидали, а сказочная Widget 3000 страница может по-прежнему отсутствовать.

Виртуальные хосты и потоки.

Как уже упоминалось выше, на многих серверах размещается несколько веб-сайтов. Одним из них является веб-сайт по умолчанию. Доступ к этому сайту можно получить только тогда, когда вы заходите на сервере по IP-адресу http://80.72.139.101/ , а не по имени, или когда вы при обращении опускаете строку Host: в HTTP-запросе. Остальные сайты называются виртуальными хостами. Каждый из этих сайтов имеет физическое размещение на сервере, известное как корневой каталог (root) документа. В ходе дальнейшей идентификации проблем с веб-сайтом вы должны найти корневой каталог документа.

К счастью и это очень правильно, основное количество пакетов управления сервером, например, таких как Plesk, хранят виртуальный хост веб-сайтов согласно доменному имени. Вы можете просто воспользоваться командой find и непосредственно отыскать доменное имя. В примере ниже показано, как можно использовать команду find для поиска целой файловой системы, -type d – для поиска только директорий, и -name – для поиска каких-либо каталогов, содержащих имя “smashingmagazine”. Звездочки – это специальные символы. Вам нужно либо избегать их \*smashingmagazine\* или заключить их в кавычки "*smashingmagazine*":

$ find / -type d -name "*smashingmagazine*"
find: '/var/run/cups/certs': Permission denied
find: '/var/run/PolicyKit': Permission denied
/var/www/vhosts/smashingmagazine.com
/var/www/vhosts/smashingmagazine.com/httpdocs...

Если вы запустите эту команду в качестве обычного непривилегированного пользователя, то, вероятнее всего, увидите сообщение “Отсутствие прав доступа”, поскольку команда find пытается обратиться к запрещенным для пользования файлам. В действительности вы видите два типа выходных данных: stdout для “стандартного вывода” и stderr для “стандартных ошибок”. Они называются потоками вывода и смешиваются вместе.

Вы уже сталкивались с символом конвейеризации ( | ) для передачи выходного потока (stdout) одной команды во входной поток (stdin) другой команды. Благодаря символу > вы можете перенаправить вывод в файл. Повторите эту команду для отправки всех matches в файл с именем matches.txt:

$ find / -type d -name "*smashingmagazine*" > matches.txt
find: '/var/run/cups/certs': Permission denied
find: '/var/run/PolicyKit': Permission denied...

В этом случае все stdout перенаправляются в файл matches.txt и на экране отображается только поток вывода ошибок stderr. Если добавить число 2, то вы можете вместо перенаправления stderr в файл и выводить stdout:

$ find / -type d -name "*smashingmagazine*" 2> matcherrors.txt
/var/www/vhosts/smashingmagazine.com
/var/www/vhosts/smashingmagazine.com/httpdocs...

На компьютерах с Linux, UNIX и Mac существует специальный файл, который, по сути, является “черной дырой”, куда файлы направляются и исчезают. Он называется /dev/null, видит только stdout и игнорирует все ошибки:

$ find / -type d -name "*smashingmagazine*" 2> /dev/null
/var/www/vhosts/smashingmagazine.com
/var/www/vhosts/smashingmagazine.com/httpdocs...

Конечный результат представляет собой данные команды find, которые говорят вам, где примерно находится корневой каталог документа. В Plesk, все виртуальные хосты, как правило, хранятся в пределах /var/www/vhosts директории с корневым каталогом документа в /var/www/vhosts/domain.com/httpdocs.

Более длительный способ.

Вы более точно можете найти корневой каталог документа, анализируя файлы конфигурации. Для серверов Apache вы можете найти корневой каталог веб-сайта, установленный по умолчанию, благодаря изучению основного конфигурационного файла, который обычно /etc/apache2/apache2.conf или /etc/httpd/conf/httpd.conf.

$ grep DocumentRoot /etc/httpd/conf/httpd.conf 
DocumentRoot "/var/www/html"

Где-то внутри файла conf будет строка Include, которая ссылается на другие conf-файлы, которые сами по себе также могут включать в себя дальнейшие conf-файлы. Для нахождения DocumentRoot вашего виртуального хоста, вы должны будете просмотреть все эти файлы. Вы можете сделать это с помощью команд grep и find, но их выполнение займет много времени, поэтому данные будут отображаться постепенно.

Во-первых, мы найдем все файлы (благодаря использованию -type f) со всего сервера (/) имена которых заканчиваются на “conf” или ” include “. Команда -type f ищет только файлы, а опция -o позволяет искать файлы, оканчивающиеся на “conf” или ” include “. При этом нужно использовать значки прилегающих наклонных линий. Как было сказано выше, ошибки будут сразу же отображаться:

$ find / -type f \( -name \*conf -o -name \*include \) 2> /dev/null
/var/spool/postfix/etc/resolv.conf
/var/some file with spaces.conf
/var/www/vhosts/myserv.com/conf/last_httpd.include...

Результат не совсем полный, поскольку все файлы с пробелами будут затруднять выполнение команды grep. Чтобы исправить это, вы можете конвейеризировать выходные данные команды find с помощью другой команды под названием sed, которая позволяет указать регулярное выражение. Регулярные выражения – это огромная тема со своими особенностями. В команде ниже, комбинация символов s/ /\\ /g будет заменять все пробелы с косой чертой, которые следуют за пробелом:

$ find / -type f \( -name \*conf -o -name \*include \) 2>/dev/null | sed 's/ /\\ /g'
/var/spool/postfix/etc/resolv.conf
/var/some\ file\ with\ spaces.conf
/var/www/vhosts/myserv.com/conf/last_httpd.include...

Теперь вы можете использовать апостроф для вставки результатов выполнения команды find в команду grep. Назначение символа «`» отличается от символа «|» поскольку он на самом деле помогает строить команду, а не просто манипулирует вводом. Опция -H в команде grep говорит о том, что имена файлов также должны показываться. Так что теперь мы будем искать любое упоминание “smashingmagazine” в любом conf-файле.

$ grep -H smashingmagazine `find / -type f \( -name \*conf -o -name \*include \) 2> /dev/null | sed 's/ /\\ /g'`
/var/www/vhosts/smashingmagazine.com/conf/last_httpd.include: ServerName "smashingmagazine.com"...

Для запуска может потребоваться несколько секунд. Результатом выполнения команды будет нахождение каждого conf файла на сервере и поиск внутри этих файлов “smashingmagazine”. Эта процедура позволяет напрямую выявить DocumentRoot. В противном случае, по крайней мере, удастся открыть файл, в котором определены ServerName или VirtualHost. Затем вы можете использовать команды grep или less для поиска DocumentRoot внутри этих файлов.

Вы можете также использовать команду xargs, которая позволяет достичь аналогичного результата. Она также позволяет поместить результаты вывода одной команды в другую:

$ find / -type f \( -name \*conf -o -name \*include \) 2> /dev/null | sed 's/ /\\ /g' | xargs grep -H smashingmagazine
/var/www/vhosts/smashingmagazine.com/conf/last_httpd.include: ServerName "smashingmagazine.com"...
$ grep DocumentRoot /var/www/vhosts/smashingmagazine.com/conf/last_httpd.include
DocumentRoot "/var/www/vhosts/smashingmagazine.com/httpdocs"

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

Вы можете использовать подобный метод для nginx. Он также содержит основной конфигурационный файл, обычно в /etc/nginx/nginx.conf и он также может содержать другие файлы conf, однако его корневой документ так и называется — “root” (корень).

Управление интерфейсом Apache.

Благодаря использованию Apache, появился еще один способ поиска требуемого conf-файла. Можно воспользоваться командой apachectl или новой командой apache2ctl с опцией -S.

$ apachectl -S 
VirtualHost configuration:
80.72.139.101:80       is a NameVirtualHost
default server default (/usr/local/psa/admin/conf/generated/13656495120.10089200_server.include:87)
port 80 namevhost default (/usr/local/psa/admin/conf/generated/13656495120.10089200_server.include:87)
port 80 namevhost www.smashingmagazine.com (/var/www/vhosts/smashingmagazine.com/conf/last_httpd.include:10)...

Если результаты будут мелькать слишком быстро, вы можете попробовать воспользоваться конвейеризацией с помощью команды grep. Однако эта команда не будет работать, поскольку grep работает только на stdout и по какой-то причине apachectl выводит информацию в stderr. Таким образом, сначала вы должны направить stderr в stdout и затем отправить в grep. Это делается путем перенаправления потока ошибок 2 в выходной поток 1 с 2>&1 как в следующем примере:

$ apachectl -S 2>&1 | grep smashingmagazine
port 80 namevhost smashingmagazine.com (/var/www/vhosts/smashingmagazine.com/conf/13656495330.08077300_httpd.include:10)

В результате также будет показан conf файл, который содержит DocumentRoot для этого веб-сайта. Как в примере выше, использование команд grep или less позволит открыть файл DocumentRoot.

Проверка корневого каталога.

Теперь, когда вы нашли корневой каталог, вы можете еще раз все просмотреть и убедиться, что все в порядке. Внесите нужные изменения в каталог с помощью команды cd:

$ cd /var/www/vhosts/smashingmagazine.com/httpdocs
bash: cd: /var/www/vhosts/smashingmagazine.com/httpdocs: No such file or directory

Если вы получили сообщение об ошибке “Файла или каталога не существует”, то это очень плохая новостью. Либо DocumentRoot был неправильно установлен, либо же весь ваш сайт был удален. Если он существует, вы можете получить список файлов с помощью команды ls. Опция -a показывает скрытые файлы, которые начинаются с точки, а опция -l отображает их в расширенном формате представления с разрешением и датой:

$ ls -al
drwxrwxrwx  8 nobody  nogroup  4096 May  9 14:03 .
drwxr-xr-x 14 root    root     4096 Oct 13  2012 ..

По каждой папке будет показано, по крайней мере, два типа вложения. Единичное “.” для текущего каталога, и “..” – для родительского каталога. Если это все, то директория пуста.

На этом этапе вы можете проверить правильность выбранного места. Создайте новый файл с помощью команды echo и снова воспользуйтесь символом”>”, чтобы направить вывод в файл.

$ echo "<h1>My test file</h1>" > testfile.html

Данная команда позволит создать файл с названием testfile.html, содержащий HTML. Вы можете использовать ваш браузер или команды telnet, curl, wget для определения правильного местоположения файла.

$ curl http://www.smashingmagazine.com/testfile.html
<h1>My test file</h1>

Если все вышло, то вы проделали хорошую работу и нашли сайт! Удалите тестовый файл, приберите за собой с помощью rm testfile.html и продолжайте двигаться далее.

Резервное копирование и восстановление.

Команды tar и zip могут использоваться для резервного копирования и восстановления. Если ваш сайт был удален, то без резервной копии восстановление не сильно вам поможет. Чтобы вернуться назад во времени и осуществить резервное копирование данных можно воспользоваться одной из команд ниже. Чтобы вернуться на день назад можно использовать команду:

$ gobackintime 86400
It is now Sat May 10 20:30:57 BST 2013

Это, конечно же, шутка – но было бы хорошо иметь такую возможность! Команда tar используется для ленточного архива и берет свое начало из дней, когда резервное копирование данных выполнялось на магнитных лентах. Для создания каталожного архива вставьте опцию cfz в состав команды tar , которая будет управлять созданием нового архива в файле, а затем выполнит архивацию в формате gzip.

$ tar cfz backupfile.tgz /var/www/vhosts/smashingmagazine.com/httpdocs
tar: Removing leading `/' from member names

Все компьютеры с Mac и Linux поддерживают команду tar и в большинстве из них доступна возможность архивации zip. С помощью команды zip можно выполнить архивацию:

$ zip -r backupfile.zip /directory/to/backup

Для того чтобы увидеть содержимое архива, запустите следующую команду:

tar tfz backupfile.tgz
var/www/vhosts/smashingmagazine.com/httpdocs/
var/www/vhosts/smashingmagazine.com/httpdocs/.htaccess...

Или для zip-формата:

unzip -l backupfile.zip
Archive:  test.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
 0  2012-05-28 00:33   var/www/vhosts/smashingmagazine.com/httpdocs
 234  2012-05-28 00:33   var/www/vhosts/smashingmagazine.com/httpdocs/.htaccess...

Во время выполнения резервного копирования в синтаксисе обеих команд tar и zip отсутствуют косые черточки. Поэтому, когда вы выполняете восстановление файла, он будут восстановлен в пределах текущего каталога. Восстановление будет осуществляться в том же месте, откуда ранее была сделана резервная копия, от cd к /.

$ tar xfzv backupfile.tgz
var/www/vhosts/smashingmagazine.com/httpdocs/...

Символ “v” (verbose) в примере выше используется для более подробного отображения результатов выполнения команды tar. У команды zip существует похожая опция:

$ unzip -v backupfile.zip
Archive:  backupfile.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
0  Stored        0   0% 2012-05-28 00:33 00000000  var/www/vhosts/smashingmagazine.com/httpdocs/...

Ошибки на сайте.

Давайте предположим, что ваш сайт на самом деле никуда не исчезал. Следующее место, которое нужно проанализировать – это файл журнала ошибок.

Как найти файл журнала ошибок.

При использовании серверного пакета управления, например, такого как Plesk, каждый веб-сайт практически наверняка будет иметь собственный файл журнала ошибок. Благодаря команде grep вы можете быстро найти слово “log” в conf файле, который вы уже научились находить выше. Опция -i означает поиск без учета регистра.

$ grep -i log /var/www/vhosts/smashingmagazine.com/conf/last_httpd.include
    CustomLog /var/www/vhosts/smashingmagazine.com/statistics/logs/access_log plesklog
    ErrorLog  "/var/www/vhosts/smashingmagazine.com/statistics/logs/error_log"...

Существует также расширенный серверный журнал, в котором отображаются все специфические ошибки. Вы можете найти его в основном conf файле:

$ grep -i log /etc/apache2/apache2.conf
ErrorLog /var/log/apache2/error.log...

Ошибки файла Htaccess.

Из-за неправильной работы с некоторыми файлами можно очень легко испортить сайт. Вы можете запросто нарушить функционирование очень большого веб-сайта путем удаления одного символа из файла .htaccess. Apache использует файл .htaccess для хранения параметров конфигурации веб-сайта. Как правило, наиболее часто этот файл используется для перезаписи URL-адресов. Команда выглядят примерно так:

RewriteRule   ^products/.*/([0-9]+)$   products/view.php?id=$1   [L,QSA]

Эта команда говорит о необходимости перезаписи любых URL-адресов формы «products/widget-3000/123» в фактический URL «products/view.php?id=123». Символ L означает, что в этом случае должно применяться последнее правило, а QSA закрепляет любой строковый запрос за новым URL адресом. Перезапись URL часто используется для поисковой оптимизации. Веб-менеджеры могут получить имя продукта в URL, фактически не создавая каталог с именем “widget-3000″.

Однако если сделать хотя бы одну опечатку, то сайт выдаст ошибку 500 (внутренняя ошибка сервера).

В команде tail отображается последние 10 строк файла журнала ошибок. Используйте опцию -1 чтобы просмотреть отдельно последнюю строку. В .htaccess проблема будет выглядеть так:

$ tail -1 /var/www/vhosts/smashingmagazine.com/statistics/logs/error_log
[Thu May 06 11:04:00 2013] [alert] [client 81.106.118.59] /var/www/vhosts/smashingmagazine.com/httpdocs/.htaccess: Invalid command 'RewiteRule', perhaps misspelled or defined by a module not included in the server configuration

Вы можете использовать команду grep для поиска всех этих типов ошибок:

$ grep alert /var/www/vhosts/smashingmagazine.com/statistics/logs/error_log
[Thu May 06 11:04:00 2013] [alert] [client 81.106.118.59]...

PHP анализ и время возникновения ошибок.

Многие веб-сайты используют LAMP сочетание: Linux, Apache, MySQL и PHP. Одна из самых распространенных причин невозможности отображения веб-страницы в том, что она содержит ошибки PHP. К счастью, подобные ошибки довольно легко обнаружить и локализовать.

Существует два обширных класса ошибок PHP: ошибки синтаксиса и ошибки времени выполнения. Ошибки в синтаксисе в первую очередь связаны с элементарным отсутствием точки с запятой или знака $ перед именем переменной. Ошибки выполнения связаны с неправильным определением функции или использованием ссылок на объекты, которых не существует.

Как и в случае с ошибкой файла .htaccess, наличие синтаксических ошибок приведет к появлению кода 500 (внутренняя ошибка сервера), зачастую сопровождающегося совершенно пустой HTML-страницей. При наличии ошибок выполнения будет выведен код 200 и показан HTML, который был обработан, прежде чем произошла ошибка. Вы можете использовать команды telnet, wget-S или curl-я чтобы получить только заголовки из URL-адреса. Теперь скопируйте и вставьте адреса ваших ошибочных страниц в следующую команду:

$ curl -i http://www.smashingmagazine.com/products/widget-3000/123
HTTP/1.0 500 Internal Server Error
Date: Sun, 12 May 2013 17:44:49 GMT
Server: Apache
Vary: Accept-Encoding
Content-Length: 0
Connection: close
Content-Type: text/html

Ошибка настроек PHP.

Чтобы найти нужное сообщение об ошибке, вы должны убедиться, что оно присутствует в журнале отчета об ошибках.

Есть несколько настроек PHP, которые могут привести к появлению ошибок. Функция display_errors определяет, будут ли отображаться ошибки для посетителей сайта или нет, а функция log_errors определяет, будут ли ошибки записаны в файл журнала ошибок. Функция error_reporting указывает на типы ошибок, о которых будет сообщаться пользователю: например, только критические ошибки или требующие только предупреждения и уведомления. Все эти компоненты могут быть установлены в файле конфигурации, в .htaccess или в PHP скрипте.

Вы можете просмотреть текущие настройки, воспользовавшись функцией PHP phpinfo. Создайте PHP-файл, который вызывает функцию, и перейдите к ней через браузер:

$ echo "<?php phpinfo()?>" > /var/www/vhosts/smashingmagazine.com/httpdocs/phpinfo.php

phpinfo

Показаны параметры конфигурации, полученные благодаря использованию функции phpinfo.

В двух столбцах отображаются настройки веб-сайта и сервера. Данное окно свидетельствует о том, что функция display_errors отключена и это хорошо, поскольку она должна быть выключен на работающем веб-сайте. Это означает, что случайный посетитель не увидит каких-либо ошибок PHP. Функция log_errors с другой стороны, должна быть активирована. Это очень удобно для отладки при возникновении проблем с PHP.

Error_reporting value is 30719 (сообщение об ошибке имеет значение 30719). Это число представляет собой битовые флаги или битовые поля. Это способ хранения нескольких значений да/нет в одном числе. В PHP существует ряд констант, представляющих различные типы ошибок. Например, константа E_ERROR – это критическая ошибка, которая имеет значение 1; E_WARNING – это константа предупреждения, которая равна 2; E_PARSE – это константа для разбора или синтаксического анализа ошибки, которая имеет значение 4. Эти значения можно использовать вместе. Например, число 7 означает, что должны быть описаны ошибки всех трех типов E_ERROR + E_WARNING + E_PARSE = 7. Значение 5 используется только для отчета E_ERROR + E_PARSE.

В действительности, существует 16 типов ошибок от 1 для E_ERROR до 16384 дляE_USER_DEPRECATED. Вы можете ввести “30719 в двоичном коде” в Google, и вам будет предложен двоичный эквивалент: 0b111011111111111. Этот код означает, что учитываются все типы ошибок за исключением двенадцатого, который называется E_STRICT. Такая специфическая настройка получена благодаря использованию постоянной E_ALL = E_ERROR + E_WARNING + E_PARSE + etc = 30719. Начиная с PHP версии 5.4.0, E_ALL – это фактически число 32767, которое включает в себя все ошибки E_STRICT.

Если ваш error_reporting параметр равен 0, то ошибки не будут отображаться в файле журнала. Вы можете изменить этот параметр в файле php.ini, но тогда для достижения требуемого эффекта вам придется перезапустить Apache. Простым способом изменения этого параметра в Apache является добавление строки в файл с именем .htaccess, находящийся в корневом каталоге документов: php_value error_reporting 30719.

Или вы можете выполнить это действие прямо из командной строки, используя двойную стрелку, которая выполнит добавление к уже существующему файлу или создаёт новый файл, если такового не существует:

$ echo "php_value error_reporting 30719" >> .htaccess
$ echo "php_value log_errors On" >> .htaccess

Обновите веб-страницу, которая содержит ошибку. Если на странице содержится PHP ошибка, то она должно отобразиться в журнале ошибок. Вы можете использовать команду grep для поиска в журнале всех PHP ошибок:

grep PHP /var/www/vhosts/smashingmagazine.com/statistics/logs/error_log
[Sun May 12 18:19:09 2013] [error] [client 81.106.118.59] PHP Notice:  Undefined variable: total in /var/www/vhosts/smashingmagazine.com/httpdocs/products/view.php on line 10...

Если у вас есть ссылки на переменные или индексы массива до присвоения им значений, то будут отображаться тысячи PHP уведомлений, как показано выше. Это происходит, когда вы пытаетесь выполнить к примеру команду <? $total = $total + 1 ?> без первоначальной установки $total в значение 0. Они полезны для поиска возможных ошибок, но они не показывают стопоров. Ваш сайт в любом случае должен работать.

Вы можете иметь так много уведомлений и предупр …

Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.