cundi / blog

push issues as a blog
2 stars 0 forks source link

使用uWSGI和nginx配置Django与web服务器[摘录翻译uWSGI文档] #6

Open cundi opened 9 years ago

cundi commented 9 years ago

使用uWSGI和nginx配置Django与web服务器

该指南主要针对的是希望配置一台生产环境中的web服务器的Django用户。通过配置Django所需的步骤,它就能很好的和uWSGI以及nginx发挥作用。它包括了所有点三个组件,并提供了一个完整的web应用栈和服务器软件。

Django是高级的Python鼓励快读开发,同时具有清晰和务实的设计这样的一个网站开发框架。

ningx(发音:engine-x)是自由、而且开源的一个高性能HTTP服务器,它可以反向代理,而且也可以作为IMAP/POP3的代理服务器。

对该指南的一些注释

注释
这是一份指南,而且并没有提供一个参考指南的打断,永远不要认为这是有关开发主题的一份内容详尽的手册。

nginx和uWSGI部署Django的上好选择,不过他们并不是唯一的选择,或者是“官方化”的选择。选择两者中的任何一个都是非常棒的,我们鼓励你进行调查研究后再做选择。

这里我们部署Django的方法确实是一个好方法,但却不是唯一的方法,就某些需求来说它也不是最好的选择。

注释
该指南对你当前正在使用的系统作出了一些假设。

假设你正在使用类Unix系统,而且主要使用的是类aptitude包管理器。不过你要是问我“在Mac OS X系统上和aptitude相当的命令是什么”这样的问题,其实这类问题的答案相当简单。

基本概念

web服务器需要面向外部世界。它可以直接地从文件系统伺服文件(HMTL, iamges, CSS等等)。不过他不能直接地和Django应用对话。它需要能够运行这个应用的东西,接受来自web客户端(比如浏览器)请求并返回响应。

Web服务器网管接口-WSGI来完成这个工作。WSGI是一个Python标准。

uWSGI是WSGI的另外一种实现。该指南中我们将配置好uWSGI,这样它就可以创建Unix socket,并通过WSGI协议来伺服到web服务器的响应。最后,完整的组件栈模样大概如此:

web客户端 <-> web服务器 <-> socket <-> uwsgi <-> Django  

配置uWSGI之前的准备工作

virtualenv
确保我们所需安装的软件使用了virtualenv(稍后我们就来叙述适用于所有系统的uwsgi安装过程):

virtualenv uwsgi-tutorial
cd uwsgi-tutorial
source bin/activate

Django
将Django安装到virtualenv中并创建一个新的项目,然后cd到这个项目:

pip install django
django-amdin.py startproject mysite
cd mysite

域名和端口

本指南中我们会调用到你的域名 example.com。这里酌情替换为自己的FQDN或者IP地址。

本指南中,在发布时对web服务器使用了8000端口,就像Django runserver默认所作的那样。你可以使用任何你所希望用的端口,不过就我来说,我会选择8000端口,因为它不与web服务器中可能已经使用的端口发生冲突。

基本的uWSGI安装与配置

安装uWSGI到virtualenv

pip install uwsgi

当然肯定还有其他的方法可以安装uWSGI,不过这个方法和其他任何一个方法一样好。不要忘了,你得安装Python开发包才可以啊。在Debian或者基于Django的系统,比如UBuntu来说,你需要做的就是安装pythonX.Y-dev,这里X.Y代表Python的版本。

基本测试

创建一个叫做test.py的文件:

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

注释

注意在Python中需要bytes()。

运行uWSGI:

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

选项的含义:

该命令会在浏览器的8000端口上直接地显示一个消息'hello world'。访问地址:

http://example.com:8000

如果显示结果正确,这就意味着下面的组件栈起作用了:

web客户端 <-> uWSGI <-> Python

测试Django项目

现在我们想让uWSGI完成相同的工作,不过运行的是Django站点而不是test.py模块。

假如你还没有这样做,请确保项目mysite可以真正的运行:

python manage.py runserver 0.0.0.0:8000

假如上面的命令能够起作用,那么接下来可以利用uWSGI来运行该站点:

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

将浏览器指向服务器,假如网站出现了,这就意味着uWSGI能够从virtualenv伺服Django应用,那么下面的栈操作也是正确地:

web客户端 <-> uWSGI <-> Django

从现在起,我们就不用直接地使用浏览器与uWSGI通信。这是由作为中间媒介的web服务器来完成的工作。

基本的nginx

安装nginx

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

现在可以通过web浏览器访问nginx

web客户端 <-> web服务器

如果有其他的进程占用了你想用的80端口,那么你必须重新配置nginx以提供一个不同的端口。不过,就本指南来说,我们使用的是8000端口。

为你的站点配置nginx

你需要的是uwsgi_params文件,它可以从nginx目录的uWSGI部分找到,https://github.com/nginx/nginx/blob/master/conf/uwsgi_params

将改文件复制到项目的目录中。一会儿我们就会让nginx引用它的。

现在,新建一个叫做mysite_nginx.conf的文件,然后把下面的内容写入该文件:

# mysite_nginx.conf

# 上游组件nginx需要连接它
upstream django{
    # server unix:///path/to/your/mysite/mysite.sock; # socket文件
    server 127.0.0.1:8001; # web端口的socket(优先使用)
}

# 服务器的配置
server{
    # 站点所提供的端口
    listen      8000;
    # 站点提供的域名
    server_name .example.com; # 替换为你自己机器的地址
    charset     utf-8;

    # 最大上传尺寸
    client_max_body_size 75M;   # 请酌情修改

    # Django媒体
    location /media{
        alias /path/to/your/mysite/media; # Django项目的媒体文件所在,请按需改进
    }

    location /static{
        alias /path/to/your/mysite/static; # 项目的静态文件目录,按需修改
    }

    # 最后,将所有非媒体请求全部发送到Django服务器。
    location / {
        uwsgi_pass django;
        include /path/to/your/mysite/uwsgi_params; #  
    }
}