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干货欢迎关注 微信公众号、知乎专栏:Python中文社区 ,致力于成为国内最好的Python开发者学习交流平台,这里有关于Python的国内外最新消息,每日推送有趣有料的技术干货和社区动态。

Python中文社区微信公众号:

picture.image

Python中文社区QQ交流群:

picture.image

Python各专业技术QQ交流群 :

Python中文社区:309365624
Python中文社区Github群组:

596796724

Python网络爬虫组:206241755
Python数据分析挖掘组:539956362
Python高级技术交流:273186166
PythonWeb开发组:577672548
Python树莓派组:338456791
Python渗透测试组:274631467
Python量化交易策略组:264204289
Python自然语言处理组: 570364809
微信公众号:Python中文社区
知乎专栏:Python中文社区

0
0
0
0
评论
未登录
暂无评论