In bash, qual è il modo più semplice per configurare lighttpd per chiamare uno script python locale basato su un particolare URL?
Domanda
In bash, qual è il modo più semplice per configurare lighttpd per chiamare uno script python locale mentre passa qualsiasi stringa di query o coppia nome-valore inclusa con l'URL come opzione da riga di comando affinché l'app python locale possa analizzare?
Example:
www.myapp.com/sendtopython/app1.py?Foo=Bar
results in the following occurring on the system.
>python app1.py Foo=Bar
www.myapp.com/sendtopython/app2.py?-h
results in the following occurring on the system.
>python app2.py –h
Ecco un esempio di script di installazione e configurazione di lighttpd.
#!/bin/bash
# Install and configure web console managed by lighttpd
# Suggested Amazon EC2 AMI : ami-0d729464
#
# The console installed into /opt/web-console and
# available on the http://_the_server_dns_/web-console
set -e -x
export DEBIAN_FRONTEND=noninteractive
function die()
{
echo -e "$@" >> /dev/console
exit 1
}
apt-get update && apt-get upgrade -y
apt-get -y install python
apt-get -y install unzip
apt-get -y install lighttpd
# web directory defaults to /var/www.
WEBDIR=/var/www/logs
mkdir $WEBDIR || die "Cannot create log directory."
PYTHON=`which python`
echo $?
if [ ! $? ]
then
echo "Python interpreter not installed or not found in system path!!!" >> /dev/console
echo "Exiting setup-instance..."
exit 1
fi
#Download web-console
FILE_DOWNLOAD_URL=http://downloads.sourceforge.net/web-console/web-console_v0.2.5_beta.zip
wget $FILE_DOWNLOAD_URL -O web-console.zip || die "Error downloading file web-console.zip"
# Install the web-console
INSTALL_DIR=/opt/web-console
mkdir $INSTALL_DIR
unzip -u -d $INSTALL_DIR web-console.zip || die "Error extracting web-console.zip"
chown www-data:www-data $INSTALL_DIR
# Configure lighttpd
cat > $INSTALL_DIR/webconsole.conf <<EOF
server.modules += ( "mod_cgi" )
alias.url += ( "/web-console/wc.pl" => "/opt/web-console/wc.pl" )
alias.url += ( "/web-console/" => "/opt/web-console/wc.pl" )
\$HTTP["url"] =~ "^/web-console/" {
cgi.assign = ( ".pl" => "/usr/bin/perl" )
}
EOF
ln -s $INSTALL_DIR/webconsole.conf /etc/lighttpd/conf-enabled/
/etc/init.d/lighttpd force-reload
exit 0
Soluzione
Mh, per prima cosa non farei confusione con lo script di installazione, ma eseguirlo una volta e quindi modificare il file di configurazione lighttpd risultante (webconsole.conf nel tuo caso).
È quindi necessario registrare gli script Python per CGI, come avviene per Perl nello script di installazione. Puoi aggiungere una riga
cgi.assign = ( ".py" => "/usr/bin/python" )
sotto la corrispondente riga .pl che renderebbe Python un'altra opzione CGI per / web-console / path (cerca i documenti lighttpd se vuoi registrare .py come CGI in qualunque ) .
Quindi, il tuo script Python CGI app1.py, app2.py, ... deve rispettare le specifiche CGI, che se ricordo la correttezza passa i parametri URL come variabili di ambiente. Quindi non puoi semplicemente usare sys.argv. Sono sicuro che esiste un modulo Python che esegue l'estrazione dei parametri per te. (In Perl, il modulo CGI di Lincoln Stein è in grado di supportare sia argomenti env che a riga di comando, ma non sono sicuro di quello di Python).