Apache mod_wsgi com o conda python 3 - não é possível carregar o módulo

0

Eu postei recentemente esta questão para eliminar um obstáculo no lançamento de uma aplicação web do Flask na minha instância do Amazon ec2 RedHat 7. No entanto, ainda estou encontrando alguns problemas que eu tenho dificuldade em entender (ainda muito novos para Apache e servidores web).

Resumidamente, estou tentando lançar uma aplicação web Flask através de um ambiente Anaconda usando o Python 3.6. Atualmente, eu tenho um aplicativo simples Hello World Flask em /var/www/html/example , seguindo as instruções encontradas aqui . Eu era capaz de executar este script anteriormente, usando o Python 2.7.5 pré-instalado (encontrado em /usr/bin/python ), e desde então tenho tentado executar o mesmo aplicativo usando o Python 3.6.

Estou me referindo a várias postagens sobre problemas semelhantes, incluindo este , este e este , mas ainda estou um pouco perdido.

Eu configurei o mod_wsgi por meio do ambiente conda (para 3.6).

Algumas informações relevantes do sistema:

$ which python
~/anaconda3/envs/myenv/bin/python (abspath is /home/ec2-user/anaconda3/envs/myenv/bin/python)
$ python -V
Python 3.6.2 :: Continuum Analytics, Inc.
$ which mod_wsgi-express
~/anaconda3/envs/myenv/bin/mod_wsgi-express
$ mod_wsgi-express module-config
LoadModule wsgi_module "/home/ec2-user/anaconda3/envs/myenv/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"
WSGIPythonHome "/home/ec2-user/anaconda3/envs/myenv"

O conteúdo do arquivo /etc/httpd/conf/httpd.conf :

DocumentRoot "/var/www/html"
WSGIDaemonProcess myenv python-path=/home/ec2-user/anaconda3/envs/myenv/lib/python3.6/site-packages
WSGIScriptAlias / /var/www/html/examples/example.wsgi process-group=myenv application-group=%{GLOBAL}
LoadModule wsgi_module "/home/ec2-user/anaconda3/envs/myenv/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"
WSGIPythonHome /home/ec2-user/anaconda3/envs/myenv

<Directory example>
    WSGIProcessGroup myenv
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
</Directory>

Ao tentar executar sudo apachectl restart , recebo esta saída de systemctl status httpd.service :

httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Sun 2018-04-08 21:41:38 UTC; 3min 7s ago
  Docs: man:httpd(8)
         man:apachectl(8)
  Process: 20541 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=1/FAILURE)
  Process: 20540 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 Main PID: 20540 (code=exited, status=1/FAILURE)

Apr 08 21:41:38 [ip].compute.internal systemd[1]: Starting The Apache HTTP Server...
Apr 08 21:41:38 [ip].compute.internal httpd[20540]: httpd: Syntax error on line 125 of /etc/httpd/conf/httpd.conf: Cannot load /home/ec2-user/anaconda3/envs/myenv/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so into server: : /home/ec2-user/anaconda3/envs/myenv/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so: cannot open shared object file: Permission denied

O arquivo em questão ( mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so ) tem permissões executáveis para todos os usuários.

Também notei que /var/log/httpd/error_log está gerando ImportError: No module named site , apesar do fato de eu não estar tentando importar o módulo site em nenhum arquivo Python em /var/www/html/example .

Alguém tem uma ideia? Eu posso fornecer mais informações, se necessário.

Obrigado a todos e quaisquer que ofereçam ajuda aqui.

    
por nat5142 08.04.2018 / 23:52

1 resposta

0

SOLUTION : Percebi que esse erro estava sendo gerado porque minha instalação do Python estava no meu diretório home . Assim, o Apache não tem permissão para acessar o ambiente.

Para resolver isso, fiz o seguinte:

Removida minha instalação do anaconda3:

[ec2-user@ip] ~ $ rm -rf anaconda3/
# -- be sure to remove directories .conda/ and .anaconda_backup/ -- #
# -- these should be in the same directory as the anaconda3/ directory -- #

Reinstalado o anaconda3 como root no diretório /usr/local (acessível por todos os usuários, funciona com o Apache):

[ec2-user@ip] ~ $ sudo su -
[root@ip] ~ $ cd /usr/local
[root@ip] ~ $ wget https://repo.continuum.io/archive/Anaconda3-5.1.0-Linux-x86_64.sh 
                  # ^ whichever version you want. Go to https://repo.continuum.io/archive/
[root@ip] ~ $ bash Anaconda3-5.1.0-Linux-x86_64.sh
    # specify your path when prompted --> /usr/local/anaconda3
    # note that directory /usr/local/anaconda3 cannot exist prior to running the command

Adicione a linha export PATH='/usr/local/anaconda3/bin:$PATH' ao final do seu arquivo /root/.bashrc COMO O USUÁRIO ROOT! (edite o caminho antigo do anaconda3 se ele já existir no final deste arquivo)

[root@ip] ~ $ vi /root/.bashrc # -- add/edit the line here -- #
[root@ip] ~ $ source /root/.bashrc

Verifique se o usuário root está usando a versão correta do Python:

[root@ip] ~ $ which python
/usr/local/anaconda3/bin/python

Sair como usuário root:

[root@ip] ~ $ exit

Verifique se a versão correta do Python funciona como usuário padrão:

[ec2-user@ip] ~ $ which python
/usr/local/anaconda3/bin/python

Se isso imprimir /usr/bin/python ou algo diferente de /usr/local/anaconda3/bin/python , certifique-se de adicionar o PATH especificado acima ao arquivo ~ / .bashrc do seu usuário (assim como você fez como usuário root)

NOTA: todas as novas instalações / configurações de ambiente devem agora ser feitas como ROOT. Ou seja:

[ec2-user@ip] ~ $ sudo su -
[root@ip] ~ $ conda install flask
...
[root@ip] ~ $ exit
# -- open Python to verify that your installation worked -- #
[ec2-user@ip] ~ $ python
Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 18:10:19)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import flask
# -- shouldn't throw an ImportError -- #
>>> exit()

Se alguém se deparar com isso no futuro, COMENTÁRIO! Eu adoraria poder oferecer ajuda.

Boa sorte!

    
por 12.04.2018 / 21:10