Установка cgi скриптов — не вляпайся!
Содержание:
Отправка чистых URI для запуска режимов
Современные веб-фреймворки обходятся без ограничений в URI, обеспечивая вместо этого чистые URI:
/cgi-bin/item.cgi?rm=view&id=15
Чистым URI для описания одного и того же ресурса может быть:
/item/15/view.
Процесс сопоставления этих URI для запуска режимов называется диспетчеризацией и обрабатывается CGI :: Application :: Dispatch. Дополнительный диспетчер не требуется.
Можно работать над проектом CGI :: Application на рабочем столе или ноутбуке без установки полнофункционального веб-сервера, такого как Apache. Вместо этого устанавливают CGI :: Application :: Server из CPAN. После нескольких минут установки у пользователя будет собственный сервер приложений.
Проводят автоматизированное тестирование. Test :: WWW :: Mechanize :: CGIApp позволяет выполнять функциональное тестирование проекта CGI :: App без запуска веб-сервера. Test :: WWW :: Mechanize можно использовать для проверки приложения через настоящий веб-сервер.
Прямое тестирование также выполняется легко. CGI- приложение обычно печатает выходные данные своих режимов работы в STDOUT. Это можно подавить с помощью переменной среды CGI_APP_RETURN_ONLY. Приложение имеет подключаемую архитектуру, которая проста в использовании и в разработке новых плагинов.
Как открыть загруженный файл ASPX
Если вы загрузили файл ASPX и ожидали, что он будет содержать информацию (например, документ или другие сохраненные данные), вероятно, что что-то не так с веб-сайтом, и вместо того, чтобы генерировать полезную информацию, он предоставил этот файл.
В этом случае поможет простой трюк – переименуйте файл ASPX в то, что вы ожидаете. Например, если вы ожидали PDF-версию счета с вашего банковского аккаунта, но вместо этого получили файл ASPX, просто переименуйте файл в bill.pdf, а затем откройте файл. Если вы ожидали изображения, попробуйте переименовать файл ASPX в image.jpg. Вы поняли идею.
Чтобы переименовать файл, ваш компьютер должен быть настроен так, чтобы показывать вам расширение файла. Для этого откройте диалоговое окно «Выполнить» (Win + R) и введите control folders. Используйте меню Вид, чтобы найти Скрывать расширения для зарегистрированных типов файлов – снимите флажок и примените изменения.
Проблема здесь заключается в том, что иногда сервер (веб-сайт, с которого вы получаете файл ASPX) неправильно называет сгенерированный файл (PDF, изображение, музыкальный файл и т.д.) и представляет его для загрузки. Вы исправляете название вручную.
Вы не всегда можете изменить расширение файла на что-то другое и ожидать, что он будет работать в новом формате. Этот случай с файлом PDF и расширением файла ASPX является очень особенным обстоятельством, поскольку, в основном, это просто ошибка именования, которую вы исправляете, изменив расширение с .ASPX на .PDF.
Иногда причиной этой проблемы является браузер или подключаемый модуль, который загружает страницу, сгенерированную ввиде файла ASPX, а не запрашиваемый файл. Попробуйте использовать другой бразуер, например, если вы используете Internet Explorer, попробуйте переключиться на Chrome, Яндекс или Firefox.
Дополнительная настройка
В дополнение к перечисленным выше настройкам нужно проверить значение параметра Listen, которым задаются настройки сетевого интерфейса (ip-адрес и номер TCP-порта), на котором сервер будет принимать клиентские подключения. Если Apache используется индивидуальным Web-разработчиком, то можно рекомендовать такую конфигурацию:
Listen 127.0.0.1:8080 # параметры сетевого интерфейса
Номер TCP-порта не должен конфликтовать с другим программным обеспечением, установленным на компьютере. Так, стандартный порт HTTP 80 часто бывает занят клиентом Skype. Для совместного использования сервера в сети нужно указать правильный IP-адрес или сетевое имя компьютера, на котором устанавливается Web-сервер.
Web-сервер Apache чаще всего используется совместно с интерпретаторами таких языков серверных сценариев, как PHP и Perl. Для того, чтобы на Web-сайте могли использоваться сценарии PHP (предполагаем, что PHP установлен в папку C:\PHP5), нужно добавить в конфигурационный файл «D:\www\conf\httpd.conf» следующие строки:
- LoadModule php5_module «C:/PHP5/php5apache2_2.dll»
- AddType application/x-httpd-php .php
- PHPIniDir «C:/PHP5»
Нужно отметить, что в папке PHP5 должен существовать конфигурационный файл php.ini, созданный на основе файла php.ini-development (если сервер используется для разработки Web-сайтов) или php.ini-production (это настоящий Web-сервер). Чтобы модули PHP могли найти все необходимые им динамические библиотеки, путь к папке C:\PHP5 должен быть прописан в переменной PATH среды окружения Windows.
Серверные CGI-сценарии на языке Perl уже должны выполняться при соблюдении двух условий:
- Интерпретатор языка Perl установлен на этом компьютере.
- В первой строке файлов сценариев правильно указан путь к интерпретатору Perl, например: #!C:/PERL/bin/perl.exe -w
Для проверки можно ввести в браузере URL: http://localhost:8080/cgi-bin/printenv.pl, предварительно подправив первую строку сценария printenv.pl в соответствии с п. 2.
Остальные нюансы настройки Web-сервера Apache под Windows выходят за рамки этой статьи.
Общий шлюзовый интерфейс CGI
CGI (Common Gateway Interface) — механизм доступа к программам на стороне веб-сервера. Спецификация CGI была разработана для расширения возможностей сервиса www за счет подключения различного внешнего программного обеспечения. При использовании CGI веб-сервер представляет браузеру доступ к исполнимым программам, запускаемым на его (серверной) стороне через стандартные потоки ввода и вывода.
Интерфейс CGI применяется для создания динамических веб-сайтов, например, когда веб-страницы формируются из результатов запроса к базе данных. Сейчас популярность CGI снизилась, т.к. появились более совершенные альтернативные решения (например, модульные расширения веб-серверов).
Веб-серверы
Веб-сервер — это сетевое приложение, обслуживающее HTTP-запросы от клиентов, обычно веб-браузеров. Веб-сервер принимает запросы и возвращает ответы, обычно вместе с HTML-страницей, изображением, файлом, медиа-потоком или другими данными. Веб-серверы — основа Всемирной паутины. С расширением спектра сетевых сервисов веб-серверы все чаще используются в качестве шлюзов для серверов приложений или сами представляют такие функции (например, Apache Tomcat).
Созданием программного обеспечения веб-серверов занимаются многие разработчики, но наибольшую популярность имеют такие программные продукты, как Apache (Apache Software Foundation), IIS (Microsoft), Google Web Server (GWS, Google Inc.) и nginx.
Apache — свободное программное обеспечение, распространяется под совместимой с GPL лицензией. Apache уже многие годы является лидером по распространенности во Всемирной паутине в силу своей надежности, гибкости, масштабируемости и безопасности.
IIS (Internet Information Services) — проприетарный набор серверов для нескольких служб Интернета, разработанный Майкрософт и распространяемый с серверными операционными системами семейства Windows. Основным компонентом IIS является веб-сервер, также поддерживаются протоколы FTP, POP3, SMTP, NNTP.
Google Web Server (GWS) — разработка компании Google на основе веб-сервера Apache. GWS оптимизирован для выполнения приложений сервиса Google Applications.
nginx — это HTTP-сервер, совмещенный с кэширующим прокси-сервером. Разработан И. Сысоевым для компании Рамблер. Осенью 2004 года вышел первый публично доступный релиз, сейчас nginx используется на 9-12% веб-серверов. Браузеры
Браузер, веб-обозреватель (web-browser) — клиентское приложение для доступа к веб-серверам по протоколу HTTP и просмотра веб-страниц. Как правило браузеры дополнительно поддерживают и ряд других протоколов (например ftp, file, mms, pop3).
Первые HTTP-клиенты были консольными и работали в текстовом режиме, позволяя читать гипертекст и перемещаться по ссылкам. Сейчас консольные браузеры (такие, как lynx, w3m или links) практически не используются рядовыми посетителями веб-сайтов. Тем не менее такие браузеры весьма полезны для веб-разработчиков, так как позволяют «увидеть» веб-страницу «глазами» поискового робота.
Исторически первым браузером в современном понимании (т.е. с графическим интерфейсом и т.д.) была программа NCSA Mosaic, разработанная Марком Андерисеном и Эриком Бина. Mosaic имел довольно ограниченные возможности, но его открытый исходный код стал основой для многих последующих разработок.
Первая программа
Вам будет интересно:Замыкания в JavaScript: практический пример, особенности и правила
Чтобы написать простую программу CGI в Perl, придерживаясь традиции, используют фразу «привет мир». Здесь она представлена полностью. Сохраняют это в файл с именем «hello» в каталоге cgi-bin и запускают его, указав URL-адрес:localhost/cgi-bin/hello в браузере. Пользователь должен увидеть текст «Hello world» в браузере. Если нет, знакомятся с разделом boxout для отладки программ CGI, чтобы получить помощь в отслеживании проблемы.
Это простая программа. Есть только несколько моментов, которые отличают разработку CGI скриптов на Perl от стандартной программы, запускающейся из командной строки. Первой из них является опция -T на линии shebang. Это переводит Perl в режим «taint». В этом режиме Perl автоматически будет игнорировать любые данные, поступающие от пользователя, и не позволит передавать эти данные в операционную систему до тех пор, пока они не будут очищены. В этом смысле taint-режим — хорошая идея.
Второе отличие заключается в добавлении строки, которая печатает заголовок содержимого. Это будет первая проба пользователя с протоколом CGI.
Все программы CGI должны выводить набор заголовков в браузер пользователя. В большинстве случаев единственным заголовком, который нужно будет вернуть, является контент. Это сообщает браузеру, какие данные программа отправляет. В этом примере возвращается простой текст, поэтому тип содержимого был «text/plain».
Обычно возвращают HTML, поэтому тип контента будет «text / html». Нет причин, по которым программа не может вернуть более сложные данные, например PNG («image / png»). Набор заголовков должен быть отделен от фактических данных пустой строкой
Это достигается путем печати двух символов новой строки после финального заголовка CGI скриптов на сервере.Также обращают внимание, что программа записывает свой вывод в STDOUT
Веб-сервер будет организован для сбора любых данных, записанных в STDOUT, и для передачи их обратно в браузер. Предыдущий пример в действительности ничего не делал. Нет необходимости иметь программу CGI, которая отображает только фиксированный текст. Это можно было бы легко сделать с помощью HTML-страницы. Пользователь должен учиться на примере того, что имеет динамический выход. Например, сценарий, который печатает текущее время:
Этот скрипт работает по тому же принципу, что и последний, но выдает системное время, используя функцию при разработке CGI скриптов на Perl — «localtime» и печатает это значение. Каждый раз, когда перезагружается скрипт, время будет обновляться. Еще раз этот скрипт выводит обычный текст. Требуется рассмотреть версию, которая возвращает HTML:
Эта программа выглядит несколько более сложной, но на самом деле она делает то же самое, что и в предыдущем примере. Добавленная сложность исходит исключительно из того факта, что должны отображать полную HTML-страницу.
Если пользователь когда-либо просматривал настройки своего браузера, вероятно, видел флажки или переключатели для включения или отключения Javascript и Java, но никогда не видел их для CGI или PHP. Это потому, что Javascript и Java выполняются браузером (или нет, если пользователь отключит их). Браузер ничего не знает о CGI или PHP. Он просто получает чистый HTML-код после выполнения сценариев на сервере. Встроенный способ создания CGI скриптов — PHP, ColdFusion, ASP, в основном, используется разработчиками, создающим веб-страницы «front end», которые будут обращаться к базам данных «назад», например, клиент/серверные веб-приложения.
Большим преимуществом метода CGI является то, что скрипты хранятся в файлах, поэтому есть буквально тысячи свободно доступных скриптов, уже написанных и готовых для загрузки и использования на веб-сайте. Это означает, что не нужно изучать язык сценариев, чтобы получить преимущества от скриптов, кто-то уже сделал эту работу за пользователя.
Литература
- Begault, Durand R. 3-D Sound for Virtual Reality and Multimedia (англ.). — AP Professional, 1994. — ISBN 978-0-1208-4735-8.
- Biocca, Frank; Levy, Mark R. Communication in the Age of Virtual Reality (англ.). — Lawrence Erlbaum Associates, 1995. — ISBN 978-0-8058-1549-8.
- Peitgen, Heinz-Otto; Jürgens, Hartmut; Saupe, Dietmar. Chaos and Fractals: New Frontiers of Science (англ.). — Springer Science & Business Media, 2004. — ISBN 978-0-387-20229-7.
- Sondermann, Horst. Light Shadow Space: Architectural Rendering with Cinema 4D (англ.). — Vienna: Springer, 2008. — ISBN 978-3-211-48761-7.
Server/Gateway¶
Чтобы запустить наше WSGI приложение, нужен WSGI сервер.
Он запускает WSGI приложение один раз при каждом HTTP запросе от клиента.
Задачи WSGI сервера:
- Сформировать переменные окружения (environment)
- Описать функцию обработчик запроса (start_response)
- Передать их в WSGI приложение
- Результат WSGI сервер отправляет по HTTP клиенту
- а WSGI шлюз приводит к формату клиент-серверного протокола (CGI, FastCGI, SCGI, uWSGI, …)
и передает их на Веб-сервер (например выводит в stdout, stderr).
WSGI-сервер
Пример WSGI-шлюза к CGI-серверу.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
import os import sys def run_with_cgi(application): environ = dict(os.environ.items()) environ'wsgi.input' = sys.stdin environ'wsgi.errors' = sys.stderr environ'wsgi.version' = (1, ) environ'wsgi.multithread' = False environ'wsgi.multiprocess' = True environ'wsgi.run_once' = True if environ.get('HTTPS', 'off') in ('on', '1'): environ'wsgi.url_scheme' = 'https' else environ'wsgi.url_scheme' = 'http' headers_set = [] headers_sent = [] def write(data): if not headers_set raise AssertionError("write() before start_response()") elif not headers_sent # Before the first output, send the stored headers status, response_headers = headers_sent = headers_set sys.stdout.write('Status: %s\r\n' % status) for header in response_headers sys.stdout.write('%s%s\r\n' % header) sys.stdout.write('\r\n') sys.stdout.write(data) sys.stdout.flush() def start_response(status, response_headers, exc_info=None): if exc_info try if headers_sent # Re-raise original exception if headers sent raise Exception(exc_info], exc_info1], exc_info2]) finally exc_info = None # avoid dangling circular ref elif headers_set raise AssertionError("Headers already set!") headers_set = status, response_headers return write result = application(environ, start_response) try for data in result if data # don't send headers until body appears write(data) if not headers_sent write('') # send headers now if body was empty finally if hasattr(result, 'close'): result.close() |
Environment
Всегда словарь
-
это обычно копия переменных окружения ОС + стандартные CGI переменные.
— содержит имя вызванного скрипта. Например: myapp.py
— путь к файлу
-
также включает в себя дополнительные WSGI-специфичные переменные, наиболее важные из них:
— представляет тело (body) HTTP запроса.
— указывает поток куда нужно выводить ошибки.
— это просто «http» или «https».
Поддержка PSGI
Приложение предлагает встроенную поддержку PSGI. Объектом запроса по умолчанию для этого является:
psgi_app ()
$psgi_coderef = WebApp->psgi_app({ … args to new() … })
Самый простой способ — создать и вернуть PSGI — совместимый coderef. Нужно передать аргументы в hashref так же, как и к новому. Это возвращает PSGI-совместимый coderef, используя CGI ::: PSGI в качестве объекта запроса. Чтобы использовать другой объект запроса, создают собственный объект run_as_psgi(), как показано ниже:
run_as_psgi ()
my $psgi_aref = $webapp->run_as_psgi
Точно так же, как run, печать, не выводит и не возвращает структуру данных, требуемую спецификацией PSGI. Используют это, если нужно запустить приложение поверх обработчика, совместимого с PSGI, например, Plack. Конечный результат может выглядеть так:
Спецификация PSGI позволяет возвращать дескриптор файла или ссылку подпрограммы вместо байтовых строк. В режиме PSGI это поддерживается непосредственно CGI Application.