【问题标题】:Deploying Symfony2 Application to AWS Elastic Beanstalk - Post Deployment Cache Clearing将 Symfony2 应用程序部署到 AWS Elastic Beanstalk - 部署后缓存清除
【发布时间】:2024-04-29 05:40:03
【问题描述】:

在将 Symfony2 应用程序部署到 Elastic Beanstalk 时,我需要执行手动缓存清除,以便应用程序开始运行。因此,我添加了一个容器命令来在部署期间清除产品缓存。命令运行,但我仍然必须手动清除才能使应用程序运行。

经过一番挖掘,我发现 Symfony2 缓存文件本身就有绝对路径字符串。我添加的命令运行“预部署”或在应用程序文件从其暂存文件夹(称为“/var/app/ondeck”)移动到它们的最终存放位置(“/var/app/current”)之前运行。结果导致缓存文件中的绝对路径字符串错误,导致应用加载失败。

此外,开发环境可以立即正常工作,因为它会自动重建自己的缓存。 prod 环境是唯一受到影响的环境。

我的问题:

  • 有没有办法在代码移动到位后自动运行缓存清除命令?
  • 或者,有没有办法让 Symfony2 让您为缓存生成指定不同的“基本路径”?这样就可以将其设置为指向正确的最终位置。

提前感谢大家:-)

【问题讨论】:

  • 您使用的是最新的 5.4 AMI 吗?我有完全相同的设置,我没有注意到这个问题,但我会做一些挖掘......你是使用 git 部署还是手动上传 zip?

标签: php amazon-web-services symfony-2.1 amazon-elastic-beanstalk


【解决方案1】:

尝试覆盖 getCacheDir?

在 app/AppKernel.php 中:

public function getCacheDir()
{
    return "/path/to/the/cache";
}

【讨论】:

    【解决方案2】:

    出现问题的原因是 ondeck 环境中,当各种 Symfony 命令在 composer 安装过程和/或您自己的命令(例如assetic:dump)结束时运行时,缓存被填充。

    解决方法是在部署的最后一个命令清除缓存,并指定--no-warmup来停止Symfony自动重新填充它,这样当环境被移出时缓存是空的ondeck当前。在我的 .ebextensions/symfony.config 我有:

    container_commands:
      01_migrate:
        command: php app/console doctrine:migrations:migrate --env=prod --no-debug --no-interaction
        leader_only: true
      02_dumpassets:
        command: php app/console assetic:dump --env=prod --no-debug
      99_clearcache:
        command: php app/console cache:clear --env=prod --no-debug --no-warmup
    

    没有很好的文档记录,但您也可以使用部署后挂钩来加热缓存环境已移动到当前。同样在 .ebextensions/symfony.config

    files:
      "/opt/elasticbeanstalk/hooks/appdeploy/post/01-cachewarm.sh":
        mode: "000755"
        owner: root
        group: root
        content: |
          #!/usr/bin/env bash
          . /opt/elasticbeanstalk/support/envvars
          cd $EB_CONFIG_APP_CURRENT
          php app/console cache:warmup --env=prod --no-debug      
    

    【讨论】:

    • 您好,我正在尝试按照您的描述运行 99_clearcache 命令,但出现错误“无法打开输入文件:app/console”。对此有什么想法吗?谢谢!
    • @Acyra - 我相信你已经弄清楚了,因为你的评论是一年半前的 :) 但我也遇到了这个问题,所以我会为其他人添加评论谁将来可能会遇到这种情况。应用程序路径是/var/app/current/,但命令是从文件系统根目录运行的,所以我只是在命令中使用了绝对路径/var/app/current/app/console,这看起来有点不雅,但工作正常。
    • 嗨@Darragh,我认为这只是因为您的应用程序的先前版本有效,但我想它在第一次部署的情况下不起作用。
    • 我什至不记得这条评论了,但请注意 - 谢谢 :)
    • 嗨,我有同样的问题,我在这里有点困惑。但是在哪里可以找到 .ebextensions/symfony.config?它是在我的项目中的某个地方还是我需要添加它?谢谢大家。
    【解决方案3】:

    我花了一些时间试图让事情以可重用的方式工作,这是我们最终确定的 ebextensions 文件。

    files:
      "/tmp/parameters.yml":
        mode: "000444"
        content: |
          parameters:
            database_driver: pdo_mysql
            database_host: '...'
            database_port: null
            database_name: ...
            database_user: ...
            database_password: ...
            mailer_transport: smtp
            mailer_host: 127.0.0.1
            mailer_user: null
            mailer_password: null
            locale: en
            secret: ...
    
    option_settings:
      - namespace: aws:elasticbeanstalk:hostmanager
        option_name: LogPublicationControl
        value: true
      - namespace: aws:elasticbeanstalk:container:php:phpini
        option_name: document_root
        value: /web
      - namespace: aws:autoscaling:launchconfiguration # This is for permission to the RDS instance
        option_name: SecurityGroups
        value: ...
    
    container_commands:
      01-params:
        command: cp /tmp/parameters.yml app/config/parameters.yml
      02-params:
        command: chown webapp:webapp app/config/parameters.yml
      03-bootsrap:
        command: php vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Resources/bin/build_bootstrap.php
      04-bootsrap:
        command: chown webapp:webapp app/bootstrap.php.cache
      05-cache:
        command: php app/console cache:clear --env=prod --no-debug --no-warmup
      06-cache:
        command: chmod -R 0777 app/cache
      07-logs:
        command: chmod -R 0777 app/logs
      08-cache:
        command: chown -R webapp:webapp app/cache
      09-logs:
        command: chown -R webapp:webapp app/logs
    

    【讨论】:

      【解决方案4】:

      根据@rhunwicks 的回答,这是我的.ebextensions/symfony.config

      commands:
        01updateComposer:
          command: export COMPOSER_HOME=/root && /usr/bin/composer.phar self-update
      
      files:
        "/opt/elasticbeanstalk/hooks/appdeploy/post/01-cachewarm.sh":
          mode: "000755"
          owner: root
          group: root
          content: |
            #!/usr/bin/env bash
            . /opt/elasticbeanstalk/support/envvars
            cd $EB_CONFIG_APP_CURRENT
            php app/console cache:clear --env=prod
            php app/console assetic:dump --env=prod
      

      确保您的作曲家中没有 "symfony-assets-install": "symlink",以免您花费数小时试图找出为什么符号链接指向 /var/app/ondeck/src/BundleName/MyBundle/Resources/public 而不是 current 文件夹。

      【讨论】:

        【解决方案5】:

        这个问题在最新的 Symfony 发行版中得到修复 2.3.23、2.5.8、2.6.1 和即将推出的版本(2.7.、3.、...)

        https://github.com/heroku/heroku-buildpack-php/issues/64

        Symfony 现在将在容器中使用相对于 FILE 的链接,因此您不再需要使用 post deploy hack。 请注意,您仍然需要将资产安装为硬链接。

        【讨论】:

        • 这拯救了我的一天。我试图执行一个 cachewarm 命令并且 aws 返回一个错误,但最新版本的 symfony 不需要它。谢谢!
        【解决方案6】:

        我遇到了同样的问题,我在 this 页面上找到了解决方案

        我的最终代码是 - 我正在使用 Symfony Framework (v2.8):

        commands:
          01_create_post_dir:
            command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
            ignoreErrors: true
        
        files:
          "/opt/elasticbeanstalk/hooks/appdeploy/post/initial_cron_job.sh":
          mode: "000755"
          owner: root
          group: root
          content: |
            #!/usr/bin/env bash
            # This line was very important for me as I needed to get EnvVars
            . /opt/elasticbeanstalk/support/envvars
            rm -rf /var/app/current/app/cache/* /var/app/current/app/logs/*
            chmod -R 777 /var/app/current/app/cache
            chmod -R 777 /var/app/current/app/logs
            su -c "command_name" $EB_CONFIG_APP_USER
        

        解释词:

        • 我不需要预热缓存,所以我对 cachelogs 文件夹执行 rm -rf
        • 我将缓存和日志文件夹权限更改为 100% 确保它们可写入 $EB_CONFIG_APP_USER - 在本例中为 webapp 用户

        【讨论】: