Servindo arquivos Python CGI em um Synology NAS

Oct 19 2020

Não consigo fazer com que os arquivos Python sejam servidos com o Apache 2.2 ou 2.4 sem um erro 500. Tenho o WebStation instalado, python, perl, php e Apache 2.2 e 2.4 instalados.

Posso servir arquivos estáticos muito bem com o apache. Quando tento servir o cgi "hello world" mais básico, recebo um erro 500. O erro é

[cgid: error] [pid 10076: tid 140542621480832] (2) Nenhum arquivo ou diretório: AH01241: exec of ['/volume2/Development/WebRepo/cgi-bin/test.py' falhou.

Tentei executar um script perl e um script python. Ambos são executados com sucesso a partir de uma linha de comando, mas não a partir do Apache (mesmos erros de "nenhum arquivo desse tipo .."). Observe também que este é um erro 500, não um 404, portanto, está vendo o arquivo. Posso servir arquivos HTML estáticos muito bem.

O script Python não poderia ser mais simples:

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

Todos os arquivos têm 755 permissões. O caminho para o python está correto. Não sei o que fazer a seguir.

Respostas

1 saaj Nov 29 2020 at 21:26

Python pode servir scripts CGI prontos para uso, usando http.server.CGIHTTPRequestHandler.

No meu Synology NAS, tenho o pacote oficial Python3 instalado (versão 3.8.2-0150). Posso fazer SSH em NAS como admine adicionar um script:

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

Depois disso, posso executá-lo assim (observe que --directorynão tem efeito para --cgimim cd):

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

Então, na minha máquina, eu posso curl http://nas:8000/cgi-bin/hello.py.

Executando na inicialização

Você pode executar isso automaticamente na inicialização por meio do agendador de tarefas.

Painel de controle → Agendador de tarefas → Criar → Tarefa disparada → Script definido pelo usuário . Preencha-os na guia Geral :

  • Tarefa: Python CGI
  • Usuário: admin
  • Ativado: [x]

E script definido pelo usuário na guia Configurações de tarefa :

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

Então você pode executá-lo manualmente. Ele também deve ser executado na reinicialização.

Permissões

Se você deseja executar a tarefa como root, certifique-se de que as permissões de arquivo estejam corretas do rootponto de vista de. No meu caso, há discrepância por algum motivo.

$ 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