Разработка программного обеспечения средствами Open Source |
![]() |
Добавил(а) microsin |
Статья Мартина Стрейчера, технического директора McClatchy Interactive наглядно показывает, как на Ubuntu быстро запустить WEB-сервер и начать программировать на PHP. 1. Скачал iso-образ, поставил на VMware Workstation 6.5.3 build-185404. При создании виртуальной машины мастер VMWare запросил имя и пароль для нового пользователя (не root). Запустил форматировать виртуальный диск и забыл про виртуалку, занявшись другими делами. Через полчаса с удивлением обнаружил, что готовая Ubuntu уже загрузилась и выдала промт для логина. Залогинился и получил рабочий стол с каки-то бешеным разрешением экрана. Подрегулировал его на привычные 1024x768 и стал оглядываться по сторонам. 2. Первая непривычная засада оказалась с тем, что я не знал, как залогиниться под root. Оказалось, что вчистую залогиниться под root теперь невозможно. Однако можно получить права root, если ввести команду sudo, а в ответ на запрос пароля ввести свой собственный. Подсказку по этому нововведению дает приглашение консоли: "To run a command as administrator (user "root"), use "sudo ". See "man sudo_root" for details.". Короче, чтобы запустить любую команду/программу с правами root, вводят эту команду с префиксом sudo, а если хотят получить интерактивный root shell, то вводят sudo -i. По умолчанию только пользователь, который инсталлировал Ubuntu (то есть тот аккаунт, за которым я сейчас работаю), имеет права получать административные права через sudo, но можно создавать специальным образом других пользователей с такими же привилегиями (описано как). Там же (man sudo_root) написано, как вс е вернуть на круги своя (но это не рекомендуется). Таким образом, первый пользователь теперь "заменяет" рута, но с требованием вводить свой пароль. Какой в этом смысл, не очень понятно. Получить консоль root можно так (в ответ на запрос пароля вводим собственный): $ sudo su - # whoami root Чтобы выйти из режима суперпользователя, нажмите Ctrl+D. Свой любимый Midnight Commander тоже поставил командой apt-get install mc, тока он у меня в черно-белой консоли Ubuntu оказался нефункционален. В putty на хостовой машине результат был лучше, но надо было еще разобраться с кракозябрами в псевдографике бордюров. Поставил также пакет ssh, но уже с помощью System -> Administration -> Synaptic Package Manager. При попытке установить русскую раскладку (System -> Preferences -> Keyboard) получил ошибку X - сервера. 3. Кроме Apache существуют и другие Web-серверы для Linux, например, lighttpd (произносится как "лайти") — маленький и быстрый сервер, который проще в настройке, чем Apache. Устанавливаем lighttpd под Ubuntu (должно быть подключение к Интернету): # apt-get install lighttpd Как ни странно, больше ничего делать не надо - все само поставится и сервер сразу заработает. Запустив Firefox с адресом http://127.0.0.1/, увидим страничку, свидетельствующую о том, что lighttpd работает. На хостовой машине этот сервер тоже доступен по адресу http://192.168.58.128/: user>nmap 192.168.58.128 ... Interesting ports on 192.168.58.128: Not shown: 1031 closed ports PORT STATE SERVICE 80/tcp open http MAC Address: 00:0C:29:F8:04:AA (Unknown) Nmap done: 1 IP address (1 host up) scanned in 2.34 seconds 4. Ставим MySQL 5, тоже всего одной командой apt: # apt-get install mysql-server-5.0 Процедура будет идти несколько дольше (так как пакет требует для себя около 112 мегабайт). Правда, по окончании установки почему-то не запустился мастер и не запросил установки пароля для "MySQL root". Пришлось искать в Интернете, как это делать см. [1]. Когда делаем это первый раз, то так: $ mysqladmin -u root password NEWPASSWORD Если надо поменять уже установленный пароль, то так: $ mysqladmin -u root -p'oldpassword' password newpass например: $ mysqladmin -u root -p'abc' password '123456' Запуск утилиты MySQL и вывод списка баз данных: $ mysql -u root -p Enter your password: s0m3p@ssWoRD mysql> show databases \G Database: information_schema Database: mysql 2 rows in set (0.01 sec) mysql> quit 5. Установка языка программирования PHP 5. Так как lighttpd использует для выполнения Web-приложений FastCGI (Fast Common Gateway Interface – быстрый обобщенный интерфейс шлюзов), важно установить правильную разновидность PHP, которая доступна в apt как php5-cgi. Чтобы PHP мог работать с MySQL, также необходимо установить соответствующий модуль php5-mysql: # apt-get install php5-cgi php5-mysql php5-gd Настройка взаимодействия Web-сервера и языка программирования. Теперь, прежде чем можно будет создавать PHP-приложение, требуется только одно действие – правильно настроить взаимодействие lighttpd и PHP. Нажмите Control-D для выхода из режима суперпользователя, а затем введите следующую команду: $ sudo gedit /etc/php5/cgi/php.ini Запустится простой текстовой редактор gedit, похожий на Блокнот из Windows или Text Editor из Mac, и в режиме суперпользователя откроется для редактирования файл /etc/php5/cgi/php.ini. Так как этот файл является системным, то для его изменения необходимы права root. В окне gedit прокрутите текст вниз и найдите такую строку: ; cgi.fix_pathinfo = 0 Измените ее на следующую строку: cgi.fix_pathinfo = 1 Для сохранения изменений выберите File > Save или нажмите Control-S. Для выхода нажмите Control-Q. Далее выполните команду: $ sudo gedit /etc/lighttpd/lighttpd.conf Найдите строку, начинающуюся с server.modules=, и добавьте через запятую mod_fastcgi к списку опций в скобках. mod_fastcgi наделяет lighttpd поддержкой PHP в режиме FastCGi. Запросы, поступающие от браузера, принимаются lighttpd, который преобразует их в запросы FastCGI и перенаправляет PHP-модулю. Когда PHP-приложение отсылает ответ, происходит обратный процесс. Обновленный список должен выглядеть как в листинге 2, за исключением, быть может, наличия других модулей. Листинг 2. Обновленный список в параметре server.modules server.modules = ( "mod_fastcgi", "mod_access", "mod_alias", "mod_accesslog", "mod_compress" ) Теперь перейдите к концу файла и добавьте следующий параметр, приведенный в листинге 3. Листинг 3. Параметр, заставляющий lighttpd использовать FastCGI-разновидность PHP и правильный сокет. fastcgi.server = ( ".php" => (( "bin-path" => "/usr/bin/php-cgi", "socket" => "/tmp/php.socket" ))) Приведенный параметр указывает lighttpd местоположение запускаемого файла PHP и файла сетевого соединения (сокета), через которое Web-сервер будет обмениваться данными с PHP. Сохраните редактируемый файл и выйдите из редактора. После изменения настроек lighttpd необходимо перезапустить, что делается командой sudo /etc/init.d/lighttpd restart. $ sudo /etc/init.d/lighttpd restart Stopping web server lighttpd [OK] Starting web server lighttpd [OK] Теперь вы можете приступить к написанию своего первого (и второго) PHP-приложения. 6. Ваше первое (а также второе) PHP-приложение Как было сказано ранее, PHP очень популярен среди языков программирования для Web за счет своей простоты и удобства встраивания в обычный HTML-код (Hypertext Markup Language, язык гипертекстовой разметки). HTML-теги выглядят как Итак, самая простая PHP-программа может выглядеть примерно так, как показано в листинге 4. Листинг 4. Пример простой PHP-программы < html> < head>< title>Hello, World! < body> < h1>< ?php echo 'Hello, World! ?> Для запуска этой программы откройте редактор Рисунок 4. Результат работы PHP-программы "Hello, World!", выданный lighttpd А теперь перейдем к написанию более сложного примера, в котором мы соберем воедино все компоненты LAMP, а база данных MySQL будет хранить некую информацию. Предлагаю создать программу, отображающую всех сотрудников Superheroes, Inc. – аутсорсинговой компании, предоставляющей услуги супергероев. Для этого необходимо проделать следующие шаги:
Создание и наполнение базы данных Приведенный в листинге 5 фрагмент кода, представляющий собой SQL-скрипт, делает следующее:
Листинг 5. SQL-скрипт для создания и наполнения базы данных superheroes DROP DATABASE IF EXISTS `superheroes`; CREATE DATABASE `superheroes`; USE `superheroes`; DROP TABLE IF EXISTS `members`; CREATE TABLE `members` ( `id` int(11) NOT NULL, `name` varchar(128) NOT NULL, `city` varchar(128) NOT NULL, `superpower` varchar(128) NOT NULL, `initiated` date NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`), KEY `name` (`name`) ) ENGINE=MyISAM; INSERT INTO `members` (`id`, `name`, `city`, `superpower`, `initiated`) VALUES (1,'Бэтмен','Готэм-сити','Детективные способности','1939-05-01'), (2,'Человек-паук','Нью-Йорк','Паутины','1962-08-01'), (3,'Красный дьявол','Нью-Йорк, Hell\'s Kitchen','Радиолокация','1964-04-01'), (4,'Супермен','Метрополис','Сила','1938-06-01'); GRANT ALL ON `superheroes`.* TO 'hero'@'localhost' IDENTIFIED BY 'shizzle'; Как правило, во избежание неразберихи для каждого Web-приложения создают свою базу данных MySQL и используют уникальную учетную запись для доступа. Также никогда не используйте в приложении учетную запись root MySQL, так как неправильное поведение программы может привести к потере всех данных. На практике обычно создают в MySQL другого суперпользователя, а пользователя root удаляют. Как и раньше, создайте с помощью $ mysql -uroot -p < superheroes.sql Enter password: Введите ваш пароль для MySQL-пользователя root и нажмите Enter. Чтобы увидеть результат, соединитесь с базой данной уже от имени hero и выведите содержимое таблицы, которое показано в листинге 6. Листинг 6. База данных Superheroes $ mysql -uhero -pshizzle superheroes mysql> select * from members; -----+----------------+----------------+-------------------------+------------- | id | name | city | superpower | initiated | -----+----------------+----------------+-------------------------+------------- | 1 | Бэтмен | Готэм-сити | Детективные способности | 1939-05-01 | | 2 | Человек-паук | Нью-Йорк | Паутины | 1962-08-01 | | 3 | Красный дьявол | Нью-Йорк, | Радиолокация | 1964-04-01 | | | | Hell's Kitchen | | | | 4 | Супермен | Метрополис | Сила | 1938-06-01 | -----+-----------------+---------------+-------------------------+------------- 4 rows in set (0.00 sec) Отлично! База данных готова. В листинге 7 приведен PHP-код, используемый в нашей Web-странице. Листинг 7. PHP-код для создания страницы Superheroes, Inc. < html> < head> < title> Сотрудники Superheroes, Inc. < body> < ?php if ( ! ( $connection = mysql_connect("localhost", "hero", "shizzle" ) ) ) { die( 'Возникла ошибка. Проверьте сетевые настройки.' ); } if ( !mysql_select_db( "superheroes", $connection ) ) { die( 'Возникла ошибка. Проверьте базу данных и права доступа.' ); } $query = "select * from members order by name"; if ( ! ( $result = mysql_query( $query, $connection ) ) ) { die( 'Возникла ошибка. ' . mysql_error() ); } ?> < table>< tr>< th>Имя< th>Сверхъестественные способности < th>Город < ?php while ($row = mysql_fetch_assoc($result)) { ?> < tr>< td> < ?php echo $row{'name'}; ?> < td> < ?php echo $row{'superpower'}; ?> < td> < ?php echo $row{'city'}; ?> < ?php mysql_close( $connection ); ?> Наберите этот код в редакторе Рисунок 5. Список доступных контрактников-супергероев Анализ используемого PHP-кода Давайте проанализируем наш PHP-код. Для него обычный HTML-текст является как бы контейнером, а PHP-код встраивается в него с помощью тегов < ?php ?>. Таким образом возможно сочетать HTML- и PHP-код, что мы и сделали для отображения таблицы героев. Приложение соединяется с локальным MySQL-сервером, выбирает базу данных, выполняет запрос и выводит результат. А теперь то же самое, но подробнее:
Вот и все! Конечно, нашей программе еще очень далеко до Web-страниц Twitter или Mint.com, однако мы все же продемонстрировали, что запустить Web-приложение легко и просто (и дешево). Не забывайте, что в Ubuntu доступны мириады программ – достаточно одной команды Aptitude. [Ссылки] 1. MySQL Change root Password site:cyberciti.biz. |