django 生产环境
django部署生产环境使用的比较多的是nginx+uwsgi和 apache+mod_python
由于对nginx比较熟一些,所以这里先使用nginx来进行部署。
安装pip
$ sudo apt-get install python-pip python-dev build-essential
$ sudo pip install --upgrade pip
$ sudo pip install --upgrade virtualenv
安装uwsgi
将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是NGINX的强项)。然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。
第一步先解决uwsgi与django的桥接。解决在没有nginx的情况下,如何使用uwsgi+DJANGO来实现一个简单的WEB服务器。
第二步解决uwsgi与Nginx的桥接。通过nginx与uwsgi的桥接,打通nginx与django的连通,从而比较完美的实现django的部署。
安装uwsgi
$ export LDFLAGS="-Xlinker --no-as-needed"
$ pip install uwsgi
测试uwsgi
在你的机器上写一个test.py
#test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return "Hello World"
然后执行shell命令:
uwsgi --http :8001 --wsgi-file test.py
访问网页:
http://127.0.0.1:8001/
看在网页上是否有Hello World
安装django
django安装,我用的是比较新的版本,由于老版本总是出现这样那样的问题,也和最新的文档对接不上,django的版本升级实在是太快了。
sudo pip install django==1.9.6
安装git
安装git,来远程获取代码
sudo apt-get install git
安装好git之后需要导入我的代码,创建一个目录,然后在目录下
git init
git clone https://github.com/yourwilliam/melonblog
就可以将代码clone到本地了。
安装pip
使用django还需要把代码依赖的python包考到本地,这里也使用pip来管理,pip的安装和配置参看其他的博客中有介绍。
安装MySQL数据库和相关python驱动包
sudo apt-get install mysql-server
apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
sudo apt-get install python-mysqldb
创建数据库
需要 create database
使用python来创建数据库
python manage.py migrate
# 创建数据库
python manage.py makemigrations blog
python manage.py makemigrations mshow
# 创建各个APP的数据库
python manage.py migrate
启动django做测试
python manage.py runserver 0.0.0.0:8001
root@iZ23b233aiuZ:/home# pip install django-wsgi
配置uwsgi
详细可以参考
五步教你实现使用Nginx+uWSGI+Django方法部署Django程序上
五步教你实现使用Nginx+uWSGI+Django方法部署Django程序下
编写django_wsgi.py文件,将其放在与文件manage.py同一个目录下
编写文件时需要注意语句os.environ.setdefault。比如,如果你的项目为mysite,则你的语句应该是 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
#!/usr/bin/env python
# coding: utf-8
import os
import sys
# 将系统的编码设置为UTF8
reload(sys)
sys.setdefaultencoding('utf8')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
升级了django和wsgi新版本之后这里需要改为
#!/usr/bin/env python
# coding: utf-8
import os
import sys
# 将系统的编码设置为UTF8
import django
reload(sys)
sys.setdefaultencoding('utf8')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hansapwiki.settings")
django.setup()
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()
启动
udo uwsgi --http :8000 --chdir /opt/melonblog/melonblog --module django_wsgi
在这里的时候访问页面,出现css,js或者图片无法加载,可以不用担心,因为此时uwsgi仅仅处理数据请求,这些静态文件需要使用nginx来读取,在配置好nginx之后就可以配置了。
配置uwsgi的XML文件
djangochina_socket.xml, 将这个文件配置为
<uwsgi>
<socket>:8077</socket>
<chdir>/opt/melonblog/melonblog</chdir>
<module>django_wsgi</module>
<processes>4</processes> <!-- 进程数 -->
<daemonize>uwsgi.log</daemonize>
</uwsgi>
安装nginx
安装nginx
sudo apt-get install nginx
#启动、停止和重启
sudo /etc/init.d/nginx start
sudo /etc/init.d/nginx stop
sudo /etc/init.d/nginx restart
#或者
sudo service nginx start
配置nginx
使用apt-get获取的nginx默认的在_etc_nginx/ 下,修改下面的nginx.conf 文件
server {
listen 80;
server_name 121.41.8.92;
access_log /var/log/nginx/melonblog/access.log;
error_log /var/log/nginx/melonblog/error.log;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8077;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /static/ {
alias /opt/melonblog/melonblog/blog/static/;
index index.html index.htm;
}
location /media/ {
alias /opt/melonblog/melonblog/blog/static/media/;
}
}
这样便设置了上面的目录结构
配置完成后重启nginx nginx -s reload
启动uwsgi服务器
cd /opt/melonblog/melonblog/
uwsgi -x djangochina_socket.xml
关闭uwsgi进程的方法
ps -ef|grep uwsgi
#如果启动没有完成,这个是没有进程的,有进程代表启动成功
kill -9 *****
#将所有的进程杀死可以完成
其他配置
admin的样式问题
由于后台使用admin 模块,在django服务器中,会默认的将所有的static文件都写入到static目录中。但是此时是由nginx来进行静态文件转发,所以无法转发,需要在转发中添加admin部分的静态文件,在nginx配置文件中添加
location /static/admin/ {
alias /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/;
}