HHVM 3.0 / Hack с Nginx не может получить доступ к файлу в каталоге с разрешениями 770 в Ubuntu 13.10, имея членство в группе

Я настроил nginx для использования виртуальной машины HipHop версии 3.0 в режиме fast-cgi. Несколько фактов:

  1. Я работаю на Ubuntu 13.10
  2. Nginx и hhvm запускаются от имени пользователя www-data.
  3. Пользователь www-data находится в группе fooers
  4. Корень сервера для nginx — это каталог /srv/foo с одним файлом index.php в нем.
  5. Групповым владением /srv/foo является группа fooers
  6. /srv/foo разрешения установлены на 770

Когда я пытаюсь просмотреть эту страницу, я получаю 404, но в журналах hhvm или nginx нет ошибок. Однако, если я изменю разрешения на 775 на /srv/foo, страница будет обслуживаться hhvm и nginx, как и ожидалось.

Кроме того, если я изменю группу по умолчанию для пользователя www-data на группу fooers, она будет работать с разрешениями 770. Кажется, что это не работает, только если это не группа по умолчанию для пользователя.

В чем проблема?!?!? Кто-нибудь знает, почему hhvm/nginx, работающий как пользователь www-data с групповым доступом к каталогу, не может получить доступ, когда разрешения равны 770?

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

$> ps -aux

Я вижу, как и ожидалось, процесс hhvm и процессы nginx, работающие как www-data:

www-data  3484 .... /usr/bin/hhvm --config /etc/hhvm/server.ini --user www-data --mode daemon -vPidFile=/var/run/hhvm/pid
www-data  3617 ... nginx: worker process 

Когда я проверяю группы, я вижу:

$> groups www-data
www-data : www-data fooers

Когда я проверяю каталог, я могу подтвердить 100% доступ к группе и владельцу:

$> ls -al
total 16
drwxr-xr-x  5 root root   4096 Mar 30 15:57 .
drwxr-xr-x 22 root root   4096 Mar 30 11:52 ..
drwxrwx---  2 root fooers 4096 Mar 30 15:39 foo

Если я проверю содержимое файла как пользователь www-data, мне разрешено:

$> sudo -u www-data ls -al /srv/foo
total 12
drwxrwx--- 2 root fooers 4096 Mar 30 15:39 .
drwxr-xr-x 5 root root     4096 Mar 30 15:57 ..
-rw-rw-r-- 1 root fooers   38 Mar 30 15:39 index.php

Если я попытаюсь выполнить описанное выше с пользователем, не входящим в группу fooers, это не удастся.

Вот мой /etc/hhvm/server.ini:

; php options

pid = /var/run/hhvm/pid

; hhvm specific

hhvm.server.port = 9000
hhvm.server.type = fastcgi
hhvm.server.default_document = index.php
hhvm.log.level = Warning
hhvm.log.always_log_unhandled_exceptions = true
hhvm.log.runtime_error_reporting_level = 8191
hhvm.log.use_log_file = true
hhvm.log.file = /var/log/hhvm/error.log
hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc
hhvm.mysql.typed_results = false

Я действительно надеюсь, что это не что-то глупое и очевидное, что я упустил из виду...

Вот мой блок местоположения nginx для веб-корня:

location ~ \.php$ {
    root /srv/foo
    fastcgi_keep_conn on;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME /srv/foo$fastcgi_script_name;
    include        fastcgi_params;
}

person Ray    schedule 30.03.2014    source источник
comment
Пожалуйста, опубликуйте свой файл /etc/hhvm/server.ini. У меня тоже nginx с hhvm-gastcgi, но с ps -aux выглядит так: /usr/bin/hhvm --config /etc/hhvm/server.hdf --user www-data --mode daemon -vServer.Type=fastcgi -vServer.Port=9010   -  person PKeidel    schedule 31.03.2014
comment
@PKeidel ps немного обрезался. Я устанавливаю тип на fastcgi и порт на 9000 в файле ini.   -  person Ray    schedule 31.03.2014
comment
@Pkeidel Кроме того, я просто запускаю новый HHVM 3.0 в режиме fastcgi, больше нет пакета hhvm-fastcgi   -  person Ray    schedule 31.03.2014
comment
Я думаю, что пакет hhvm-fastcgi создает только файл /etc/init.d/hhvm-fastcgi.   -  person PKeidel    schedule 31.03.2014
comment
Вы написали, что ваш веб-корень nginx — /srv/foo. Но ваш hhvm repo.central.path указывает на /var/run/hhvm/hhvm.hhbc. Таким образом, вы должны изменить этот путь к файлу/каталогу, а не /srv/foo/*. Вы уже пробовали это? И когда вы выполняете сканирование портов nmap, ваш порт 9000 указан как открытый?   -  person PKeidel    schedule 31.03.2014
comment
@PKeidel Спасибо за совет. Я думаю, что hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc - это место, где он кэширует обработанный байт-код, а не расположение исходных файлов php, поэтому это не должно быть затронуто, поскольку /srv/foo - это место для моих исходных файлов php. Кроме того, я убедился, что HHVM находится на уровне 9000.   -  person Ray    schedule 31.03.2014
comment
Где вы установили /srv/foo в качестве своего каталога hhvm www?   -  person PKeidel    schedule 31.03.2014
comment
@PKeidel В моей конфигурации nginx. Я добавлю блок местоположения в OP   -  person Ray    schedule 31.03.2014
comment
Привет, я только что протестировал HHVM 3.0.1, и он работал с настройками по умолчанию. Я установил новую Ubuntu 13.10 с hhvm через apt-get. HHVM был запущен /usr/bin/hhvm --config /etc/hhvm/server.ini --user www-data --mode daemon -vPidFile=/var/run/hhvm/pid. server.ini такой же, как у вас. Может быть, chmod 777 для всех файлов журнала может помочь?!?   -  person PKeidel    schedule 04.04.2014
comment
@PKeidel спасибо за отзыв, на выходных попробую 3.0.1. да, когда я определяю файлы как группу, которая является основной группой для www-данных, все работает нормально, или если я 777 все. Единственный владелец задачи не является www-данными, а групповое владение не является основной группой для www-данных. Этого не должно быть — все группы, к которым имеет доступ www-data, должны работать на него с разрешениями 770.   -  person Ray    schedule 04.04.2014


Ответы (2)


Пожалуйста, попробуйте изменить файл конфигурации, в вашем нет SourceRoot. Некоторые из моих конфигов переопределяются параметрами запуска.

Посмотрите на них здесь: /usr/bin/hhvm --config /etc/hhvm/server.hdf --user www-data --mode daemon -vServer.Type=fastcgi -vServer.Port=9010

PidFile = /var/run/hhvm/pid

Server {
  Port = 82
  SourceRoot = /var/www/main/
  DefaultDocument = index.php
}

#AdminServer {
#    Port = 9088
#    ThreadCount = 1
#    Password = xxx
#}

Eval {
    Jit = true
    JitWarmupRequests = 5
}

Log {
  Level = Error
  AlwaysLogUnhandledExceptions = true
  RuntimeErrorReportingLevel = 8191
  UseLogFile = true
  UseSyslog = false
  File = /var/log/hhvm/error.log
  Access {
    * {
      File = /var/log/hhvm/access.log
      Format = %h %l %u % t \"%r\" %>s %b
    }
  }
}

#Repo {
#  Central {
#    Path = /var/run/hhvm.hhbc.sq3
#  }
#}

#include "/usr/share/hhvm/hdf/static.mime-types.hdf"
StaticFile {
  FilesMatch {
    * {
      pattern = .*\.(dll|exe)
      headers {
        * = Content-Disposition: attachment
      }
    }
  }
  Extensions : StaticMimeTypes
}

MySQL {
  TypedResults = false
}
person PKeidel    schedule 30.03.2014
comment
Это в старом .hdf. Хотя он все еще поддерживается, начиная с HHVM 3.0, он переходит на формат .ini, показанный в моем посте. - person Ray; 31.03.2014
comment
О, извините за это. Мой рабочий сервер по-прежнему работает с последней версией 2.X. В ближайшие дни просмотра тоже хочу попробовать 3.0. Я позволю вам сейчас, когда у меня все заработает (или нет). - person PKeidel; 31.03.2014
comment
Вы действительно используете HHVM в производстве? Это круто. URL ? - person Radu Murzea; 01.04.2014
comment
Извините, но я не могу это показать. Это внутренняя страница для клиента, они используют ее для управления заказами, клиентами и так далее. На сервере также работает piwik, но панель управления piwik не работает с hhvm. Но вставки работают ;) Дашборд подается от апача на другом порту. - person PKeidel; 02.04.2014

Похоже, это ошибка с HHVM. Я добавил билет, чтобы исправить это в этом проекте.

person Ray    schedule 01.09.2014