7. Servidor Web

adJ y OpenBSD incluyen en el sistema base dos servidores web: (1) una versión auditada de nginx 1.6.0 y (2) su propio OpenBSD httpd. En este capítulo detallamos la configuración y uso de cada uno, así como del paquete apache-httpd-openbsd que es el Apache 1.3.29 incluido hasta OpenBSD 5.5.

7.1. OpenBSD httpd

A continuación describimos algunos casos de uso del nuevo httpd que soporta contenido estático, FastCGI sin reescritura y SSL. Sus fuentes se basan en las de relayd que fue introducido y madurado en OpenBSD desde la versión 4.1 (inicialmente llamado hoststated).

7.1.1. Configuración mínima

En el archivo /etc/rc.conf.local agregue:

	httpd_flags=""

y en adJ agregue httpd a la variable pkg_scripts.

Se configura en el archivo /etc/httpd.conf cuya sintaxis tiene algunas similitudes con la de nginx y con la de relayd. Puede constar de 4 secciones: macros, configuraciones globales, uno o más servidores y tipos.

La sintaxis de la sección de tipos es idéntica a la de nginx y como puede usarse include para incluir otro archivo de configuración, el siguiente es un ejemplo mínimo (incluyendo el macro ext_ip):

	ext_ip="200.201.202.203"
	server "default" {
		listen on $ext_ip port 80
	}
	include "/etc/nginx/mime.types"

Podría probarlo iniciando en modo de depuración con:

	doas httpd -vn

Y examinando con un navegador la URL http://200.201.202.203, con lo que vería el archivo /var/www/htdocs/index.html y notaría que:

  • Debido a la opción listen on $ext_ip port 80 serviría por el puerto 80 de 200.201.202.203. En lugar de $ext_ip puede usar una interfaz o incluso un grupo como egress para servir en todas las interfaces conectadas a Internet.

  • Por defecto pondría una jaula chroot en /var/www. Esto podría modificarse en la sección de configuración, antes del primer server y después del macro con la opción chroot directorio

  • Iniciaría 3 procesos para servir páginas. Esto puede modificarse en la sección de configuración con la opción prefork numero

  • Que serviría los archivos de /var/www/htdocs. Esto puede modificarse agregando la opción root directorio_relativo_a_jaula dentro de la sección server.

7.1.2. Servidor con cifrado

Al ejemplo de configuración mínima anterior bastaría agregarle ssl a la opción listen e indicar el puerto 443, que es el asignado por defecto para HTTPS:

	ext_ip="200.201.202.203"
	server "default" {
		listen on $ext_ip ssl port 443
	}
	include "/etc/nginx/mime.types"

El certificado que emplea por defecto es el par /etc/ssl/server.crt y /etc/ssl/private/server.key. Podría especificarse otro par con las opciones ssl certificate archivo y ssl key archivo dentro de la sección server.

7.1.3. Dominios virtuales

Si la misma IP debe servir diversos dominios, cree una sección server por cada dominio con el nombre del dominio y emplee la misma opcion listen para todos y si es el caso directorios raices diferentes.

Si se configuraran los dominios www.miescuela.edu.co y www.otrodominio.co apuntando a la misma IP de los ejemplos anteriores y tiene las páginas de cada dominio en /var/www/htdocs/miescuela y /var/www/htdocs/otrodominio:

	ext_ip="200.201.202.203"
	server "www.miescuela.edu.co" {
		listen on $ext_ip port 80
		root /htdocs/miescuela
	}

	server "www.otrodominio.co" {
		listen on $ext_ip port 80
		root /htdocs/otrodominio
	}

	include "/etc/nginx/mime.types"

7.1.4. Sitio con PHP

Es posible que sirva contenidos PHP usando php-fpm como FastCGI. Sin embargo debe asegurar haber aplicado los parches más recientes para 5.6 (ya incluidos en binarios de adJ) y tener en cuenta que no soporta, y posiblemente no soportará reescritura de URLs.

Una configuración mínima para SIVeL 1.2 que opere en 192.168.1.1, con archivos en /var/www/htdcos/sivel y con SSL es:

	server "192.168.1.1" {
		listen on egress ssl port 443

		location "*.php" {
			fastcgi socket "/run/php-fpm.sock"
		}
		root "/htdocs/sivel/"
		include "/etc/nginx/mime.types"
	}

Operará bien con la configuración por defecto de php-fpm, que puede instalar con:

	doas pkg_add php-fpm
	doas cp /usr/local/share/examples/php-5.4/php-fpm.conf /etc/

e iniciar con:

	doas sh /etc/rc.d/php-fpm start

o mejor en cada arranque de su sistema editando /etc/rc.conf.local y agregando

  • Agregar php_fpm_flags=""

  • A la variable pkg_scripts añadir php-fpm

7.1.5. Otros detalles de uso

Si requiere volve a leer archivo de configuración, en lugar de reiniciar httpd puede ejecutar:

						pkill -HUP httpd

El formato de las bitácoras por defecto es similar al de nginx

7.2. Certificados SSL gratuitos con Let's Encrypt

Hasta hace un tiempo era impensable contar con un certificado SSL válido para los diversos navegadores (candadito verde) y que fuese gratuito. Sin embargo algunas empresas empezaron a ofrecerlos (e.g Gandi da certificado gratuito por un año para un dominio por la compra de un dominio), y finalmente de diversos intentos por parte de organizaciones sin ánimo de lucro, letsencrypt.org es reconocida por los navegadores principales y ofrece todo tipo de certificados validos por 3 meses de manera gratuita (cada 3 meses debe renovarse con el mismo letsencrypt).

Por ejemplo para un dominio miong.org sólo certificado para el web:

	doas letsencrypt certonly --webroot -w /var/www/htdocs/ -d miong.org -d www.miong.org 

Si además de los dominios web necesita cubrir con el mismo certificado el servidor de correo: correo.miong.org que tiene una raiz diferente:

	doas letsencrypt certonly --webroot -w /var/www/htdocs/ -d miong.org -d www.miong.org  -w /var/www/roundcubemail -d correo.miong.org

7.3. Nginx

OpenBSD y adJ incluyen nginx también entre los componentes básicos. Su archivo de configuración es /etc/nginx/nginx.conf. Por defecto correra en una jaula en /var/www, puede iniciarlo manualmente con:

	doas /etc/rc.d/nginx start

y detenerlo con

	doas /etc/rc.d/nginx stop

Para que inicie automáticamente en cada arranque basta agregar en /etc/rc.conf.local:

	nginx_flags=""

y que añada nginx en pkg_scripts.

7.3.1. Uso de PHP con nginx

No hay un módulo para PHP pero puede ejecutarse como Fast-CGI. Esto puede lograrse por ejemplo con el paquete php-fpm-5.6.25. Este paquete incluye un servicio que se configura en /etc/php-fpm.conf por ejemplo para escuchar en el socket /var/www/run/php-fpm.sock con

	listen = /var/www/run/php-fpm.sock

Inicielo con

	doas sh /etc/rc.d/php-fpm start

o de manera permanente en cada arranque agregue php-fpm en pkg_scripts en /etc/rc.conf.local. En el archivo de configuración de nginx agregue en la sección server donde servirá Apache:

  1. En index agregue index.php

  2. Adicione:

    	location ~ \.php$ {
    		fastcgi_pass   unix:run/php-fpm.sock;
    		fastcgi_index  index.php;
    		fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    		include        fastcgi_params;
    	}
    

7.4. Apache

adJ y OpenBSD cuentan con el porte de transición apache-httpd-openbsd con el Apache 1.3.29 modificado que había en adJ/OpenBSD 5.5. Este porte será descontinuado por lo que es importante usarlo como porte de transito bien a OpenBSD httpd o a nginx o a Apache2.

Instale el paquete:

	doas pkg_add apache-httpd-openbsd

En el archivo etc/rc.conf.local haga los siguientes cambios (parcialmente explicados en {2}): # Renombre httpd_flags por apache_flags # En la variable pkg_scripts remplace httpd por apache (y de requerirse saque nginx).

Modifique el archivo de configuración /var/www/conf/httpd.conf, el cambio evidente es modificar la ruta de los módulos activos para que sean cargados de /usr/local/lib/apache/ en lugar de /usr/lib/apache

Puede probar reiniciar el servidor completo para asegurar que el Apache 1.3.29 arranca también, o bien iniciar sólo el servicio con:

	doas sh /etc/rc.d/apache start

Este porte corre por defecto y para mayor seguridad con chroot en /var/www. Es decir que desde el punto de vista de Apache la raíz del sistema es lo que hay en /var/www. Diversos portes o sus aplicaciones pueden requerir que Apache tenga acceso a otras partes del sistema, aunque no lo recomendamos puede lograrlo iniciando con el flag:

	apache_flags="-u" 

Para detener el servidor una vez esté corriendo puede emplear:

	doas /etc/rc.d/apache stop

Para iniciarlo o reiniciarlo con las opciones que haya configurado en /etc/rc.conf.local:

	doas /etc/rc.d/apache restart
	

7.4.1. Directorios para usuarios

El archivo de configuración por defecto (/var/www/conf/httpd.conf) no incluye directorios para usuarios. A partir de OpenBSD 3.4 se recomienda que estos directorios se creen en /var/www/users, los activa estableciendo en el archivo de configuración:

	UserDir /users 

o bien

	UserDir /var/www/users 

el primer en caso de que corra Apache chroot y el segundo si no. En ambos casos se sugiere la siguiente secuencia para crear un directorio de publicación para el usuario pablo:

	cd /home/pablo
	doas mkdir /var/www/users/pablo
	doas ln -s /var/www/users/pablo public_html
	doas chown pablo:pablo /var/www/users/pablo
	

Así el usuario podrá publicar sus archivos en su subdirectorio public_html (como ocurre clásicamente) y desde un navegador local podrán verse con el URL: http://localhost/~pablo/ o remotamente con http://www.miong.org/~pablo/

7.4.2. Dominios virtuales

Empleado dominios virtuales (del inglés Virtual Hosting) es posible manejar con un mismo servidor diversas direcciones DNS. Para activarlo:

  1. En /var/www/conf/httpd.conf no emplee un alias para el directorio /

  2. Si ejecuta Apache con chroot copie /usr/local/lib/apache/modules/mod_vhost_alias.so en /var/www/usr/local/lib/apache/modules/

  3. Agregue en /var/www/conf/httpd.conf una línea del estilo:

    	NameVirtualHost 65.167.3.4
    		

    remplazando la IP por la de su servidor

    Agregue un dominio virtual por cada dominio que maneje, por ejemplo:

    	<VirtualHost 65.167.63.234>
    	    ServerAdmin pablo@miong.org
    	    DocumentRoot /var/www/htdocs
    	    ServerName www.miong.org
    	    ServerAlias miong.org
    	    ErrorLog logs/miong.org-error_log
    	    Options ExecCgi Includes MultiViews Indexes FollowSymlinks 
    	    SymLinksIfOwnerMatch
    	    CustomLog logs/miong.org-access_log common
    	</VirtualHost>
    		

7.4.3. SSL

Para emplear SSL con Apache pueden seguirse las instrucciones del FAQ de OpenBSD que se retoman a continuación. Debe generar un certificado que pueda ser firmado por una Autoridad Certificadora o por usted mismo.

	doas openssl genrsa -out /etc/ssl/private/server.key 1024
	doas openssl req -new -key /etc/ssl/private/server.key \
	       -out /etc/ssl/private/server.csr

Tras el segundo paso debe ingresar el código del país (co para Colombia), el departamento en el que está, la organización, la unidad dentro de la organización y el nombre común (e.g la dirección web).

Después puede enviar el archivo /etc/ssl/private/server.csr a una entidad certificadora, la entidad certificadora la devolverá su certificado firmado (digamos sudominio.pem) el cual debe ubicar en /etc/ssl/server.crt. Si prefiere firmar usted mismo su certificado emplee:

	doas openssl x509 -req -days 3650 -in /etc/ssl/private/server.csr \
		-signkey /etc/ssl/private/server.key -out /etc/ssl/server.crt

A continuación puede

  • agregar entre las opciones de Apache -DSSL en /etc/rc.conf.local

  • modificar /var/www/conf/httpd.conf para que al usar SSL se redireccione al directorio apropiado (digamos /var/www/users/sivel/), i.e. remplazando algunas líneas de la sección <VirtualHost _default_:443>:

    	DocumentRoot /var/www/users/sivel
    	ServerName miServidor
    	ServerAdmin micorreo@midominio.org
    	ErrorLog logs/error_log
    	TransferLog logs/access_log
    

  • Reiniciar el servidor con las opciones apropiadas, por ejemplo:

    	doas /etc/rc.d/apache restart
    

Finalmente puede probar abriendo desde un navegador https://Jesus.miong.org

7.4.4. PHP

Instale el paquete php-5.6.25. Después cree un enlace para activarlo en servidor web:

	doas ln -s /var/www/conf/modules.sample/php-5.4.conf \
		/var/www/conf/modules/php.conf
	  

y asegúrese de que las siguientes líneas estén en /var/www/conf/httpd.conf:

	LoadModule php5_module /usr/local/lib/apache/modules/libphp5.so

	AddType application/x-httpd-php .php

	DirectoryIndex index.html index.php
	  

Reinicie Apache y pruebe la instalación de PHP por ejemplo cargando desde un navegador un archivo prueba.php el cual debe tener el siguiente contenido:

	<?php
	  phpinfo();
	?>
	  

7.4.4.1. Soporte para PostgreSQL en PHP

Para activar el soporte para PostgreSQL (ver Sección 2, “Motor de bases de datos PostgreSQL”en PHP instale el paquete php-pgsql-5.6.25 y ejecute:

	doas ln -fs /etc/php-5.4.sample/pgsql.ini \
		/etc/php-5.4/pgsql.ini
	

Puede comprobar que esta extensión funciona revisando la salida de la función phpinfo().

7.4.4.2. Lecturas recomendadas

Puede aprender sobre PHP en http://www.php.net

La configuración de PHP con PostgreSQL y Apache corriendo con chroot puede verse en http://www.bsdforen.org/foren/showtopic.php?threadid=773 o en la sección sobre PostgreSQL de estas guías (ver Sección 2, “Motor de bases de datos PostgreSQL”

7.4.5. Server Side Include

El Apache incluido en OpenBSD tiene compilado como módulo estático mod_include.c (como puede comprobarse ejecutando /usr/sbin/httpd -l). Por esto para activar SSI basta quitar los comentarios de las siguientes líneas en /var/www/conf/httpd.conf:

	AddType text/html .shtml
	AddHandler server-parsed .shtml
		

y en el directorio o directorios desde los que se quieren usar páginas con SSI (extensión .shtml), agregar entre las opciones:

	Option Includes
		

Si se desea que las páginas con extensión .html sean reconocidas por el servidor, de forma que puedan incluir directivas SSI, deles permiso de ejecución y agregué después del AddHandler antes mencionado:

	XBitHack on
		

Tras reiniciar apache puede probar creando una página prueba.shtml por ejemplo con:

	<html>
		<head><title></title></head>
		<body>
			<!--#echo var="DATE_LOCAL" -->
		</body>
	</html> 
		

Al abrirla debe presentar la fecha y hora del sistema.

7.4.5.1. Lecturas recomendadas

Hay información completa sobre SSI en el manual de Apache http://httpd.apache.org/docs/howto/ssi.html