Strony

wtorek, 16 marca 2010

CherryPy behind blue eyes of apache

Well, a big change is coming. We are going to switch our web app from PHP+jQuery to CherryPy+jQuery+some kind of ORM+some db back-end (and with a little intrusion of PHP, but #!).

It won't be easy... First of all I've put all parts of a new system together:

  • CherryPy 3.1.2 for "pythonization"
  • SQLObject 0.10.2 as out ORM
  • Cheetah 2.2.2 for templates
  • sqlite or mysql for db back-end (still not decided)


I want to run CherryPy application in a standalone server, probably as a deamon, on our www host and communicate with it using apache + mod_proxy.


  1. deamonization

    Sound easy but it took me two days to understand cherryd usage. After that I've wrote a shell script to run my CherryPy application as a deamon under Fedora (I hope it would work also under RHEL..):


    #!/bin/sh
    #
    # Comments to support chkconfig on RedHat Linux
    # chkconfig: 35 96 96
    # description: Cherrypy start/stop script
    #
    #
    ### BEGIN INIT INFO
    # Provides: cherrypy
    # Required-Start: $local_fs $syslog
    # Required-Stop: $local_fs $syslog
    # Default-Start: 2345
    # Default-Stop: 90
    # Short-Description: run CherryPy web server
    # Description: CherryPy is a python framerwork for CMT
    #
    ### END INIT INFO

    . /etc/init.d/functions

    serverdir=/home/cibak/CheRTTyPy
    prog=get
    server=${serverdir}/get.py
    config=${serverdir}/conf/get.conf
    pidfile=${PIDFILE-/var/run/CheRTTyPy.pid}
    lockfile=${LOCKFILE-/var/lock/subsys/CheRTTy}

    PYTHONPATH=${serverdir}

    RETVAL=0

    start() {
    echo -n "Starting $prog:"
    cherryd -d -p ${pidfile} -c ${config} -i get
    RETVAL=$?
    [ $RETVAL = 0 ] && touch ${lockfile}
    echo_success
    echo
    return $RETVAL
    }

    stop() {
    echo -n "Stopping $prog:"
    if test -f ${pidfile}; then
    killproc -p ${pidfile} -d 10 $prog
    rm -f "$pidfile"
    RETVAL=$?
    else
    RETVAL=1
    fi
    RETVAL=$?
    echo_success
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
    }


    case "$1" in
    start)
    start
    ;;
    stop)
    stop
    ;;
    status)
    status -p ${pidfile} $server
    RETVAL=$?
    ;;
    restart)
    stop
    start
    ;;
    *)
    echo $"Usage: $0 {start|stop|restart|status}"
    exit 1
    esac
    exit $RETVAL


  2. apache and mod_proxy

    I want to run CherryPy app behind apache and use mod_proxy to redirect ajax calls to it. So the vhost configuration:


    <VirtualHost cibak.fedora12.mbp:443>
    ServerAdmin krzysztof.ciba@xxxxxxxxx.xxx
    ServerName cibak.fedora12.mbp
    ProxyPreserveHost On

    DocumentRoot /home/cibak/CheRTTyPy
    ErrorLog logs/cibak.fedora12.mbp_error.log
    TransferLog logs/cibak.fedora12.mbp_access.log

    SSLEngine On
    SSLProtocol all -SSLv2
    SSLProxyEngine On

    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW

    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

    <Proxy *>
    Order allow,deny
    Allow from all
    </Proxy>
    ProxyPass /query/ https://127.0.0.1:8083/
    ProxyPassReverse /query/ https://127.0.0.1:8083/
    </VirtualHost>


  3. ORM
    SQLObject, looks pretty nice, especially sqlbuilder classes for constructing SQL query. For prototype I choose simple sqlite3 DB-API, as it is already built in python, but for production version I'll switch to ORACLE or mysql.

    BTW switch of db back-end is very easy with SQLObject ORM — only place for that is changing connection string passed to sqlconnector. :)


After 6-7 weeks of rather extensive work the prototype for Atlas experiment RTT web page is ready and released to the public. Now I'm waiting for the feedback.



!!!WORK IN PROGRESS!!!