Nginx与django+uwsgi成功勾搭的始末(下)

在“Nginx与django+uwsgi成功勾搭的始末(上)”里我们已经实现了可以用浏览器访问我们django里的静态文件,注意,是django里的文件,而不是nginx里的。也就是说我们打开nginx是可以访问django里的静态文件,而不能访问django里的其他内容,只有我们启动了nginx同时也启动了django,才会访问django里的动态文件。

这篇文章的内容是验证socket是否可以连接起nginx和uwsgi。

在/home/下面我记得我们是有一个叫logan.py,里面的内容是这样的:

def application(env, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘,‘text/html‘)])
    return ["Good bye,Logan..."] # python2

现在我们来到home文件夹,ps -ef一下确认后台进程nginx是没有的,uwsgi也是没有的,使用#uwsgi --plugin python --socket :8001 --wsgi-file logan.py。然后在浏览器里测试“外网地址:8001”,发现网页无法打开,同时服务器终端提示:“invalid request block size: 21573 (max 4096)...skip”。

这是因为在#uwsgi --plugin python --socket :8001 --wsgi-file logan.py这个命令里,我们用 socket的方式去打开logan.py,这个方式默认是tcp的,而我们在浏览器访问却是走的http协议,自然会失败了。而我们在前面已经知道用#uwsgi --plugin python --http-socket :8001 --wsgi-file logan.py是可以打开的,但是我们的目的是要验证“socket是否可以连接起nginx和uwsgi”。怎么办?

此时,我们还是需要启动nginx,但是要用我们之前的mysite_nginx.conf,于是我们#nginx -c /etc/nginx/sites-enabled/mysite_nginx.conf

然后我们再试试#uwsgi --plugin python --socket :8001 --wsgi-file logan.py,在浏览器里输入“外网地址:8000”,发现浏览器里出现了"Good bye,Logan...",不仅这个界面OK,就连我们之前的那个电影海报(media/logan.jpg)也是OK的。

至此我们可以大吼一声:

Web Client <===> Web Server(nginx) <===> The Socket <===> uWSGI <===> Python

这条通道已经彻底打通了!

打通了还没完,我们需要进去搞事情。现在我们修改一下mysite_nginx.conf,把里面的server改成这样:

server unix:///django/logan/logan.sock;

然后#uwsgi --plugin python --socket /django/logan/logan.sock --wsgi-file logan.py,这样规定它使用socket去代替那些协议去启动那个py文件。估计看到这里很多人会有疑问,为啥凭空出现了一个logan.sock?这是什么鬼?

因为这个logan.sock是在uwsgi启动之后自动生成的,当我们执行了#uwsgi --plugin python --socket /django/logan/logan.sock --wsgi-file logan.py之后,来到/django/logan里就会发现里面多了一个粉嫩的logan.sock,默认权限是755:

现在我们去浏览器里试试“外网地址:8000”,发现却是502,bad gateway:

不要虚,去查看一下nginx的error.log,里面的反馈是这样的:

2017/03/17 16:57:06 [crit] 29123#0: *9 connect() to unix:///django/logan/logan.sock failed (13: Permission denied) while connecting to upstream, client: 60.191.94.120, server: 121.40.52.61, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///django/logan/logan.sock:", host: "121.40.52.61:8000"

既然说权限不足,nginx无法调用这个socket文件,那就#chmod 666 logan.sock加权限好了。

然后我们再试试#uwsgi --plugin python --socket /django/logan/logan.sock --wsgi-file logan.py --chmod-socket=666,在浏览器上刷新一下“外网地址:8000”,就看到了logan.py里的“Good bye,Logan...”了,现在我们应该也可以用这个方法启动一下我们的django project,命令就是#uwsgi --plugin python --socket /django/logan/logan.sock --chdir /django/logan/ --wsgi-file  /django/logan/logan/wsgi.py  --chmod-socket=666。

现在我们在浏览器里打开“外网地址:8000/admin”,就会看到django的页面:

当然了,打开media/logan.jpg一样会看到那张《金刚狼3》的电影海报。

不过uwsgi启动命令太长了,uwsgi可以使用ini或者xml两个文件方式来简化启动命令,我们在/django/logan里建立一个uwsgi_logan.ini,里面的内容是这样的:

# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
plugin          = python
# the base directory (full path)
chdir           = /django/logan/
# Django‘s wsgi file
wsgi-file          = /django/logan/logan/wsgi.py
# the virtualenv (我的python只有一个版本所以没有用这个,有的话这里需要填写全路径)
# home            = /path/to/virtualenv
# process-related settings
# master
master          = true
# maximum number of worker processes(这里的数字请根据自己实际情况填写,4个已经够用了)
processes       = 4
# the socket (填写全路径)
socket          = /django/logan/mysite.sock
# ... with appropriate permissions - may be needed
chmod-socket    = 666
# clear environment on exit(退出的时候会清理)
vacuum          = true
pidfile = /django/logan/uwsgi_logan.pid    #确定pid的文件
daemonize = /django/logan/uwsgi_logan.log    #确定日志文件

然后使用#uwsgi --ini /django/logan/uwsgi_logan.ini,来启动django吧。

参考资料:http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

参考资料:http://stackoverflow.com/questions/23148082/in-django-nginx-wsgi-what-is-a-mysite-sock

时间: 2024-10-12 23:14:10

Nginx与django+uwsgi成功勾搭的始末(下)的相关文章

Nginx+PostgreSQL+Django+UWSGI搭建

最近因为项目上的需要开始大量使用nginx,因此也想趁机将以前常用的django+apache的架构换成django+nginx.常见的 django webapp 部署方式采用FCGI 或 WSGI的方式部署,在这里主要对CentOS 6.5下Python 2.7.5环境下采用 Nginx + PostgreSQL + Django + uwsgi 的搭建与配置步骤做一个简要说明,主要留作备忘,也希望对大家有所帮助. 一.Nginx-1.6.2安装 1. 在安装nginx前,需要确保系统安装了

阿里云 centos7 django + uWSGI+Nginx + python3 部署攻略

centos7+nginx+python3+django+uwsgi配置Django 项目部署 1.租的服务器(选择centos)的话,需要在阿里云后台控制台开放几个端口,克隆一下已开放的端口,tcp自定义就行,mysql(3306),nginx(8000以上都行).(都切换到root用户操作) 2.安装python3 3.安装nginx 4.安装mysql(这一步如果暂时用不上数据库也可以不操作) 5.确定2,3两步安装成功了,接下来就用pip3 安装django 和uwsgi, 在进行下一步

Django + Uwsgi + Nginx 的生产环境部署

使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇文章总结归纳了一下基于uwsgi+Nginx下django项目生产环境的部署 准备条件: 1.确保有一个能够用runserver正常启动的django项目 2.项目已上传到linux 3.linux上已部署好python环境,且已安装好项目所需的模块 安装uwsgi uwsgi是python的一个模块,安装u

python django uwsgi nginx &nbsp; 实例

实例:192.168.200.133 1.安装django wget  https://www.djangoproject.com/download/1.7.11/tarball/ 1.3.安装 cd Django-1.x.y sudo python setup.py install 1.4.创建  django-admin.py startproject testdj 1.5.启动测试 cd testdj # 切换到我们创建的项目 python manage.py runserver 2.安装

Django+uWsgi+nginx部署

一.环境 操作系统:Ubuntu 14.04 64位 python:2.7.6 Django:1.8.2 项目源码:https://github.com/youchuancong/django.git 部署方式:Django+uWsgi+nginx 二.部署 1.Django安装 官网:https://www.djangoproject.com/ 安装 wget https://www.djangoproject.com/m/releases/1.8/Django-1.8.2.tar.gz ta

Django+uwsgi+nginx配置详解

操作系统是ubuntu 更新源 1 apt-get update 安装 Nginx 和 uWSGI 1 apt-get install nginx uwsgi uwsgi-plugin-python 安装 Python 相关环境 1 apt-get install python-dev python-virtualenv python-pip 这里如果安装不成功,可以分开安装,试过一次,分开安装才成功,原因目前以我的水平还发现不了,很遗憾. 安装 MySQL 1 apt-get install 

python django+uwsgi+nginx 搭建步骤(血一般的教训)

安装Django 没有pip的童鞋可以看http://blog.csdn.net/imphp/article/details/38228619安装python包管理工具pip 先在 https://pypi.python.org/ 上 搜索Django,排在第一的那个就是我们要安装的主要框架Django啦- 点进去可以查找一些相关文档,虽然全部是鸟语花香,不过有翻译.百度.炕忙,就算是菜鸟也成英国鸟了. Django 的官网文档 https://docs.djangoproject.com/en

[linux]centos7.4部署django+Uwsgi+Nginx

前言:我已经写了几个接口用来部署在服务器上的,首先选择django+Uwsgi+Nginx因为配置简单,比较符合python的简单操作功能强大的特点 然后对于django的一些版本在之前的文章写了 参考:https://www.cnblogs.com/Jack-cx/p/9351633.html  根据版本,服务器pip3 install xxx 安装下 我的django项目大概结构: TestWebApi ----TestWebApi ----Apiso(创建的应用) ----manage.p

Django 部署 CentOS7+Python3+Django+uWSGI+Nginx(含Nginx返回400问题处理、防火墙管理)

本节将介绍如何部署Django,基于下面的架构: CentOS7+ Python3 + Django1.11 + uWSGI + Nginx. 首先,你得安装CentOS或Redhat等Linux系统,物理机和虚拟机都行,如果是阿里云ECS主机并且带有独立公网IP,那就更好.我选用的是CentOS7,敬请参考. 至于如何安装CentOS.Python3(含虚拟环境)和Django1.11,不是本节的内容,请自行解决.下面我假定你已将安装好了这三者. 将Django项目移植到Linux系统中,进入