Nginx+uWSGI部署Django网站的详细步骤,脱坑必备,值得收藏!

Posted 墨子谷python训练营

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx+uWSGI部署Django网站的详细步骤,脱坑必备,值得收藏!相关的知识,希望对你有一定的参考价值。

对于Django部署来说,选择nginx和uWSGI是一个不错的选择,此教程旨在将Django部署到生产环境的服务器中。当然你也可以使用Apache或者其他的服务器部署方式,不过笔者看来,用uWSGI还是相对简单的。

概念

Web Server是面向外界的。它可以提供文件服务,但并不能直接与Django应用通话;它需要一些东西来运行这个应用,将请求从客户端喂给它,并且返回响应。

Web Server Gateway Interface - WSGI - 就是用来做这件事的。WSGI是一种Python标准。

uWSGI是WSGI的一种实现。在此教程中,我们将创建uWSGI,以让它创建一个Unix socket,并且通过 WSGI协议来服务于web server的响应。

安装uWSGI之前,先确保拥有一个python虚拟环境:

 
   
   
 
  1. virtualenv uwsgi-tutorial  

  2. cd uwsgi-tutorial  

  3. source bin/activate

安装Django

将Django安装到你的虚拟环境中,创建一个新的project,并 cd 到这个目录下:

 
   
   
 
  1. pip install Django  

  2. django-admin.py startproject mysite  

  3. cd mysite

关于域和端口

在这篇教程中,我们将称你的域为 example.com,可以自行替换为你的IP。

通篇我们将使用8000端口来部署web服务,就如Django运行环境默认的一样。当然你也可以换成另外的端口,但注意不要与其他应用冲突。

基本的uWSGI安装和配置

在virtualenv中安装uWSGI

 
   
   
 
  1. pip install uwsgi

注意在安装uwsgi之前请确保安装了python开发包,使用Debian系统的话,安装pythonX.Y-dev,X.Y是Python的版本。

简单测试

创建一个文件test.py:

 
   
   
 
  1. # test.py

  2. def application(env, start_response):  

  3.    start_response('200 OK', [('Content-Type','text/html')])

  4.    return [b"Hello World"] # python3

  5.    #return ["Hello World"] # python2

运行uWSGI:

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

参数意义:

 
   
   
 
  1.    http :8000:使用http协议,8000端口

  2.    wsgi-file test.py:载入特定文件, test.py

这应该直接在浏览器中返回hello world。访问:

 
   
   
 
  1. http://example.com:8000

以检查。如果如此,说明配置成功了.

测试你的Django project

现在我们想让uWSGI做同样的是,但是是运行一个Django项目,而不是test.py模块。如果你还未这样做过,请确保你的 mysite 项目运行正确:

 
   
   
 
  1. python manage.py runserver 0.0.0.0:8000

如果它成功了,使用uWSGI运行它:

 
   
   
 
  1. uwsgi --http :8000 --module mysite.wsgi

module mysite.wsgi:载入特定wsgi模块 
在浏览器中访问你的服务器,如果出现了网站,说明uWSGI可以服务一个Django应用 
现在一般我们不会让浏览器直接与uWSGI对话。这是web server的工作。

基本的 nginx 配置 
1、安装 Nginx

 
   
   
 
  1. sudo apt-get install nginx  

  2. sudo /etc/init.d/nginx start    # start nginx

安装完后检查nginx正在服务,访问80端口,你应该能得到一个“Welcome to nginx!”的返回。为你的网站配置Nginx,你需要uwsgi_params文件,访问GitHub下载。

复制到你的项目目录。之后我们会通知Nginx来引用它。

现在,创建一个文件叫做mysite_nginx.conf,然后把这些放进去(可以复制default修改):

 
   
   
 
  1. # mysite_nginx.conf

  2. # the upstream component nginx needs to connect to

  3. upstream django {  

  4.    # server unix:///path/to/your/mysite/mysite.sock; # for a file socket

  5.    server 127.0.0.1:8001; # for a web port socket (we'll use this first)

  6. }

  7. # configuration of the server

  8. server {  

  9.    # the port your site will be served on

  10.    listen      8000;

  11.    # the domain name it will serve for

  12.    server_name .example.com; # substitute your machine's IP address or FQDN

  13.    charset     utf-8;

  14.    # max upload size

  15.    client_max_body_size 75M;   # adjust to taste

  16.    # Django media

  17.    location /media  {

  18.        alias /path/to/your/mysite/media;  # your Django project's media files - amend as required

  19.    }

  20.    location /static {

  21.        alias /path/to/your/mysite/static; # your Django project's static files - amend as required

  22.    }

  23.    # Finally, send all non-media requests to the Django server.

  24.    location / {

  25.        uwsgi_pass  django;

  26.        include     /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed

  27.    }

  28. }

这一配置文件告诉nginx从文件系统为文件提供服务,以及处理需要Django的请求。

2、创建一个链接以让nginx发现它: 

sudo ln -s ~/path/to/your/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/ 

3、部署静态文件

在运行nginx之前,要把Django的静态文件集中到static文件夹中。首先你应该修改 mysite/settings.py文件,添加:

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

然后执行:

 
   
   
 
  1. python manage.py collectstatic

4、基本nginx测试

重启nginx

 
   
   
 
  1. sudo /etc/init.d/nginx restart

为确定Media文件被正确服务,添加一个图片文件media.png到/path/to/your/project/project/media directory目录,然后访问http://example.com:8000/media/media.png。 如果成功,你将会知道至少nginx服务文件是正常的。

nginx和uWSGI和test.py

让我们让Nginx来与“hello world” test.py进行通话。

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

这几乎与之前的一样,除了参数不同。

 
   
   
 
  1. socket :8001:使用uwsgi协议,8001

Nginx同时配置完成了,以与uWSGI通信在8001端口通信,并在外部8000端口通信。访问:

http://example.com:8000/

以检查。使用Unix sockets代替端口。使用TCP端口socket虽然简单,但是最好使用 Unix sockets而不是端口。

编辑 mysite_nginx.conf:

 
   
   
 
  1. server unix:///path/to/your/mysite/mysite.sock; # for a file socket  

  2. # server 127.0.0.1:8001; # for a web port socket (we'll use this first)

重启nginx。

重新运行 uWSGI:

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

在浏览器中访问 http://example.com:8000/ .
如果不起作用,检查nginx 错误日志 (/var/log/nginx/error.log)。如果你看到如下:

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

  2. denied)

说明权限不够,尝试:

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

或者:

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

使用uWSGI和Nginx运行Django项目,现在运行Django项目:

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

现在uwsgi和nginx应该在服务你的Django应用,而不是hello world。 
配置uWSGI以使用.ini文件运行

可以将参数放在文件中,然后运行该文件以运行uwsgi。

创建一个文件mysite_uwsgi.ini:

 
   
   
 
  1. # mysite_uwsgi.ini file

  2. [uwsgi]

  3. # Django-related settings

  4. # the base directory (full path)

  5. chdir           = /path/to/your/project  

  6. # Django's wsgi file

  7. module          = project.wsgi  

  8. # the virtualenv (full path)

  9. home            = /path/to/virtualenv

  10. # process-related settings

  11. # master

  12. master          = true  

  13. # maximum number of worker processes

  14. processes       = 10  

  15. # the socket (use the full path to be safe

  16. socket          = /path/to/your/project/mysite.sock  

  17. # ... with appropriate permissions - may be needed

  18. # chmod-socket    = 664

  19. # clear environment on exit

  20. vacuum          = true

使用如下命令运行uwsgi:

 
   
   
 
  1. uwsgi --ini mysite_uwsgi.ini

修改好文件后重新启动uwsgi和nginx

 
   
   
 
  1. sudo systemctl start nginx

  2. sudo systemctl start uwsgi


学习云技术底层实现,了解最新python知识


以上是关于Nginx+uWSGI部署Django网站的详细步骤,脱坑必备,值得收藏!的主要内容,如果未能解决你的问题,请参考以下文章

Django部署——uwsgi+Nginx

django+uwsgi+nginx部署(非常详细)

瞬间心情愉悦,头发都少掉了几根!---Django+uwsgi+Nginx项目部署超详细步骤

瞬间心情愉悦,头发都少掉了几根!---Django+uwsgi+Nginx项目部署超详细步骤

Django+uWSGI+Nginx 部署网站

部署django+uwsgi+Virtualenv+nginx+supervisor详细步骤