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

时间:2020-02-23 14:30:21  来源:igfitidea点击:

在今天的教程中,我们将通过Apache和Mod_Wsgi部署Django项目的过程。
这也将涵盖使用WSGI,Apache和Django的基础知识。

什么是WSGI?

Web服务器网关接口(WSGI发音为Whiskey)描述了Web服务器(如Apache或者NginX)如何与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

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

准备你的项目

主要是在将项目部署到生产时,我们将使用GIT存储库,因此我们将从此方案开始。
让我们现在克隆该项目并设置其他所有迁移和准备静态文件的所有内容。

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

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

$sudo mkdir logs

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

$virtualenv venv
$source venv/bin/activate

我们现在需要使用来自Resiges.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配置文件需要我们定义一个 WSGIDaemonProcessWSGIProcessGroup指令。

配置项目的Apache Conf文件

现在为我们的项目配置Apache Conf文件。
请注意,在这种情况下,我的项目名称是Awesomedjango。

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

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

<VirtualHost *:80>
        ServerAdmin Hyman@theitroad
        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,请替换 Require all grantedAllow from all并添加行 Order deny,allow它上面。

apache mod_wsgi特定的djangorestframework的conf

如果我们使用DjangorestFrameworkWork,则是他们的提示:

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:'module'对象没有属性'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