使用gunicorn和nginx简单部署Django程序

2015-12-19 08:51:58

本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议

之前一直使用的是 uwsgi,但 uwsgi的部署怎一个蛋疼了的啊,这次简单的换成了 gunicorn+gevent,性能强劲,非常喜欢,而且用起来还不 uwsgi简单,这次的部署我使用nginx做静态文件的反向负载

guniorn


gunicorn是来自于ruby的一个python反写版“服务器”,代码基本用c写出,性能非常强劲,而且可以与 geventtornadoeventletmeinheld等配合使用,是不是非常诱人了现在,

首先安装gunicorn:

sudo pip install gunicorn

然后安装你的配合使用的机制,这次我用的 gevent

sudo pip install gevent

gunicorn 的使用也非常简单,首先有几个东西需要选择:

  • -b (BIND)后面接你的外网IP

  • -w (WORKERS)表示“工人”数量,一般是线程数,但是python自带GIL锁,让python的多线程非常蛋疼,一般的公式是 你的核数+1

  • -k (WORKERCLASS) 表示你需要的工人类型,可以是 synctornadogeventevnetletgthread等等,默认是 sync

  • 你的app,如,如果是flask程序,像我博客就是 manage:app ,如果是django程序,便是 xxx.wsgi

所以我们先运行我们的gunicorn:

nohup gunicorn -b xx.xx.xx.xx:xxxx -k gevent -w 4 xxx,wsgi

好了,这时候我们打开浏览器的 http://xx.xx.xx.xx:xxxx ,但是看到我们的静态文件都没有了,所以我们准备使用nginx负载我们的静态文件

nginx


nginx是一位俄罗斯人用c++写的高性能服务器,相比与好几m的apache,nginx只有几百kb,是一个轻量级高性能的服务器,一般在高并发情况下首先考虑,国内淘宝团队还重写了nginx,推出了他们的tnginx

首先安装nginx

sudo apt-get update
sudo apt-get install nginx 

因为ubuntu自带的nginx镜像源,并不是最新版的(1.9),所以要最新版的nginx还需要自己找一下镜像源,部分镜像源还被墙了,就不在这里讨论了

我们打开nginx

sudo service nginx start

这个时候打开我们的浏览器,输入外网IP,就可以看见nginx的默认欢迎界面了

因为这次我们只是简单地配置,所以就简单粗暴的编辑位于 /etc/nginx/site-available/default文件了

vim  /etc/nginx/site-available/defalut

配置信息如下:

server {
     listen 80;

     server_name your domain_name;
     access_log /path/to/your/location;
     error_log /path/to/your/location;

    location / {
        proxy_pass http://xx.xx.xx.xx;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

然后这样还是没有静态文件的,这时候需要django的帮助

先设置好settings.py这两项:

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'statics')

然后输入:

python manage.py collectstatics

这个时候,你的文件就多了一个文件夹,那么你的所有静态文件就在里面了:

获得路径 statics_path

pwd

把你的nginx的default改成如下:

server {
     listen 80;

     server_name your domain_name;
     access_log /path/to/your/location;
     error_log /path/to/your/location;

    location / {
        proxy_pass http://xx.xx.xx.xx:xx;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /static {
        alias static_path;
    }
}

好,这时候重新载入nginx:

sudo service nginx reload
sudo service nginx restart

这时候你还需要把django的 settings.py里面的部分配置:

...
DEBUG=False
TEMPLATE_DEBUG=DEBUG
ALLOWED_HOSTS = ['*']
...

这样django会自动关掉你的debug,另外那个host最好是设为 *,因为会很多坑,这样你的404页面将会从你的 templates文件夹中选择,所以最好事先写好你的 404.html文件

好了,这时候你打开你的外网IP就可以看见你的网站了

如果有域名,这时候把它解析了就可以访问了如 xxxx.com

如果你的网站陷入一个403 forbidden的陷阱,那是因为nginx的权限不够,所以,把 /etc/nginx/nginx.conf里的user改了

vim /etc/nginx/nginx.conf

把他改成 root:

user root 
...

另外我的新网站:

http://www.zhaduixueshe.com

希望大家多多支持

Django 返回首页

Designed and built with all the love in the world by the Mr.ALJUN.

@SERVER BY NGINX AND POWER BY DIGITALOCEAN.

© COPYRIGHT BY GAGASALAMER 2015