云网牛站
所在位置:首页 > Linux云服务器 > 用Apache和mod_wsgi在CentOS 7上部署Python 3 Django应用程序

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

2019-11-26 16:01:17作者:戴进稿源:云网牛站

本文介绍使用Apache和mod_wsgi在CentOS 7上部署Python 3 Django应用程序的过程,这还将涵盖使用WSGI、Apache和Django的基础知识。Django主要使用WSGI来部署Web应用程序,Django使用不同的WSGI服务器,其中包括:Gunicorn、uWSGI、mod_wsgi。

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

 

安装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

参考:如何在CentOS 7系统下安装Apache

 

打开HTTP 80端口和启用软件集合(Software Collections)

1、打开HTTP 80端口

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

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

sudo firewall-cmd reload

2、启用软件集合(Software Collections)

软件集合将使我们能够在同一系统上构建,安装和使用多个版本的软件,而不会影响系统默认软件包,因为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版本。

参考:在CentOS下安装Python-3.7.3.tgz的方法,可用于安装3.8版本参考

 

准备你的项目

通常,在将项目部署到生产环境时,我们将使用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守护程序模式、为项目配置apache conf文件

1、mod_wsgi守护程序模式

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

2、为项目配置apache conf文件

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

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

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

<VirtualHost *:80>

ServerAdmin info@awesomedjango.com

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 granted”替换为“Allow from all”,并在其上方添加“Order deny,allow”行。

 

适用于djangorestframework的Apache mod_wsgi特定配置

如果你使用的是djangorestframework,请参考以下提示:

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

默认情况下,授权标头不会传递给WSGI应用程序,因为假定身份验证将由Apache处理,而不是在应用程序级别处理,如果要部署到Apache并使用任何基于非会话的身份验证,则需要显式配置mod_wsgi以将所需的标头传递给应用程序,这可以通过在适当的上下文中指定WSGIPassAuthorization指令并将其设置为“On”来完成。

附:如果出现错误:AttributeError: ‘module’ object has no attribute ‘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

这样问题就能解决掉了,启动服务器后一切正常。

 

相关主题

讲解Docker化Python Django应用程序的步骤

精选文章
热门文章