使用Apache和mod_wsgi在CentOS 7上部署Python 3 Django应用程序
在今天的教程中,我们将介绍使用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