django博客搭建(二)Nginx+Django+Uwsgi架构部署

(作者翻译整理自官方文档,https://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html,更详细了解请参考官方文档)
web 服务器可以直接位文件系统的文件(HTML,图像,CSS等)提供服务。但是,它不能直接与Django应用程序交互,
它需要一个能直接运行Djanog应用程序,向它发送客户端请求,并返回响应。
于是就出现了Web服务器网关接口:WSGI ,来做这件工作。
uWSGI是一个WSGI实现。它会创建一个Unix套接字,并通过WSGI协议向Web服务器提供响应。
他们的关系如下:
the web client <-> the web server <-> the socket <-> uwsgi <-> Django

安装和配置:
Django

安装Django,创建一个新的项目:

$pip install Django
$django-admin.py startproject mysite
$cd mysite

uWSGI
安装uWSGI:

$pip install uwsgi

创建文件test.py,测试

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

运行uwsgi

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

该选项的意思是:
HTTP:8000:使用HTTP协议,端口8000
WSGI-file test.py:加载指定的文件,test.py
直接访问127.0.0.1:8000,如果看到Hello World,说明以下组件工作正常:
the web client <-> uWSGI <-> Python
测试你的Django项目

首先,请确保你的mysite项目工作正常:

$python manage.py runserver 0.0.0.0:8000

如果它的工作正常,使用uWSGI运行它:

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

module mysite.wsgi: 加载指定的wsgi模块
直接访问127.0.0.1:8000,如果一切正常,说明uWSGI可以serve你的Django应用程序,而以下组件正常工作:
the web client <-> uWSGI <-> Django

安装Nginx

$sudo apt-get install nginx
$sudo /etc/init.d/nginx start    # start nginx


访问127.0.0.1:8000,看到 “Welcome to nginx!”. 说明安装成功,以下组件正常:
the web client <-> the web server
为你的站点配置Nginx:
首先你需要uwsgi_params文件,该文件可在nginx的安装目录下(比如Ubuntu在/etc/nginx/),
或者从https://github.com/nginx/nginx/blob/master/conf/uwsgi_params下载
把它复制到你的项目目录,后面nginx会用到它。
现在,创建一个名为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
    }
}

这个conf文件告诉nginx,媒体文件和静态文件处理请求路径和方式。让一台服务器处理静态/媒体文件,另一个处理Django应用程序,
这对于一个大的项目来说是很好的做法,这会做就好了。
在/etc/nginx/sites-enabled/ 这个文件夹下建立链接,让nginx可以看到:

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

部署静态文件:
打开mysite/settings.py 添加:

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

然后运行:

$python manage.py collectstatic

重启 nginx:

$sudo /etc/init.d/nginx restart


添加一个名为media.png的图片到 /path/to/your/project/project/media 目录下,访问127.0.0.1:8000/media/media.png
如果到此仍然正常工作,至少确定nginx可以正确提供服务。

使用Unix套接字,而不是端口
编辑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 --socket mysite.sock --wsgi-file test.py

如果错误日志里出现
connect() to unix:///path/to/your/mysite/mysite.sock failed (13: Permission
denied)
尝试:

$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)

使用uwsgi和nginx运行Django应用程序

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

配置uWSGI以使用一个.ini文件来运行
创建一个名为`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

并使用该文件运行uswgi:

$uwsgi --ini mysite_uwsgi.ini # the --ini option is used to specify a file

基本到此就完成.

更多请参考:
Django:https://docs.djangoproject.com/en/1.7/
Nginx:http://nginx.org/en/docs/
uWSGI:https://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html
如有疑问,欢迎交流