nginx+uwsgi+django部署

关于如何在生产服务器上部署nginx+uwsgi+django,最近遇到了不少坑啊,不过总算解决了,不用通过开发服务器进行访问了。
下面就把最近遇到的坑说一说,同时捋一遍流程。

声明,所有操作实在ubuntu服务器上进行的。

django

安装django

1
sudo pip install django
sudo easy_install django

以上两种方法都可以,建议不要用apt-get那个版本太低了,会出现不可预计的错误。

创建django项目

在目录/root/dev/下面执行命令

1
django-admin startproject myproject

那个myproject换成自己的项目名.
然后进入/root/dev/myproject下,创建一个应用

1
python manage.py startapp myapp

然后就是编写djiango的代码了。这里就不多说了。网上很多教程的。

使用开发服务器运行

关于如何调试django项目,只要在/root/dev/myproject下执行

1
python manage.py runserver 0.0.0.0:8000

uwsgi

安装uwsgi

1
sudo apt-get install python-dev
sudo pip install uwsgi

建议也不要使用apt-get那个版本也是过低,出现了不可预知的错误。

运行uwsgi

然后在app目录下创建一个文件wsgi.py,即/root/dev/myproject/myapp/wsgi.py
在文件中写入:

1
import os

from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
application = get_wsgi_application()

注意要修改你的项目名。
完成后,便可以通过uwsgi去跑django

1
uwsgi --http :8000 --chdir /root/dev/myproject  --module myapp.wsgi

当我们访问网站的时候发现我们的静态资源全部找不到了,这里我们就要用到nginx了。
当然我们之后要使用unix socket去代替它的端口,因为它要和nginx进行通信。

nginx

安装nginx

1
sudo apt-get install nginx

安装完成后可以访问127.0.0.1来查看是否启动。

配置文件

然后在项目的根目录/root/dev/myproject/下建立一个nginx的配置文件myproject.conf,在配置文件中写入:

1
# myproject.conf
# @InnerAc

# the upstream component nginx needs to connect to
upstream myproject {
    server unix:///root/dev/myproject/myapp.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 127.0.0.1; # 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 /root/dev/myproject/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /root/dev/myproject/static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  myproject;
        include uwsgi_params; # the uwsgi_params file you installed
    }

}

需要修改哪里,大家应该也能看的出来,然后将这个配置文件复制或者软链接到/etc/nginx/sites-enabled下。我是复制的,因为我软链接过去好像有时有用,有时没用。

1
sudo ln -s /root/dev/myproject/myproject.conf /etc/nginx/sites-enabled
或者
sudo cp /root/dev/myproject/myproject.conf /etc/nginx/sites-enabled

然后重启nginx

1
sudo /etc/init.d/nginx restart

Start

配置好nginx后,通过上面那个socket去启动uwsgi

1
uwsgi --socket myapp.sock  --module myapp.wsgi --chmod-socket=666

一定要给666权限,否则会报错的。报错信息在/var/log/nginx/error.log查看。
至此我们的生产服务器就部署完成了。
当然,也可以写一个xml文件来方便启动。

xml启动uwsgi

创建一个django.xml在项目根目录下:

1
<uwsgi>
    <socket>/root/dev/myproject/myapp.sock</socket>
    <chdir>/root/dev/myproject</chdir>
    <module>myapp.wsgi</module>
    <chmod>666</chmod>
</uwsgi>

然后通过:

1
uwsgi -x django.xml

启动。

PS

有人说,一定要用sock么?,我的回答是,可以不用,如果不用的话,仍然可以访问网站,但是你可以看一下你的静态资源的地址是不是就变了。