Я хотел бы настроить Apache 2, работающий на Kubuntu
, для выполнения сценариев Perl CGI. Я пробовал некоторые шаги, которые мне попадались в поисковых системах, но ничего не работает.
Каков правильный способ достижения этого?
Я хотел бы настроить Apache 2, работающий на Kubuntu
, для выполнения сценариев Perl CGI. Я пробовал некоторые шаги, которые мне попадались в поисковых системах, но ничего не работает.
Каков правильный способ достижения этого?
Этот пост предназначен для спасения людей, которые страдают от * невозможности правильно настроить Apache2 для Perl на Ubuntu. (Конфигурации системы, характерные для вашей машины Linux, будут указаны в квадратных скобках, например [this]).
Возможный результат неправильной настройки Apache 2:
Если следовать шагам, описанным ниже, с разумным интеллектом, он может пройти через упомянутые выше ошибки.
Перед началом шагов. Перейдите в /etc/hosts
файл и добавьте IP-адрес/домен-имя`, например:
127.0.0.1 www.BECK.com
Шаг 1: установите apache2
Шаг 2: Установите mod_perl
Шаг 3: Настроить apache2
откройте sites-available/default
и добавьте следующее,
<Files ~ "\.(pl|cgi)$">
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
Options +ExecCGI
PerlSendHeader On
</Files>
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory [path-to-store-your-website-files-like-.html-(perl-scripts-should-be-stored-in-cgi-bin] >
####(The Perl/CGI scripts can be stored out of the cgi-bin directory, but that a story for another day. Let concentrate on washing out the issue at hand)
####
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ [path-where-you-want-your-.pl-and-.cgi-files]
<Directory [path-where-you-want-your-.pl-and-.cgi-files]>
AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
AddHandler cgi-script .pl
Order allow,deny
allow from all
</Directory>
<Files ~ "\.(pl|cgi)$">
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
Options +ExecCGI
PerlSendHeader On
</Files>
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory [path-to-store-your-website-files-like-.html-(perl-scripts-should-be-stored-in-cgi-bin] >
####(The Perl/CGI scripts can be stored out of the cgi-bin directory, but that a story for another day. Let concentrate on washing out the issue at hand)
####
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ [path-where-you-want-your-.pl-and-.cgi-files]
<Directory [path-where-you-want-your-.pl-and-.cgi-files]>
AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
AddHandler cgi-script .pl
Order allow,deny
allow from all
</Directory>
Добавьте следующие строки в ваш файл /etc/apache2/apache2.conf
.
AddHandler cgi-script .cgi .pl
<Files ~ "\.pl$">
Options +ExecCGI
</Files>
<Files ~ "\.cgi$">
Options +ExecCGI
</Files>
<IfModule mod_perl.c>
<IfModule mod_alias.c>
Alias /perl/ /home/sly/host/perl/
</IfModule>
<Location /perl>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Location>
</IfModule>
<Files ~ "\.pl$">
Options +ExecCGI
</Files>
Очень важно, или, по крайней мере, я так думаю, только после этого шага я получил его для работы.
AddHandler cgi-script .cgi .pl
<Files ~ "\.pl$">
Options +ExecCGI
</Files>
<Files ~ "\.cgi$">
Options +ExecCGI
</Files>
<IfModule mod_perl.c>
<IfModule mod_alias.c>
Alias /perl/ /home/sly/host/perl/
</IfModule>
<Location /perl>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Location>
</IfModule>
<Files ~ "\.pl$">
Options +ExecCGI
</Files>
Очень важно, или, по крайней мере, я так думаю, только после этого шага я получил его для работы.
Добавьте к вам следующее /etc/apache2/sites-enabled/000-default
файл
<Files ~ "\.(pl|cgi)$">
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
Options +ExecCGI
PerlSendHeader On
</Files>
Теперь добавьте свой Perl script в качестве test.pl в том месте, где вы упомянули ранее на шаге 3, как [path-where-you-want-your-.pl и-.cgi-files].
Предоставьте разрешения для файла .pl
с помощью chmod
, а затем введите webaddress/cgi-bin/test.pl
в адресной строке браузера, там вы его получили.
(Теперь многие вещи были бы лишними в этом посте. Пожалуйста, не обращайте на него внимания.)
Вам нужно просмотреть журнал ошибок Apache, чтобы узнать, что такое "внутренняя ошибка сервера". Четыре наиболее вероятных случая, по моему опыту, были бы следующими:
Программа CGI находится в директории, в которой нет выполнения CGI. Решение. Добавьте параметр ExecCGI
в этот каталог через httpd.conf или файл .htaccess.
Apache настроен только на запуск CGI из выделенного каталога cgi-bin
. Решение: Переместите туда программу CGI или добавьте оператор AddHandler cgi-script .cgi
в httpd.conf.
Программа CGI не установлена как исполняемая. Решение (предполагая операционную систему * nix-типа): chmod +x my_prog.cgi
Программа CGI выходит без отправки заголовков. Решение. Запустите программу из командной строки и убедитесь, что она фактически работает, а не умирает с ошибкой времени компиляции, и b) она генерирует правильный вывод, который должен включать, как минимум, заголовок Content-Type
и пустую строку, следующую за последними заголовками.
(поиск Google привел меня к этому вопросу, хотя я не просил perl)
У меня возникла проблема с запущенными скриптами (хотя bash не perl). Apache имел конфигурацию ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
, однако журнал ошибок Apache показал File does not exist: /var/www/cgi-bin/test.html
.
Пробовал помещать script в /usr/lib/cgi-bin/
и /var/www/cgi-bin/
, но ни один из них не работал.
После продолжительной сессии по поиску в Google, что взломало его для меня,
sudo a2enmod cgi
и все встало на место с помощью /usr/lib/cgi-bin/
.
Как Ubuntu 12.04 (Precise Pangolin) (и, возможно, релиз или два раньше), просто устанавливая apache2
и mod-perl
через Synaptic и размещение ваших скриптов CGI в /usr/lib/cgi -bin - это все, что вам нужно сделать.
Существует два способа обработки сценариев CGI, SetHandler
и AddHandler
.
SetHandler cgi-script
применяется ко всем файлам в заданном context, независимо от того, как они названы, даже index.html
или style.css
.
AddHandler cgi-script .pl
аналогичен, но применяется к файлам, заканчивающимся на .pl
, в данном контексте. Вы можете выбрать другое расширение или несколько, если хотите.
Кроме того, модуль CGI должен быть загружен и Options +ExecCGI
настроен. Чтобы активировать модуль, введите
a2enmod cgi
и перезапустите или перезагрузите Apache. Наконец, Perl CGI script должен быть исполняемым. Поэтому биты выполнения должны быть установлены
chmod a+x script.pl
и он должен начинаться с
#! /usr/bin/perl
в качестве первой строки.
Когда вы используете SetHandler
или AddHandler
(и Options +ExecCGI
) вне любой директивы, он применяется глобально ко всем файлам. Но вы можете ограничить контекст подмножеством, включив эти директивы внутри, например. Directory
<Directory /path/to/some/cgi-dir>
SetHandler cgi-script
Options +ExecCGI
</Directory>
Теперь SetHandler
применяется только к файлам внутри /path/to/some/cgi -dir, а не ко всем файлам веб-сайта. То же самое с AddHandler
внутри директивы Directory
или Location
, конечно. Затем он применяется к файлам внутри /path/to/some/cgi -dir, заканчивающимся на .pl
.
Я предполагаю, что вы взглянули на mod_perl?
Вы пробовали следующий учебник?
EDIT: по отношению к вашей публикации - возможно, вы можете включить образец кода внутри вашего файла .cgi
. Возможно, даже первые несколько строк?
Если вы успешно установили веб-сервер Apache и Perl, выполните следующие шаги для запуска cgi script с помощью perl в системах ubuntu.
Перед началом работы с CGI-скриптами необходимо настроить сервер Apache таким образом, чтобы он распознавал каталог CGI (где сохраняются программы cgi) и разрешает выполнение программ в этом каталоге.
В каталоге Ubuntu cgi-bin обычно находится в каталоге path/usr/lib, если нет, создайте каталог cgi-bin, используя следующую команду. cgi-bin должен быть на этом пути сам по себе.
mkdir /usr/lib/cgi-bin
Выполните следующую команду, чтобы проверить статус разрешений в каталоге.
ls -l /usr/lib | less
Проверьте, выглядит ли разрешение "drwxr-xr-x 2 root root 4096 2011-11-23 09:08 cgi- bin", если да, переходите к шагу 3.
Если не выполнить следующую команду для обеспечения соответствующего разрешения для нашего каталога cgi-bin.
sudo chmod 755 /usr/lib/cgi-bin
sudo chmod root.root /usr/lib/cgi-bin
Предоставить разрешение на выполнение для каталога cgi-bin
sudo chmod 755 /usr/lib/cgi-bin
Таким образом, ваш каталог cgi-bin готов к работе. Здесь вы накладываете все свои скрипты cgi на исполнение. Следующий шаг - настроить apache для распознавания каталога cgi-bin и разрешить выполнение всех программ в нем как cgi-скриптов.
Настройка Apache для запуска CGI script с использованием perl
Директива должна быть добавлена в конфигурационный файл сервера apache, чтобы он знал наличие CGI и расположение его каталогов. Сначала перейдите в папку конфигурационного файла apache и откройте его с помощью вашего любимого текстового редактора.
cd /etc/apache2/sites-available/
sudo gedit 000-default.conf
Скопируйте приведенный ниже контент в файл 000-default.conf между строкой кодов "DocumentRoot/var/www/html/" и "ErrorLog ${APACHE_LOG_DIR}/error.log"
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
Перезапустите сервер Apache со следующим кодом
sudo service apache2 restart
Теперь нам нужно включить модуль cgi, который по умолчанию присутствует в более поздних версиях ubuntu.
sudo a2enmod cgi.load
sudo a2enmod cgid.load
В этот момент мы можем перезагрузить веб-сервер apache, чтобы он снова считывал файлы конфигурации.
sudo service apache2 reload
Теперь часть конфигурации apache завершена, проверим ее с помощью программы cgi perl.
Тестирование
Перейдите в каталог cgi-bin и создайте файл cgi с расширением .pl
cd /usr/lib/cgi-bin/
sudo gedit test.pl
Скопируйте следующий код на test.pl и сохраните его.
#!/usr/bin/perl -w
print "Content-type: text/html\r\n\r\n";
print "CGI working perfectly!! \n";
Теперь дайте разрешение на выполнение test.pl.
sudo chmod 755 test.pl
Теперь откройте этот файл в своем веб-браузере http://Localhost/cgi-bin/test.pl
Если вы видите, что вывод "CGI работает отлично", вы готовы к работе. Теперь выгрузите все свои программы в каталог cgi-bin и начните их использовать.
Примечание. Не забудьте предоставить свои новые программы в разрешениях cgi-bin, chmod 755, чтобы успешно запускать его без каких-либо внутренних ошибок сервера.
Для таких, как я, которые нащупывали ваш путь через учебные пособия и документы гораздо больше, чем вам нужно, чтобы узнать, и просто хотите увидеть, что работает на старте, я нашел единственное Я должен был добавить:
AddHandler cgi- script.pl.cgi
В мой файл конфигурации.
http://httpd.apache.org/docs/2.2/mod/mod_mime.html#addhandler
В моей ситуации это работает лучше всего, так как я могу разместить свой perl script где угодно, и просто добавить расширение .pl или .cgi.
Ответ Дейва Шеохмана также упоминает решение AddHandler.
Конечно, вы все равно должны убедиться, что права/права на свой script установлены правильно, особенно, что script будет исполняемым. Обратите внимание на то, кто "пользователь" при запуске из HTTP-запроса - например, www или www-data.