全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解通过Nginx部署Django(基于ubuntu)

Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。

在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是NGINX的强项)。然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。

可见,uwsgi的作用就类似一个桥接器。起到桥梁的作用。

Linux的强项是用来做服务器,所以,下面的整个部署过程我们选择在Ubuntu下完成。

一、安装Nginx                                                                       

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。

Nginx同样为当前非常流行的web服务器。利用其部署Django,我们在此也做简单的介绍。

Nginx官网:http://nginx.org/

打开ubuntu控制台(ctrl+alt+t)利用Ubuntu的仓库安装。

fnngj@ubuntu:~$ sudo apt-get install nginx #安装

启动Nginx:

fnngj@ubuntu:~$ /etc/init.d/nginx start #启动
fnngj@ubuntu:~$ /etc/init.d/nginx stop #关闭
fnngj@ubuntu:~$ /etc/init.d/nginx restart #重启

修改Nginx默认端口号,打开/etc/nginx/nginx.conf 文件,修改端口号。

 server {
  listen    8088;  # 修改端口号
  server_name localhost;

  #charset koi8-r; 

  #access_log logs/host.access.log main;

  location / {
    root  html;
    index index.html index.htm;
  }

大概在文件36行的位置,将默认的80端口号改成其它端口号,如 8088。因为默认的80端口号很容易被其它应用程序占用。

然后,通过上面命令重启nginx。访问:http://127.0.0.1:8088/

  

如果出现如上图,说明Nginx启动成功。 

二、安装uwsgi                                                           

 通过pip安装uwsgi。

root@ubuntu:/etc# python3 -m pip install uwsgi

测试uwsgi,创建test.py文件:

def application(env, start_response):
  start_response('200 OK', [('Content-Type','text/html')])
  return [b"Hello World"]

通过uwsgi运行该文件。

fnngj@ubuntu:~/pydj$ uwsgi --http :8001 --wsgi-file test.py

接下来配置Django与uwsgi连接。此处,假定的我的django项目位置为:/home/fnngj/pydj/myweb

复制代码 代码如下:
fnngj@ubuntu:~/pydj$ uwsgi --http :8001 --chdir /home/fnngj/pydj/myweb/ --wsgi-file myweb/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

常用选项:

http : 协议类型和端口号

processes : 开启的进程数量

workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number ofworkers / processes)

chdir : 指定运行目录(chdir to specified directory before apps loading)

wsgi-file : 载入wsgi-file(load .wsgi file)

stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)

threads : 运行线程。由于GIL的存在,我觉得这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)

master : 允许主进程存在(enable master process)

daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。

pidfile : 指定pid文件的位置,记录主进程的pid号。

vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)

三、Nginx+uwsgi+Django                                        

接下来,我们要将三者结合起来。首先罗列一下项目的所需要的文件:

myweb/

├── manage.py

├── myweb/

│  ├── __init__.py

│  ├── settings.py

│  ├── urls.py

│  └── wsgi.py

└── myweb_uwsgi.ini

在我们通过Django创建myweb项目时,在子目录myweb下已经帮我们生成的 wsgi.py文件。所以,我们只需要再创建myweb_uwsgi.ini配置文件即可,当然,uwsgi支持多种类型的配置文件,如xml,ini等。此处,使用ini类型的配置。

# myweb_uwsgi.ini file
[uwsgi]

# Django-related settings

socket = :8000

# the base directory (full path)
chdir      = /home/fnngj/pydj/myweb

# Django s wsgi file
module     = myweb.wsgi

# process-related settings
# master
master     = true

# maximum number of worker processes
processes    = 4

# ... with appropriate permissions - may be needed
# chmod-socket  = 664
# clear environment on exit
vacuum     = true

这个配置,其实就相当于在上一小节中通过wsgi命令,后面跟一堆参数的方式,给文件化了。

socket  指定项目执行的端口号。

chdir   指定项目的目录。

module  myweb.wsgi ,可以这么来理解,对于myweb_uwsgi.ini文件来说,与它的平级的有一个myweb目录,这个目录下有一个wsgi.py文件。

其它几个参数,可以参考上一小节中参数的介绍。

接下来,切换到myweb项目目录下,通过uwsgi命令读取myweb_uwsgi.ini文件启动项目。

fnngj@ubuntu:~$ cd /home/fnngj/pydj/myweb/
fnngj@ubuntu:~/pydj/myweb$ uwsgi --ini myweb_uwsgi.ini 
[uWSGI] getting INI configuration from myweb_uwsgi.ini
*** Starting uWSGI 2.0.12 (32bit) on [Sat Mar 12 13:05:06 2016] ***
compiled with version: 4.8.4 on 26 January 2016 06:14:41
os: Linux-3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:18:00 UTC 2015
nodename: ubuntu
machine: i686
clock source: unix
detected number of CPU cores: 2
current working directory: /home/fnngj/pydj/myweb
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
chdir() to /home/fnngj/pydj/myweb
your processes number limit is 15962
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to TCP address :8000 fd 3
Python version: 3.4.3 (default, Oct 14 2015, 20:37:06) [GCC 4.8.4]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x8b52dc0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 319920 bytes (312 KB) for 4 cores
*** Operational MODE: preforking ***
WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x8b52dc0 pid: 7158 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 7158)
spawned uWSGI worker 1 (pid: 7160, cores: 1)
spawned uWSGI worker 2 (pid: 7161, cores: 1)
spawned uWSGI worker 3 (pid: 7162, cores: 1)
spawned uWSGI worker 4 (pid: 7163, cores: 1)

注意查看uwsgi的启动信息,如果有错,就要检查配置文件的参数是否设置有误。

再接下来要做的就是修改nginx.conf配置文件。打开/etc/nginx/nginx.conf文件,添加如下内容。

……
server {
  listen     8099; 
  server_name  127.0.0.1 
  charset UTF-8;
  access_log   /var/log/nginx/myweb_access.log;
  error_log    /var/log/nginx/myweb_error.log;

  client_max_body_size 75M;

  location / { 
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:8000;
    uwsgi_read_timeout 2;
  }  
  location /static {
    expires 30d;
    autoindex on; 
    add_header Cache-Control private;
    alias /home/fnngj/pydj/myweb/static/;
   }
 }
……

 listen 指定的是nginx代理uwsgi对外的端口号。

server_name  网上大多资料都是设置的一个网址(例,www.example.com),我这里如果设置成网址无法访问,所以,指定的到了本机默认ip。

在进行配置的时候,我有个问题一直想不通。nginx到底是如何uwsgi产生关联。现在看来大概最主要的就是这两行配置。

include uwsgi_params;

uwsgi_pass 127.0.0.1:8000;

include 必须指定为uwsgi_params;而uwsgi_pass指的本机IP的端口与myweb_uwsgi.ini配置文件中的必须一直。

现在重新启动nginx,翻看上面重启动nginx的命令。然后,访问:http://127.0.0.1:8099/

通过这个IP和端口号的指向,请求应该是先到nginx的。如果你在页面上执行一些请求,就会看到,这些请求最终会转到uwsgi来处理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# django部署到nginx  # nginx部署django项目  # django  # nginx  # 部署  # 详解将Django部署到Centos7全攻略  # CentOS6.5设置Django开发环境  # Python3+django2.0+apache2+ubuntu14部署网站上线的方法  # 解决nginx+uwsgi部署Django的所有问题(小结)  # 使用Docker搭建Django 


相关文章: 购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  制作网站公司那家好,网络公司是做什么的?  如何在橙子建站上传落地页?操作指南详解  香港服务器如何优化才能显著提升网站加载速度?  婚礼视频制作网站,学习*后期制作的网站有哪些?  学校为何禁止电信移动建设网站?  制作网站的公司有哪些,做一个公司网站要多少钱?  建站OpenVZ教程与优化策略:配置指南与性能提升  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何在腾讯云服务器快速搭建个人网站?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  如何高效利用亚马逊云主机搭建企业网站?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  建站之星CMS五站合一模板配置与SEO优化指南  网站制作需要会哪些技术,建立一个网站要花费多少?  如何制作网站标识牌,动态网站如何制作(教程)?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  青浦网站制作公司有哪些,苹果官网发货地是哪里?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何选择适配移动端的WAP自助建站平台?  建站之星导航如何优化提升用户体验?  宝塔新建站点为何无法访问?如何排查?  如何在局域网内绑定自建网站域名?  Android自定义控件实现温度旋转按钮效果  如何在阿里云服务器自主搭建网站?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  制作表格网站有哪些,线上表格怎么弄?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  高防服务器如何保障网站安全无虞?  如何通过西部建站助手安装IIS服务器?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  建站之星安装步骤有哪些常见问题?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  Python如何创建带属性的XML节点  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  建站之星代理如何获取技术支持?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  郑州企业网站制作公司,郑州招聘网站有哪些?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  深圳网站制作平台,深圳市做网站好的公司有哪些?  建站主机数据库如何配置才能提升网站性能?  创业网站制作流程,创业网站可靠吗?  网站app免费制作软件,能免费看各大网站视频的手机app? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。