Set Up a Django Server with Apache Virtual Host and Python Virtual Environment
It took me some time to get everything working together, so I'd like to document the steps to save you time in the future.
Firstly, assume that you already have your CentOS/Ubuntu instance running and Python installed. Create a folder for your project and set the appropriate permissions:
If you haven't already initialized your project, you can do so with:
By default, the server runs on port 8000:
To prepare your Django server for production, edit the settings.py file with the following settings:
DEBUG = False
ALLOWED_HOSTS = ['*']
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
Then, you can build the static files using:
Next, serve your web application via the Apache web server. Assuming you installed Apache2 through yum or apt-get, enable virtual hosts for your project and create the following file:
With the content below:
<IfDefine !IS_APPNAME_LOADED>
Define IS_APPNAME_LOADED
WSGIDaemonProcess APPNAME python-home=/opt/yourpath/python python-path=/opt/yourpath/projects/APPNAME
</IfDefine>
<VirtualHost 127.0.0.1:80 _default_:80>
...
Remember to replace all instances of APPNAME with your Django project name. Then, create another file for HTTPS:
And populate it with similar content, replacing APPNAME as appropriate.
After updating the configurations, restart the Apache server. Your Django site should now be operational.
Lastly, isolate Python dependencies within a virtual environment to avoid dependency issues and version conflicts. Inside your project directory, run:
This creates a folder containing all your Python executables. Subsequent pip install
commands will affect only this folder. Now, go back and edit project-vhost.conf and project-https-vhost.conf, changing the python-home
path to point to the venv
folder:
From:
WSGIDaemonProcess APPNAME python-home=/opt/yourpath/python python-path=/opt/yourpath/projects/APPNAME
To:
WSGIDaemonProcess APPNAME python-home=/opt/yourpath/projects/APPNAME/venv python-path=/opt/yourpath/projects/APPNAME
Be sure to point the Python home path to the venv
folder, not to the /bin
executable or the Python location, to avoid a 500 error. If you encounter issues, check the Apache server error log:
That's it! Navigate to your public IP address, and you should see your Django page.
P.S. If you encounter a timeout error at the WSGI level:
Edit project-vhost.conf and project-https-vhost.conf to add the following line below WSGIDaemonProcess
:
This addition can resolve timeouts caused by Python C extension modules, such as NumPy.