Как настроить Apache 2 для запуска сценариев Perl CGI?

Я хотел бы настроить Apache 2 на Kubuntu выполнять сценарии Perl CGI. Я попробовал несколько шагов, которые я наткнулся на Google, но ничего не получается.

Как правильно достичь этого?

8 ответов

Этот пост предназначен для спасения людей, которые страдают от * неспособности правильно настроить Apache2 для Perl в Ubuntu. (Конфигурации системы, специфичные для вашего компьютера с Linux, будут указаны в квадратных скобках, например [this]).

Возможный результат неправильной настройки Apache 2:

  1. Браузер пытается загрузить файл.pl вместо выполнения и выдачи результата.
  2. Запрещено.
  3. Внутренняя ошибка сервера.

Если кто-либо выполняет действия, описанные ниже, с разумным интеллектом, он / она может пройти через ошибки, упомянутые выше.

Перед началом шагов. Идти к /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, чтобы увидеть, что такое "внутренняя ошибка сервера". По моему опыту, четыре наиболее вероятных случая:

  1. Программа CGI находится в каталоге, в котором не разрешено выполнение CGI. Решение: Добавьте ExecCGI опцию к этому каталогу через httpd.conf или файл.htaccess.

  2. Apache настроен только для запуска CGI из выделенного cgi-bin каталог. Решение: переместите туда программу CGI или добавьте AddHandler cgi-script .cgi заявление в httpd.conf.

  3. Программа CGI не установлена ​​как исполняемая. Решение (при условии операционной системы типа *nix): chmod +x my_prog.cgi

  4. Программа 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) и разрешал выполнение программ в этом каталоге.

  1. В Ubuntu каталог cgi-bin обычно находится в пути /usr/lib, если его нет, создайте каталог cgi-bin с помощью следующей команды.cgi-bin должен быть на этом пути сам.

     mkdir /usr/lib/cgi-bin
    
  2. Выполните следующую команду, чтобы проверить состояние разрешений каталога.

     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
  1. Дайте разрешение на выполнение директории cgi-bin

     sudo chmod 755 /usr/lib/cgi-bin
    

Таким образом, ваш каталог cgi-bin готов к работе. Здесь вы помещаете все свои сценарии cgi для выполнения. Нашим следующим шагом будет настройка apache для распознавания каталога cgi-bin и разрешения выполнения всех программ в нем как сценариев cgi.

Настройка Apache для запуска CGI-скрипта с использованием perl

  1. Директива должна быть добавлена ​​в файл конфигурации сервера Apache, чтобы он знал о наличии CGI и расположении его каталогов. Сначала перейдите в папку с конфигурационным файлом apache и откройте его в вашем любимом текстовом редакторе.

    cd /etc/apache2/sites-available/ 
    sudo gedit 000-default.conf
    
  2. Скопируйте приведенный ниже контент в файл 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
    

  3. Перезапустите сервер Apache с помощью следующего кода

    sudo service apache2 restart
    
  4. Теперь нам нужно включить модуль cgi, который по умолчанию присутствует в более новых версиях ubuntu.

    sudo a2enmod cgi.load
    sudo a2enmod cgid.load
    
  5. На этом этапе мы можем перезагрузить веб-сервер apache, чтобы он снова считывал файлы конфигурации.

    sudo service apache2 reload
    

Конфигурационная часть apache завершена, теперь давайте проверим ее с помощью примера программы cgi perl.

Тестирование это

  1. Перейдите в каталог cgi-bin и создайте файл cgi с расширением.pl

    cd /usr/lib/cgi-bin/
    sudo gedit test.pl
    
  2. Скопируйте следующий код в test.pl и сохраните его.

    #!/usr/bin/perl -w
    print “Content-type: text/html\r\n\r\n”;
    print “CGI working perfectly!! \n”;
    
  3. Теперь дайте разрешение на выполнение test.pl.

    sudo chmod 755 test.pl
    
  4. Теперь откройте этот файл в вашем веб-браузере http://localhost/cgi-bin/test.pl

  5. Если вы видите вывод "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.

Я предполагаю, что вы взглянули на mod_perl?

Вы пробовали следующий урок?

РЕДАКТИРОВАТЬ: Относительно вашей публикации - возможно, вы могли бы включить образец кода в свой .cgi файл. Возможно, даже первые несколько строк?

Другие вопросы по тегам