Django应用部署

简介: 前言Apachewsgi环境搭建安装Apache安装mod_wsgi添加djangowsgi文件配置etcapache2httpdconfwsgipy配置跑起来吧uWSGI环境搭建测试一下部署Django应用参数释义NginxuWSGI环境搭建整合Nginx配置运行总结前言这几天又大致的复习了一下Django的相关内容,发现很多东西都忘得差不多了。

前言

这几天又大致的复习了一下Django的相关内容,发现很多东西都忘得差不多了。看来知识的确是很容易就被遗忘的。时常按照艾宾浩斯记忆曲线来复习一下之前学过的,遗忘的速度就减慢许多了。

废话扯多了,今天主要是写点关于Django应用部署的笔记。毕竟今后一定会用得到,于是先给自己充点电,权当是准备一下。

总的来说有下面三种方式,接下来简答的描述一下。

  • Apache+wsgi
  • uWSGI
  • Nginx+uWSGI

Apache+wsgi

Apache是家喻户晓的了。当然了,不是说阿帕奇武直多么厉害,而是这个服务器。而wsgi是什么意思咧?

wsgi全称 Web Server Gateway Interface。是专门为Python语言定义的Web服务器和Web应用程序或者框架之间的一种简单而通用的接口。

WSGI是Web服务器与Web应用之间的一种低级别的接口,我们可以理解为一个桥梁,通过这座桥梁实现了Web应用在Web服务器上的部署。


环境搭建

安装Apache

sudo apt-get -y install apache

安装mod_wsgi

sudo apt-get -y install libapache2-mod-wsgi

添加django.wsgi文件

这个django.wsgi文件的作用就是告诉Apache服务器,到底要怎么将Django应用程序和Apache服务器联系起来。

文件的内容如下:

#!/usr/bin/env python3
# coding: utf8

import os
import sys
# Django的项目的绝对目录
path = 'home/biao/guest/'
sys.path.append(path)
sys.path.append(path+'guest')

os.environ['DJANGO_SETTINGS_MODULE'] = 'guest.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

配置/etc/apache2/httpd.conf

……
#添加mod_wsgi.so 模块
LoadModule wsgi_module modules/mod_wsgi.so

#指定myweb项目的wsgi.py配置文件路径
WSGIScriptAlias / /home/biao/guest/django.wsgi

#指定项目路径
WSGIPythonPath /home/biao/guest

<Directory /home/biao/guest>
<Files wsgi.py>
    Require all granted
</Files>
</Directory>

wsgi.py配置

最后是修改guest应用下的wsgi.py文件。

……
import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "guest.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

跑起来吧

然后重启一下Apache服务即可。

service apache2 reload

或者使用下面的命令

sudo /etc/init.d/apache2 restart

uWSGI

uWSGI 是一个Web服务器,它实现了WSGI, uwsgi,HTTP等协议(这里姑且把WSGI接口看作是一个协议吧)。 这一点要和uwsgi区别对待即可。

环境搭建

首先当然是得先安装这个服务器了。

pip install uWSGI

具体的版本可以在 https://pypi.python.org/pypi/uWSGI 处下载。

测试一下

安装完毕之后,我们先来测试一下uWSGI能否正常工作。根据其实现了uwsgi和WSGI协议,我们可以写出下面的桥接

# coding: utf8
# file: test.py
# author: 郭璞

def application(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')]
    return [b'It Works.']

运行文件命令

uwsgi --http :8080 --wsgi-file test.py

uWSGI 方式运行代码

部署Django应用

部署Django应用的命令很长,接下来一一讲解各个参数的含义。

uwsgi --http :8080 --chdir /home/biao/guest --wsgi-file guest/wsgi.py --master --processes 4 
root@iZ2zeigvkok5ldc6x0m6itZ:/home/biao/guest# uwsgi --http :8080 --chdir /home/biao/guest --wsgi-file guest/wsgi.py --master --processes 4
*** Starting uWSGI 2.0.15 (64bit) on [Tue May 30 10:57:10 2017] ***
compiled with version: 4.8.4 on 29 May 2017 15:26:43
os: Linux-3.13.0-86-generic #130-Ubuntu SMP Mon Apr 18 18:27:15 UTC 2016
nodename: iZ2zeigvkok5ldc6x0m6itZ
machine: x86_64
clock source: unix
detected number of CPU cores: 1
current working directory: /home/biao/guest
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** 
chdir() to /home/biao/guest
your processes number limit is 7781
your memory page size is 4096 bytes
detected max file descriptor number: 65535
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on :8080 fd 4
uwsgi socket 0 bound to TCP address 127.0.0.1:41481 (port auto-assigned) fd 3
Python version: 3.4.3 (default, Nov 17 2016, 01:12:14)  [GCC 4.8.4]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x25f0d10
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 363800 bytes (355 KB) for 4 cores
*** Operational MODE: preforking ***
WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x25f0d10 pid: 16143 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 16143)
spawned uWSGI worker 1 (pid: 16145, cores: 1)
spawned uWSGI worker 2 (pid: 16146, cores: 1)
spawned uWSGI worker 3 (pid: 16147, cores: 1)
spawned uWSGI worker 4 (pid: 16148, cores: 1)
spawned uWSGI http 1 (pid: 16149)

参数释义

  • --http: 协议类型和端口号 ,一般形式 –http :port
  • --processes: 开启的进程数量,对比上述的日志,我们可以看出有四个进程
  • --chdir: 指定项目的路径。
  • --wsgi-file: 指定wsgi文件的路径,这里是相对于chdir的路径而言的,所以可以更加清爽的写路径。
  • --master: 允许主进程存在,不写则不允许存在
  • --threads: 开启的线程数量。

其实还有很多参数,但是对于部署而言,很多东西都要根据具体的硬件配置不断的调试,调优,才能发挥出服务器最大的能力。

Nginx+uWSGI

Nginx近年来可谓是风生水起。目前而言,Nginx+uWSGI作为Django应用的部署方案已经是很普遍的了。通常让Nginx作为前台接收各种请求,然后转发给下方的uWSGI来具体的处理各种请求。以此来达到一个更高的响应效率。

环境搭建

刚才已经安装好了uWSGI,这里就安装一下Nginx好了。具体的安装方式有源码安装和直接使用包管理工具安装,这里为了方便,就简单的采用包管理工具安装好了。

sudo apt-get -y install nginx

然后为了防止出现端口冲突,可以修改一下Nginx的默认监听端口。

vim /etc/nginx/sites-avaiable/default

修改Nginx的默认监听端口

然后重启一下服务

sudo /etc/init.d/nginx restart

然后访问一下端口为8888的链接。
Nginx端口修改后效果

整合

整合Nginx和uWSGI与Django应用的时候,需要一些配置文件。`.

tree . -I *.pyc -L 4

目录结构如下

.
├── db.sqlite3
├── django_uwsgi.ini
├── django.wsgi
├── guest
│   ├── __init__.py
│   ├── __pycache__
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
└── sign
    ├── admin.py
    ├── apps.py
    ├── __init__.py
    ├── migrations
    │   ├── 0001_initial.py
    │   ├── __init__.py
    │   └── __pycache__
    ├── models.py
    ├── __pycache__
    ├── templates
    │   ├── event_manage.html
    │   ├── guest_manage.html
    │   ├── index.html
    │   ├── login.html
    │   └── sign_index.html
    ├── tests.py
    ├── urls.py
    ├── views_if.py
    └── views.py

我们需要了解的就是Django和uWSGI的整合。uWSGI可以通过XML文件或者INI文件来读取相关的配置信息。所以我们可以在django_uwsgi.ini文件中有如下声明。
django_uwsgi.ini文件内容

大致的含义其实和之前第二种方式使用命令行来运行是一致的。

可以通过命令

uwsgi --ini django_uwsgi.ini

如果没有报错信息,说明可以正常运行。也说明了现在后台部分已经完毕了。只需要**前台**Nginx做一下路由即可。

Nginx配置

现在需要修改一下Nginx的配置,让它为我们的Django应用服务。其实说白了还是对于uWSGI的路由请求的分配。

vim /etc/nginx/sites-avaiable/default

在文件的末尾加上如下内容。含义是让Nginx监听服务器的10010端口,然后将请求转发给后台的uWSGI服务器。并作出相应的处理。
Nginx前台配置

运行

现在我们可以测试一下运行效果。也就是说:
- 先开启uWSGI服务器。
- 然后开启Nginx服务器。
- 访问Nginx对外暴露的端口,看看能不能获取uWSGI的服务。

uwsgi --ini django_uwsgi.ini
/etc/init.d/nginx restart

Django的admin后台访问效果

发现已经可以正确运行了。如此即可。

总结

最后来总结一下需要注意的地方。

Apache的方式不是很赞同,虽然稳定性很高,但是配置起来不是很容易而且各种依赖。
uWSGI单独运行的话,也还可以。就是略显单薄。

Nginx配合uWSGI 给我的感觉就是很沉稳了。后台部分可以挂载多个uWSGI。

但是需要知道的是整合uWSGI和Nginx的时候的那个ini文件。

  • 如果想直接通过uWSGI服务器获取服务,这里的请求方式与端口配置为 http = :port

  • 如果要想通过Nginx配合uWSGI的方式获取服务,这里的请求方式与端口配置为socket = :port

对外网而言,要想正确访问到我们的Django服务,还需要一项配置ALLOWED_HOSTS

在项目根目录的settings.py文件中,对下面一项做下配置即可。

ALLOWED_HOSTS = ['www.example.com', 'ip', '*']

还有就是在生产环境下,Django的DEBUG开关也需要关闭一下。这样给用户的用户体验也会好上不少,还能在一定程度上保证应用的安全性。设置方式如下。
在项目根目录的settings.py文件中,对下面一项做下配置即可。

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

感觉还是有很多东西要去学习呵。

目录
相关文章
|
1月前
|
前端开发 JavaScript UED
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
通过在Django项目中集成Channels和WebSocket,我们能够为前后端分离的应用添加实时通信功能,实现诸如在线聊天、实时数据更新等交互式场景。这不仅增强了应用的功能性,也提升了用户体验。随着实时Web应用的日益普及,掌握Django Channels和WebSocket的集成将为开发者开启新的可能性,推动Web应用的发展迈向更高层次的实时性和交互性。
61 1
|
22天前
|
IDE 关系型数据库 MySQL
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
34 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
|
22天前
|
监控 应用服务中间件 网络安全
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
79 0
|
22天前
|
存储 开发框架 JSON
【查漏补缺】Django模型字段类型及其应用
【查漏补缺】Django模型字段类型及其应用
13 0
|
24天前
|
存储 安全 UED
GitHub OAuth认证的Django应用
GitHub OAuth认证的Django应用
18 0
|
3月前
|
中间件 数据库连接 UED
Django中间件秘籍:如何用几行代码让你的应用变得超级强大?
【8月更文挑战第31天】中间件是Django框架的核心特性,位于视图与HTTP服务器之间,允许全局处理请求和响应,增强Web应用功能。通过实现`MiddlewareMixin`类的方法,如`process_request`和`process_response`,可以轻松实现请求预处理或响应后处理。中间件应用场景广泛,包括用户认证、CSRF防护和数据库连接管理等。创建并配置中间件需将其加入`settings.py`的`MIDDLEWARE`列表,顺序决定执行优先级。合理利用中间件能提高代码重用性和应用性能,带来更好的用户体验。
51 0
|
3月前
|
前端开发 JavaScript Linux
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
|
4月前
|
前端开发 JavaScript API
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
【7月更文挑战第17天】现代Web开发趋势中,前后端分离配合WebSocket满足实时通信需求。Django Channels扩展了Django,支持WebSocket连接和异步功能。通过安装Channels、配置设置、定义路由和消费者,能在Django中实现WebSocket交互。前端使用WebSocket API连接后端,实现双向数据流,如在线聊天功能。集成Channels提升Web应用的实时性和用户体验,适应实时交互场景的需求。**
180 6
|
4月前
|
安全 开发者 Python
告别迷茫,Django/Flask深入应用指南,让你的Web梦想照进现实!
【7月更文挑战第13天】在Python Web开发中,Django和Flask框架各具特色。Django适合快速构建企业级应用,提供ORM、模板引擎等全面功能;而Flask轻量灵活,适用于小项目和原型开发。通过实例,了解如何启动Django和Flask的基本应用,从创建项目到运行服务器。选择框架应考虑项目需求和个人偏好,不断学习与实践将助你实现Web梦想。
45 1
|
5月前
|
存储 前端开发 JavaScript
探索Django:打造高效、可扩展的Web应用(中)
探索Django:打造高效、可扩展的Web应用(中)
43 1