在CentOS 7上使用Apache和Mod_Wsgi部署Python 3 Django应用程序
在今天的教程中,我们将通过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配置文件需要我们定义一个 WSGIDaemonProcess
和 WSGIProcessGroup
指令。
配置项目的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 granted
和 Allow 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