在网上搜了很多篇Django+uwsgi+Nginx的部署文章,忙了一下午头昏脑胀,最终完成了部署。部署文章流程讲解都很好,但在细节上或许缺乏一些注意力,导致我多篇文章来回切换在字里行间寻找蛛丝马迹。既然我完成了部署,那我何不写下自己的流程和心得,让后来人有一些参考?

原理

Django+uwsgi+Nginx的工作模式如下图所示,三个服务各司其职,分别为:

  1. Nginx负责接收浏览器的连接,静态文件Nginx能够自己处理,有诸如查询数据库,判断输入数据等,调用uwsgi。
  2. uwsgi为web网关服务网关接口,起到桥梁的作用,连接Django应用和Nginx。对于Nginx的调用,会发回给Django应用。
  3. Django实际的生产者,处理业务逻辑,读写数据库,流程判断等,实现网站具体的功能。

部署流程

一、完成的Django项目

首先,要有一个完成的Django项目,通过浏览器能打开。

在我的服务器上有一个tutotial的Django项目,是个博客的学习项目。

使用python manager.py runserver 0.0.0.0:8000能够运行。通过浏览器访问是正常的。

 二、安装uwsgi并配置

2.1 安装uswgi。

使用pip工具安装uswgi,pip install  uswgi

使用一个测试程序来测试uswgi能否正常运行。新建一个test.py,内容如下。

test.py

使用命令:uwsgi --http  :8002 --wsgi-file test.py,开启一个uswgi的服务。--http指访问端口为8002,--wsgi-file 指uwsgi的请求处理函数为test.py。如下图所示,为开启之后正常的输出项

通过浏览器能够访问到该服务。当访问端口8002时,处理函数为test.py中的application,返回一个text,格式为html,内容是“hello world”。

2.2 配置uswgi文件

使用uswgi作为nginx和django之间的搬运工,要将服务长久化就必须写一个配置文件。如下配置文件,路径在django主目录,是对上一步骤的命令行中命令的文件化。其中我们熟悉的配置项:

  1. 对外端口  http:9000,指定服务的开启端口
  2. wsgi-flie   tutorial/wsgi.py 指定请求的处理文件,在django项目中自动创建的文件。位于tutorial/tutorial/wsgi.py

除此之外还有:

  1. chdir django的主目录
  2. socket 和nginx交互的端口。
  3. daemonize 让程序后台运行。默认开启程序时如上图中会在终端中输出连接信息,开启该项配置关闭输出信息。

uwsgi起到一个桥梁的作用,具体体现在:wsgi-file连接django项目,socket连接Nginx。

uwsgi.ini

[uwsgi]
# 对外提供 http 服务的端口
http = : #the local unix socket file than commnuincate to Nginx 用于和 nginx 进行数据交互的端口
socket = 127.0.0.1: # the base directory (full path) django 程序的主目录
chdir = /home/ccf/code/django_learn/tutorial # Django's wsgi file
wsgi-file = tutorial/wsgi.py # maximum number of worker processes
processes = #thread numbers startched in each worker process
threads = #monitor uwsgi status 通过该端口可以监控 uwsgi 的负载情况
stats = 127.0.0.1: # clear environment on exit
vacuum = true

# 后台运行,并输出日志
daemonize = /var/log/uwsgi.log

2.3 运行uwsgi

使用uwsgi可执行文件,载入uwsgi.ini配置文件。

当程序运行之后,有两个端口可以访问到:

  1. http:9000 能够通过端口9000访问
  2. socket 预留给Nginx访问。

如下使用9000端口,访问到django的项目。

三、安装Nginx服务器

3.1 安装Nginx

使用apt-get install nginx,一键安装nginx。

3.2 配置nginx

上面的配置中,uswgi已经连接到django,大桥的一端已经通车,剩下的就nginx和uwsgi合龙。nginx的配置项路径为:/etc/nginx/nginx.conf。如下是nginx的完整配置文件,修改如下蓝色字体。在http的配置项中增加了一个server配置项,该server就是连接uwsgi服务的配置。

/etc/nginx/nginx.conf

user root;
worker_processes auto;
pid /run/nginx.pid; events {
worker_connections ;
# multi_accept on;
} http { ##
# Basic Settings
## sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off; # server_names_hash_bucket_size 64;
# server_name_in_redirect off; include /etc/nginx/mime.types;
default_type application/octet-stream; ##
# SSL Settings
## ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on; ##
# Logging Settings
## access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log; ##
# Gzip Settings
## gzip on;
gzip_disable "msie6"; # gzip_vary on;
# gzip_proxied any;
# gzip_comp_level ;
# gzip_buffers 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ##
# Virtual Host Configs
## include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
server {
#这里是访问时用到的端口
listen 8000;
server_name 127.0.0.1;
charset UTF-8;
#这块存让日志文件
access_log /var/log/nginx/SchoolBuy_access.log;
error_log /var/log/nginx/SchoolBuy_error.log;
client_max_body_size 75M;
location / {
#一定要有该配置项
include uwsgi_params;
#同uwsgi内容,连接uwsgi的socket。
uwsgi_pass 127.0.0.1:8001;
#链接超时时间
uwsgi_read_timeout 30;
} location /static/ {
autoindex on;
#这里的路径一定要到达静态文件的文件夹。即collectedstatic/,重点在最后的横杠。不然会报错
alias /home/ccf/code/django_learn/tutorial/collectedstatic/;
} location /media/ {
autoindex on;
alias /home/ccf/code/django_learn/tutorial/media/;
}
}
} #mail {
# # See sample authentication script at:
# #
http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen 8088;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}

listen                                      nginx监听的端口

include uwsgi_params           必填项

uwsgi_pass 127.0.0.1:8001  连接uwsgi的socket的端口。

其中稍难理解的是location/staic 和 location/media。简单来讲,在一个完整的django项目中,为了便于django发布应用,就是部署到web服务器,会将所有的静态文件和图形图像文件放在一个指定的文件夹中,这样Nginx收到请求之后就不用再去询问django,而是直接去指定的静态文件夹中获取。该方法极大的增加了并发的数量。static和media就是django的两个静态文件夹,在我的环境中如下:

media文件根据django项目而定是否有,如果没有collectedstatic文件夹要执行如下两步:

1、配置setting.py文件,添加STATIC_ROOT配置项,指定静态文件的收集文件夹当前路径下的collectedstatic/,当前路径指django主项目路径。

2、执行 python manage.py collectstatic,收集所有的静态文件。

3、可以查看在django主目录下出现了collectedstatic,内容如下,为admin的后台的css,js等文件和blog项目的静态文件。

3.3 使配置生效

Nginx检查配置文件

nginx -t 是nginx检查配置文件是否有错误的命令,如果正常,输出如下:

使配置文件生效

nginx -s  reload 是nginx重新载入配置文件的命令,可以让配置项生效。

3.4 浏览器访问

浏览器能够正常访问,部署成功。

在部署中每个人都会遇到自己的问题,我的经验也不适用于所有人。参考我的过程,如果遇到问题,欢迎留言交流。

Django 部署到Nginx的更多相关文章

  1. Django 部署 uwsgi + nginx + supervisor

    Django 部署 uwsgi + nginx + supervisor https://hacpai.com/article/1460607620615?p=1&m=0 zonghua • ...

  2. 【Django】Django web项目部署(Nginx+uwsgi)

    一.安装uwsgi 通过pip安装uwsgi. pip install uwsgi 测试uwsgi,创建test.py文件: def application(env, start_response): ...

  3. Nginx+uWSGI+Django部署web服务器

    目录 Nginx+uWSGI+Django部署web服务器 环境说明 前言 搭建项目 Django部署 编辑luffy/luffy/settings.py 编辑luffy/app01/views.py ...

  4. Django +uwsgi+python3+nginx + mysql 部署

    环境: 服务器ip:192.168.0.110 centos服务器 6.4 + mysql 5.6 + django1.11 +nginx 1.13.7 + uwsgi 2.0.18 uwsgi介绍 ...

  5. nginx+uwsgi+django部署流程

    当我们在用django开发的web项目时,开发测试过程中用到的是django自带的测试服务器,由于其安全及稳定等性能方面的局限性,django官方并不建议将测试服务器用在实际生产. nginx+uws ...

  6. Django项目部署(django+guncorn+virtualenv+nginx)

    一.说明 为了django项目部署到生产环境上,能够稳定的运行,且能够同时指出http和https的访问,对django的部署进行了一些研究,决定采用django + gunicorn + virtu ...

  7. CentOS7 + Python3 + Django(rest_framework) + MySQL + nginx + uwsgi 部署 API 开发环境, 记坑篇

    CentOS7 + Python3 + Django(rest_framework) + MySQL + nginx + uwsgi 部署 API 开发环境 CentOS7 + Python3 + D ...

  8. django 本地项目部署uwsgi 以及云服务器部署 uwsgi+Nginx+Docker+MySQL主从

    一 .django 本地项目部署uwsgi 1 本地部署项目 uwsgi安装测试 通过uwsgi 进行简单部署 安装uwsgi命令:pip install uwsgi -i http://pypi.d ...

  9. CentOS下 Django部署 nginx+uWSGI+Django(二)

    该篇内容承接CentOS下 Django部署 uWSGI+Django(一),细节流程可参考此篇内容. 1. 当前系统 CentOS Linux release 7.6.1810 Python 2.7 ...

随机推荐

  1. mybatis动态sql排序无效

    order by 字段,在用动态sql时会出现问题,排序无效,而且在日志里查询不到,不能发现这个错误. 通常,咱们的动态sql一般都会用#代替$,因为#可以防止sql注入问题. 但是在order by ...

  2. 【转】如何将qlv格式的腾讯视频转换为mp4格式

    一般来说,每个视频网站都会有自己的视频播放格式,如优酷的KUX.爱奇艺的QSV和腾讯的QLV等.但是大家知道,优酷是有转码功能的,而就目前来说腾讯视频还没有转码功能,这就给大家造成了一定的困扰.这里呢 ...

  3. 破解附近寝室的Wifi密码

    [系统]运行在VMware虚拟机中的Kali Linux系统.(实测Kali运行在virtualbox中兼容性很差,VMware支持的很好.我认为这正是一个不要迷信开源的例子,多数情况下,大公司的商业 ...

  4. Eclipse中使用Maven新建 Servlet 2.5的 SpringMVC项目

    1.前言: 最近在学习SpringMVC框架,由于使用Eclipse创建的webAPP项目默认使用的还是比较旧的servlet2.3,而且默认使用的还是JDK1.5,所以便有一次开始了我的配置之路 2 ...

  5. 【干货分享】dos命令大全

    一般来说dos命令都是在dos程序中进行的,如果电脑中安装有dos程序可以从开机选项中选择进入,在windows 系统中我们还可以从开始运行中输入cmd命令进入操作系统中的dos命令,如下图: 严格的 ...

  6. 【NOI2014】魔法森林

    为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为 1…n1…n,边标号为1…m1…m.初始时小E同学在 11 号节点,隐 ...

  7. bzoj:3400 [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队

    Description     农夫顿因开始玩飞盘之后,约翰也打算让奶牛们享受飞盘的乐趣.他要组建一只奶牛飞盘 队.他的N(1≤N≤2000)只奶牛,每只部有一个飞盘水准指数Ri(1≤Ri≤10000 ...

  8. bzoj:3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛

    Description     约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡 ...

  9. codeforces 767A Snacktower(模拟)

    A. Snacktower time limit per test:2 seconds memory limit per test:256 megabytes input:standard input ...

  10. linux基本命令学习01

    =============================================================================Unix/Linux最主要的应用领域是基础服务 ...