Обслуживание файлов Python CGI на Synology NAS

Oct 19 2020

Я не могу заставить файлы python обрабатываться с помощью Apache 2.2 или 2.4 без ошибки 500. У меня установлена ​​WebStation, установлены python, perl, php и Apache 2.2 и 2.4.

Я могу нормально обрабатывать статические файлы с помощью apache. Когда я пытаюсь обслужить самый простой cgi "hello world", я получаю ошибку 500. Ошибка

[cgid: error] [pid 10076: tid 140542621480832] (2) Нет такого файла или каталога: AH01241: exec of ['/volume2/Development/WebRepo/cgi-bin/test.py' не удалось.

Пытался выполнить как Perl-скрипт, так и скрипт Python. Оба успешно запускаются из командной строки, но не из обслуживаемого Apache (те же ошибки «нет такого файла ...»). Также обратите внимание, что это ошибка 500, а не 404, поэтому он видит файл. Я могу нормально обрабатывать статические HTML-файлы.

Скрипт python не может быть проще:

#!/usr/bin/python
print "Content-type: text/html\n\n";
print "Hello, World.";

Все файлы имеют 755 прав доступа. Путь к питону правильный. Я не понимаю, что делать дальше.

Ответы

1 saaj Nov 29 2020 at 21:26

Python может обслуживать сценарии CGI из коробки, используя http.server.CGIHTTPRequestHandler.

На моем Synology NAS установлен официальный пакет Python3 (версия 3.8.2-0150). Я могу подключиться к NAS по SSH как adminи добавить скрипт:

mkdir -p app/cgi-bin

cat << EOF > app/cgi-bin/hello.py
#!/usr/bin/env python3

print('Content-Type: text/html')
print()
print('<html><body><h2>Hello World!</h2></body></html>')
EOF

После этого я могу запустить его так (обратите внимание, что --directoryэто не действует, --cgiпоэтому я cdтам):

cd app && python3 -m http.server --cgi

Тогда на моей машине я смогу curl http://nas:8000/cgi-bin/hello.py.

Запуск при загрузке

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

Панель управления → Планировщик заданий → Создать → Инициированное задание → Пользовательский сценарий . Заполните их на вкладке Общие :

  • Задача: Python CGI
  • Пользователь: admin
  • Включено: [x]

И пользовательский сценарий на вкладке параметров задачи :

cd /var/services/homes/admin/app
python3 -m http.server --cgi

Затем вы можете запустить его вручную. Он также должен запускаться при перезагрузке.

Разрешения

Если вы хотите запустить задачу от имени root, убедитесь, что права доступа к файлу верны rootс точки зрения пользователя. В моем случае по какой-то причине есть несоответствие.

$ ls -l app/cgi-bin/hello.py -rwxrwxrwx+ 1 admin users 122 Nov 29 14:50 app/cgi-bin/hello.py $ sudo ls -l app/cgi-bin/hello.py 
Password: 
-rwx--x--x+ 1 admin users 122 Nov 29 14:50 app/cgi-bin/hello.py