文档章节

Ubuntu上通过nginx部署Django笔记

j_hao104
 j_hao104
发布于 2016/11/16 22:17
字数 964
阅读 78
收藏 1

Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。今天在Ubuntu上使用Nginx部署Django服务,虽然不是第一次搞这个了,但是发现还是跳进了好多坑,google了好久才搞定。想想还是把这个过程记录下来,免得下次再来踩同样的坑。

安装Nginx

apt-get install nginx

ubantu安装完Nginx后,文件结构大致为:   所有的配置文件都在 /etc/nginx下;   启动程序文件在 /usr/sbin/nginx下;   日志文件在 /var/log/nginx/下,分别是access.log和error.log;   并且在 /etc/init.d下创建了启动脚本nginx。

sudo /etc/init.d/nginx start    # 启动
sudo /etc/init.d/nginx stop     # 停止
sudo /etc/init.d/nginx restart  # 重启

安装uwsgi

apt-get install python-dev
pip install uwsgi

至于为什么要使用uwsgi,可以参见这边博客:快速部署Python应用:Nginx+uWSGI配置详解(1)。 这样大体的流程是:nginx作为服务器最前端,负责接收client的所有请求,统一管理。静态请求由Nginx自己处理。非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。 通信原理是: the web client <-> the web server(nginx) <-> the socket <-> uwsgi <-> Django

测试uwsgi

在Django项目下新建test.py文件,

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

然后执行shell命令:

uwsgi --http :8001 --plugin python --wsgi-file test.py

加上--plugin python是告诉uWSGI在使用python插件,不然很有可能会出现类似这样的错误:

uwsgi: unrecognized option '--wsgi-file'
getopt_long() error

执行成功在浏览器中打开:http://localhost:8001 显示Hello World说明uwsgi正常运行。

测试Django

首先得保证Django项目没有问题

python manage.py runserver 0.0.0.0:8001

访问http://localhost:8001, 项目运行正常。 然后链接Django和uwsgi,实现简单的web服务器,到Django项目目录下执行shell:

uwsgi --http :8001 --plugin python --module blog.wsgi

blog为你的项目名。访问http://localhost:8001 项目正常。注意这时项目的静态文件是不会被加载的,需要用nginx做静态文件代理。

配置uwsgi

uwsgi支持通过配置文件的方式启动,可以接受更多的参数,高度可定制。我们在Django项目目录下新建uwsgi.ini

# Django-related settings

socket = :8001

# the base directory (full path)
chdir           = /home/ubuntu/blog

# Django s wsgi file
module          = blog.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

在shell中执行:

sudo uwsgi --ini uwsgi.ini 

ps:如果实在不想配置nginx的话,单uwsgi就已经能完成部署了(把socket换成http),你可以把Django中的静态文件放到云平台中如七牛等等,这样你的Web也能被正常访问。

配置nginx

nginx默认会读取/etc/nginx/sites-enabled/default文件中的配置,修改其配置如下:

server {
    # the port your site will be served on
    listen      80;
    # the domain name it will serve for
    server_name 127.0.0.1; # substitute your machine's IP address or FQDN
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
    location /media  {
        alias /home/ubuntu/blog/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /home/ubuntu/blog/static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        include     uwsgi_params; # the uwsgi_params file you installed
        uwsgi_pass 127.0.0.1:8001;
    }
}

收集Django静态文件

把Django自带的静态文件收集到同一个static中,不然访问Django的admin页面会找不到静态文件。在django的setting文件中,添加下面一行内容:

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

然后到项目目录下执行:

python manage.py collectstatic

运行

一切配置好后直接重启nginx即可。更加详细的说明请参见官方文档

可能遇到的问题

如果监听80端口,部署后访问localhost自动跳转到nginx默认的欢迎界面 uwsgi: option ‘--http‘ is ambiguous

开源中国:https://my.oschina.net/jhao104/blog/789370

© 著作权归作者所有

共有 人打赏支持
j_hao104
粉丝 202
博文 67
码字总数 101848
作品 2
程序员
私信 提问
django+nginx+uwsgi进行服务器部署

django的服务器配置可以说是十分繁琐的部分 哪怕严格按照步骤也会有不明错误 再此详细记录操作步骤 版本Ubuntu 16.04 LTS 64位 服务器:腾讯云学生机 由于配置繁琐,所以操作步骤于全新系统进...

凝墨洒泪
06/08
0
0
Nginx+uWSGI 部署 Django 应用

常见的 webapp 部署方式采用 或 的方式部署,今天我这备忘下采用的部署方式。 目前我这博客就是采用 Nginx + uWSGI + Python + Django 构建的,部署虽没有php那样扔到目录那么方便,但是并发和...

鉴客
2011/10/26
26.4K
8
Django学习(一)网站部署流程

部署业务流程 零、已经具备的条件 django项目在建立之初,就预留了uwsgi的接口。我在学习了整个项目部署流程之后,感觉到这应该算是最简单的部署方式了。 在此我要特别感谢我的好友@小飞侠,...

敖瑞_rick
01/11
0
0
django+nginx+supervisor+gunicorn+gevent 网站部署

django+nginx+supervisor+gunicorn+gevent 网站部署 标签(空格分隔): 未分类 django gunicorn supervisor gevent django,nginx,supervisor,gunicorn,gevent这几个都是在本领域大名鼎鼎...

回不了
2015/01/16
0
0
Ubuntu 下面部署Django 项目

django 是 python 开源的 web 框架 ,django 本身运行后也是一个轻量级的服务器,可以满足本地的测试,生产环境中的 大量访问, 一般和nginx 和 apache 结合。下面以 Django 与nginx 结合为例...

水滴石川1
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux学习-1031(rsync同步工具 上)

10.28 rsync工具介绍 10.29/10.30 rsync常用选项 10.31 rsync通过ssh同步 一、 rsync工具介绍 rsync是一个同步工具,在日常的运维中常会用到。它可以本地同步,也实现可以远程两台机器同步。...

wxy丶
16分钟前
1
0
python实战一期:第一天

1. 为什么学习python 1.1 为什么要学Python? Python第一是个非常牛B的脚本语言,能满足绝大部分自动化运维的需求,又能做后端C/S架构,又能用WEB框架快速开发出高大上的Web界面,只有当你自...

laoba
18分钟前
2
0
Java并发编程学习三:线程同步的关键字以及理解

上篇文章中介绍了Java线程的带来的问题与内存模型中介绍了线程可能会引发的问题以及对应Java的内存模型,顺带介绍了Volatile和Sychronized关键字。今天对Java中涉及到的常见的关键类和关键字...

JerryLin123
25分钟前
0
0
我用代码来给你们分析一个赚钱的技巧

赚钱是个俗气的话题,但又是人人都绕不开的事情。我今天来“科学”地触碰下这个话题。 谈赚钱,就会谈到理财、投资,谈到炒股。有这样一个笑话: 问:如何成为百万富翁? 答:带一千万进入股...

crossin
25分钟前
1
0
spring MatchingBean应用

1、编写接口FactoryList import java.util.List;public interface FactoryList<E extends MatchingBean<K>, K> extends List<E> { E getBean(K factor); List<E> getBeanLi......

重城重楼
38分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部