先说说他们的关系,Nginx和uWSGI都是Web服务器,Nginx负责静态内容,uWSGI负责Python这样的动态内容,二者配合共同提供Web服务以实现提高效率和负载均衡等目的。uWSGI实现了多个协议,如WSGI,HTTP协议,还有它自己的uwsgi协议,想了解更多关于uWSGI和uwsgi协议内容可以查阅这里。这样和fastcgi类似,请求和响应的流程如下:

Request > Nginx > uWSGI > Django > uWSGI > Nginx > Response

请求先交由Nginx,如果是静态内容就自己处理了,如果是动态内容就交给uWSGI服务器,uWSGI服务器处理整个Django项目的Python代码,响应请求,原路返回,但是与fastcgi不同,Nginx、uWSGI和Django可以独立部署,然后整合。那么我们从Django开始,这里的服务器环境是Ubuntu 16.10。

1. 部署Django的项目

安装Python和Django,Ubuntu自带2.7和3.5版本的Python,安装相应的Django版本,注意在Ubuntu中不同版本Python都有相应的命令

www@cloud-vm-ub01:~$ python --version
Python 2.7.12+
www@cloud-vm-ub01:~$ python3 --version
Python 3.5.2+
www@cloud-vm-ub01:~$ pip -V
pip 9.0.1 from /home/www/.local/lib/python2.7/site-packages (python 2.7)
www@cloud-vm-ub01:~$ pip3 -V
pip 9.0.1 from /home/www/.local/lib/python3.5/site-packages (python 3.5)pip3 install django

将已经完成开发的Django项目pro(pro是Django项目名)拷贝到服务器,这里拷贝到了www用户(www是服务器可登录用户名)路径下,最后相对路径是~/work/project/pro,绝对路径是/home/www/work/project/pro

进入以上目录,使用Django的内置服务器测试看看pro项目是否运行正常。

python3 ./manage.py runserver 127.0.0.1:8080

2. 部署uWSGI服务器

通过pip安装uWSGI。

pip3 install uwsgi

测试uWSGI是否正常,在~/work/project/pro目录中创建一个测试用的Python文件uwsgi_test.py

def application(env, start_response):start_response('200 OK',[('Content-Type', 'text/html')])#return ['Hello world'] # Python2return [b'Hello world'] # Python3

在pro项目路径下,基于HTTP协议运行uWSGI,如果uWSGI安装正常的话,可以在浏览器中访问9090端口,看到Hello world字样

uwsgi --http 127.0.0.1:9090 --wsgi-file uwsgi_test.py

接下来启动uWSGI加载Django项目,这里依然使用HTTP协议,将指向具体Python文件--wsgi-file参数替换为指向Django项目的--module参数,参数的值pro.wsgi指向~/work/project/pro/pro/wsgi.py模块,如果正常可以在浏览器http://127.0.0.1:9090端口打开了项目,但是静态文件路径有问题,不过没关系后面再处理。

www@cloud-vm-ub01:~/work/project/pro$ uwsgi --http 127.0.0.1:9090 --module pro.wsgi

对于uWSGI服务器的配置,如上命令加上很多参数非常麻烦,可以写成配置文件的方式,在~/work/project/pro中创建一个配置文件uwsgi.ini,注释掉参数暂时忽略,Django 1.4以前的版本需要配置如env,pythonpath等参数,这里不再深究了。

其中http参数用于以上测试,而与Nginx交互需要使用socket参数,即使用TCP协议,WSGI和uwsgi协议都在TCP协议之上。socket参数也可以配置为网络地址,如socket=127.0.0.1:7070,但如果Nginx和uWSGI同在一个服务器上,可以使用socket文件的形式。chmod-socket是为了动态配置socket文件的权限,因为socket文件会在每次uWSGI启动时被重新创建。

[uwsgi]
http=127.0.0.1:8000
#socket=/home/www/work/project/pro/nginx_uwsgi.socket
chdir=/home/www/work/project/pro/
#chmod-socket=664
master=true
processes=4
threads=2
module=pro.wsgi
#wsgi-file=uwsgi_test.py
#stats=127.0.0.1:9000

通过下面命令同样可以启动uWSGI加载Djiango项目

uwsgi --ini uwsgi.ini

设置uwsgi为自启动,在Ubuntu 16. 10

3. 部署Nginx服务器

通过apt安装Nginx

sudo apt install nginx

Nginx可以通过以下命令控制。正常安装和启动Nginx后,通过http://127.0.0.1:80可以看到Nginx的欢迎页

sudo service nginx start
sudo service nginx stop
sudo service nginx restart

接下来修改配置Nginx配置与uWSGI服务器交互。Nginx的主要配置文件在/etc/nginx/nginx.conf和sites-enabled文件夹里,nginx.conf是全局设置,sites-enabled文件夹里的可以针对不同站点进行配置,其中有个默认的default配置文件,该文件其实是sites-available文件夹里的default文件的软链接,sites-avaliable像个仓库,但只有sites-enabled里的才有效。我们可以将sites-enabled的default删除,再cp一份sites-available的default到sites-enabled里重名为nginx-pro,同时cp /etc/nginx/uwsgi_params ~/work/project/pro里以备nginx-pro配置文件调用。

#nginx-pro
 
upstream django{server unix:///home/www/work/project/pro/nginx_uwsgi.sock; # file socket#server 127.0.0.1:7070; # TCP socket
}server {listen 80 default_server;listen [::]:80 default_server;root /var/www/html;index index.html index.htm index.nginx-debian.html;server_name 127.0.0.1; # IP or FQDNlocation /static {alias /home/www/work/project/pro/static;}location / {uwsgi_pass django;include /home/www/work/project/pro/uwsgi_params;#try_files $uri $uri/ =404;}
}

uwsgi_params文件是Nginx向uWSGI传递的参数,uwsgi_pass的意思动态内容请求都通过名为django的upstream传递给uWSGI,这使用文件socket的方式,那么与之前uwsgi.ini里的socket参数配置一致。

4. Nginx权限问题

以上全部配置完成了,但是还有一个重要的权限问题,如果启动uWSGI和Nginx(以下需要两个终端窗口,因为uwsgi命令会占据一个),会报错

uwsgi --ini uwsgi.ini
sudo service nginx restart

在/var/log/nginx/error.log中会看到Permission denied字样,是对home/www/work/project/pro/nginx_uwsgi.socket文件没有读写权限,即运行Nginx工作进程的用户需要socket文件的读写权限。

运行Nginx的工作进程的用户在/etc/nginx/nginx.conf中有配置,是user的值www-data,但查看/etc/group发现www-data是个用户组

user www-data;
worker_processes auto;
pid /run/nginx.pid;events {worker_connections 768;# multi_accept on;
}

我们可以将www用户加入该用户组

usermod -G www-data www

也可以将socket文件及其上级目录pro的用户组改为www-data,并为该用户组授予读写权限

chown :www-data ~/home/work/project/pro
chown :www-data ~/home/work/project/pro/nginx_uwsgi.socket
chmod  ~/home/work/project/pro/nginx_uwsgi.socket

5.Nginx和Django静态文件处理

Django项目可以正常打开,但是静态文件引用路径还有问题,在Django开发时Django自己可以正确处理静态文件的路径,但是部署后Nginx去无法找到静态文件路径。

检查Nginx配置文件夹sites-enabled里的nginx-pro文件,确保里面默认的try_files要删掉或者注释掉,否则Nginx会因此检查静态文件是否存在。

将Django的静态文件集中起来,Django为此有专门的工具

现在Django的Settings文件中加上StATIC_ROOT,把静态文件都集中到这个路径下

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

执行命令

python3 ./manage.py collectstatic

这样所有Django前后台的静态文件都会集中到项目文件夹pro下static中,另外nginx-pro其中一个配置location /static即可让Nginx来处理静态内容。

转载于:https://www.cnblogs.com/qingspace/p/6838747.html

跨过Nginx上基于uWSGI部署Django项目的坑相关推荐

  1. 【转】Nginx+uWSGI 部署 Django 应用

    原文来自: http://www.oschina.net/question/54100_30386 http://obmem.info/?p=703 常见的django webapp 部署方式采用FC ...

  2. nginx+uwsgi部署Django

    本篇文章主要介绍了解决nginx+uwsgi部署Django的所有问题(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 最近,自己暑假写的小项目也算完毕了,想着投放 ...

  3. 飞桨领航团AI达人创造营4-在Jetson Nano上基于python部署Paddle Inference(硬件部署)

    在Jetson Nano上基于python部署Paddle Inference(硬件部署) 一.准备好一块新鲜出炉的Jetson nano,并配好基础的开发环境 1.基础配置方法 直接参考我多年来总结 ...

  4. nginx、uwsgi部署django项目理论+实战

    基本环境: Ubuntu 16.04.4 LTS python 3.5 virtualenv django project deployable #理论分析   部署django项目有很多方法,方法推 ...

  5. 使用Nginx+uWSGI部署Django项目

    1.linux安装python3环境 参考链接:https://www.cnblogs.com/zzqit/p/10087680.html 2.安装uwsgi pip3 install uwsgiln ...

  6. CENTOS7 使用 Nginx + Uwsgi 部署 Django 项目

    写在前面的话 最近总是见到有新学 Django 的朋友在部署自己的项目到 Linux 上面的时候运行不起来,所以就动手写了这篇博客. 对于不会搭建 Python 3 环境的朋友可以参考前面的博客[CE ...

  7. 使用uWSGI部署django项目

    先说说什么是uWSGI吧,他是实现了WSGI协议.uwsgi.http等协议的一个web服务器,那什么是WSGI呢? WSGI是一种Web服务器网关接口.它是一个Web服务器(如nginx)与应用服务 ...

  8. centos7 下通过nginx+uwsgi部署django应用

    1. 安装python3.6 1. 获取wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz tar -xzvf Python-3 ...

  9. Ubuntu nginx+uwsgi部署Django项目

    前提条件:首先项目使用一下命令启动成功后,输入公网ip后可以启动成功 python manage.py runserver 0.0.0.0:80 一.阿里云配置安全组 添加8000端口 二.安装配置u ...

  10. uwsgi部署django

    1. django版本4.2.1 2. uwsgi 版本2.0.21 3. uwsgi配置文件 [uwsgi] chdir = /home/djangoProject wsgi-file = djan ...

最新文章

  1. jQuery 常用的效果函数(一)
  2. c:线性表的链式表示
  3. [TCP/IP] SSL的通讯原理
  4. 人工玻璃体-技术指标汇总(持续更新中)
  5. JS学习--取整方法整理
  6. 学习Web前端,前景无限光明?
  7. Python:matplotlib绘制条形图
  8. depthmap资料总结
  9. S TYLE N E RF: A S TYLE - BASED 3D-A WARE G ENERA - TOR FOR H IGH - RESOLUTION I MAGE S YNTHESIS
  10. js for in对象key排序
  11. java算术表达式_一文了解如何用 Java 进行算术表达式计算
  12. python进阶学习路线(全)
  13. 【Java 数据结构】树和二叉树
  14. 加密、解密、数字签名和数字证书概念详解
  15. scrum立会报告+燃尽图(第三周第三次)
  16. 拉马努金,天才之超越
  17. Elasticsearch CCR源码分析
  18. android 混淆debug版本,在Android Studio中的混淆debug與release
  19. Http状态码大全(100、200、300、404、500等)
  20. 电子商务的未来是B2C还是C2C ?

热门文章

  1. python自定义修饰器_Python进阶自检清单:来自《Effective Python》的建议(二)
  2. 在网页输入框输入角标_这个免费插件能帮我们把Excel内容快速填充到网页表单?...
  3. 整数划分之四 【区间dp】讲解于思考方法
  4. 算法合集之《信息学中守恒法的应用》
  5. 快速线性筛法求素数一般筛法求素数代码
  6. python 根据关键字 切割pdf_用python拆分pdf
  7. 【HDU5869】Different GCD Subarray Query(求[L,R]内有多少个不同的区间gcd---树状数组+思维)
  8. beego mysql增删改查_5-BeegoORM增删改查-Go语言中文社区
  9. tensorflow--制作数据集tfrecords文件
  10. 接口测试及服务器性能压测,接口测试及服务器性能压测