Migrar de Apache/PHP a Nginx/PHP en CentOS

nginx2Si contamos con un servidor Apache, quiz谩 nos interese pasarlo a nginx聽con el menor downtime posible. Yo he hecho alguna prueba partiendo del siguiente entorno:

  • CentOS release 6.6
  • Apache/2.2.15 sin m贸dulos adicionales
  • VirtualHosts para un proyecto PHP 5.3.3

Lo que haremos con nginx es instalarlo y configurarlo de forma muy b谩sica en un puerto diferente y posteriormente una vez est茅 todo bien, cambiar puertos de escucha.

ATENCI脫N: Si est谩s pensando en migrar de Apache a Nginx, en producci贸n, ten en cuenta que dependiendo de tu entorno, deber谩s hacerlo de una u otra manera. No es lo mismo migrar un proyecto python que sirve Apache via mod_wsgi, que un proyecto PHP que ni si quiera usa mod_rewrite (como en este聽ejemplo). Este post, por tanto, te puede servir de punto de partida, pero no es la 芦gu铆a definitiva禄.

Instalaci贸n de nginx

En primer lugar, deberemos crear el fichero para acceder al repositorio de nginx, pues 茅ste no viene en los repositorios de CentOS.

[[email protected] ~]# vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Tras configurar el repo, ya podremos instalar nginx via yum:

[[email protected] ~]# yum install nginx

Continuar leyendo 芦Migrar de Apache/PHP a Nginx/PHP en CentOS禄

Default VirtualHost en Apache

Black Hole

A continuaci贸n, algunas notas sobre el comportamiento del primer VirtualHost definido en Apache.

En un entorno Apache con VirtualHosts, el primer VirtualHost es importante, pues ser谩 el VirtualHost por defecto. 脡sto significa que ser谩 el VirtualHost con mayor prioridad, y por tanto atender谩 a cualquier petici贸n al server contra un dominio no especificado en ning煤n VirtualHost.

Usualmente tendremos definidos VirtualHost *:80 as铆 como *:443. En este caso, tendremos un default para *:80 y un default para *:443. Si definieramos nuestros VirtualHost especificando IP:puerto, entonces tendr铆amos un default para cada IP:puerto definido.

El primer VirtualHost, no es m谩s que el primer VirtualHost definido en el httpd.conf. Si usamos como es habitual un fichero de configuraci贸n por cada VirtualHost, dentro del directorio 芦conf.d禄 incluido por el httpd.conf, entonces el primer VirtualHost ser谩 el que primero aparezca, ordenado por nombre. Por esta raz贸n se suele especificar el VirtualHost 芦default禄 en un archivo con nombre 芦_defaul.conf禄, para que se liste primero.

En la documentaci贸n oficial de Apache, adem谩s, comentan que este primer VirtualHost deber铆a tener un ServerName y un DocumentRoot iguales a los definidos de forma global en el fichero de configuraci贸n global de Apache.

Fuentes:

http://httpd.apache.org/docs/2.2/vhosts/details.html

http://httpd.apache.org/docs/2.2/vhosts/name-based.html

Flickr! Foto por ( (( marS )) )

C贸mo configurar VirtualHosts para HTTPS

ApacheEn Apache, usamos los VirtualHosts para poder definir diferentes proyectos web, cada uno con su propio dominio (o dominios), escuchando tras el mismo puerto e IP. 脡sto podemos hacerlo para conexiones HTTP normales, pero antiguamente no se pod铆a para HTTPS, puesto que la conexi贸n ven铆a cifrada y por tanto Apache no pod铆a saber a qu茅 dominio se quer铆a acceder.

Al parecer, desde el 2006 se incorpor贸 una extensi贸n que le permit铆a al cliente (el navegador del usuario) enviar el dominio a consultar en la primera petici贸n, antes de iniciar la transferencia cifrada de datos, permiti茅ndo as铆 al servidor poder usar el mecanismo de VirtualHosts para tener varios sitios web HTTPS escuchando por el mismo puerto (t铆picamente el 443).

Requisitos

Seguramente nuestro servidor Linux con Apache ya tenga instalados los requisitos para funcionar, pero para asegurarnos, bastar谩 con confirmar que tenemos:

  • openSSL 0.9.8f o posterior instalado
  • mod_ssl instalado en Apache

En mi ejemplo, un聽Fedora release 13 (Goddard) con Apache 2.2.15, lo he confirmado as铆:

[[email protected]]# openssl version
OpenSSL 1.0.0d-fips 8 Feb 2011

[[email protected]]#聽httpd -M | grep -i ssl
ssl_module (shared)

[[email protected]]#聽grep -i ssl /var/log/httpd/error_log*
Apache/2.2.15 (Unix) DAV/2 PHP/5.3.3 mod_ssl/2.2.15 OpenSSL/1.0.0-fips mod_wsgi/3.4 Python/2.7.5 configured — resuming normal operations

Si no tienes openssl ni mod_ssl, puedes instalarlo con yum y posteriormente reiniciar Apache:

[[email protected]]# yum install openssl mod_ssl
[[email protected]]# /etc/init.d/httpd restart

Continuar leyendo 芦C贸mo configurar VirtualHosts para HTTPS禄

Python 2.7 en CentOS 6 con mod_wsgi

python2En este post, veremos c贸mo instalar una nueva versi贸n de Python (la 2.7.5) manteniendo la versi贸n del sistema (2.6.6 en CentOS 6), forzando al mod_wsgi de Apache a usar la nueva versi贸n en lugar de la de sistema. La idea es no tocar la versi贸n de sistema, puesto que si cambiamos dicha versi贸n, seguramente nos encontraremos m谩s adelante con problema de dependencias en pr谩cticamente cualquier actualizaci贸n o instalaci贸n que queramos hacer con yum.

De esta manera, lo que har铆amos ser铆a hacer una segunda instalaci贸n de la nueva versi贸n de Python, que no comprometiera la instalaci贸n original. En el ejemplo, estamos usando un servidor CentOS 6.4 que por defecto, viene con Python 2.6.6, con un servidor Apache con mod_wsgi 3.2. Lo que queremos, es instalar Python 2.7.5 sin comprometer el Python del sistema, instalar los m贸dulos de Python necesarios para nuestra aplicaci贸n, pero 煤nicamente para la nueva versi贸n 2.7.5, y finalmente, reconfigurar mod_wsgi para usar la nueva versi贸n.

Para ello, podr铆amos seguir los pasos descritos a continuaci贸n:

Entorno

Comprobamos los detalles del sistema operativo:

[[email protected]]#cat /etc/redhat-release
CentOS release 6.4 (Final)

Verificamos la versi贸n de python del sistema:

[[email protected]]# python --version
Python 2.6.6

Continuar leyendo 芦Python 2.7 en CentOS 6 con mod_wsgi禄

Apuntes de mod_rewrite

httpd ApacheEste post es una breve introducci贸n a mod_rewrite, que puede servir como punto de partida, pero que no servir谩 ni mucho menos, como manual ni como gu铆a. Por favor, mira las fuentes al final del mismo, para acceder a las fuentes originales y ampliar la informaci贸n sobre mod_rewrite.

Mod_rewrite es uno de los m贸dulos de Apache m谩s importantes. Nos permitir谩 manipular urls (reescribiendo urls al vuelo), redirigir una url a otra o invocar un proxy interno, mediante una serie de reglas y condiciones.

En primer lugar, activaremos el motor de reescritura (en el .htaccess o en el virtualhost correspondiente), en el caso de que est茅 instalado mod_rewrite. Una vez activado, pondremos las reglas a continuaci贸n:

<IfModule mod_rewrite.c>
RewriteEngine On
## Aqu铆 las reglas
</IfModule>

Continuar leyendo 芦Apuntes de mod_rewrite禄

Optimizaci贸n de Apache

httpd Apache
Siguiendo con el 煤ltimo post sobre fine tuning de MySQL para mejorar el rendimiento, me lanzo con otro post recopilatorio con un resumen de algunas de las recomendaciones oficiales de Apache, completadas con otras fuentes listadas al final del post.

Hardware y SO

En la documentaci贸n oficial de Apache se comenta, que el factor m谩s importante para el rendimiento de un servidor es la RAM, lo cual me recuerda a una frase que reproduzco casi literalmente, pero de la cual no consigo recordar la fuente:

芦Aumentar la RAM es la manera m谩s r谩pida, barata y eficaz de mejorar el rendimiento禄

Adem谩s de la RAM, se deber谩 prestar atenci贸n a la i/o de los discos, CPU y finalmente a la velocidad de la tarjeta de red, que deber谩n ser suficientes (茅sto se deber谩 determinar por experimentaci贸n).

Continuar leyendo 芦Optimizaci贸n de Apache禄

Configuraci贸n b谩sica de Apache

httpd ApacheEn este post se trata de dar una idea de los que pueden ser los primeros pasos a dar tras la instalaci贸n de un servidor Apache con PHP.

/etc/php.ini

En primer lugar, podr铆amos mirar el archivo de configuraci贸n del php en busca de las l铆neas correspondientes a la gesti贸n de la visualizaci贸n de los mensajes de error. Se recomienda que ambos par谩metros est茅n a Off si se quiere evitar que tras un error en el servidor, se le muestre al usuario el c贸digo relativo al error, o incluso el fragmento de c贸digo php que lo ha provocado:

display_errors = Off
display_startup_errors = Off

Continuar leyendo 芦Configuraci贸n b谩sica de Apache禄

Instalar y configurar un servidor LAMP

Hoy me lanzo a la piscina con un paso a paso para instalar un servidor LAMP (Linux, Apache, Mysql, Php) y realizar los primeros pasos, en entornos tipo servidor Red Hat (Fedora, CentOS, etc.). Hay muchas formas de hacer 茅sto, pero la descrita a continuaci贸n siempre me suele funcionar:

Primer paso, instalar todos los componentes con yum:

yum install -y httpd php mysql-server mysql php-mysql

Continuar leyendo 芦Instalar y configurar un servidor LAMP禄

Generar petici贸n CSR para HTTPS

Apache HTTPSi se quiere montar un servidor que soporte HTTPS, se deber谩 contar un certificado v谩lido para el sitio web. Para ello, una opci贸n es directamente, comprar dicho certificado, en alguno de los m煤ltiples sitios web que ofrecen esta opci贸n, como GoDaddy, los cuales, ya tienen las instrucciones para generar la petici贸n del certificado aqu铆:

Para generar la petici贸n para el certificado, se deber谩n seguir una serie de pasos:

  • Crear el certificado y la petici贸n CSR (Solicitud para Firma del Certificado), ejecutando en el servidor web, el siguiente comando (NOTA: yourdomain puede ser cualquier texto, por ejemplo, para dominio.com podr铆amos usar dominio.key y dominio.csr respectivamente):

openssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr

Ej. openssl req -new -newkey rsa:2048 -nodes -keyout www_domain_com.key -out www_domain_com.csr

Continuar leyendo 芦Generar petici贸n CSR para HTTPS禄

驴Cu谩ndo reiniciar Apache?

RAID
Dos preguntas cortas con respuestas de copy&paste sobre Apache.

驴Una modificaci贸n en el archivo php.ini requiere reiniciar apache para aplicarse?
芦Si tenemos PHP como m贸dulo del servidor, el archivo php.ini se lee cada vez que se reinicia. Por lo tanto tienes que reiniciar para que actualice los cambios. 禄
Fuente: http://www.ignside.net/man/servidores/phpini.php

驴Y qu茅 pasa si no puedo reiniciar apache porqu茅 est谩 en producci贸n sirviendo una aplicaci贸n cr铆tica?
芦Las se帽ales USR1 o graceful hacen que el proceso padre indique a sus hijos que terminen despu茅s de servir la petici贸n que est茅n atendiendo en ese momento (o de inmediato si no est谩n sirviendo ninguna petici贸n). El proceso padre lee de nuevo sus ficheros de configuraci贸n y vuelve a abrir sus ficheros log. Conforme cada hijo va terminando, el proceso padre lo va sustituyendo con un hijo de una nueva generaci贸n con la nueva configuraci贸n, que empeciezan a servir peticiones inmediatamente.禄
Fuente: http://httpd.apache.org/docs/2.0/stopping.html

Actualizaci贸n Noviembre 2013

Aprovecho para actualizar este post con un par de apuntes:

  • Ante cualquier cambio en la configuraci贸n de Apache, podemos verificar si hay problemas con la nueva configuraci贸n, antes de aplicar los cambios, ejecutando:
/etc/init.d/httpd configtest
  • Una vez verificada la configuraci贸n, podemos reiniciar la configuraci贸n (sin necesidad de reiniciar Apache y por tanto sin afectar al servicio) s铆mplemente haciendo un reload:
/etc/init.d/httpd reload

Flickr! Foto por US Mission Geneva