2011-01-25 2 views
5

Это проблема Apache/Perl, которая у меня есть.Perl CGI Сценарии не могут найти модули в библиотеке

Я использую модуль CPAN в своем приложении CGI perl. Это Spreadsheet :: ParseExcel

Я установил модуль cpan с файлами tar.gz.

Я установил зависимости.

Однако я сделал это как пользователь без полномочий root. Библиотека, содержащая эти файлы, находится под папкой пользователя,/home/user/lib

Теперь я успешно настроил Apache2 в этом поле. Каталог html - это/var/www/html, а папка cgi -/var/www/html/cgi-bin. Я подтвердил, что они работают, потому что все сценарии в этой папке, которые не требуют специальных модулей, работают в моем браузере Firefox. привет мир, дампы данных, простые формы.

Однако, когда я пытаюсь запустить скрипты, использующие «Таблицу :: ПарсЭксэл», я получаю сообщение об ошибке, что модуль не может быть найден в @INC. Тем не менее, у меня есть инструкция «use lib» в начале скрипта, который добавляет библиотеку.

Сценарии могут запускаться в PUTTY без проблем. Я получаю эту проблему только при запуске скрипта из браузера.

Это веб-приложение написано на другой упаковке и отлично работает на этой коробке. Потому что я там развился, конечно. Я положил Apache2 на свою личную машину Ubuntu и установил здесь веб-приложение и модули, и он работает в моем локальном поле.

Я установил «chmod -R a + rx» в папку библиотеки пользователей, поэтому я думаю, что Apache имеет доступ к этой папке, если только настройки родительского каталога не блокируют его? Мне не нужно запускать это в папке/home/user, или, что еще хуже, в папке/home, не так ли?

Любые идеи по проблеме?

Благодарим вас за ваше время!

ответ

1

Две мысли здесь:

  1. Что такое @INC говорится в ошибку об отсутствии модулей, он включает в себя путь, который вы добавили через use lib?
  2. Выполняет ли пользователь, выполняющий Apache, доступ к этому каталогу? Довольно часто домашние каталоги имеют разрешения, которые отрицают обход других учетных записей. Проверяйте разрешения из каталога модуля на всем протяжении, убедитесь, что o имеет значение r-x как минимум для всех каталогов и файлов в вашем модуле.
+0

Первый каталог, указанный в ошибке @INC, является каталогом библиотеки. Я не уверен, какой пользователь apache использует, чтобы попытаться получить доступ к файлам «nobody» или «www-user», но я склоняюсь к проблеме с разрешениями. Да, у всей библиотеки есть права доступа r-x для владельца, группы и пользователей. – bleutyler

+0

Не только каталог модуля. Например, если модуль находится в /home/tydel/lib/perl/Net/BoogieTime.pm, для каждого каталога из/up потребуется минимум o + rx.Это включает/home,/home/tydel,/home/tydel/lib и/home/tydel/lib/perl,/home/tydel/lib/perl/Net и, наконец,/home/tydel/lib/perl/Net /BoogieTime.pm потребуется o + r. Надеюсь, это поможет. –

3

Пользователь Apache не может получить доступ к/home/user/lib, если у него нет доступа к/home/user, даже если разрешения на/home/user/lib позволят ему получить к нему доступ.

Например, если у вас есть файл в/root, вы все равно не можете получить к нему доступ, если у вас нет доступа к/root.

+0

Ага, я вижу. Спасибо, что указали это. Поэтому лучше разместить библиотеку для модулей perl в виде/usr/local/lib! – bleutyler

+0

@ user589905: ... или просто сделать '/ home/user /' world-readable/world-executable ('drwxr-xr-x'). В подавляющем большинстве случаев способность обмениваться данными в вашем домашнем каталоге гораздо важнее, чем сделать все там строго конфиденциальным (особенно, поскольку вы можете создать закрытый подкаталог для обычно небольшого количества данных, которые на самом деле чувствительны). –

+0

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

Смежные вопросы