Как настроить Apache 2 для запуска сценариев Perl CGI?
Я хотел бы настроить Apache 2 на Kubuntu
выполнять сценарии Perl CGI. Я попробовал несколько шагов, которые я наткнулся на Google, но ничего не получается.
Как правильно достичь этого?
8 ответов
Этот пост предназначен для спасения людей, которые страдают от * неспособности правильно настроить Apache2 для Perl в Ubuntu. (Конфигурации системы, специфичные для вашего компьютера с Linux, будут указаны в квадратных скобках, например [this]).
Возможный результат неправильной настройки Apache 2:
- Браузер пытается загрузить файл.pl вместо выполнения и выдачи результата.
- Запрещено.
- Внутренняя ошибка сервера.
Если кто-либо выполняет действия, описанные ниже, с разумным интеллектом, он / она может пройти через ошибки, упомянутые выше.
Перед началом шагов. Идти к /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's a story for another day. Let's 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's a story for another day. Let's 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>
Шаг 4:
Добавьте следующие строки в ваш /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>
Шаг 5:
Очень важно, или, по крайней мере, я так думаю, только после выполнения этого шага я получил его на работу.
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>
Шаг 6
Очень важно, или, по крайней мере, я так думаю, только после выполнения этого шага я получил его на работу.
Добавьте следующее к вам /etc/apache2/sites-enabled/000-default
файл
<Files ~ "\.(pl|cgi)$">
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
Options +ExecCGI
PerlSendHeader On
</Files>
Шаг 7:
Теперь добавьте ваш Perl-скрипт как test.pl в то место, где вы упоминали ранее на шаге 3 как [путь-куда-вы-хотите-ваши-.pl-и-.cgi-файлы].
Дайте разрешения .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 выходит без отправки заголовков. Решение: Запустите программу из командной строки и убедитесь, что: а) она действительно запускается, а не умирает с ошибкой во время компиляции, и б) генерирует правильный вывод, который должен включать, как минимум,
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
,
Пробовал ставить скрипт в оба /usr/lib/cgi-bin/
а также /var/www/cgi-bin/
но ни один не работал.
После длительного сеанса поиска в Google мне это удалосьsudo a2enmod cgi
и все стало на свои места с помощью /usr/lib/cgi-bin/
,
Если вы успешно установили веб-сервер Apache и Perl, пожалуйста, выполните следующие шаги для запуска сценария cgi с использованием perl в системах Ubuntu.
Перед началом работы со сценариями CGI необходимо настроить сервер Apache таким образом, чтобы он распознавал каталог CGI (в котором сохраняются программы cgi) и разрешал выполнение программ в этом каталоге.
В Ubuntu каталог cgi-bin обычно находится в пути /usr/lib, если его нет, создайте каталог cgi-bin с помощью следующей команды.cgi-bin должен быть на этом пути сам.
mkdir /usr/lib/cgi-bin
Выполните следующую команду, чтобы проверить состояние разрешений каталога.
ls -l /usr/lib | less
Проверьте, выглядит ли разрешение как "корневой корень drwxr-xr-x 2 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-скрипта с использованием 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 и начните их использовать.
NB. Не забудьте дать вашим новым программам разрешения cgi-bin, chmod 755, чтобы они могли успешно запускаться без каких-либо внутренних ошибок сервера.
Начиная с Ubuntu 12.04 (Precise Pangolin) (и, возможно, с выпуском или двумя ранее) просто устанавливая apache2
а также mod-perl
через Synaptic и размещение ваших CGI-скриптов в /usr/lib/cgi-bin - это действительно все, что вам нужно сделать.
Есть два способа обработки CGI-скриптов: SetHandler
а также AddHandler
,
SetHandler cgi-script
применяется ко всем файлам в данном контексте, независимо от того, как они названы, даже index.html
или же style.css
,
AddHandler cgi-script .pl
аналогично, но применяется к файлам, оканчивающимся на .pl
в данном контексте. Вы можете выбрать другое расширение или несколько, если хотите.
Кроме того, модуль CGI должен быть загружен и Options +ExecCGI
сконфигурировано. Чтобы активировать модуль, выдайте
a2enmod cgi
и перезапустите или перезагрузите Apache. Наконец, сценарий Perl CGI должен быть исполняемым. Таким образом, биты выполнения должны быть установлены
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
,
Для таких, как я, которые пробирались по учебникам и документам "гораздо больше, чем вам нужно знать сейчас", и просто хотели увидеть, как это работает для начинающих, я нашел единственное, что у меня было сделать было добавить:
AddHandler cgi-скрипт.pl.cgi
К моему файлу конфигурации.
http://httpd.apache.org/docs/2.2/mod/mod_mime.html
В моей ситуации это работает лучше всего, так как я могу поместить свой Perl-скрипт куда угодно и просто добавить расширение.pl или.cgi.
В ответе Дейва Шерохмана также упоминается решение AddHandler.
Конечно, вы все равно должны убедиться, что права доступа / владельца вашего скрипта установлены правильно, особенно, чтобы скрипт был исполняемым. Обратите внимание на то, кто является "пользователем" при запуске из http-запроса - например, www или www-data.