Servidor web Apache

Introducción

Como servidor web para producción usaremos Apache.

Dado que sólo tenemos un equipo, el mismo equipo servirá contenido dinámico y estático.

Configuraremos el servidor de tal manera que la interfaz web de Cactus basada en Django se ejecute en un proceso independiente del servidor web y de los blogs, dado que tiene acceso a Tronco y nos gustaría minimizar al máximo la exposición de este último servidor.

Instalación

Apache está en los repositorios de Debian.

Necesitaremos instalar los módulos para PHP y WSGI (Python).

aptitude install apache2 libapache2-mod-{php5,wsgi}

Configuración

En /etc/apache2/sites-available/main creo un fichero de configuración con dos vhosts, uno para HTTP y otro para HTTPS.

<VirtualHost *:80>
    include /etc/apache2/sites-config/main
</VirtualHost>
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/cactus.pem
    SSLCertificateChainFile /etc/ssl/certs/startssl.class1.server.ca.pem
    SSLCertificateKeyFile /etc/ssl/private/cactus.key

    include /etc/apache2/sites-config/main
</VirtualHost>

Los dos vhosts tendrán la misma configuración salvado que uno de ellos tiene activado SSL. En el que lo tiene activado tengo que indicar además la ruta del par de claves. Apache lee estos archivos como root al iniciarse, por lo que no es necesario darles permisos especiales.

Nótese que la configuración real del servidor la he relevado a otro fichero, /etc/apache2/sites-config/main, para no repetirla dos veces. Este es el contenido de dicho fichero:

ServerAdmin webmaster@cactus.rufian.eu

# DocumentRoot is a blank directory!
DocumentRoot /var/www/main

################
#  Cactus web  #
################

# Use WSGI by default
WSGIScriptAlias / /home/cactus-web/cactus_proj/cactus_proj/wsgi.py
<Directory "/home/cactus-web/cactus_proj/cactus_proj">
    <Files wsgi.py>
        Order deny,allow
        Allow from all
    </Files>
</Directory>

# Serve static files with Apache
Alias /static/ /home/cactus-web/static/
<Directory "/home/cactus-web/static">
    Order deny,allow
    Allow from all
</Directory>

Alias /favicon.ico /home/cactus-web/static/favicon.ico

################
#  Cactus doc  #
################

Alias /doc /var/www/doc

#################
#  Cactus webs  #
#################

AliasMatch ^/web/([a-zA-Z0-9]+)/?(.*) /home/$1/web/public_html/$2

##################
#  Cactus blogs  #
##################

Alias /blogs /var/www/blogs
<Directory "/var/www/blogs">
    Order deny,allow
    Allow from all
</Directory>

#############
#  Logging  #
#############

ErrorLog ${APACHE_LOG_DIR}/error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog ${APACHE_LOG_DIR}/access.log combined

Por último en /etc/apache2/http.conf configuro WSGI para que utilice un proceso separado, así como que ese proceso debe ser ejecutado con cactus-web como propietario y que debe utilizar su virtualenv.

WSGIDaemonProcess cactus-web processes=4 threads=4 \
  user=cactus-web group=cactus-web \
  python-path=/home/cactus-web/cactus_proj:/home/cactus-web/env/lib/python2.6/site-packages
WSGIProcessGroup cactus-web

Contenidos

Tema anterior

Instalación del servidor de bases de datos MySQL

Próximo tema

Portal web con Django

Esta página