Linux更新python及安装pip,Linux+Nginx+uWSGI+Django
升级python
升级python要确定安装zlib与zlib-devel,openssl与openssl-devel,bzip2与bzip2-devel否则下面安装setuptools或pip会出错,也可以后面装,只要重新编译一下python就行了。
yum install zlib zlib-devel openssl openssl-devel bzip2 bzip2-devel
wget http://python.org/ftp/python/2.7/Python-2.7.tar.bz2
tar -jxvf Python-2.7.tar.bz2
cd Python-2.7
./configure
make all
make install
make clean
make distclean
mv /usr/bin/python /usr/bin/python2.6
ln -s /usr/local/bin/python2.7 /usr/bin/python
将文件头部的#!/usr/bin/python改成#!/usr/bin/python2.6
vim /usr/bin/yum
安装pip
1.安装pip前需要安装setuptools
wget http://pypi.python.org/packages/source/s/setuptools/setuptools-2.0.tar.gz
tar xvf setuptools-2.0.tar.gz
cd setuptools-2.0
python setup.py build
python setup.py install
2.安装pip
wget --no-check-certificate https://github.com/pypa/pip/archive/1.5.5.tar.gz
tar zvxf 1.5.5.tar.gz
cd pip-1.5.5/
python setup.py install
#现在已经安装成功,可以使用了
测试pip install requests
Django部署(Nginx)
Django的启动及基本操作可参照:http://www.cnblogs.com/xtrtfp/articles/5229317.html
参考Django部署nginx:http://www.ziqiangxuetang.com/django/django-nginx-deploy.html (没有成功)
http://www.django-china.cn/topic/101/ (上,参考这个)
http://www.django-china.cn/topic/124/ (下,参考这个)
1.在Linux使用pip安装Django后需要安装几个包,
建议先装上,总比后面出错强
pip install django
yum
install
epel-release
python-devel
2.安装 supervisor, 一个专门用来管理进程的工具,我们用它来管理 gunicorn/uwsg
pip
install
supervisor
3.使用gunicorn / uwsgi 来部署 (二选一) ,我这里选择uwsgi
pip
install
uwsgi
4.首先使用django-admin.py startproject Linuxcmdb创建一个Django项目
5.使用python manage.py startapp cmdb来创建app
6.在新建的Linuxcmdb项目下新建django_wsgi.py文件,文件内容如下
#!/usr/bin/env python # coding: utf-8 import os import sys reload(sys) sys.setdefaultencoding('utf8') os.environ.setdefault("DJANGO_SETTINGS_MODULE","Linuxcmdb.settings") from django.core.handlers.wsgi import WSGIHandler application = WSGIHandler()
注意!os.environ.setdefault("DJANGO_SETTINGS_MODULE","Linuxcmdb.settings")这里面的Linuxcmdb是项目名
现在可以启动了。使用uwsgi --http :8000 --chdir /root/zt/python/Linuxcmdb --module Linuxcmdb.wsgi
注意这里是用http连接的
这样,你就可以在浏览器中访问你的Django程序了。所有的请求都是经过uwsgi传递给Django程序的。
7.接下来,就是如何将uwsgi与Nginx连接
上面的通过命令启动uwsgi --http :8000 --chdir /root/zt/python/Linuxcmdb --module Linuxcmdb.wsgi实际上只是我们测试的时候会用,在实际部署环境中,我们常用的是配置文件的方式
我们将要让Nginx采用8077端口与uWSGI通讯,请确保此端口没有被其它程序采用。
与步骤6的新建文件一样,在项目目录/root/zt/python/Linuxcmdb 下再新建一个djangochina_socket.xml文件
注意这里是用soket连接的
<uwsgi> <socket>8077</socket> <chdir>/root/zt/python/Linuxcmdb</chdir> <module>Linuxcmdb.wsgi</module> <processes>4</processes> <daemonize>uwsgi.log</daemonize> </uwsgi>
在上面的配置中,我们使用 uwsgi.log 来记录日志,开启4个进程来处理请求。
这样,我们就配置好uWSGI了。
8.配置Nginx
配置前当然得安装上Nginx,安装方法略。安装在了/usr/local/nginx/
修改nginx.conf文件,增加如下
server { listen 80; server_name www.you.com; access_log /usr/local/nginx/logs/access_django.log; error_log /usr/local/nginx/logs/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 /root/zt/python/static/; index index.html index.htm; } }
在上面的设置后,可以让Nginx来处理静态文件(/static/)。非静态文件请求Nginx会发给 socket 8077,然后让uWSGI来进行处理。
9.接下来启动Nginx与uWSGI服务器
启动Nginx
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx
启动uWSGI
cd /root/zt/python/Linuxcmdb/
uwsgi -x djangochina_socket.xml
此时报错了。这个错是说xml有问题。
解决上面uWSGI报错方法如下:因为uWSGI 支持多种配置文件格式,比如 xml,ini,json等等都可以。所以我采用ini来代替 -x参数的xml配置文件了
在Django项目目录下创建一个ini配置文件,配置文件内容如下
djangochina_socket.ini
[uwsgi] vhost = false plugins = python socket = 127.0.0.1:8077 master = true enable-threads = true workers = 4 wsgi-file = /root/zt/python/Linuxcmdb/Linuxcmdb/wsgi.py #virtualenv = /root/nowamagic_venv chdir = /root/zt/python/Linuxcmdb/
现在进入Django项目目录使用uwsgi --ini djangochina_socket.ini 来启动uWSGI服务则能成功了。
以上启动了Nginx与uWSGI服务后,在浏览器里就可以访问了,由于我在远程服务器里搭建的,所以我需要在我的本地电脑修改一下hosts文件,加上
172.16.150.72 www.you.com
现在在浏览器里访问得到如下结果,说明Linux+Nginx+uWSGI+Django配置成功咯!接下来就是需要将自己之前在windows下写的代码copy在相应的文件里
这个时候可能访问出错,只要修改django_wsgi.py文件注释两行并新加两行,如下就行了。
#!/usr/bin/env python # coding: utf-8 import os import sys reload(sys) sys.setdefaultencoding('utf8') os.environ.setdefault("DJANGO_SETTINGS_MODULE","test_01.settings") #from django.core.handlers.wsgi import WSGIHandler #application = WSGIHandler() from django.core.wsgi import get_wsgi_application
10,将项目放入Linux环境中,出现了几个总题,现总结如下:
1,使用python manage.py makemigrations生成数据库表的时候提示没有安装MySQLdb模块,安装方面采用源码,参考地址:http://www.jb51.net/article/48827.htm 安装完成MySQLdb模块后使用import MySQLdb还会出现一个ImportError: libmysqlclient.so.18错误,解决方法地址:http://www.111cn.net/database/mysql/60100.htm
2,我的项目由于使用了PIL模块,所以还提示了PIL不存在的错误,只要使用pip install image就能解决
3,静态文件调用的问题,对于静态文件,一种是使用Django自己的调用方法,一种是使用Nginx的调用。所在在这里我当然是用Nginx调用的方法了。下面说说两种方法的区别:
使用Django自己的调用方法通过查看settings.py文件可以看出来,他的DEBUG = True,则默认是调试模式,如果页面出错会直接在页面显示错误信息,并且使用自己静态文件定 义的位置,但是会有问题存在,admin后台管理打开没有样式。
如果使用Nginx指定静态文件(真实环境当然使用Nginx来处理静态文件)则修改settings.py文件如下
将DEBUG设置为False,ALLOWED_HOSTS写上自己服务器的ip地址或是域名(注:如果没有域名则需要写上*,否则会报400的错误)
如下配置后需要使用python manage.py collectstatic将静态文件收集到一个目录下面,包括admin后台管理需要的静态文件。
我们在nginx下面server配置如下,指定上面收集的静态文件目录既可。
大功告成了!
ps:每次新加静态文件使期生效都需要python manage.py collectstatic,这条命令会递增的来添加文件。
这样我每次新建一篇文章后文章头图片都显示不出来,因为是放到静态文件目录的,这样都需要手工python manage.py collectstatic 收集一次,这样是不合理的,网上搜了一下也没有搜出来。。可尝试将文章的头图片直接放入collectstatic 命令收集的静态文件目录中,我上面的例子在/root/zt/python/Linuxcmdb/static/
补充:如果设置 DEBUG = False则表示生产(正式)模式,但又不想加nginx,可以用下面的这种方式,在启动时加上--insecure参数(不安全参数)
还有一种是Django 1.8版本以下,可以在url中加上如下参数,不过这只限于1.8版本以下,同样的不推荐使用。
urlpatterns += patterns( '', url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}), )#django不建议这样处理静态文件,静态文件仍需在部署时在服务器中专门指定,已免增加服务器负担