Как настроить Apache 2 для запуска сценариев Perl CGI? - PullRequest
42 голосов
/ 18 февраля 2009

Я хотел бы настроить Apache 2, работающий на Kubuntu, для выполнения сценариев Perl CGI. Я попробовал несколько шагов, которые мне попались, прибегая к помощи, но, похоже, ничего не работает.

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

Ответы [ 8 ]

23 голосов
/ 28 ноября 2010

Этот пост предназначен для спасения людей, страдающих от * неспособности правильно настроить 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 file

<Files ~ "\.(pl|cgi)$">
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
Options +ExecCGI
PerlSendHeader On
</Files>

Шаг 7:

Теперь добавьте ваш Perl-скрипт как test.pl в том месте, где вы упомянули ранее на шаге 3 как [ path-where-you-want-your-.pl-and-.cgi-files ].

Дайте разрешения файлу .pl, используя chmod, а затем введите webaddress/cgi-bin/test.pl в адресной строке браузера, и все, вы получили его.

(Теперь, многие вещи были бы излишними в этом посте. Пожалуйста, игнорируйте это.)

19 голосов
/ 18 февраля 2009

Вам нужно просмотреть журнал ошибок 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 пустая строка после последнего заголовка.

13 голосов
/ 02 марта 2015

(поиск в 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/.

5 голосов
/ 08 сентября 2012

Начиная с Ubuntu 12.04 (Precise Pangolin) (и, может быть, релизом или двумя ранее) просто установив apache2 и mod-perl через Synaptic и поместив ваши CGI-скрипты в / usr / lib / cgi- bin действительно все, что вам нужно сделать.

4 голосов
/ 04 августа 2017

Если вы успешно установили веб-сервер 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 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
  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, чтобы он успешно запускался без каких-либо внутренних ошибок сервера.

2 голосов
/ 27 июня 2016

Существует два способа обработки сценариев 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 или AddHandlerOptions +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.

1 голос
/ 07 марта 2014

Для таких, как я, которые пробирались по учебникам и документам «гораздо больше, чем нужно, чтобы знать, что вам нужно», и просто хотели увидеть, как это работает для начинающих, я нашел единственную мне нужно было добавить:

AddHandler cgi-скрипт .pl .cgi

К моему файлу конфигурации.

http://httpd.apache.org/docs/2.2/mod/mod_mime.html#addhandler

В моей ситуации это работает лучше всего, так как я могу поместить свой Perl-скрипт в любое место и добавить расширение .pl или .cgi.

В ответе Дейва Шерохмана также упоминается решение AddHandler.

Конечно, вы все равно должны убедиться, что права доступа / владельца вашего скрипта установлены правильно, особенно для того, чтобы скрипт был исполняемым. Обратите внимание на то, кто является «пользователем» при запуске из http-запроса - например, www или www-data.

1 голос
/ 18 февраля 2009

Полагаю, вы посмотрели на mod_perl ?

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

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

...