如何用uWSGI和nginx搭建Django工程

 我来答
从空去听8
2017-09-13 · TA获得超过7439个赞
知道大有可为答主
回答量:6907
采纳率:93%
帮助的人:5499万
展开全部
前言:
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

uWSGI的安装和基本配置:
我们使用pip包管理工具来安装uWSGI:

[plain] view plain copy
sudo pip install uwsgi
如果你还没有pip,那么装上它:
在 Debian 和 Ubuntu系统中使用:

[plain] view plain copy
sudo apt-get install python-pip
在 Fedora 和 CentOS系统中使用:

[plain] view plain copy
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

注意:Centos7.0及以上yum版本为3.4.X以上,yum groupinstall "Development Tools"是没用的,跳过这句,安装下面的python-devel就可以了

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

[python] view plain copy
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return ["Hello World"] # python2
#return [b"Hello World"] # python3
运行uWSGI

[plain] view plain copy
uwsgi --http :8000 --wsgi-file test.py
代码的意思是使用http协议,端口8000,载入我们的测试文件。如果一切正常,访问:

http://127.0.0.1:8000/ (注意冒号是英文的冒号)
你会看到熟悉且可爱的Hello World。这也就说明我们打通了客户端——uWSGI——Python的桥梁。
用你的Django工程代替test.py
首先确信一下我们的工程本身能正常运行,在终端进入你的工程目录,然后敲入:

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

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

那么现在我们打通客户端——uWSGI——Django的桥梁,恭喜。
如果你的Django工程叫abc,我建议你把它的全部内容都拷贝到/var/www/中。然后你的工程的manage.py文件就在/var/www/abc/中,这样可以避免因文件权限,带来的一些不能提供服务的问题。
好了可以停掉服务了,我们继续。

nginx的安装和基本配置:
安装 nginx
Ubuntu 和 Debian:

[plain] view plain copy
sudo apt-get install nginx
sudo /etc/init.d/nginx start
Fedora 和CentOS

[plain] view plain copy
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
首先我们需要一份uwsgi_params文件,这个文件一般会在你的nginx目录中,比如我的在/etc/nginx/里

[plain] view plain 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,里面敲入:

[python] view plain copy
# 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知道有这么一个配置文件:

[plain] view plain copy
sudo ln -s mysite_nginx.conf /etc/nginx/sites-enabled/

部署静态文件

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

[plain] view plain copy
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
然后运行

[plain] view plain copy
python manage.py collectstatic

基本nginx测试

重启nginx服务
Ubuntu,Debian:

[plain] view plain copy
sudo /etc/init.d/nginx restart
Fedora,CentOS:

[plain] view plain copy
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的沟通

[plain] view plain copy
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,做以下更改:

[plain] view plain copy
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服务,输入以下命令重新开启:

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

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

[plain] view plain copy
connect() to unix:///path/to/your/mysite/mysite.sock failed (13: Permission
denied)
那可能需要更改socket的权限,以便nginx可以使用它。

试一下:

[plain] view plain copy
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666 # (very permissive)
或者:

[plain] view plain copy
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664 # (more sensible)
可能你还需要把当前用户加入nginx用户组,反之也需要把nginx加入你当前用户的用户组。这样nginx应该就有权限访问socket文件了。

激动人心的时候要到了
现在我们可以尝试一下用uwsgi和nginx来运行我们的Django应用了。
在工程目录下运行:

[plain] view plain copy
uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=664
注意mysite.wsgi要改成你的工程名。

现在应该在浏览器中能看到你的工程了。
用ini文件来配置uWSGI
创建一个文件命名为'mysite_uwsgi.ini'

[plain] view plain copy
# 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就可以使用:

[plain] view plain copy
uwsgi --ini mysite_uwsgi.ini
进一步我们还可以让uWSGI运行在上帝模式,设置开机自动启动以及限制最大访问,工程文件大小之类的配置。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式