Capistrano3에서 Symfony2를 배포하면 app/cache 아래에 쓸 수 없어 몇 시간 빠졌습니다.

8390 단어 심포니Capistrano

소개


[UNMAINTAINED] 가 된 Capistrano2 + Capifony 플러그인에서 Capistrano3 + capistrano/symfony 플러그인으로 전환하면 캐시 주위에서 몇 시간 빠졌습니다.

무슨 일이 있었는지


Capistrano3 + capistrano/symfony 플러그인으로 전환하고 배포한 직후에 액세스할 때 Apache 가 아래와 같은 오류를 토했습니다.
request.CRITICAL: Exception thrown when handling an exception (InvalidArgumentException: The directory "{/path/to/app}/releases/{timestamp}/app/cache/prod/jms_serializer" is not writable. at {/path/to/app}/releases/{timestamp}/vendor/jms/metadata/src/Metadata/Cache/FileCache.php line 17) {"exception":"[object] (InvalidArgumentException(code: 0): The directory \"{/path/to/app}/releases/{timestamp}/app/cache/prod/jms_serializer\" is not writable. at {/path/to/app}/releases/{timestamp}/vendor/jms/metadata/src/Metadata/Cache/FileCache.php:17)"} []

앞에 둡니다만, jms_serializer 는 무관합니다.
다른 라이브러리도 마찬가지로 app/cache에 쓸 수 없어 오류를 토합니다.

app/cache는 0777로 설정되어야 합니다.


config/deploy.rb 에는, 아래와 같이, app/cache0777 로 하고 있을 생각이었습니다.
# config/deploy.rb

# Set correct permissions between releases, this is turned off by default
set :file_permissions_paths, ["app/cache"]
set :file_permissions_users, ["apache"]
set :file_permissions_chmod_mode, "0777"
set :permission_method, :acl
after "deploy:updated", "deploy:set_permissions:acl"

심포니 적으로는 ACL을 사용해야합니다.



파일 사용 권한은 Symfony의 공식 문서에 자세히 설명되어 있습니다.
  • Setting up or Fixing File Permissions (current)
  • $ HTTPDUSER=$(ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1)
    # # if this doesn't work, try adding `-n` option
    $ sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX var
    $ sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX var
    
    setfacl 명령은 웹 서버의 실행 사용자 (apache, www-data 등)와 권한을 설정하는 사용자 ($ (whoami)) 모두에게 전체 액세스를 제공하는 명령 예제를 제공합니다.

    setfacl이 실행 중입니다.


    Capistrano::FilePermissionsREADME 을 보면 아래와 같이 명령을 실행하고 있다고 설명합니다.
    [..] setfacl -Rn -m u:www-data:rwX -m u:<deploy-user>:rwX <path-to-app>/shared/app/logs <path-to-app>/<release>/app/cache
    

    실제로 배포시 콘솔 로그를 보면 아래와 같이 setfacl 명령이 실행되고 있습니다.
    00:06 deploy:set_permissions:acl
          01 setfacl -Rn -m u:{web server user}:rwX -m u:{deploy user}:rwX {/path/to/app}/releases/{timestamp}/app/cache
        ✔ 01 {deploy user}@{web server} 0.047s
          02 setfacl -dRn -m u:{web server user}:rwX -m u:{deploy user}:rwX {/path/to/app}/releases/{timestamp}/app/cache
        ✔ 02 {deploy user}@{web server} 0.047s
    

    그러나 권한은 0777이 아닙니다.



    확인해 보면 권한은 0777 로 되어 있지 않다는 것을 알 수 있습니다.
    [{deploy user}@{web server} {/path/to/user}]$ ls -la current/app/cache
    
    drwxr-xr-x+ 3 {deploy user} {group} 4096  5 25 19:42 2017 .
    drwxr-xr-x  5 {deploy user} {group} 4096  5 25 19:42 2017 ..
    drwxr-xr-x+ 9 {deploy user} {group} 4096  5 25 19:42 2017 prod
    
    [{deploy user}@{web server} {/path/to/user}]$ getfacl current/app/cache/*
    # file: current/app/cache/prod
    # owner: {deploy user}
    # group: {group}
    user::rwx
    group::r-x
    other::r-x
    

    알려진 문제입니다.



    이상하네요. 하지만 이건 모두 밟고 있는 지뢰인가? 그래서 Github을 보면 다음 PR을 발견했습니다.
  • Do not use -n flag with setfacl #9 capistrano/file-permissions



  • 자세한 것은 이해하고 있지 않습니다만, 아무래도, setfacln 옵션이 불필요했던 것 같습니다.
    어, 이거, Merged 되어 있지만...

    수정되었지만 출시되지 않았습니다.



    그래, 이 PR이 병합된 것은, 2016-6-29 로, 최신의 capistrano-file-permissions 1.0.0 는, 2016-1-15 그대로입니다.
    이것을 깨닫는 데는 또 한 시간이 걸렸습니다.
  • capistrano-file-permissions 1.0.0

  • 그래서, 빨리 릴리스 해 주는 이슈가 2017-5-3 에 벌써 끊어졌습니다.
  • Ask for a new release with setfacl #15

  • umask를 사용하여



    ACL에 의한 파일 권한을 포기하게 되면, umask 를 사용하는 방법이 Symfony의 공식으로 소개되고 있습니다.
  • Setting up or Fixing File Permissions (current) #4. Without Using ACL
  • If none of the previous methods work for you, change the umask so that the cache and log directories are group-writable or world-writable (depending if the web server user and the command line user are in the same group or not). 
    To achieve this, put the following line at the beginning of the bin/console, web/app.php and web/app_dev.php files:
    
    bin/console (symfony2는 app/console ), web/app.php
    실제로, web/app_dev.php 에도 아래의 코멘트가 이미 채워져 있거나 합니다.
    // app/console
    
    // if you don't want to setup permissions the proper way, just uncomment the following PHP line
    // read http://symfony.com/doc/current/book/installation.html#configuration-and-setup for more information
    umask(0000); // 今回ここのコメントを解除しました
    

    결론



    정리하면, 이하 2개의 대응을 하는 것으로 umask(0000); 에 기입할 수 없는 문제를 회피했습니다.
  • 0777
  • app/console , app/cache , Capistrano의 맨 위에 deploy:set_permissions:acl
    전 세계 Symfony 사용자를 위해 app/console의 새 버전이 출시되기를 바랍니다.
    (모두, umask 사용하고 있는 것일까. 혹시 상식?)

    그럼.
  • 좋은 웹페이지 즐겨찾기