mod-wsgi 4.8.0 on fedora34

137 views
Skip to first unread message

Bob Bobsled

unread,
Jun 7, 2021, 8:57:22 PM6/7/21
to mod...@googlegroups.com
Hello Graham,

I have tried unsuccessfully to get mod-wsgi working for Django, and httpd on fedora34.

I tried the CMMI method first, downloading/configuring/make/install, but the instructions give out at the point of knowing what to do after getting the module into etc/httpd/modules.  I'm stuck figuring out how to continue with where to place a .config file and how to fiddle with vhosts etc.

So I moved on to dnf install python3-mod_wsgi, but that seems to be an older version and doesn't have the niceties of mod_wsgi-express.

Then I tried, as root, pip3 install mod_wsgi, but that seems to bugger the permissions.

Fourth try was as user pip3 install --user mod_wsgi but it seems to put everything in odd places.
For ex. mod_wsgi-express winds up in .local/bin, instead of usr/bin, but nevertheless when I run it from .loca/bin with the install-module directive I get permission denied on /usr/lib64/modules/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so

I'd be really grateful for some advice on the best way to get it working in fedora34.  I'm glad to try anyway you might suggest.

Regards,
Bob

Graham Dumpleton

unread,
Jun 7, 2021, 9:01:05 PM6/7/21
to mod...@googlegroups.com
You seem to have multiple installs conflicting with each other. Would suggest ensuring you uninstall all the mod_wsgi versions installed in different ways.

Once that is done, create a Python virtual environment instead, activate it and pip install mod_wsgi into that. Don't install into system Python or per user Python.

When have cleaned up and removed existing installs and tried the virtual environment method come back and indicate what problem you have at that point.

Graham

--
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 modwsgi+u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/modwsgi/CALWZDaN7J95EeTVJdty1wobGZ44X_q2utuJv%3DnmXEzVgqNhZQQ%40mail.gmail.com.

Bob Bobsled

unread,
Jun 8, 2021, 3:21:01 PM6/8/21
to mod...@googlegroups.com
Hi Graham,

OK. I did that. (I was hoping to avoid virtualenv, since django is the only main python app I'm using on that fedora box, but glad to set one up if that helps).  
I do have a conflict with the django port for another web app, however.  A couple years ago you helped me thru a django setup on a windows box using wamp,
where you suggested nip.io for the conflict problem.  That seemed to work okay, but I haven't been able to get it worked out on the fedora box yet because
still struggling with mod_wsgi part.

From the activated virtualenv the mod_wsgi-express install-module command is still giving me a permission error on /usr/lib64...

On fedora I have one user, refstudent who is admin.  My /opt directory and contents are all under the refstudent user and group and chmod 777 permission
on /opt and all contents.   /home is under root, but /home/refstudent is under refstudent user and group with 777 permission on all contents.
Everything else on the box is under root.  My django website is in /var/www/html/mysite.


(myenv) [refstudent@localhost myenv]$ mod_wsgi-express install-module
Traceback (most recent call last):
  File "/opt/myenv/bin/mod_wsgi-express", line 33, in <module>
    sys.exit(load_entry_point('mod-wsgi==4.8.0', 'console_scripts', 'mod_wsgi-express')())
  File "/opt/myenv/lib64/python3.9/site-packages/mod_wsgi/server/__init__.py", line 3830, in main
    cmd_install_module(args)
  File "/opt/myenv/lib64/python3.9/site-packages/mod_wsgi/server/__init__.py", line 3766, in cmd_install_module
    shutil.copyfile(where(), target)
  File "/usr/lib64/python3.9/shutil.py", line 264, in copyfile
    with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
PermissionError: [Errno 13] Permission denied: '/usr/lib64/httpd/modules/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so'

Regards,
Bob

Graham Dumpleton

unread,
Jun 8, 2021, 6:47:31 PM6/8/21
to mod...@googlegroups.com
If the intent is to use mod_wsgi-express to host the application, you don't need to install the module into the system wide Apache using "install-module".

One you have run pip install, run:

    mod_wsgi-express start-server

and verify it starts. Then use mod_wsgi-start start-server with your application as explained in:



If you really want to go the way of manually configuring the system Apache for mod_wsgi instead, the "install-module" command will only work if done as root, so you need to use "sudo" to run it.

Graham

Bob Bobsled

unread,
Jun 9, 2021, 2:53:07 PM6/9/21
to mod...@googlegroups.com
Thank you Graham for your response.  Always helpful.

From my virtualenv I can run mod_wsgi-express start-server, and see malt whiskey at localhost:8000.

My goal would be to just have the mod run when apache starts, so the box can stay running, and folks can access the Django website when they need to (although it's only for local access, and we're behind a firewall and only using http).  

So I'm thinking the manually configured apache approach is what I need to do.  I tried elevating to root and running mod_wsgi-express install-module:

(myenv) [root@localhost bin]# ./mod_wsgi-express install-module
LoadModule wsgi_module "/usr/lib64/httpd/modules/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so"

On fedora34, that copes the library to:
/etc/httpd/modules

In fedora34 I have httpd directories (all under root ownership):
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.modules.d
/etc/httpd/logs
/etc/httpd/modules
/etc/httpd/run
/etc/httpd/state

I'm confused about where to place the config file(s) which contains the httpd directives such as LoadModule wsgi_module, WSGIPythonHome, WSGIDaemonProcess, etc. as well as directory permissions and any virtual host setup.

On fedora34:
/etc/httpd/conf/ contains the general httpd.conf file

/etc/httpd/conf.d  is for individual app config files?  ex. mod_dnssd.conf, php.conf etc.
     "The directory is used in addition to the directory /etc/httpd/conf.modules.d/, which contains
      configuration files necessary to load modules."

/etc/httpd/conf.modules.d  is for two-digit, numbered .conf files, ex. 10-mod_dnssd.conf, etc.
     "This directory contains configuration fragments necessary only to load modules.
      Administrators should use the directory "/etc/httpd/conf.d" to modify
      the configuration of httpd, or any modules."

vhosts seems to be in a weird place on Fedora (also under root ownership):
/usr/share/doc/httpd/httpd-vhosts.conf

Regards,
Bob

Graham Dumpleton

unread,
Jun 9, 2021, 5:43:07 PM6/9/21
to mod...@googlegroups.com
Not much I can do to help you with where you should put config when using system Apache of a specific operating system. CentOS/RHEL, Fedora and Debian/Ubuntu all set different requirements on where to place things and I am not familiar with how each does it. Unless someone else on the list can help with how Fedora does it, best I can suggest is you look at the Fedora documentation which I would hope explains it.

Graham

Bob Bobsled

unread,
Jun 10, 2021, 3:22:37 PM6/10/21
to mod...@googlegroups.com
Hi Graham,
Unraveling the fedora httpd sub directories is actually not too bad. But the problem I'm having is getting httpd to load the module via the /etc/httpd/conf.modules.d directory which has a 10-mod_wsig.conf file place there which says:

<IfModule !wsgi_module>
     LoadModule wsgi_module modules/mod_wsgi_py39.cpython-39-x86_64-linux-gnu.so
</IfModule>

httpd keeps saying it cannot load the module, however it is there because mod_wsgi-express copied it there.

I tried maybe finding a SONAME for the .so file, but there doesn't seem to be one, so I'm not sure what it's hung up on with the naming conventions.  I also set permissions consistent with the other modules.

Regards,
Bob

Graham Dumpleton

unread,
Jun 10, 2021, 6:28:05 PM6/10/21
to mod...@googlegroups.com
What were the actual lines that the install-module command output? It would not have been written as that but should have used an absolute path I think, plus may have had a WSGIPythonHome directive as well if mod_wsgi were installed into a Python virtual environment.

Also, what are the exact messages that Apache outputs in the error log when failing to load it?

Graham

Bob Bobsled

unread,
Jun 14, 2021, 8:36:36 PM6/14/21
to mod...@googlegroups.com
Hi Graham,
re: f34, problem getting httpd to load the module via the /etc/httpd/conf.modules.d directory which has a 10-mod_wsig.conf file place there which says:

5 <IfModule !wsgi_module>
6     LoadModule wsgi_module modules/mod_wsgi_py39.cpython-39-x86_64-linux-gnu.so
7 </IfModule>

--What were the actual lines that the install-module command output?

(myenv) [root@localhost bin]# mod_wsgi-express install-module
LoadModule wsgi_module "/usr/lib64/httpd/modules/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so"
WSGIPythonHome "/opt/myenv"

--Also, what are the exact messages that Apache outputs in the error log when failing to load it?

[root@localhost conf.modules.d]# service httpd restart
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xe" for details.

[root@localhost conf.modules.d]# systemctl status httpd.service
httpd: Syntax error on line 59 of /etc/httpd/conf/httpd.conf: Syntax error on line 6 of /etc/httpd/conf.modules.d/10-mod_wsgi.conf: Cannot load modules/mod_wsgi_py39.cpython-39-x86_64-linux-gnu.so: cannot open shared object file: No such file or directory

Thanks,
Bob

Graham Dumpleton

unread,
Jun 14, 2021, 9:10:39 PM6/14/21
to mod...@googlegroups.com
And did you try using the config output by install-module instead?

LoadModule wsgi_module "/usr/lib64/httpd/modules/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so"
WSGIPythonHome "/opt/myenv"

What do you get for:

ls -las /usr/lib64/httpd/modules/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so

Graham

Bob Bobsled

unread,
Jun 15, 2021, 9:07:19 PM6/15/21
to mod...@googlegroups.com

And did you try using the config output by install-module instead?
(myenv) [refstudent@localhost bin]$ mod_wsgi-express install-module
PermissionError: [Errno 13] Permission denied: '/usr/lib64/httpd/modules/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so'

then (su)
(myenv) [root@localhost bin]# mod_wsgi-express install-module
LoadModule wsgi_module "/usr/lib64/httpd/modules/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so"
WSGIPythonHome "/opt/myenv"

What do you get for: ls -las /usr/lib64/httpd/modules/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so
1128 -rwxr-xr-x 1 root root 1153984 Jun 15 14:33 /usr/lib64/httpd/modules/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so

-----
Seems like the LoadModule bit pointing to the virtualenv will work in my /etc/http/conf.modules.d dir in the 10-mod_wsgi.conf file:

<IfModule !wsgi_module>
     #LoadModule wsgi_module modules/mod_wsgi_py39.cpython-39-x86_64-linux-gnu.so XXX
       LoadModule wsgi_module "/usr/lib64/httpd/modules/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so"
</IfModule>

But in my /etc/http/conf.d dir, in the mod_wsgi.conf file (the place for WSGIPythonHome, WSGIDaemonProcess, WSGIScriptAlias, and VirtualHosts etc.) I also have another
LoadModule statement:
       LoadModule wsgi_module "/usr/lib64/httpd/modules/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so"

I would have thought once wsgi-express install-module put it in /etc/http/modules
and the > httpd -M command shows the module (wsgi_module (shared)) loaded, that it would be good to go, but it seems like I need include call LoadModule  from the wsgi.conf file again, and then have the  fallback in 10-mod_wsgi.conf in case somehow it doesn't get loaded in the first place.

I feel like I'm inching closer to getting it working.

Regards,
Bob


Graham Dumpleton

unread,
Jun 16, 2021, 1:00:08 AM6/16/21
to mod...@googlegroups.com
Do you still have a system package for mod_wsgi installed?

If that was uninstalled, likely the file 10-mod_wsgi.conf wouldn't exist unless you manually added it.

Anyway, the LoadModule for wsgi_module should only be in one place, likely a file in /etc/http/conf.modules.d to ensure it is loaded early. If you don't have a system package for mod_wsgi you would need to create that file yourself.

Bob Bobsled

unread,
Jun 17, 2021, 3:07:08 PM6/17/21
to mod...@googlegroups.com
Hi Graham,

Thanks very much for your help and guidance.

I no longer have any system installed package for mod_wsgi, and I did add the 2-digit 10-mod_wsgi fallback LoadModule because I thought it was needed for the Apache configuration.  Since, as you wrote, that's the early load of the module, then I commented out the LoadModule in /etc/httpd/conf.d/mod_wsgi.conf, so now I should only have the one LoadModule statement for Apache.

If I'm understanding correctly then using root (su) to run mod_wsgi-express install-module is what places the module not only in the virtualenv but also in 
/usr/lib64/httpd/modules
and also copies it to 
/etc/httpd/modules

I'm trying to make sure the mod_wsgi is working properly because I have some URL errors on the Django side, and I want to eliminate mod_wsgi from the debug equation.  I know I chose the route of having Apache host the app using mod_wsgi, but as a test that I have mod_wsgi and apache configured correctly I'm trying the steps below (avoiding nip.io, for now).    Does this, then indicate I have it configured and talking to the app?  Is so, I can forget the mod_wsgi configuration bits and move on to debugging the Django side before getting back to trying to run it as production server app.  Or is there a better way to verify mod_wsgi is configured properly and working with Apache?

> httpd -M
shows module is loaded

then activate the virtualenv and cd to my app
/var/www/html/myapp

elevate to root (su) and run
python manage.py collectstatic

then de-elevate back to admin user and run
python manage.py runmodwsgi

which shows server is running at localhost:8000/

then opened the browser and went to:
localhost:8000/myapp

and see my URL errors on the Django side.

Thank you,
Bob





Graham Dumpleton

unread,
Jun 17, 2021, 8:59:09 PM6/17/21
to mod...@googlegroups.com
On 18 Jun 2021, at 5:06 am, Bob Bobsled <thebob...@gmail.com> wrote:

Hi Graham,

Thanks very much for your help and guidance.

I no longer have any system installed package for mod_wsgi, and I did add the 2-digit 10-mod_wsgi fallback LoadModule because I thought it was needed for the Apache configuration.  Since, as you wrote, that's the early load of the module, then I commented out the LoadModule in /etc/httpd/conf.d/mod_wsgi.conf, so now I should only have the one LoadModule statement for Apache.

If I'm understanding correctly then using root (su) to run mod_wsgi-express install-module is what places the module not only in the virtualenv but also in 
/usr/lib64/httpd/modules
and also copies it to 
/etc/httpd/modules

Not correct.

Running:

    pip install mod_wsgi

builds the mod_wsgi Apache .so module file and installs it in the virtual environment (if one is used), or in system Python directory (if no virtual environment).

Running:

    sudo mod_wsgi-express install-module

only copies the the mod_wsgi Apache .so module file to the single directory where Apache modules are installed.

If you have the installed .so file appearing in two different Apache modules directories, then the directories are either symlinked, or one of modules has got there in some other way.

Note that instead of using install-module you could have run:

    mod_wsgi-express module-config

which all it does is output config to include in the Apache configuration file where modules are loaded. The config lines it outputs will use the mod_wsgi Apache .so module file from the location in the virtual environment rather than having it be copied to Apache module directory.

I'm trying to make sure the mod_wsgi is working properly because I have some URL errors on the Django side, and I want to eliminate mod_wsgi from the debug equation.

It would have been quicker just to post the Django app errors if Django is running. There are common mistakes one can make as to how you setup WSGIScriptAlias, how Django settings are setup, plus wrong assumptions your application makes about web site mount point, working directory, directory access when running under Apache and various other things. It is usually evident from the Python errors and stack traces what problem is.

So post the errors from the Apache error log and browser, plus the mod_wsgi configuration from Apache. As far as I can see you haven't posted yet your WSGIScriptAlias, WSGIDaemonProcess, WSGI??? configurations you are including in the Apache configuration, so have no idea how you have configured it.

Also read:


but post the above information first as can probably stop you going around in circles if you explain the errors and actual problem at this point rather than assuming it might be somewhere else.

One major point though, since you are running:

    python manage.py runmodwsgi

you don't even need to configure the system Apache, so not sure why you are doing that.

If you are trying to run mod_wsgi-express (or manage.py runmodwsgi) locally, that is completely different from system Apache configuration, so just show the errors you are getting.

Bob Bobsled

unread,
Jun 18, 2021, 8:35:18 PM6/18/21
to mod...@googlegroups.com
Hi Graham,
Yes, not sure why fedora has two dirs for apache modules.  one in /usr/lib64/httpd and the other in /etc/httpd/modules...both have same contents.

My django app (test_app) is located in /var/www/html

/var/www/html/test_app, and the project within test_app is just called test_app too.

I can see it in the browser using the development server by activating the virtualenv, cd'ing to /var/www/html/test_app
and running
>python manage.py runserver
or alternately
>python manage.py runmodwsgi

then go to the browser and enter
localhost:8000
to see the django rocket
or
localhost:8000/admin
to see the admin login page

But when I try to run the test_app as production server by going to the browser and typing
XXX.XXX.107.165/test_app   (get 403 forbidden, you don't have permission...)
or
XXX.XXX.107.165/test_app/admin   (get 404 URL not found on the server)


Below is my mod_wsgi.conf file from /etc/httpd/conf.d.  I couldn't find any other place for vhost, so I'm thinking it goes in the same file.

Ownership and group of virtualenv is refstudent (me), with permissions 777 recursively
Ownership and group of /var/www/html is root:root
Ownership and group of test_app is apache:apache (recursively throughout) with permissions 777 throughout the app.

=======================
#/etc/http/conf.d/mod_wsgi.conf

WSGIPythonHome "/opt/myenv"

<VirtualHost *:80>
ServerName XXX.XXX.107.165
ServerAlias XXX.XXX.107.165
DocumentRoot /var/www/html

WSGIScriptAlias  /XXX.XXX.107.165/test_app "/var/www/html/test_app/test_app/wsgi.py>

WSGIDaemonProcess test_app python-path=/var/www/html/test_app:/opt/myenv/lib/python3.9/site-packages:/opt/myenv/lib64/python3.9/site-packages

WSGIProcessGroup test_app

 <directory /var/www/html/test_app>
   AllowOverride all
   Require all granted
   Options FollowSymlinks
 </directory>

 Alias /static/ /var/www/html/test_app/static/

 <Directory /var/www/html/test_app/static>
  Require all granted
 </Directory>
</VirtualHost>

Alias /static /var/www/html/test_app/static

<Directory /var/www/html/test_app/static>
        Require all granted
</Directory>

<Directory "/var/www/html/test_app/test_app/">
        <Files wsgi.py>
        Require all granted
        </Files>

</Directory>
    Alias /robots.txt /var/www/html/test_app/static/robots.txt
    Alias /favicon.ico /var/www/html/test_app/static/favicon.ico

    Alias /media/ /var/www/html/test_app/media/
    Alias /static/ /var/www/html/test_app/static/

   <Directory /var/www/html/test_app/static>
    Require all granted
   </Directory>

   <Directory /var/www/html/test_app/media>
   Require all granted
   </Directory>

=============================
excerpt from settings.py in test_app

ALLOWED_HOSTS = ["localhost", "127.0.0.1", "XXX.XXX.107.165"]

# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'mod_wsgi.server',
]





Regards,
Bob





Graham Dumpleton

unread,
Jun 18, 2021, 10:48:53 PM6/18/21
to mod...@googlegroups.com
Neither ServerName or ServerAlias should be an IP address. If you don't have a proper hostname, ensure you are adding the configuration to the first/default VirtualHost.

Your configuration if you want it mounted at sub URL path should then be:

WSGIScriptAlias  /test_app "/var/www/html/test_app/test_app/wsgi.py"

WSGIDaemonProcess test_app python-home=/opt/myenv python-path=/var/www/html/test_app

WSGIProcessGroup test_app

You don't include host IP in WSGI mount point sub URL path.

Your path for the WSGI script file wasn't quoted properly.

You don't include site-packages in Python path but set home for Python virtual environment instead.

For details on using virtual environments see:


Graham

Bob Bobsled

unread,
Jun 21, 2021, 4:08:26 PM6/21/21
to mod...@googlegroups.com
Hi Graham,
Thank you for your continued help.

I'm still a bit stuck on the virtualhost configuration re: IP address.  Under /var/www/html I have several small websites being served, but only one django using mod_wsgi.
We typically access them locally, behind a firewall using IP and website name in the URL of the browser.  Ex. XXX.XXX.107.165/MyOtherSite.

In /etc/httpd/conf directory in the http.conf file I have
Listen 80

But regarding ServerName and ServerAlias, I have only

$ hostname 
localhost.localdomain
or
$ hostname -i
::1 127.0.0.1

I'd rather avoid using localhost in the virtualhost config because the django site is typically accessed by other client machines.

Thus I would have thought in the /etc/httpd/conf.d configuration file:
<VirtualHost *:80>
(and omit ServerName, and ServerAlias)

would have given it to me.

So I also tried, just as a test:
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost

and tried to access the django app using URL
localhost:8000/test_app
or

But still no joy

My selinux is disabled
and 
the ports have been added to firewalld
firewall -cmd --zone=public --permanent --add-port=80/tcp
firewall -cmd --zone=public --permanent --add-port=8000/tcp

I can't imagine what's continuing to block the django app from apache.

Regards,
Bob


Graham Dumpleton

unread,
Jun 21, 2021, 7:26:51 PM6/21/21
to mod...@googlegroups.com
You can't use "localhost" for ServerName or ServerAlias either.

If you have multiple sites you are trying to host yet don't have proper distinct hostnames for each, then everything would need to be in one VirtualHost.

How many VirtualHost definitions do you have?

BTW, one way around the issue is to use nip.io hostnames.

Eg., 

<VirtualHost *:80>
ServerName myothersite.XXX.XXX.107.165.nip.io
WSGIScriptAlias  / "/var/www/html/test_app/test_app/wsgi.py"

WSGIDaemonProcess test_app python-home=/opt/myenv python-path=/var/www/html/test_app
WSGIProcessGroup test_app
...
</VirtualHost>

That way you can have multiple VirtualHost definitions and each is accessed using different hostname, where each site is hosted at root of site and not a sub URL, where the URL in this case would be:

    http://myothersite.XXX.XXX.107.165.nip.io

This is a much better way of handling it.

See the nip.io site to see how it works. Do be ware though that some corporate networks may block it from working.

Graham

Bob Bobsled

unread,
Jun 22, 2021, 8:25:50 PM6/22/21
to mod...@googlegroups.com
Hi Graham,

I checked, and nip.io was working with my other local sites, so I gave that a shot again and I finally got the /etc/httpd/conf.d/mod_wsgi.conf page configured to show the django site.

Thanks for your help and guiding me thru the process with mod_wsgi on fedora.

Regards,
Bob

Reply all
Reply to author
Forward
0 new messages