文档章节

Ubuntu上通过nginx部署Django笔记

j_hao104
 j_hao104
发布于 2016/11/16 22:17
字数 964
阅读 119
收藏 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

j_hao104

粉丝 214
博文 71
码字总数 111997
作品 2
成都
程序员
私信 提问
django+nginx+uwsgi进行服务器部署

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

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

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

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

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

敖瑞_rick
2018/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
2.1K
0
Ubuntu 下面部署Django 项目

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

水滴石川1
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

YUM仓库配置及命令详解

导读 通过源代码编译的方式安装程序在灵活性、可定制性方面具有无可比拟的优势,但也正因为这种特性给管理员带来了额外的维护开销,当应用在大规模的服务器群集时存在一定的局限性。那么就需...

问题终结者
45分钟前
11
0
docker初学者

docker简介 在真正使用这项技术之前很难深刻的理解它的概念。 从简单的方面来说,docker就是一个轻量级的虚拟机。接下去的学习首先不妨抱着这个想法来看,让后慢慢寻找差别,最终我们会回来试...

街角的小丑
今天
15
0
了解下Hz单位的意思

今天看到计组的突然看到Hz这个单位,突然不知道它是啥意思,就百度了解啦下。 赫,是频率的基本单位,为纪念验证电磁波存在的德国物理学家海因里希·鲁道夫·赫兹(Heinrich Rudolf Hertz)而...

南桥北木
今天
11
0
Mysql的sql_mode模式

sql_mode 是一个很容易被忽视的配置,宽松模式下可能会被输入一些非准确数据,所以生产环境下会要求为严格模式,为了保持生产环境和开发环境,测试环境一致性,我们开发环境和测试环境也要配...

贾峰uk
今天
15
0
Qt程序打包发布方法(使用官方提供的windeployqt工具)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/toTheUnknown/article/details/81748179 如果使用到了Qt ...

shzwork
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部