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

36

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

Каков правильный способ достижения этого?

  • 2
    может помочь, если вы связались с тем, что уже пробовали, и сказали, что с ним не работает.
  • 2
    Какие сообщения об ошибках вы получаете в журнале ошибок? Те обычно говорят вам, что не так.
Показать ещё 1 комментарий
Теги:
cgi

8 ответов

21

Этот пост предназначен для спасения людей, которые страдают от * невозможности правильно настроить 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 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>

Шаг 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 script в качестве test.pl в том месте, где вы упомянули ранее на шаге 3, как [path-where-you-want-your-.pl и-.cgi-files].

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

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

  • 13
    Миллион строк только для запуска Perl?
  • 1
    Я не понимаю, шаги 5 и 6. Вы объясняете, что это «очень важно». Вы даете команду AddHandler cgi-script .cgi .pl . Тогда есть блок кода. Где мы должны разместить это точно?
Показать ещё 2 комментария
19

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

  • 0
    Большое спасибо :) .. Однако вместо httpd.conf мне пришлось внести изменения в / etc / apache2 / sites-enabled / default, а затем все заработало ... httpd.conf был пустым файлом. Любая причина, почему я не должен был вносить изменения в httpd.conf?
  • 0
    Более «современный» способ обработки конфигов состоит в том, чтобы поместить все в набор частичных файлов конфигурации (с включенными сайтами, с поддержкой модов и conf.d), чтобы программы могли легче ими манипулировать. Когда вы делаете это, httpd.conf больше не нужен и может быть использован или нет.
10

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

  • 0
    Спасибо, на Debian 7 вам нужно запустить a2enmod cgi иначе он не будет работать.
  • 0
    a2enmod cgi исправил это и для меня! Этот ответ действительно заслуживает большего количества голосов.
Показать ещё 1 комментарий
5

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

2

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

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

1

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

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

EDIT: по отношению к вашей публикации - возможно, вы можете включить образец кода внутри вашего файла .cgi. Возможно, даже первые несколько строк?

  • 0
    Да, я уже установил libapache2-mod-perl2, но все же, когда я пытаюсь получить доступ к своей странице, используя localhost / cgi-bin / mypage.cgi , я получаю «Внутреннюю ошибку сервера»
  • 0
    Так что, возможно, mypage.cgi сломан?
0

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

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню