> On 6 Apr 2019, at 6:17 am, Peer Boerner <[email protected]> wrote:
> 
> I am trying to get mod_wsgi working with Apache 2.4.6 on RHEL.  I have access 
> to the sudo command but not root. 
> 
> The net-net: No matter what I have tried, I can not get mod_wsgi to see the 
> associated python modules for the virtual environment that it was configured 
> for using Anaconda 3. 
> 
> The good news: According to the Apache error log files, mod_wsgi has loaded 
> successfully.
> The bad news is that I receive numerous messages: Fatal Python error: 
> Py_Initialize: Unable to get the locale encoding ModuleNotFoundError: No 
> module named 'encodings'

This usually indicates that you have multiple Python versions installed and the 
one you are trying to use is in a non standard location and mod_wsgi hasn't 
been compiled so it knows where to find the correct shared library, or mod_wsgi 
hasn't been configured to find the Python installation or virtual environment.

It is very important that mod_wsgi be compiled for the specific Python 
installation (distribution/version) you want to use. You cannot force mod_wsgi 
compiled for one Python installation to use another, not even a virtual 
environment created using a different version. If you do, issues like what you 
are seeing will occur.

> I've spent two days trying what I believe is every combination of 
> configurations I've seen from the various posts I've read on virtual 
> environments, all to no avail.
> 
> I even pasting the output of mod_wsgi module-config into the httpd.conf file. 
>  The LoadModule statement fails with a permissions error even though all of 
> the files in the entire directory have been set to 777.
> 
> The only way I have been able to get the mod_wsgi module to load has been to:
> 1. Build mod_wsgi from source in the virtual environment of my application
> 2. Use the make install command to load the module into the apache modules 
> directory
> 3. Copy the libpython3.6m.so.1.0 directly into the /usr/lib64 directory 
> (allows mod_wsgi.so to see it).

A summary of the important steps you need to do are:

1. Ensure that the system package for mod_wsgi is not installed.

2. Build mod_wsgi from source code using the Python version you want to use. 
The easiest way to do this is use the 'pip install' method. See:

https://pypi.org/project/mod_wsgi/ <https://pypi.org/project/mod_wsgi/>

Best practice would be to create a Python virtual environment and activate it. 
Then run:

pip install mod_wsgi

3. Setup Apache to use this mod_wsgi. First run:

mod_wsgi-express module-config

Add the output of this to the Apache configuration.

It should include a LoadModule and WSGIPythonHome line. If it doesn't have 
WSGIPythonHome in your case, it may break.

I don't recommend Anaconda Python as it breaks the ability to use mod_ssl in 
Apache. If you have to use mod_ssl, Python will crash and you can't use 
Anaconda Python. This is an issue with Anaconda Python that cannot be fixed.

If you don't need mod_ssl, you will can also need an extra step, as Anaconda 
somehow seems to break Python shared library loading in some cases.

In this case, you may need to add:

LoadFile /some/path/libpython3.6m.so.1.0

where the path is to the Anaconda Python shared library in the Anaconda 
installation directory. Do not copy this to system library directory, as doing 
so will break a system Python of same version.

This should be added before the LoadModule line above.

I also recommend adding:

WSGIRestrictEmbedded On

after the WSGIPythonHome. This disables embedded mode, forcing you to use 
daemon mode. You will get an error when making a request if daemon mode isn't 
set up correctly.

A few more comments below.

> But still, I get the ModuleNotFoundError: No module named 'encodings' message
> 
> I'd really appreciate some help.  Here's the state of my configuration:
> 
> Here is a section of the Apache Error Log:
> 
> [Fri Apr 05 14:56:25.878394 2019] [core:notice] [pid 4621] SELinux policy 
> enabled; httpd running as context system_u:system_r:httpd_
> t:s0
> [Fri Apr 05 14:56:25.879482 2019] [suexec:notice] [pid 4621] AH01232: suEXEC 
> mechanism enabled (wrapper: /usr/sbin/suexec)
> [Fri Apr 05 14:56:25.898250 2019] [auth_digest:notice] [pid 4621] AH01757: 
> generating secret for digest authentication ...
> [Fri Apr 05 14:56:25.899292 2019] [lbmethod_heartbeat:notice] [pid 4621] 
> AH02282: No slotmem from mod_heartmonitor
> [Fri Apr 05 14:56:25.900426 2019] [wsgi:info] [pid 4622] mod_wsgi (pid=4622): 
> Starting process 'ImgOrientD' with uid=48, gid=48 and
> threads=15.
> [Fri Apr 05 14:56:25.901434 2019] [wsgi:info] [pid 4622] mod_wsgi (pid=4622): 
> Python home /home/pboerner/.conda/envs/imgorient.
> [Fri Apr 05 14:56:25.901496 2019] [wsgi:info] [pid 4622] mod_wsgi (pid=4622): 
> Initializing Python.
> [Fri Apr 05 14:56:25.901909 2019] [wsgi:info] [pid 4623] mod_wsgi (pid=4623): 
> Initializing Python.
> [Fri Apr 05 14:56:25.902368 2019] [mpm_prefork:notice] [pid 4621] AH00163: 
> Apache/2.4.6 (Red Hat Enterprise Linux) mod_wsgi/4.6.5 Py
> thon/3.6 configured -- resuming normal operations
> [Fri Apr 05 14:56:25.902391 2019] [mpm_prefork:info] [pid 4621] AH00164: 
> Server built: Jun 22 2018 01:19:25
> [Fri Apr 05 14:56:25.902403 2019] [core:notice] [pid 4621] AH00094: Command 
> line: '/usr/sbin/httpd -D FOREGROUND'
> [Fri Apr 05 14:56:25.902778 2019] [wsgi:info] [pid 4625] mod_wsgi (pid=4625): 
> Initializing Python.
> [Fri Apr 05 14:56:25.903619 2019] [wsgi:info] [pid 4627] mod_wsgi (pid=4627): 
> Initializing Python.
> Fatal Python error: Py_Initialize: Unable to get the locale encoding
> ModuleNotFoundError: No module named 'encodings'
> 
> The Apache configuration:
> 
> Server version: Apache/2.4.6 (Red Hat Enterprise Linux)
> Server built:   Jun 22 2018 01:19:25
> Server's Module Magic Number: 20120211:24
> Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
> Compiled using: APR 1.4.8, APR-UTIL 1.5.2
> Architecture:   64-bit
> Server MPM:     prefork
>   threaded:     no
>     forked:     yes (variable process count)
> Server compiled with....
>  -D APR_HAS_SENDFILE
>  -D APR_HAS_MMAP
>  -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
>  -D APR_USE_SYSVSEM_SERIALIZE
>  -D APR_USE_PTHREAD_SERIALIZE
>  -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
>  -D APR_HAS_OTHER_CHILD
>  -D AP_HAVE_RELIABLE_PIPED_LOGS
>  -D DYNAMIC_MODULE_LIMIT=256
>  -D HTTPD_ROOT="/etc/httpd"
>  -D SUEXEC_BIN="/usr/sbin/suexec"
>  -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
>  -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
>  -D DEFAULT_ERRORLOG="logs/error_log"
>  -D AP_TYPES_CONFIG_FILE="conf/mime.types"
>  -D SERVER_CONFIG_FILE="conf/httpd.conf"
> 
> The httpd.conf file for apache:
> LoadModule wsgi_module /usr/lib64/httpd/modules/mod_wsgi.so
> 
> # Configure the virtual host for mod_wsgi which will run the MLAI code
> 
> <VirtualHost *:80>
>     ServerName duaidapst01
>     # Set up a daemon process 
>     WSGIDaemonProcess ImgOrientD 
> python-home=/home/pboerner/.conda/envs/imgorient

The value for python-home must be a virtual environment created from the same 
Python installation that mod_wsgi was compiled for.

>     # Now make sure this runs within that process group
>     WSGIProcessGroup ImgOrientD
>     WSGIApplicationGroup %{GLOBAL}
>     WSGIScriptAlias /mlai_test /var/www/wsgi-scripts/mlai_test.wsgi

SELinux may prevent Apache from reading anything from certain directories. 
Anything under /var/www should be okay, but it may not be able to read things 
under /home. In addition to SELinux, if the home directory, eg., 
/home/pboerner, has permissions 0700 or 0750, then Apache will not be able to 
see under the home directory.

>     <Directory /var/www/wsgi-scripts>
>         Order allow,deny
>         Allow from all
>     </Directory>
> </VirtualHost>
> 
> My simple python wsgi code to test (this never runs):
> 
> ALLDIRS = ['/home/pboerner/.conda/envs/imgorient/lib/python3.6/site-packages']
> import sys
> import site
> # Remember original sys.path.
> prev_sys_path = list(sys.path)
> # Add each new site-packages directory.
> for directory in ALLDIRS:
>     site.addsitedir(directory)
> # Reorder sys.path so new directories at the front.
> new_sys_path = []
> for item in list(sys.path):
>     if item not in prev_sys_path:
>     new_sys_path.append(item)
>     sys.path.remove(item)
> sys.path[:0] = new_sys_path

All of the above code fiddling with sys.path should be removed. You only need 
to set python-home option above for the virtual environment root.

> 
> def application(environ, start_response):
>     ex = sys.executable
>     status = '200 OK'
>     output = "Executable: {} ".format(ex)
>     response_headers = [('Content-type', 'text/plain'),
>                         ('Content-Length', str(len(output)))]
>     start_response(status, response_headers)
>     return [output]
> 
> 
> Many, many thanks for any help this community can provide!!
> 
> Peer
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "modwsgi" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected] 
> <mailto:[email protected]>.
> To post to this group, send email to [email protected] 
> <mailto:[email protected]>.
> Visit this group at https://groups.google.com/group/modwsgi 
> <https://groups.google.com/group/modwsgi>.
> For more options, visit https://groups.google.com/d/optout 
> <https://groups.google.com/d/optout>.

-- 
You received this message because you are subscribed to the Google Groups 
"modwsgi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/modwsgi.
For more options, visit https://groups.google.com/d/optout.

Reply via email to