0

0

如何用uWSGI和nginx来搭建Django工程

php中文网

php中文网

发布时间:2016-07-30 13:31:53

|

1178人浏览过

|

来源于php中文网

原创

前言:

nginx和uWSGI是Django部署的不错选择,但并非唯一的,它们都是可以替代的,欢迎进行其它尝试。

背景知识简要介绍:

1、WSGI是一种Web服务器网关接口。它是Web服务器(如nginx)与应用服务器(如uWSGI服务器)通信的一种规范。

2、uWSGI它实现了WSGI、uwsgi、http等协议。

3、Nginx是高性能的HTTP和反向代理服务器(我们使用Nginx是因为其高效的处理静态文件请求的能力)

4、Django是采用MVC设计模式的开源Web应用框架。

5、socket是用来实现进程间通信的,在我们这里用作实现nginx和uWSGI之间的通信

粗略的介绍我们需要使用到的部件之后,我们来具体说明搭建的步骤(请认真看,务求一次做对)

我们最后要完成的工作基本是这样的:

客户端(进行web请求) —— 服务器(这里使用的是nginx) —— socket(自动生成的通信文件)—— uwsgi —— Django

下面的内容很多来源于http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html#configuring-uwsgi-to-run-with-a-ini-file

uWSGI的安装和基本配置:

我们使用pip包管理工具来安装uWSGI:

sudo pip install uwsgi

如果你还没有pip,那么装上它:

在 Debian 和 Ubuntu系统中使用:

sudo apt-get install python-pip
在 Fedora 和 CentOS系统中使用:
sudo yum install python-pip
在pip安装uwsgi的过程中如果提示有依赖没有安装:

Debian 和Ubuntu:

apt-get groupinstall "Development Tools"

apt-get install python-devel

Fedora 和CentOS:

yum groupinstall "Development Tools"

yum install -y python-devel

基本试验

创建一个测试文件test.py:

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

运行uWSGI

uwsgi --http :8000 --wsgi-file test.py

代码的意思是使用http协议,端口8000,载入我们的测试文件。如果一切正常,访问:

http://127.0.0.1:8000/  (注意冒号是英文的冒号)

你会看到熟悉且可爱的Hello World。这也就说明我们打通了客户端——uWSGI——Python的桥梁。

用你的Django工程代替test.py

首先确信一下我们的工程本身能正常运行,在终端进入你的工程目录,然后敲入:

python manage.py runserver 0.0.0.0:8000
如果可以正常运行,停掉它然后执行下面的代码,把nidegongchenming改成你的工程名:

uwsgi --http :8000 --module nidegongchenming.wsgi
module *.wsgi是载入wsgi模块的意思,请放心这个模块你已经有了的。

那么现在我们打通客户端——uWSGI——Django的桥梁,恭喜。

如果你的Django工程叫abc,我建议你把它的全部内容都拷贝到/var/www/中。然后你的工程的manage.py文件就在/var/www/abc/中,这样可以避免因文件权限,带来的一些不能提供服务的问题。

好了可以停掉服务了,我们继续。

nginx的安装和基本配置:

安装 nginx

Ubuntu 和 Debian:

sudo apt-get install nginx
sudo /etc/init.d/nginx start
Fedora 和CentOS
sudo yum install nginx
sudo service nginx start
Fedora中,service nginx start会被重定向到systemctl start nginx.service。

如果一切正常(默认的80端口没有被占用),此时在浏览器中访问127.0.0.1你会看到“Welcome to nginx on XXX”

那么现在我们的桥梁变成了:客户端——服务器(nginx)

如果端口被Apache或者其它什么占用了,导致nginx服务不能成功启动也没关系,下面我们介绍怎么配置nginx来监听其它端口。

配置 nginx

j2me3D游戏开发简单教程 中文WORD版
j2me3D游戏开发简单教程 中文WORD版

本文档主要讲述的是j2me3D游戏开发简单教程; 如今,3D图形几乎是任何一部游戏的关键部分,甚至一些应用程序也通过用3D形式来描述信息而获得了成功。如前文中所述,以立即模式和手工编码建立所有的3D对象的方式进行开发速度很慢且很复杂。应用程序中多边形的所有角点必须在数组中独立编码。在JSR 184中,这称为立即模式。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

首先我们需要一份uwsgi_params文件,这个文件一般会在你的nginx目录中,比如我的在/etc/nginx/里,当然,没找到的话,你也可以去https://github.com/nginx/nginx/blob/master/conf/uwsgi_params,copy一份,或者复制下面的内容

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

文件名是uwsgi_params,没有后缀。把它放到你的Django工程中,和manage.py同目录。下面我们来配置nginx,并告诉它引用uwsgi_params文件。

进入你的Django工程目录,创建一个文件 mysite_nginx.conf,里面敲入:

# mysite_nginx.conf

# the upstream component nginx needs to connect to
upstream django {
    # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
    server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}

# configuration of the server
server {
    # the port your site will be served on
    listen      8000;
    # the domain name it will serve for
    server_name .example.com; # 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 /path/to/your/mysite/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /path/to/your/mysite/static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed
    }
}

这个文件中的内容我保留了英文文档中的注释,比较详细,可能会对你有一些意外的帮助。

server{}中的server_name可以接IP地址,比如:server_name  219.242.174.48,测试的话用你本机的吧,搭好了之后方便在同网段内使用其它机器测试。

这份配置文件告诉nginx从文件系统中建立媒体和静态文件服务,同时也处理Django应用中的请求。对于大型的部署而言,让一个服务器处理静态/媒体文件,另一个处理Django应用,会有很好的表现。不过现在,我们这么做也没问题。

然后执行下面的命令,让nginx知道有这么一个配置文件:

sudo ln -s mysite_nginx.conf /etc/nginx/sites-enabled/

部署静态文件

在运行nginx之前,必须把所有的Django静态文件收集到一个静态文件夹中,首先在settings.py中写入:

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

然后运行

python manage.py collectstatic

基本nginx测试

重启nginx服务

Ubuntu,Debian:

sudo /etc/init.d/nginx restart
Fedora,CentOS:
sudo service nginx restart
或者
systemctl restart nginx.service

为了测试我们是不是可以提供访问媒体文件的服务,找张图片比如"abc.png",放到你的Django工程中的媒体目录下,比如/var/www/project/project/media。然后访问http://127.0.0.1:8000/media/abc.png,如果有问题,需要先停止nginx(上面命令中restart改成stop),再启动。这样我们能得到一些提示信息,以便找出问题在哪。

nginx和uWSGI以及test.py的沟通

uwsgi --socket :8001 --wsgi-file test.py

前面nginx已经被设置好在8001端口与uWSGI通信,同时在外界服务被布置在8000端口,访问:http://127.0.0.1:8000/

如果能看到Hell World,说明我们打通的桥梁变成:

客户端(浏览器)——服务器(nginx)——socket——uWSGI——python

同时你也可以访问http://127.0.0.1:8001/,看看uWSGI的反应,暂不剧透……

到现在我们都是在使用TCP port socket,这样开始的时候会容易些,不过实际上使用Unix sockets 会更好些,会有较小的开销。

编辑我们刚才的nginx配置文件mysite_nginx.conf,做以下更改:

server unix:///path/to/your/mysite/mysite.sock; # for a file socket
# server 127.0.0.1:8001; # for a web port socket (we'll use this first)

重启nginx,

停下刚才的uWSGI服务,输入以下命令重新开启:

uwsgi --socket mysite.sock --wsgi-file test.py

mysite.sock文件会被自动建立,用做通信,你可以当它是个临时文件。当然不喜欢这个文件名,你也可以更改。用浏览器再访问一次8000端口,看看结果。

如果服务没能正常运行,查看一次啊nginx的错误日志,在/var/log/nginx/error.log。如果错误日志像是这样:

connect() to unix:///path/to/your/mysite/mysite.sock failed (13: Permission
denied)

那可能需要更改socket的权限,以便nginx可以使用它。

试一下:

uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666 # (very permissive)

或者:

uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664 # (more sensible)

可能你还需要把当前用户加入nginx用户组,反之也需要把nginx加入你当前用户的用户组。这样nginx应该就有权限访问socket文件了。

激动人心的时候要到了

现在我们可以尝试一下用uwsgi和nginx来运行我们的Django应用了。

在工程目录下运行:

uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=664

注意mysite.wsgi要改成你的工程名。

现在应该在浏览器中能看到你的工程了。

用ini文件来配置uWSGI

创建一个文件命名为'mysite_uwsgi.ini'

# mysite_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /path/to/your/project
# Django's wsgi file
module          = project.wsgi
# the virtualenv (full path)
# home            = /path/to/virtualenv

# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 10
# the socket (use the full path to be safe
socket          = /path/to/your/project/mysite.sock
# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true

如果你使用了virtualenv,home那个位置就不能注释掉。

以后再运行 uswgi就可以使用:

uwsgi --ini mysite_uwsgi.ini

进一步我们还可以让uWSGI运行在上帝模式,设置开机自动启动以及限制最大访问,工程文件大小之类的配置。

去吃饭了

这些内容我可能会在下一篇博客里写,想先了解的同学请移步:http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html#configuring-uwsgi-to-run-with-a-ini-file
这个文档相当全面,而且重要的是没有拼写错误这种情况。







版权声明:本文为博主原创文章,未经博主允许不得转载。

以上就介绍了如何用uWSGI和nginx来搭建Django工程,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

616

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

194

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

91

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

54

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

598

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

56

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

nginx浅谈
nginx浅谈

共15课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号