Неправильно установлены разрешения Capistrano 3 для кеша и релизов

Я развертываю веб-приложение Symfony2 на Ubuntu 14.04, используя Capistrano 3 с symfony gem. Неправильно установлены разрешения для папки кеша: поскольку я использую гем symfony, разрешения должны быть установлены на папка кеша, и я действительно вижу это на выходе во время успешного развертывания:

cd /var/www/releases/20151015083314 && ( SYMFONY_ENV=prod /usr/bin/env mkdir -pv app/cache 

Однако, когда я просматриваю свое веб-приложение, я получаю следующую ошибку в моих журналах

PHP Warning:  mkdir(): Permission denied in /var/www/releases/20151015082855/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpCache/Store.php on line 40

PHP Fatal error:  Uncaught exception 'RuntimeException' with message 'Unable to create the cache directory (/var/www/releases/20151015082855/app/cache/staging)\n'

У меня также возникли ошибки разрешений при удалении папки релизов, но, похоже, теперь это исчезло после того, как я вручную удалил самую старую папку.

Я выполняю развертывание с пользователем ubuntu. Я также пытался следовать руководству по разрешениям здесь, используя второй способ ACL. Я установил разрешения для папки кеша в / current и для папки журналов в / shared.

В моих сценариях капистрано есть следующее:

# deploy.rb

set :pty, true

set :ssh_options, {
  user: 'ubuntu',
  keys: ['~/.ssh/id_rsa'],
  forward_agent: true,
  auth_methods: ["publickey"]
}

set :linked_files, fetch(:linked_files, []).push('app/config/parameters.yml', 'web/.htaccess', 'web/robots.txt')
set :linked_dirs, fetch(:linked_dirs, []).push('app/logs', 'src/Helios/CoreBundle/Resources/translations', 'app/spool')

# staging.rb

server 'ec2-00-000-000-000.eu-west-1.compute.amazonaws.com', user: 'ubuntu', roles: %w{app db web}

Я разворачиваюсь с

bundle exec cap staging deploy --trace

Спасибо

ОБНОВЛЕНИЕ

что странно, почему приложение symfony2 пытается создать папку кеша в / Release, а не в / current?

Я также следовал этому руководству, которое работало, если я установил разрешения после развертывания, но затем я получил ту же ошибку кеша после нового развертывания.

ОБНОВЛЕНИЕ

Я снова проверил свой сервер, и он работает как www-data. Я сделал следующее

APACHE_USER=$(ps axho user,comm|grep -E "httpd|apache"|uniq|grep -v "root"|awk 'END {if ($1) print $1}')

echo $APACHE_USER

Когда я развертываю с помощью capistrano, он не может удалить папку старых релизов. Я получаю несколько строк для каждого файла, который нельзя удалить:

rm: cannot remove ‘20151029153350/app/cache/staging/.....’: Permission denied

Пользователь capistrano развертывается как «ubuntu», который находится в группе «www-data». Я проверил разрешения каталога Release / 20151029153350, и это:

drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 30 10:13 20151029153350

person Patrick    schedule 16.10.2015    source источник
comment
Является ли пользователь развертывания («ubuntu») тем же пользователем, под которым работает ваш веб-сервер?   -  person will_in_wi    schedule 16.10.2015
comment
Я считаю, что веб-сервер работает с www-данными, но я не уверен, как это узнать?   -  person Patrick    schedule 16.10.2015
comment
Вы можете использовать ps -ef | grep [nameofwebserver], чтобы увидеть это. Имена могут быть httpd, nginx, apache и так далее. Это было бы полезно для варианта 2 моего ответа.   -  person will_in_wi    schedule 16.10.2015
comment
если я сделаю ps -ef | grep httpd, он вернет ubuntu 14632 14613 0 12:51 pts/0 00:00:00 grep --color=auto httpd. Я делаю ps -ef | grep apache2, он возвращает длинный список, включающий ubuntu 14630 14613 0 12:51 pts/0 00:00:00 grep --color=auto apache2   -  person Patrick    schedule 16.10.2015
comment
Кажется, мой сервер работал как пользователь ubuntu. Я не знаю почему? Я перезапустил apache2 с помощью sudo, и теперь он работает как пользователь root. Чтобы выяснить это, я запустил ps aux | egrep '(apache|httpd)', и он дал мне root 18281 0.0 0.0 8164 912 pts/0 S+ 17:48 0:00 egrep --color=auto (apache|httpd). Теперь веб-приложение правильно записывает папку кеша и работает после нового развертывания. Кто-нибудь знает, как это произошло, а также почему он не работает как пользовательские «www-data»? Благодарность   -  person Patrick    schedule 16.10.2015
comment
Кажется, что мой производственный сервер работает как «ubuntu», и он работает нормально. Имеет ли значение, под каким сервером работает мой сервер?   -  person Patrick    schedule 26.10.2015
comment
Я запустил эту команду на сервере APACHE_USER=$(ps axho user,comm|grep -E "httpd|apache"|uniq|grep -v "root"|awk 'END {if ($1) print $1}'), а затем echo $APACHE_USER, и она выводит www-data.   -  person Patrick    schedule 30.10.2015


Ответы (1)


Я бы посоветовал вам добавить в свой linked_dirs запись для app/cache, а затем создать shared/app/cache и установить его разрешения, которые будут доступны пользователю веб-сервера. Таким образом, разрешения сохраняются во всех развертываниях.

В качестве альтернативы вы можете использовать этот плагин, чтобы установить разрешения для развернутого кода.

Поскольку /current является символической ссылкой на /releases/[release_timestamp], некоторый код разрешит символическую ссылку и получит к ней прямой доступ.

person will_in_wi    schedule 16.10.2015
comment
Symfony Gem уже зависит от права доступа к файлам. Symfony Gem также устанавливает set :linked_dirs, [fetch(:log_path), fetch(:web_path) + "/uploads"] - person Patrick; 16.10.2015