MyDC.ru _ Программирование на Lua _ Создание динамических страниц с помощью Lua
Автор: alex82 15.3.2011, 4:11
Бытует мнение, что для создания динамических сайтов на языке, отличном от php, необходимо убить уйму времени на написание соответствующего модуля для вебсервера, и извести метр нервов на сборку этого модуля с помощью кривого компилятора от фирмы "Майкрософт". Однако, это далеко не так - писать сайты можно на любом языке, для которого имеется консольный интерпретатор. Теоретически, можно написать сайт на Ассемблере, собрав полученную программу как консольное приложение. Законченные извращенцы могут попробовать сделать сайт на том мерзопакостном "языке программирования", что используется в командной строке Windows. Но сегодня мы не будем заниматься извращениями, и попробуем написать сайт на каком-нибудь более простом и понятном языке. А именно - на Lua.
Для этого нам понадобятся:
Web-сервер Apache с включенным модулем mod_cgi.
Интерпретатор Lua. В качестве интерпретатора можно взять сборку LuaForWindows - она предельно простая в установке, и содержит практически все библиотеки, которые могут понадобиться для написания сайта.
Редактор исходного кода для редактирования конфигов и написания скриптов.
Бутерброды, пиво.
Ну и конечно же прямые руки, растущие из плеч.
Итак, начнем.
Для начала откроем файл конфигурации Apache, и убедимся, что для директории, в которой будут лежать наши скрипты, разрешено управление конфигом при помощи файлов .htaccess:
Код
AllowOverride All
Далее откроем эту директорию, создадим в ней файл .htaccess, и пропишем в нем 2 заклинания:
Код
Options +ExecCGI
Эта директива разрешает выполнение CGI-скриптов в данной директории.
Код
AddHandler cgi-script .lua
Эта директива сообщает Апачу о том, что файлы с расширением .lua являются CGI-скриптами.
Теперь создадим в этой же директории файл test.lua, и пропишем в первой строке путь к интерпретатору Lua (здесь и далее предполагается, что интерпретатор установлен в директорию C:\Program Files\lua):
Код
#!C:\Program Files\lua\lua.exe
Далее попробуем вывести в окно браузера какую-нибудь строчку. Для тех кто не в курсе поясню - общение между Апачем и CGI-приложением происходит через стандартные потоки. Для передачи данных Апачу используется stdout, а для получения тела сообщения CGI-приложением - stdin. Итак, пишем скрипт:
Код
io.write("Hello world!!!")
Пытаемся открыть наш скрипт в браузере, и... получаем ошибку 500 .
Судорожно лезем в лог ошибок апача в надежде выяснить причину ошибки, и видим там следующее:
Цитата
[Sun Mar 15 02:35:07 2011] [error] [client 127.0.0.1] Premature end of script headers: test.lua
Замечаем в сообщении знакомое слово "headers". Долго-долго думаем, что бы это могло означать... Нервничаем, кусаем бутерброд, запиваем его пивом... И тут нас осеняет: "Эврика, блеать, мы же не отправили заголовки!".
Запускаем скрипт, и видим в окне браузера заветную строчку:
Цитата
Hello world!!!
Ура!!! Оно работает!!! Бутерброды съедены не зря, и пиво выпито не напрасно.
Продолжение следует...
Автор: DEN 007 15.3.2011, 5:11
alex82, Спасибо, по сути заменив путь до интерпретатора, можно тоже самое запустить и на линуксе. И еще наверное неплохобы отправить в заголовках кодировку, а то на русском будет несуразица..
P.S. Надо будет попробовать...
Автор: Setuper 15.3.2011, 10:39
Простые фразы можно так отсылать, а вот с построением сложных заголовков уже будет проблематично возиться, уж намного проще, когда это за тебя делает веб-сервер, а ты только заботишься о наполнении контекста.
Однако, как вариант данный метод сгодиться
Автор: alex82 15.3.2011, 10:54
Setuper
Веб-сервер (во всяком случае Апач) не будет этим заниматься. От тупо отправит те заголовки, что передал ему скрипт, добавив в них заголовок с информацией о себе. При полном отсутствии заголовков он выкинет ошибку 500 и запишет "Premature end of script headers" в лог ошибок. Так что переложить всю работу на него не получится .
Но можно автоматизировать этот процесс чтобы не возиться с составлением заголовков при написании каждой страницы. Как только решусь писать продолжение, напишу об этом.
Автор: DEN 007 15.3.2011, 14:27
alex82, просто можно также писать сайты на луа, по принципу подключения файлов как в php к примеру, то есть один файл index.lua запускается а уже через него все работает, к примеру index.lua?do=hublist , и всю рутинную работу делать непосредственно в index.lua.
Автор: Invisible 26.3.2011, 20:04
Вообщем делаю вот так.
захожу в папку apache\conf открываю файл httpd.conf в ней у меня стоит следующее:
Код
<Directory "s:/appserv/www"> Options Indexes FollowSymLinks MultiViews ExecCGI AllowOverride All Order allow,deny Allow from all </Directory>
и
Код
AddHandler cgi-script .lua .cgi .pl
Далее делаю дальше по инструкции.
Цитата
Далее откроем эту директорию, создадим в ней файл .htaccess, и пропишем в нем 2 заклинания: Код Options +ExecCGI
Создаю в папке www файлик .htaccess пишу туда Options +ExecCGI и сохраняю. Далее... Создаю в той же папке www файлик test.lua Туда ввел пару строк: #!C:\Program Files\lua\lua.exe io.write("content-type: text/html\n\nHello world!!!")
Ошибки: в apache\logs\error.log пишет ошибки
Цитата
[Sun Mar 27 03:55:08 2011] [error] [client 10.30.3.254] couldn't spawn child process: s:/appserv/www/test.lua [Sun Mar 27 03:55:09 2011] [error] [client 10.30.3.254] File does not exist: s:/appserv/www/favicon.ico
а на браузере вот эта ошибка:
Цитата
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator, [no address given] and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
Apache/1.3.29 Server at localhost Port 80
При изменении конфига, apache перезапускаю. И вот вопрос. Какие пальцы мне стоит выпрямить молотком, чтобы и молоток держать удобнее и чтобы все было нормуль. И де собственно мои корячки не так сделали?
Автор: alex82 28.3.2011, 0:58
Цитата
Apache/1.3.29 Server at localhost Port 80
Может дело не в руках вовсе? Бытует мнение что Apache 1 устарел.
Автор: Saymon21 28.3.2011, 1:27
в мире так 2.2.16, имхо
alex82, кстати, тема таки интересная, полезная. Стоит ждать продолжения?)
Автор: AltSide 16.5.2011, 1:12
alex82, а расскажите пожалуйста, как работать с post запросами? Т.е, обращаемся к вайлу index.lua, в форму post запроса вводим нужный IP, после чего нужно вызвать функцию, которая должна получить информацию об IP из mysql.
Покажите пожалуйста пример реализации. Зарание спасибо.
Автор: DEN 007 16.5.2011, 4:49
Цитата(AltSide @ 16.5.2011, 2:12)
alex82, а расскажите пожалуйста, как работать с post запросами? Т.е, обращаемся к вайлу index.lua, в форму post запроса вводим нужный IP, после чего нужно вызвать функцию, которая должна получить информацию об IP из mysql.
Покажите пожалуйста пример реализации. Зарание спасибо.
А почитать маны по луа?
Автор: Артём 16.5.2011, 7:59
DEN 007 а нормально ответить человеку слабо или это модно теперь посылать в «маны» ? P.S. сам ответ знаешь или просто послал + отметился?
Автор: DEN 007 16.5.2011, 9:20
Цитата(Артём @ 16.5.2011, 8:59)
DEN 007 а нормально ответить человеку слабо или это модно теперь посылать в «маны» ? P.S. сам ответ знаешь или просто послал + отметился?
а я знаю что это можно найти в манах которые самолично читал на тему получения http запросов.
Автор: alex82 16.5.2011, 22:33
Давно хотел продолжить эту тему, но все никак руки не доходили.
_SERVER - Окружение, полученное от web-сервера _HEADERS - Заголовки HTTP. По умолчанию в таблице содержится один заголовок: content-type: text/html. Все заголовки должны быть установлены до отправки каких-либо данных web-серверу. На момент первой отправки данных в таблице должен содержаться как минимум один заголовок, в противном случае web-сервер сообщит о внутренней ошибке. _GET - Переменные, полученные при помощи метода GET. _POST - Переменные, полученные при помощи метода POST. _REQUEST - Переменные, полученные при помощи методов GET и POST. _COOKIE - Куки, сохраненные на стороне клиента. _SET_COOKIE - Куки, которые необходимо сохранить на стороне клиента. Каждое значение должно быть таблицей, содержащей собственно значение куки и время истечения в формате unix-epoch. Если время истечения не указано, куки сохраняется до конца сессии. Для удаления куки, установите его заведомо просроченным.
В таблицах _HEADERS,_GET,_POST,_REQUEST и _COOKIE все индексы хранятся в нижнем регистре. Таблицы _SERVER,_GET,_POST,_REQUEST и _COOKIE заполняются данными лишь при необходимости, поэтому к ним нельзя применять функции pairs и next.
Функции:
echo(...) - Функция, использующаяся для отправки данных клиенту. При первой отправке данных помимо самих данных отправляются заголовки, после чего добавление или изменение заголовков становится невозможным, а данная функция становится ссылкой на функцию io.write print(...) - Функция, использующаяся для отображения произвольных значений. Результат помещается в теги <pre><code></code></pre>. Данную функцию необходимо использовать только в целях отладки. tprint(tTable[, sTableName]) - Функция отображает содержимое таблицы tTable. Данную функцию необходимо использовать только в целях отладки.
Переменные:
_HEADERS_SENT - Переменная, определяющая, были ли отправлены заголовки. Менять значение этой переменной вручную не рекомендуется.
Пример использования
Код
#!C:\Program Files\lua\lua.exe
dofile("web.lua")
if not _REQUEST.mode or _REQUEST.mode == "main" then echo("Hello world!!!") elseif _REQUEST.mode == "ip" then echo("Ваш IP: ",_SERVER.REMOTE_ADDR or "?") elseif _REQUEST.mode == "useragent" then echo("Ваш User-Agent: ",_SERVER.HTTP_USER_AGENT or "?") else echo("<center><h2>Кулхацкер, да?</h2><br>А ну-ка иди отседова по добру по здорову. Не то глазки красненькие повыковыриваю, да ручки шаловливые пообломаю.</center>") end
Теперь создадим в этой же директории файл test.lua, и пропишем в первой строке путь к интерпретатору Lua (здесь и далее предполагается, что интерпретатор установлен в директорию C:\Program Files\lua):
А тем, у кого lighttpd
Код
cgi.assign = ( ".lua" => "/usr/bin/lua5.1" )
Автор: alex82 15.6.2011, 23:45
Saymon21
Даже не буду ходить по ссылке.
После ковыряния в коде некоторых библиотек от Kepler Project, у меня появились серьезные сомнения отностиельно вменяемости его авторов.
Автор: Saymon21 19.6.2011, 2:39
Мда... Встаки прав alex82. Фигня :(
Автор: OCTAGRAM 17.8.2011, 19:06
А в виде специализированного web сервера, как node.js есть что–нибудь дельное?