Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Symfony a producción

10 de febrero de 2015

No estoy seguro si ya se ha hecho esta consulta.

Estoy desarrollando una aplicación en Symfony. La estoy subiendo al servidor de producción para ir mirando si funciona correctamente. El servidor es Ubuntu Server 14.04, que corre en AWS.

La cuestión es que para que corra realmente Symfony no es tan fácil. Se requieren de ciertos conocimientos sobre las configuraciones del server y algunas instalaciones de algunas librerías y módulos PHP5.

El problema que tengo es que no es capaz de leer el controlador frontal app.php. En cambio el app_dev.php, sí. Aunque tuve que engañarlo.

¿Alguno han tenido problemas similares? ¿Saben del alguna buena documentación para instalar bien Symfony2 en Ubuntu Server?

Saludos.


Respuestas

#1

No uso Amazon AWS, así que no te puedo ayudar con el problema que te está sucediendo. Eso sí, te puedo pasar este enlace de la documentación oficial de AWS que explica cómo deployar aplicaciones Symfony 2 en Amazon AWS Elastic Beanstalk.

Si ese enlace no te sirve, te comento las diferentes opciones que tienes para deployar aplicaciones Symfony:

  • Capifony, se basa en Ruby y es una versión del proyecto Capistrano personalizada para Symfony (de ahí su nombre). Esta es la herramienta que uso en todos mis proyectos y me gusta bastante: a veces da problemas al instalarlo y las primeras veces que lo usas puede ser un poco confuso. Pero en cuanto lo controlas, es genial porque permite de verdad deployar una aplicación ejecutando un solo comando.
  • Capistrano, es el proyecto original en el que se basa Capifony. Algunos lo prefieren precisamente por ser la versión original de Capifony. Muchas aplicaciones RubyOnRails lo usan para el deploy. Leer tutorial sobre como deployar con Capistrano
  • Fabrik está basado en Python y es más sencillo (y genérico) que Capistrano/Capifony. Conozco varias empresas Symfony que usan Fabrik para deployar sus aplicaciones.
  • Docker, aunque personalmente creo que esto está muy verde para deployar aplicaciones hoy en día, parece que en un par de años Docker será lo único que se utilice en todo el mundo. No te aconsejo para nada que lo uses hoy en día, pero si quieres echarle un vistazo, puedes ver esta presentación sobre cómo preparar las aplicaciones Symfony para Docker.

@javiereguiluz

12 febrero 2015, 8:44
#2

Hola @javiereguiluz

Por favor, me podrias explicar como capifony. (Mas claro que tutoriales que encotrado)

En mi caso estoy desarrollando win7 y el servidor esta montado win2008 R2.

Gracias.

@dariongg

12 febrero 2015, 13:23
#3

Gracias Javier. Todo esto fue lo que hice y funciona bien:

1. Se actualizan los paquetes de Ubuntu:

$ sudo apt-get update && sudo apt-get upgrade

2. Se instalan los paquetes para tener listo el servidor Apache con php:

$ sudo apt-get install apache2 mysql-server mysql-client php5 php5-mysql libapache2-mod-php5

3. Se instala PHPMyAdmin:

$ sudo apt-get install phpmyadmin

4. Se instala Git:

$ sudo apt-get install git-core

5. Se instala la librería cURL para php:

$ sudo apt-get install php5-curl

6. Se descarga Composer:

$ sudo curl -sS https://getcomposer.org/installer | php

Se mueve composer a una ruta global:

$ sudo mv composer.phar /usr/local/bin/composer

7. Nos dirigimos a la raíz del servidor:

$ cd /var/www/html

8. Se instala una distribución Symfony mediante Composer:

$ sudo composer create-project symfony/framework-standard-edition [el_proyecto]

9. Ajustar los algunos permisos de algunos archivos dentro de Symfony2:

$ sudo chown -R root:www-data app/cache
$ sudo chown -R root:www-data app/logs
$ sudo chown -R root:www-data app/config/parameters.yml
$ sudo chmod -R 755 app/cache
$ sudo chmod -R 755 app/logs
$ sudo chmod -R 755 app/config/parameters.yml

Si vamos hasta http:[dominio]/proyecto/web/app.php nos debe salir el siguiente error:

Oops! An Error Occurred
The server returned a "404 Not Found".
Something is broken. Please let us know what you were doing when this
error occurred. We will fix it as soon as possible. Sorry for any
inconvenience caused.

Es muestra de que todo va bien. Por ahora.

10. Por consola "le preguntamos" a Symfony si está listo para correr sobre el servidor:

$ sudo php app/check.php

Si el servidor no está correctamente instalado arrojará el siguiente aviso:

[ERROR]
Your system is not ready to run Symfony2 projects
Fix the following mandatory requirements
 
date.timezone setting must be set
Set the "date.timezone" setting in php.ini* (like Europe/Paris).
 
Optional recommendations to improve your setup
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
intl extension should be available
Install and enable the intl extension (used for validators).
 
Note The command console could use a different php.ini file
~~~~ than the one used with your web server. To be on the
     safe side, please check the requirements from your web
     server using the web/config.php script.

Para solucionar el problema con el huso horario de nuestro servidor tenemos que ir a dos lugares:

$ sudo nano /etc/php5/apache2/php.ini
$ sudo nano /etc/php5/cli/php.ini

Buscar y descomentar date.timezone y poner el huso de donde nos encontramos. He puesto Mexico/General. Volvemos y le preguntamos a Symfony sobre nuestra configuración:

$ sudo php app/check.php
Symfony2 Requirements Checker
 
> PHP is using the following php.ini file:
 
  /etc/php5/cli/php.ini
 
> Checking Symfony requirements:
 
  ............................W.......
 
 [OK]                                          
 Your system is ready to run Symfony2 projects 
 
Optional recommendations to improve your setup
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
intl extension should be available
Install and enable the intl extension (used for validators).

Nos recomienda instalar la extensión intl para php:

$ sudo apt-get install php5-intl

11. Habilitar los módulos mod_headers, mod_rewrite, mod_expires, mod_deflate:

$ sudo a2enmod headers
$ sudo a2enmod rewrite
$ sudo a2enmod expires
$ sudo a2enmod deflate

Y restaurar Apache:

$ sudo service apache2 restart

12. Modificar el virtual host:

$ sudo nano /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
    #ServerName      mi-sitio.com
    #ServerAlias     www.mi-sitio.com
    #SetEnv SYMFONY__DATABASE__USER     "..."
    #SetEnv SYMFONY__DATABASE__PASSWORD "..."
    DocumentRoot    "/Proyectos/Symfony2/mi-sitio.com/web"
    #DirectoryIndex  app.php
 
    <Directory "/Proyectos/Symfony2/mi-sitio.com/web">
        AllowOverride None
        Allow from All
        <IfModule mod_rewrite.c>
            Options -MultiViews
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ app.php [QSA,L]
        </IfModule>
    </Directory>
 
    #CustomLog  /var/log/httpd/mi-sitio.com-access.log combined
    KeepAlive            On
    MaxKeepAliveRequests 200
    KeepAliveTimeout     5
 
    AddOutputFilterByType DEFLATE text/css text/plain text/html application/xhtml+xml 
text/xml application/xml
 
    <IfModule mod_headers.c>
        Header append Vary User-Agent env=!dont-vary
        ExpiresActive On
        ExpiresDefault "now plus 1 week"
        ExpiresByType image/x-icon "now plus 1 month"
        ExpiresByType image/gif    "now plus 1 month"
        ExpiresByType image/png    "now plus 1 month"
        ExpiresByType image/jpeg   "now plus 1 month"
    </IfModule>
</VirtualHost>

13. Reiniciamos Apache:

$ sudo service apache2 restart

14. Activamos la caché de PHP:

; activa la caché
opcache.enable=1
 
; no elimina los comentarios (imprescindible para que funcionen las anotaciones)
opcache.save_comments=1

@cristian_angulo

12 febrero 2015, 14:28
#4

@cristian_angulo muchas gracias por publicar una guía tan detallada de los pasos que has seguido. Me gustaría hacerte varias sugerencias, pero antes que nada, una aclaración: que nadie piense que son necesarios todos estos pasos para pasar una aplicación Symfony a producción. Lo que aquí se explica es cómo preparar un servidor desde cero y después, instalar una aplicación Symfony.

Y ahora mis comentarios:

1. En vez de instalar Symfony con Composer, te recomiendo que utilices el nuevo Instalador de Symfony. Llevamos varios meses probándolo y pronto lo presentaremos públicamente. Gracias a este instalador, desacrgar Symfony y crear el proyecto es tan fácil como ejecutar lo siguiente:

$ symfony new mi_proyecto

Este instalador incluso ejecuta el php app/check.php después de instalar Symfony, por lo que no te tendrás que preocupar de el. Además, mientras que instalar Symfony con Composer te costará varios minutos, instalarlo con este nuevo instalador te costará unos 10 segundos.

2. En el punto 9 muestras cómo solucionar el problema de los permisos de Symfony. Siempre que sea posible, es mejor hacer que el servidor web se ejecute con el mismo usuario que el que utilizas en la consola (obviamente no el usuario root). Así no tendrás que hacer jamás nada para resolver el problema de los permisos en ningún otro proyecto Symfony.

3. En realidad, después de todos estos pasos lo que has hecho es crear un proyecto Symfony vacío, pero lo que normalmente quieres es instalar en el servidor un proyecto Symfony que estás desarrollando localmente en tu propio ordenador. Para hacerlo, necesitarás alguna de las herramientas que te he comentado antes: Capifony, Capistrano, Fabrik, Docker, etc.

@javiereguiluz

12 febrero 2015, 14:55
#5

@dariongg te recomiendo el siguiente tutorial que es muy nuevo y explica bastante bien cómo instalar una aplicación Symfony utilizando Capifony:

How to Deploy Symfony Apps with Capifony

@javiereguiluz

12 febrero 2015, 14:56
#6

Javier, de hecho fue la única forma como me funcionó un paquete de Symfony sobre Ubuntu en AWS. Levanté polvo de internet y no encontraba nada en concreto. Los 12 ó 13 pasos es la recopilación de algo por aquí y de allá.

Para desplegar la aplicación, y mientras me funcionaba uso Github. Creo las llaves públicas y luego clono el repositorio. Actualizando inmediatamente los vendors. Sí, lo sé. Es una forma arcaica, pero... ando corriendo :D...

Para @dariongg, para deployar puedes usar Magallanes. No se apega a ningún framework. Está escrito en php. Por si tienes otros proyectos, fuera de Symfony, te servirá mucho...

Saludos!

@cristian_angulo

12 febrero 2015, 16:01
#7

-_- por qué no había avisado del instalador. Lo probaré en el acto!!!

@cristian_angulo

12 febrero 2015, 16:11
#8

Regresé a dejar esto por acá. No puede ser más fácil desplegar una aplicación PHP, con Magallanes: http://acilia.es/wp-content/uploads/2014/05/Magallanes-Presentacion-PHP-MeetUp-Mayo-2014.pdf

Saludos!

@cristian_angulo

12 febrero 2015, 18:19
#9

Me ha encantado este post y que gran cantidad de documentación. Y de paso voy a poner una librería en php que me encontrado hoy. Además tiene muy buena pinta y parece fácil se llama Deployer.

Espero que os guste.

@jcarlosweb

18 febrero 2015, 17:20