Ссылки
Вступление
Практически каждый ведущий какого-либо веб-проекта основную работу ведет в
"офф-лайне" - создает страницы сайта, пишет скрипты, редактирует изображения
на своей локальной машине, а затем переносит данные на свой виртуальный
веб-сервер у хостинг-провайдера. Это - достаточно распространенная практика.
Но в некоторых случаях данный подход, связанный с переносом файлов
"туда-сюда", неэффективен и трудоемок, а иногда и вовсе неприемлем.
Например, перенос файлов из одной директории на сервере в другую средствами
обычного ftp-клиента будет выглядеть следующим образом: сначала Вы
скопируете файлы из первой директории на свою локальную машину, а потом
будете закачивать их обратно на сервер во вторую директорию. Это -
неоптимально: Вы тратите оплаченное время за пользование интернетом по
модему или создаете лишний, далеко не бесплатный трафик в случае
использования выделенной линии.
В данной статье мы рассмотрим методы, которые позволят оптимизировать Вашу
работу, сэкономят время и деньги.
Доступ к Unix-shell
Собственно, работая в Unix-shell, Вы управляете сервером через удаленный
терминал: на своем компьютере Вы видите интерфейс командной строки, для
которой все отправляемые команды выполняются на сервере, а результат выводится
Вам. Получается, у Вас появляется что-то типа монитора, который вроде бы
подключен прямо к серверу и позволяет выполнять команды прямо на сервере, но
на самом деле это - только отображение на Вашем мониторе того, что происходит
на компьютере провайдера в соответствие с Вашими пожеланиями-командами.
Многие хостинг-провайдеры предоставляют доступ к Unix-shell. Существуют
разные протоколы доступа: telnet или ssh. Возможность использования того или
иного протокола необходимо уточнить у своего провайдера. В первом случае
можно пользоваться стандартной программой telnet, которая входит в дистрибутив
практически любой операционной системы. Минус использования telnet состоит в
том, что все данные (в том числе и пароли) пересылаются в открытом виде.
Для ssh этой проблемы нет, так как передаваемые данные шифруются на уровне
протокола.
SSH-клиент для Windows можно взять на нашем сайте : PuTTY.
Параметры подключения (хост, логин, пароль) необходимо уточнить у своего
хостинг-провайдера. Если Вы являетесь клиентом "Зенон Н.С.П.", и Ваш тип
контракта предусматривает доступ к Unix-shell, то Вам поможет
наша документация. Существует две основные версии ssh-протокола: SSH1 и
SSH2. Разница между ними не очень большая, так что не стоит много думать над
выбором. Если есть возможность использовать SSH2 - используете его. Кроме
того, SSH2 позволяет выполнять различные операции, повышая уровень их
безопасности. Почитайте о реализации "безопасного" FTP, например.
Управление контентом
Рассмотрим для начала список команд, которые могут Вам пригодиться, а затем
опишем практические примеры.
- ls - эта команда отображает содержимое директории
- rm - удаляет файлы
- mv - перемещает файлы
- cp - копирует файлы
- mkdir - создает директорию
- joe - редактор текстовых файлов
- tar, gzip, gunzip - эти команды чаще всего
применяются совместно и позволяют работать с архивами: создавать их,
извлекать файлы из архивов
- zip, unzip - команды для работы с zip-архивами
Подробнее о каждой команде можно узнать, выполнив команду 'man имя_команды' в
Unix-shell: Вы узнаете, для чего служит конкретная команда, ключи ее запуска,
примеры выполнения. Наверняка, Вам понадобится минимальное знание английского
языка.
Теперь рассмотрим несколько практических примеров.
Предположим, что весь контент Вашего сайта состоит из нескольких
html-документов и картинок в поддиректории 'images', и должен он располагаться
в директории 'www', а Вы, закачивая файлы на сервер, по ошибке записали их скопом
(и картинки, и документы) в свою домашнюю директорию, то есть на уровень выше,
чем 'www'. Решается данная ситуация достаточно просто:
cd www
mkdir images
mv ~/*.html ~/www/
mv ~/*.jpg ~/www/images/
Вы "заходите" в директорию 'www', в ней создаете директорию 'images', потом
переносите все файлы с расширением '.html' (по маске '*.html') в директорию
'www' (путь '~/' обозначает путь к Вашей домашней директории), а все файлы
'.jpg' - в 'www/images'.
Рассмотрим следующий пример. Допустим, Вам просто необходимо отредактировать
файл. Обычно Вы скачиваете его к себе на компьютер, запускаете любимый
HTML-редактор, вносите исправления и загружаете обратно на сервер. Можно
оптимизировать и это. Ведь странно, согласитесь, два раза перекачивать файл
по сети, если надо всего-то исправить одну буковку. Да, можно редактировать
файлы прямо на сервере с помощью текстового редактора, которых существует
множество. Мы рекомендуем самый простой - joe. Выполните команду 'joe
имя_файла', и Вы увидите содержимое своего файла. Отредактируете и сохраните.
Вы сэкономили время.
Некоторые комбинации клавиш редактора 'joe':
- Ctrl-K, H - вызов помощи
- Ctrl-K, F - поиск
- Ctrl-L - поиск следующего вхождения фразы
- Ctrl-Y - удалить строку
- Ctrl-K, X - выход из редактора с сохранением данных
- Ctrl-C - выход из редактора без сохранения данных
В следующем примере Вам, допустим, нужно удалить резервные копии файлов,
которые остались после применения редактора 'joe' (имена таких файлов
заканчиваются символом '~'):
rm *~
Будьте предельно осторожны, применяя команду 'rm' с ключами '-r' и '-f'.
Первый ключ "говорит" о том, что заданные файлы нужно удалять рекурсивно по
всем поддиректориям. Второй - отключает запрос каких-либо подтверждений.
Работая же с архивами, можно значительно минимизировать трафик, а,
следовательно, и время загрузки Ваших файлов на сервер. Предположим, что
у Вас есть готовый проект, который занимает весьма значительный объем.
Вместо того, чтобы закачивать все файлы на сервер по отдельности, можно
упаковать их на локальной машине в один архив, сохранив всю структуру
директорий, записать на сервер один файл, а потом просто распаковать его:
если это zip-архив:
unzip имя_архива
если это tar.gz-архив:
tar -zxf имя_архива
Это будет значительно быстрее.
Точно так же и в обратную сторону. Более того, расширив задачу, представим, что
нужно перенести весь контент с одного сервера на другой:
упакуем весь сайт в один архив:
tar -czf archive.tar.gz 'www'
с помощью команды 'ftp адрес_другого_сервера', авторизовавшись и
выполнив команду 'put archive.tar.gz', Вы закачаете архив на другой
сервер и, зайдя в Unix-shell уже нового сервера, распакуете архив там:
tar -zxf archive.tar.gz
А, например, если Вы хотите повысить уровень безопасности, не передавая
пароли ftp в открытом виде, можно воспользоваться программой 'scp' (если
хостинг-провайдер предоставляет такую возможность). Она позволяет копировать
файлы с одного компьютера на другой, используя для шифрования данных
протокол SSH. Например, команда
scp vasya@home.domain.ru:~/www/index.html index.html
сначала запросит пароль. Если введенный пароль совпадет с паролем
пользователя 'vasya' на сервере 'home.domain.ru', то Вы скопируете к себе в
текущую директорию файл 'index.html' из директории 'www' домашнего каталога
пользователя 'vasya'.
Более подробно о командах 'ftp' и 'scp' можно узнать, выполнив
man ftp
man scp
Управление сервером
Зачастую единственным инструментом для выполнения тех или иных действий с
сервером является доступ в Unix-shell. Серьезно занимаясь
веб-программированием или дизайном, рано или поздно Ваш уровень становится
настолько высоким, что возникает необходимость овладевать и некоторыми
навыками администрирования unix-систем. К счастью, инструментарий у Вас вряд
ли будет очень обширен, так что имеет смысл изучить полезные вещи заранее.
Рассмотрим те команды, которые могут Вам пригодиться:
- ps - эта команда отображает список текущих процессов
- kill - позволяет отправить процессу определенный сигнал, в том числе и прекратить выполнение процесса
- du - отображает информацию о потреблении дисковых ресурсов
Конечно же, и для этой группы команд верно то, что подробную информацию о них
можно получить, выполнив 'man имя_команды'.
Данная группа команд полезна в том случае, если Вы ведете достаточно большой
проект, с поддержкой баз данных, возможно, с выполнением различных программ
и скриптов по расписанию. Например, команда 'du -с ~/' "расскажет" о том,
какой объем занимает Ваш сайт. Если какие-либо
процессы "зависли" и требуют перезапуска, то можно с помощью команды 'ps'
получить числовое значение PID необходимого процесса, после чего выполнить
команду 'kill значение_PID_процесса'. Обратите внимание: не все эти команды
могут быть Вам доступны в условиях хостинга. Проконсультируйтесь со своим
провайдером.
Кроме того, достаточно удобно диагностировать корректную работу самого сервера
(в нашем случае речь идет об Apache). С помощью команды:
/www/bin/httpd -d ~/proff/ -t
можно оценить, корректно ли написан конфигурационный файл веб-сервера, и в
противном случае понять, в чем заключается ошибка. (Следует учитывать то,
что указанный выше пример актуален для клиентов "Зенон Н.С.П.",
обслуживающихся по тарифному плану "Профессионал". Пути к различным утилитам
и конфигурационным файлам следует уточнять у своего хостинг-провайдера).
Далее рассматривая управление своим веб-сервером, нельзя не упомянуть об
администрировании баз данных. Одними из самых распространенных серверов баз
данных в рамках хостинга на платформе Unix являются MySQL и PostgreSQL.
Скажем о том, что основным инструментом для управления ими являются
утилиты администрирования, которые запускаются из Unix-shell. Конкретно для
MySQL - это программы
mysql, mysqladmin и mysqldump.
Зачастую хостинг-провайдер дает клиенту доступ только к одной базе данных,
а не ко всему серверу. В таком случае для Вас будет актуальным
использование mysqldump и mysql. Первая утилита служит для
создания дампа базы или отдельных таблиц в виде текстового файла.
Подробнее об этом можно прочитать в нашей статье "Резервное копирование
баз MySQL". mysql - это работающий в текстовом режиме клиент для
сервера баз данных, позволяющий выполнять различные SQL-запросы.
Для начала рассмотрим ключи, которые могут Вам пригодиться при запуске
mysql:
- '-hадрес_хоста' (или '--host=адрес_хоста) - задает адрес
хоста для подключения
- '-uимя_пользователя' (или '--user=имя_пользователя) -
имя пользователя, который подключается к серверу
- '-pпароль' (или '--password=пароль) - пароль, с которым
Вы подключаетесь к серверу. Если Вы не введете пароль, а только зададите
ключ '-p', то пароль будет запрошен после выполнения команды.
- '-Pпорт' (или '--port=порт) - порт, который используется
для подключения
Кроме того, после всех ключей можно указать название базы данных, с которой
Вы собираетесь работать. Например:
mysql --user=vasya --host=baze.Ваш_домен --port=64000 -p vasya
Конечно же, подключиться к нужной базе можно и в интерактивном режиме,
выполнив команду 'use название_базы;'. Запрос 'show tables;' покажет Вам
список таблиц в данной базе, 'desc название_таблицы;' отобразит структуру
заданной таблицы. Подробно об остальных командах, таких как создание
таблиц (create table ...), выборка по заданным условиям (select
...), изменение данных (update ...), удаление (delete
...), можно прочитать в документации по MySQL.
Если же хостинг-провайдер предоставляет персональный MySQL-сервер, Вам
пригодится утилита mysqladmin. С помощью нее можно создавать и
удалять базы данных, обновлять данные о правах доступа пользователей, если
Вы вносили изменения, отображать список выполняемых сервером процессов.
Кроме того, с помощью клиента mysql можно будет выполнять необходимые
действия с таблицами в базе mysql ('use mysql;', 'show tables'). Например,
вносить изменения в таблицу пользователей ('user').
Как всегда, Вам помогут команды:
man mysql
man mysqldump
man mysqladmin
Ссылки на подробную
документацию по базам данных приведены в конце статьи.
Отладка скриптов
Как обычно, начнем со списка полезных команд:
- less - эта команда позволяет просматривать содержимое файла
- grep - ищет заданную последовательность в файле
- tail - отображает содержимое конца файла
- chmod - изменение атрибутов файла
Конечно же, и для этой группы команд верно то, что подробную информацию о
них можно получить, выполнив 'man имя_команды'.
В процессе отладки работы скриптов, приложений, сервисов очень важным
фактором является возможность анализа файлов протоколов. Чаще всего именно в
протоколах ошибок содержатся ответы на вопросы "почему скрипт не работает /
работает неправильно?" Самое простое действие - обычный просмотр такого
файла:
less file.log
Стрелки "вверх" и "вниз" позволят "листать" файл, клавиша "H" отобразит
экран с текстом подсказки, "Q" - закончит работу с файлом.
Однако можно столкнуться со следующей проблемой. Файлы протоколов зачастую
обновляются очень активно, и вся новая
информация дописывается в конец файла. Таким образом, чтобы
получить интересующие данные, необходимо скачать файл протокола к себе на
компьютер либо "пролистать" его до самого конца. Что с точки зрения передачи
некоторого объема данных равнозначно. Вот, именно в таких
случаях поможет команда:
tail имя_файла_протокола
Вы увидете последние 10 строк файла (по умолчанию). Это значение можно
изменить с помощью ключа '-n', где n - число строк, которое Вы хотите
увидеть. Например, 'tail -30 file.txt' - показать 30 последних строк файла
'file.txt'.
Еще одним очень удобным средством диагностики ошибок является запуск
команды 'tail' с ключом "-f":
tail -f имя_файла_протокола
В этом случае выполнение данной команды не прекращается при достижении конца
файла, а продолжается и отображает вновь добавляемую информацию. При этом
можно запустить вторую копию telnet- или ssh-клиента и, например, выполнять
параллельно другие задачи.
Если же файл протоколов достаточно велик и весьма активно обновляется, то,
возможно, поможет поиск по данному файлу по заданным параметрам. Самый простой
вариант:
grep "ключевая_фраза" имя_файла_протокола
Например, нужно найти в файле 'file.txt' все строчки, в которых содержится
слово "web". Для этого используем команду:
grep "web" file.txt
А если Вы хотите,
чтобы команда 'grep' искала без учета регистра и находила в том числе и
"Web" или "WEB", используйте ключ '-i':
grep -i "web" file.txt
Еще полезные ключи команды grep :
- 'grep -r' - поиск и в подкаталогах текущего каталога
- 'grep -v' - показать те строки, которые не удовлетворяют условиям поиска
Подробнее о применении 'grep' - 'man grep'.
Нельзя не упомянуть о таких полезных возможностях Unix, как перенаправление
стандартного ввода и вывода, а также объединение команд с помощью каналов.
Покажем на примерах, что это такое. Команда
ls -la
выводит на экран содержимое текущей директории. Предположим, что эти данные
Вам нужно каким-либо образом сохранить. Команда
ls -la > file.txt
сделает то же самое, что и предыдущая, но результат будет сохранен в файле
'file.txt'. Если такого файла не было, он будет создан заново. В противном
случае он перезапишется. При использовании команды
ls -la >> file.txt
результат будет сохранен в файле 'file.txt' с тем лишь отличием, что если
файл с таким именем уже существовал, новые данные будут дописаны в конец
имеющегося файла.
Данные примеры иллюстрируют перенаправление стандартного вывода.
Перенаправление стандартного ввода - соответственно, обратное действие: если
какая-либо команда в процессе выполнения требует некоторые данные в
интерактивном режиме, то их можно вводить не вручную, а получить из файла.
Например, команда
sort < file1.txt
отсортирует по алфавиту строки из текстового файла 'file1.txt' и выведет
результат на экран. А, например
sort < file1.txt > file2.txt
сделает то же самое, но сохранит полученные данные в 'file2.txt'. Данный
пример показывает, что перенаправление стандартного ввода и вывода можно
применять одновременно. Кроме того, вывод одной команды может являться
вводом для другой. Это - объединение команд каналами. Например:
grep "web" file.txt | grep "site"
найдет все строки в файле 'file.txt', в которых одновременно встречаются
слова "web" и "site", а
grep "web" file.txt | grep "site" | wc -l
посчитает количество таких строк.
И в заключение нужно сказать о том, что самым простым, но достаточно
эффективным средством диагностики
является простой запуск скрипта в командной строке. Если Вы просто где-то
опечатались при написании скрипта или ошиблись в синтаксисе, то Вы сразу же
поймете это по сообщению об ошибке.
Автоматизация работы
Еще одним интересным инструментом, которым можно управлять из Unix-shell,
является использование 'cron'.
Это - встроенная программа OC Unix, которая управляет периодическим
выполнением процессов. Грамотное использование данной возможности позволит
Вам генерировать страницы сайта из скриптов в указанное время, периодически
создавать резервные копии данных, отправлять Вам на адрес электронной почты
статистику.
Управлять 'cron' нужно с помощью команды 'crontab'. Команда 'crontab -e'
автоматически запустит текстовый редактор и загрузит в него файл
конфигурации cron. После выхода из редактора, новая конфигурация cron будет
установлена (вступит в силу) автоматически. Конфигурационный файл содержит
последовательность командных строк и расписание их вызова. Пустые строки и
строки, начинающиеся с символа '#', игнорируются. Остальные строки являются
установками переменных окружения и командами cron.
Первые пять полей каждой строки сценария описывают расписание запуска
команд. Начиная с шестого поля и до конца строки следуют команды
пользователя. Допустимые значения временных параметров:
| параметр | допустимый
интервал |
| минуты | 0-59 |
| часы | 0-23 |
| день_месяца | 1-31 |
| месяц | 1-12 |
| день_недели | 0-7
(0-Вс,1-Пн,2-Вт,3-Ср,4-Чт,5-Пт,6-Сб,7-Вс) |
Пример готовой строки сценария cron :
7 18 13 5 5 /www/cgi-bin/test.pl
Это означает: "В 18 часов 7 минут 13 мая, если это пятница, выполнить скрипт
/www/cgi-bin/test.pl". А строка
*/5 * * * * /www/cgi-bin/test.pl
будет запускать тот же скрипт каждые пять минут. Очень подробную
документация по 'cron' на русском языке Вы найдете тут.
Заключение
Авторы данной статьи понимают, что в unix очень много разных команд. На
текущий момент только в каталогах /usr/bin/, /usr/sbin/ и /bin/
"свежеустановленной" ОС FreeBSD содержится порядка 650 различных исполняемых
файлов. Однако здесь мы постарались описать только те команды, которые
могут быть полезны в тех ограниченных условиях, которые доступны при работе
со стандартным хостингом. Конечно, у каждого есть еще и свои любимые
инструменты, которые привычны и полезны. Расскажите нам о том, что еще
используете Вы, и мы постараемся добавить и Ваш опыт в данный документ,
сделав его еще более полезным всем пользователям интернета.
Ссылки
SSH-клиент для Windows - PuTTY
Статья "Введение в Unix"
Статья "FreeBSD handbook :: Unix Basics"
"Проект Русской Документации FreeBSD"
"Введение в UNIX" (Евгений Дегтярев)
Главный сайт разработчиков MySQL
Документация по MySQL (установка, использование, SQL)
Главный сайт разработчиков PostgreSQL
Документация по PostgreSQL
Александр Демидов, Петр Диденко, компания Зенон Н.С.П.