Come configuro Apache 2 per eseguire script Perl CGI?

Mi piacerebbe configurare Apache 2 in esecuzione su Kubuntu per eseguire script Perl CGI. Ho provato alcuni passaggi che ho trovato su googling, ma niente sembra funzionare.

Qual è il modo giusto per raggiungere questo objective?

Questo post è destinato a salvare le persone che soffrono di * non essere in grado di configurare correttamente Apache2 per Perl su Ubuntu. (Le configurazioni di sistema specifiche per la tua macchina Linux saranno menzionate tra parentesi quadre, come [questo]).

Possibile risultato di una configurazione errata di Apache 2:

  1. Browser che tenta di scaricare il file .pl anziché eseguire e dare il risultato.
  2. Proibito.
  3. Errore interno del server.

Se uno segue i passaggi descritti sotto con intelligenza ragionevole, può superare gli errori sopra menzionati.

Prima di iniziare i passaggi. Vai al /etc/hosts e aggiungi l’indirizzo IP / nome-dominio` per esempio:

 127.0.0.1 www.BECK.com 

Passaggio 1: installazione di apache2 Passaggio 2: installazione di mod_perl Passaggio 3: configurazione di apache2

apri sites-available/default e aggiungi quanto segue,

  SetHandler perl-script PerlResponseHandler ModPerl::PerlRun Options +ExecCGI PerlSendHeader On   Options FollowSymLinks AllowOverride None   ####(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  ScriptAlias /cgi-bin/ [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   SetHandler perl-script PerlResponseHandler ModPerl::PerlRun Options +ExecCGI PerlSendHeader On   Options FollowSymLinks AllowOverride None   ####(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  ScriptAlias /cgi-bin/ [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  

Passaggio 4:

Aggiungi le seguenti righe al tuo file /etc/apache2/apache2.conf .

 AddHandler cgi-script .cgi .pl  Options +ExecCGI   Options +ExecCGI    Alias /perl/ /home/sly/host/perl/   SetHandler perl-script PerlHandler Apache::Registry Options +ExecCGI    Options +ExecCGI  

Passaggio 5:

Molto importante , o almeno lo credo, solo dopo aver fatto questo passo, l’ho fatto funzionare.

AddHandler cgi-script .cgi .pl

  Options +ExecCGI   Options +ExecCGI    Alias /perl/ /home/sly/host/perl/   SetHandler perl-script PerlHandler Apache::Registry Options +ExecCGI    Options +ExecCGI  

Passaggio 6

Molto importante , o almeno lo credo, solo dopo aver fatto questo passo, l’ho fatto funzionare.

Aggiungi il seguente /etc/apache2/sites-enabled/000-default

  SetHandler perl-script PerlResponseHandler ModPerl::PerlRun Options +ExecCGI PerlSendHeader On  

Step 7:

Ora aggiungi il tuo script Perl come test.pl nel posto in cui hai menzionato prima nel passaggio 3 come [ path-where-you-want-your-.pl-and-.cgi-files ].

Assegna le autorizzazioni al file .pl usando chmod e poi, digita l’indirizzo webaddress/cgi-bin/test.pl nella barra degli indirizzi del browser, webaddress/cgi-bin/test.pl , hai capito.

(Ora, molte delle cose sarebbero state ridondanti in questo post. Gentilmente, ignoratelo.)

Avrai bisogno di dare un’occhiata al tuo log degli errori di Apache per vedere cosa è “l’errore del server interno”. I quattro casi più probabili, nella mia esperienza sarebbero:

  1. Il programma CGI si trova in una directory che non ha l’esecuzione CGI abilitata. Soluzione: aggiungere l’opzione ExecCGI a tale directory tramite httpd.conf o un file .htaccess.

  2. Apache è configurato solo per eseguire CGI da una directory cgi-bin dedicata. Soluzione: sposta il programma CGI lì o aggiungi un’istruzione AddHandler cgi-script .cgi a httpd.conf.

  3. Il programma CGI non è impostato come eseguibile. Soluzione (presupponendo un sistema operativo di tipo * nix): chmod +x my_prog.cgi

  4. Il programma CGI sta uscendo senza inviare intestazioni. Soluzione: esegui il programma dalla riga di comando e verifica che a) venga effettivamente eseguito anziché morire con un errore in fase di compilazione eb) generi l’output corretto, che dovrebbe includere, come minimo, un’intestazione Content-Type e una riga vuota che segue l’ultimo dei suoi header.

(La ricerca su Google mi ha portato a questa domanda anche se non ho chiesto perl)

Ho avuto un problema con l’esecuzione di script (anche se bash non perl). Apache aveva una configurazione di ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ comunque il registro degli errori di Apache mostrava che File does not exist: /var/www/cgi-bin/test.html .

Ho provato a mettere lo script in /usr/lib/cgi-bin/ e /var/www/cgi-bin/ ma nessuno dei due funzionava.

Dopo una sessione googling prolungata, quello che per me è stato il crack è stato sudo a2enmod cgi e tutto è andato a posto usando /usr/lib/cgi-bin/ .

A partire da Ubuntu 12.04 (Precise Pangolin) (e forse una versione o due prima) semplicemente installando apache2 e mod-perl tramite Synaptic e posizionando gli script CGI in / usr / lib / cgi-bin è tutto ciò che devi fare.

Ci sono due modi per gestire gli script CGI, SetHandler e AddHandler .

 SetHandler cgi-script 

si applica a tutti i file in un dato contesto , indipendentemente dal loro nome, anche index.html o style.css .

 AddHandler cgi-script .pl 

è simile, ma si applica ai file che terminano in .pl , in un dato contesto. Puoi scegliere un’altra estensione o più, se vuoi.

Inoltre, il modulo CGI deve essere caricato e Options +ExecCGI configurato. Per triggersre il modulo, problema

 a2enmod cgi 

e riavviare o ricaricare Apache. Infine, lo script Perl CGI deve essere eseguibile. Quindi i bit di esecuzione devono essere impostati

 chmod a+x script.pl 

e dovrebbe iniziare con

 #! /usr/bin/perl 

come prima linea.


Quando si utilizza SetHandler o AddHandler (e Options +ExecCGI ) al di fuori di qualsiasi direttiva, viene applicato globalmente a tutti i file. Ma puoi limitare il contesto a un sottoinsieme racchiudendo queste direttive all’interno, ad esempio Directory

  SetHandler cgi-script Options +ExecCGI  

Ora SetHandler applica solo ai file all’interno di / path / to / some / cgi-dir invece di tutti i file del sito web. Lo stesso vale per AddHandler all’interno di una direttiva Directory o Location , ovviamente. Si applica quindi ai file all’interno di / path / to / some / cgi-dir, che termina con .pl .

Se hai installato correttamente il server web Apache e Perl, segui i seguenti passi per eseguire lo script cgi usando perl su sistemi ubuntu.

Prima di iniziare con lo script CGI è necessario configurare il server Apache in modo tale che riconosca la directory CGI (dove i programmi cgi vengono salvati) e consenta l’esecuzione di programmi all’interno di tale directory.

  1. In Ubuntu la directory cgi-bin di solito risiede nel percorso / usr / lib, se non presente crea la directory cgi-bin usando il seguente comando. cgi-bin dovrebbe essere in questo stesso percorso.

      mkdir /usr/lib/cgi-bin 
  2. Emettere il seguente comando per verificare lo stato di authorization della directory.

      ls -l /usr/lib | less 

Controllare se l’authorization appare come “root root drwxr-xr-x 2 4096 2011-11-23 09:08 cgi-bin” se sì andare al passaggio 3.

Se non si emette il seguente comando per garantire l’authorization appropriata per la nostra directory cgi-bin.

  sudo chmod 755 /usr/lib/cgi-bin sudo chmod root.root /usr/lib/cgi-bin 
  1. Dare il permesso di esecuzione alla directory cgi-bin

      sudo chmod 755 /usr/lib/cgi-bin 

Pertanto la directory cgi-bin è pronta per essere utilizzata. Qui è dove metti tutti i tuoi script cgi per l’esecuzione. Il nostro prossimo passo è configurare apache per riconoscere la directory cgi-bin e consentire l’esecuzione di tutti i programmi in esso contenuti come script cgi.

Configurazione di Apache per eseguire script CGI usando perl

  1. È necessario aggiungere una direttiva nel file di configurazione del server Apache in modo che conosca la presenza di CGI e la posizione delle relative directory. Inizialmente vai nella posizione del file di configurazione di apache e aprilo con il tuo editor di testo preferito

     cd /etc/apache2/sites-available/ sudo gedit 000-default.conf 
  2. Copia il contenuto sottostante nel file 000-default.conf tra la riga di codici “DocumentRoot / var / www / html /” e “ErrorLog $ {APACHE_LOG_DIR} /error.log”

     ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/  AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Require all granted 

  3. Riavviare il server Apache con il seguente codice

     sudo service apache2 restart 
  4. Ora dobbiamo abilitare il modulo cgi che è presente nelle versioni più recenti di Ubuntu per impostazione predefinita

     sudo a2enmod cgi.load sudo a2enmod cgid.load 
  5. A questo punto possiamo ricaricare il webserver di apache in modo che legga di nuovo i file di configurazione.

     sudo service apache2 reload 

La parte di configurazione di apache è finita ora controlliamola con un programma cgi perl di esempio.

Provalo

  1. Vai alla directory cgi-bin e crea un file cgi con estensione .pl

     cd /usr/lib/cgi-bin/ sudo gedit test.pl 
  2. Copia il seguente codice su test.pl e salvalo.

     #!/usr/bin/perl -w print “Content-type: text/html\r\n\r\n”; print “CGI working perfectly!! \n”; 
  3. Ora concedi il permesso di esecuzione test.pl.

     sudo chmod 755 test.pl 
  4. Ora apri quel file nel tuo browser web http: //Localhost/cgi-bin/test.pl

  5. Se vedi l’output “CGI perfettamente funzionante” sei pronto per andare. Ora scarica tutti i tuoi programmi nella directory cgi-bin e inizia a usarli.

NB: Non dimenticare di dare i tuoi nuovi programmi in permessi cgi-bin, chmod 755 in modo da eseguirlo correttamente senza errori interni del server.

Suppongo che tu abbia dato un’occhiata a mod_perl ?

Hai provato il seguente tutorial ?

EDIT: in relazione al tuo post – forse potresti includere un esempio del codice all’interno del tuo file .cgi . Forse anche le prime righe?

Per quelli come me che sono stati a tentoni attraverso tutorial e documenti molto più di quanto tu abbia bisogno di sapere, proprio ora, e voglio solo vedere la cosa che funziona per i principianti, ho trovato l’unica cosa che avevo fare è stato aggiungere:

AddHandler cgi-script .pl .cgi

Al mio file di configurazione.

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

Per la mia situazione, questo funziona meglio perché posso inserire il mio script perl ovunque io voglia e aggiungere l’estensione .pl o .cgi.

La risposta di Dave Sherohman menziona anche la soluzione AddHandler.

Naturalmente è ancora necessario accertarsi che le autorizzazioni / proprietà dello script siano impostate correttamente, in particolare che lo script sia eseguibile. Prendi nota di chi è “l’utente” quando viene eseguito da una richiesta http, ad esempio www o www-data.