使用Apache和mod_wsgi在CentOS 7上部署Python 3 Django应用程序

时间:2020-02-23 14:38:01  来源:igfitidea点击:

在今天的教程中,我们将介绍使用Apache和mod_wsgi部署Django项目的过程。这还将涵盖使用WSGI,Apache和Django的基础知识。在Apache上部署Django

什么是WSGI?

Web服务器网关接口(WSGI,发音为威士忌)描述了诸如Apache或者Nginx之类的Web服务器如何与Web应用程序通信,以及Web应用程序如何处理或者执行请求。 Django主要使用WSGI来部署Web应用程序。 Django使用不同的WSGI服务器,其中包括:GunicornuWSGImod_wsgi

安装Apache和mod_wsgi

要安装apache和mod_wsgi,请执行以下命令。 mod_wsgi用于提供Django脚本,是专门为apache创建的。

sudo yum -y update
sudo yum -y install epel-release
sudo yum -y install httpd mod_wsgi

打开HTTP端口80

虽然我启用了端口80,但是我们可以使用其他端口,例如8000访问项目。

sudo firewall-cmd --zone=public --permanent --add-port=80/tcp
sudo firewall-cmd reload

启用软件集合

软件集合将使我们能够在同一系统上构建,安装和使用多个版本的软件,而不会影响系统默认软件包。在这种情况下,python3. 这是因为CentOS 7随附python版本2,但我们的projet使用版本3. 允许启用软件集合并安装python3.

sudo yum -y install centos-release-scl
sudo yum -y install rh-python36 python36-devel httpd-devel rh-python36-mod_wsgi
scl enable rh-python36 bash
python --version

请注意,此shell程序会话将Python 3.6设置为默认Python版本。从另一个终端关闭会话或者打开新会话将产生Python 2.7作为默认Python版本。

准备你的项目

通常,在将项目部署到生产环境时,我们将使用git存储库,因此我们将从这种情况开始。现在让我们克隆项目并设置其他所有内容,例如迁移和准备静态文件。

$cd /var/www/
$sudo git clone <myproject>.git

为我们的特定项目访问和来自apache的错误日志创建一个名为logs的自定义目录:

$sudo mkdir logs

创建一个虚拟环境并激活它。虚拟环境将用于进行一些配置,例如数据库迁移和静态文件收集:

$virtualenv venv
$source venv/bin/activate

现在,我们需要使用requirements.txt文件中的pip安装项目依赖项和需求:

$pip install -r requirements.txt

现在让我们根据Django对静态文件的部署要求进行迁移并将所有静态文件存储在服务器中:

$python manage.py makemigrations
$python manage.py migrate
$python manage.py collectstatic

停用虚拟环境,并将项目文件夹所有权更改为apache。所有权确保apache可以对项目进行必要的执行,写入和读取。

$deactivate
$sudo chown -R apache:apache /var/www/

mod_wsgi守护程序模式

在UNIX服务器上,建议通过mod_wsgi使用守护程序模式。这将创建一个守护进程组,并委派Django实例其中运行。因此,我们的apache配置文件将要求我们定义WSGIDaemonProcess和WSGIProcessGroup指令。

为项目配置apache conf文件

现在为我们的项目配置apache conf文件。请注意,在这种情况下,我的项目名称为awesomedjango。

$sudo vim /etc/httpd/conf.d/django.conf

粘贴此配置,确保在必要时替换项目名称和路径!

<VirtualHost *:80>
        ServerAdmin theitroad@localhost
        ServerName awesomedjango.com
        DocumentRoot /var/www/

        Alias /static /var/www/awesomedjango/static
        <Directory "/var/www/awesomedjango/static">
                Options FollowSymLinks
                Order allow,deny
                Allow from all
                Require all granted
        </Directory>

        Alias /media /var/www/awesomedjango/media
        <Directory "/var/www/awesomedjango/media">
                Options FollowSymLinks
                Order allow,deny
                Allow from all
                Require all granted
        </Directory>
        ErrorLog /var/www/awesomedjango/logs/apis_error.log
        CustomLog /var/www/awesomedjango/logs/apis_access.log combined

        WSGIPassAuthorization On
        WSGIDaemonProcess awesomedjango python-path=/var/www/awesomedjango:/var/www/awesomedjango/venv/lib/python3.6/site-packages
        WSGIProcessGroup awesomedjango
        WSGIScriptAlias//var/www/awesomedjango/v/wsgi.py

        <Directory /var/www/awesomedjango/awesomedjango>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>
</VirtualHost>

如果我们使用的Apache版本低于2.4,则将" Requireallgranted"替换为" Allowfromall",并在其上方添加" Orderdeny"行。

适用于djangorestframework的Apache mod_wsgi特定配置

如果我们正在使用
djangorestframework是他们的提示:

the authorization header is not passed through to a WSGI application by default, as it is assumed that authentication will be handled by Apache, rather than at an application level. If you are deploying to Apache, and using any non-session based authentication, you will need to explicitly configure mod_wsgi to pass the required headers through to the application. This can be done by specifying the WSGIPassAuthorization directive in the appropriate context and setting it to 'On'.

如果收到错误:AttributeError:模块对象没有属性lru_cache

当我们使用python3 mod_wsgi时,会在apache错误日志中找到此错误。要解决此问题,请执行以下操作:

$sudo cp /opt/rh/httpd24/root/usr/lib64/httpd/modules/mod_rh-python36-wsgi.so /lib64/httpd/modules
$sudo cp /opt/rh/httpd24/root/etc/httpd/conf.modules.d/10-rh-python36-wsgi.conf /etc/httpd/conf.modules.d

重新启动Apache服务器:

$sudo systemctl restart httpd