2011-12-16 12 views
6

cómo hacemos las cosas ahoraBuscando una manera segura para desplegar código PHP

Tenemos un servidor de archivos (mediante NFS) que se montan múltiples servidores web y el uso de estos soportes como la raíz Web. Cuando implementamos nuestra base de código, hacemos SCP un archivo (tar.gz) al servidor NFS y desarchivamos los datos directamente en el "directorio web" del servidor de archivos.

La cuestión

Durante el proceso de despliegue que estamos viendo algunos errores de E/S, sobre todo cuando un archivo solicitado no se puede leer: Smarty error: unable to read resource: "header.tpl" Estos errores parecen desaparecer después de finalizada la implementación, por lo que suponemos que es porque desarchivar los datos directamente en el directorio web no es lo más seguro. Supongo que necesitamos algo atómico.

Mi pregunta

¿Cómo podemos atómicamente copiar nuevos archivos en un directorio existente (el directorio raíz del servidor web)?

EDITAR

Los archivos que son inflexibles en el directorio web no son los únicos archivos que se encuentran en el directorio. Estamos agregando archivos al directorio, que ya tiene archivos. Así que copiar el directorio o usar un enlace simbólico no es una opción (que yo sepa).

+1

de cambio de nombre es atómica (mv), también tal vez es mejor utilizar enlaces de software y el directorio web real es solo un enlace a /storage/www.revision.3282378 por ejemplo – jackdoe

Respuesta

1

Esto es lo que hago.

DocumentRootes, por ejemplo, /var/www/sites/www.example.com/public_html/:

cd /var/www/sites/www.example.com/ 
svn export http://svn/path/to/tags/1.2.3 1.2.3 
ln -snf 1.2.3 public_html 

Desde aquí se puede modificar esto para ampliar su .tar.gz antes de cambiar el enlace simbólico en lugar de exportar desde svn. La parte importante es que el cambio es la aplicación atómica del enlace simbólico.

0

¿Por qué no tienes 2 directorios con 2 versiones diferentes del sitio? Así que cuando terminaste de implementar en el sitio_2, simplemente cambiaste el directorio del sitio en tu configuración del servidor web (por ejemplo, apache) y copiaste todos los archivos en el sitio_1 dir. Luego puede implementarlo en site_1 dir y cambiarlo desde site_2 con el mismo método.

+0

Supongo que algo como se menciona aquí es la manera más rápida. Copie sus cosas nuevas en una carpeta temporal, luego cambie el nombre de la carpeta original y la carpeta nueva/temp después (lo cual no llevará mucho tiempo). – djot

+0

Ver mi edición - Tenemos otros archivos en la raíz web que deben permanecer (sitio de marketing) y muchos (> 40 GB de contenido generado por el usuario), no quiero duplicar eso todo el tiempo ... – mmattax

0

RSync nació para correr ... er ... pienso hacer esto mismo

RSync funciona a través de los sistemas de archivos locales y ssh - es muy robusto y rápido - solamente el envío/copiado archivos cambiados

Se puede configurar para eliminar los archivos que se han eliminado (o que simplemente faltan de la fuente), o se puede configurar para dejarlos solos. Puede configurar listas de exclusión para excluir ciertos archivos/directorios al sincronizar.

Aquí hay un link to a tutorial.

Re: atómica - link to another question on SO

+0

por lo que vale Utilicé esto en varios sitios web para implementar código durante los últimos 2 años sin ningún error (registro y correos electrónicos) - no faltan avisos de archivos/errores - solo comandos simples, comandos, implementaciones con guiones de línea de comandos. –

+0

Esto suena como una buena opción, algún ejemplo de ejecutarlo como "único" en un directorio local, o debe rsync siempre ejecutarse como un daemon? – mmattax

+0

Ejecuto rsync localmente todo el tiempo como parte de un script que empaqueta proyectos de código de Google. Estoy bastante seguro de que nunca configuré rsyncd, estoy en un Mac. –

0

me gusta la idea de NFS. Implementamos nuestro código en el servidor NFS que está en nuestras interfaces. De hecho, ejecutamos un script de shell cuando queremos lanzar una nueva versión.Lo que hacemos es utilizar una corriente enlace a la última dir la liberación, así:

/fasmounts/website/current -> /fasmounts/website/releases/2013120301/ 

y Apache raíz del documento es:

/fasmounts/website/current/public 

(de hecho, la raíz de documentos de Apache es/var/www cual es un enlace simbólico a/fasmounts/sitio web/actual/público)

El script de shell actualiza el enlace simbólico actual a la nueva versión DESPUÉS de que todo se haya cargado correctamente.

1

Creo que rsync es una mejor elección en lugar de scp, solo se sincronizarán los archivos modificados. pero implementar código por script no es conveniente para desarrollos en un equipo, y los errores en la implementación no se humanizan.

puedes pensar en Capistrano, Magallanes, Deployer, pero también están los script. Le recomiendo que pruebe walle-web, una herramienta de implementación escrita en PHP con yii2 lista para usar. Lo he alojado en nuestra compañía durante meses, funciona sin problemas durante la implementación de prueba, simulación, entorno de producción.

que dependerá de grupos de herramientas de golpe, rsync, GIT, enlace, pero una interfaz de usuario web en general bien para la operación, tener una oportunidad :)

+0

¡Bienvenido a Stack Overflow! Me he dado cuenta de que las cinco respuestas hasta ahora en este sitio (incluidas las dos que se eliminaron recientemente) promueven la misma herramienta, walle-web. Tómese un momento para leer nuestras [directrices sobre autopromoción] (http://meta.stackexchange.com/a/59302/253560). Es importante destacar que, si está afiliado a esta herramienta, debe divulgarlo en cada respuesta. Además, no debería promocionar su herramienta en todas sus respuestas en este sitio. – josliber

Cuestiones relacionadas