Servindo arquivos Python CGI em um Synology NAS
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
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