django,uWSGI,nginx的环境搭建(上)(渣翻)

一如既往的渣翻译时间~~由于质量还是一如既往的渣,所以如果您突然发现:TM的,我看不懂中文了。那么欢迎您,原文在此:Setting up Django and your web server with uWSGI and nginx。顺便吐槽一下,这个名字真是挺长的。

下面是正文:


正文

这份教程的目标对象是那些希望搭建生产服务器的用户。它将会引导您一步步设置django使之能与uWSGI以及nginx良好地协同工作。教程涉及的三个组件—-django,uWSGI以及nginx,提供了一个完全的web应用栈和一个服务器程序。(这句翻译貌似不太对劲,反正看看吧,原文:It covers all three components, providing a complete stack of web application and server software.)

django是一个高层次的python网络框架,它鼓励快速开发以及使用干净,实用的设计。

nginx (读作 engine-x),是一个免费,开源,广受好评的http服务器以及类似于IMAP/POP3代理服务器这样的反向代理。

一些和教程相关的笔记

nginx和uWSGI对于django开发来说,都是相当不错的选择。但是请注意,他们不是唯一的选择或者‘官方’指定的选择。尽管如此,他们都是极好的,并且值得您去花心思研究他们。

在这里,我们使用他们并与django配合使用是相当不错的一种方式,但是这并不是唯一一种方式,对于某些特殊的要求而言,他们或许并不是最佳的方式。

不管怎么着吧,接下来会向您介绍一些概念和流程,并且您也应该熟悉那些用来呈现django的软件。通过提供给您工作环境的配置步骤,以及对步骤的详述,将会对您未来探索其他的方面打下一个良好的基础。

首先我们假设您使用类unix环境,并且有一个如同aptitude这样的包管理器。当然,如果您问:对Mac OS X来说,和aptitude类似的包管理器有么?google一下,很容易找到答案。

并且我们也假设,您使用的django是1.4或者之后的版本。因为1.4之后的版本会在您的新项目中创建一个uwgi模块。如果您使用之前的版本,您需要自己折腾以取得django对wsgi模块的支持。

概念

对于一个web服务器来说,它面对的是整个外面的世界。它能够直接从文件系统中取得文件从而呈现出来。但是,服务器不能直接和django应用进行通话,它需要运行一个应用,用以在客户端请求的时候返回响应。

服务器网关接口—-WSGI就是干这事儿。而WSGI是python标准。

uWSGI是WSGI的实现。在这篇教程中,我们会设置uWSGI,通过它,创建Unix套接字,以及处理服务器和请求之间的联系。总之,完整的关系链大致是这样:

the web client <-> the web server <-> the socket <-> uwsgi <-> Django

一切开始之前

virtualenv

确认您在virtualenv环境中,如果没有,请运行下面几行代码,以切换virtualenv环境

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

Django

在您的virtualenv中安装django,并创建一个新的项目,最后cd到这个项目中。

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

(译者补记:如果您已经在全局环境中安装了django,那么请放弃virtualenv吧,因为虚拟环境中根本没有django包的关系,会处处报错。使用强制改变解释器的方式,只能运行manage.py,后期导入包的时候,还是会失败)

域名和端口

在这个教程中,我们称呼您的域名为example.com,以指代您拥有的域名。

同时,我们使用8000端口—-正如django默认的那样。您也可以选择您喜欢的端口,只要不与其他的正在运行的应用冲突就好。

基本的uWSGI的安装和配置

在您的virtualenv中安装uWSGI

pip install uWSGI

(译注:由于大陆众所周知的一些原因,有可能需要换源,推荐豆瓣的pypi的源)

当然您也有其他方式安装uWSGI,由于太麻烦,译者就跳过了……

基本测试

创建一个文件,并命名为 test.py

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

运行uWSGI

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

选项的意义

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

wsgi-file test.py: 载入指定的test.py文件

这会打印hello world在浏览器上,想要测试的话,访问 http://example.com:8000就好。

然后关系链是这样的:

the web client <-> uWSGI <-> Python

测试您的django工程

现在我们期望uWSGI做类似的事情,但是不是打印字符串而是运行一个django站点。

不过还是先测试一下吧。

python manage.py runserver 0.0.0.0:8000,是否好好运行了呢?

如果好了,运行下面的这个吧。

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

其中的 mysite.wsgi是载入wsgi模块用的。(译注:原文和这里有出入,官方那个其实并不能用,上面的应该就可以,问题是您必须在mysite文件夹里—第一层。您可以运行python,看是否能正确导入mysite.wsgi来测试)

现在其实我们的浏览器并没有直接和uWSGI对话。这件任务是属于服务器的。

基本的nginx

安装nginx

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

现在可以通过访问80端口去确认nginx是否正在提供服务。理论上来说,您将会得到这样的信息:Welcome to nginx!

于是现在,我们期望的工作链是这样:

the web client <-> the web server

如果端口80被占用了,您就必须重新配置nginx到另一个端口,在这个教程中,我们使用8000端口。

为您的站点配置nginx

您将会需要uwsgi_params文件。一般来说在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/mysite/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /path/to/your/mysite/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
        }
    }

这些配置告知了nginx从filesystem取得media和static文件。这是一个明智的举动,让服务器来处理static/media文件,然后django处理其他的文件是推荐的。不过这里,这样就够了。

软链接这个文件到 /etc/nginx/sites-enabled 中,就像这样:

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


待续吧,原来以为一篇就够了,我看了看进度,刚好还有一半,这里先说说一些我遇到的坑。

arch的nginx并没有site-enabled文件夹,需要自己增加一个,然后通过填写这样的配置,来使得nginx处理添加进site-enabled文件夹的软链接:

events
    {
        worker_connections 65535;
    }
http
{
    include mime.types;
    default_type application/octet-stream;
    gzip on;
    autoindex on;
    keepalive_timeout 65;

    include /etc/nginx/sites-enabled/*;

}

顺便一说,其实软链接也是有坑的。软链接只能是绝对路径而不能是相对路径。否则会有一个链接层数太多的错误。

话说剩下的明天再说吧……

其他的—–

恩,今天在看某本漫画《我妻同学成了我老婆》,名字不咋样内容很有趣,大致是有时空穿越能力的屌丝攻略女神的故事,吐槽满载。然后女主很可爱。推荐。

然后最近发现,苹果发布会挺适合练听力的,一边稍微写写一边有的没的地听,几天下来听力长进不少。话说下次看google发布会吧?

没什么好说的,明天再说吧。

以上