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.conf

在上面的设置后,可以让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不建议这样处理静态文件,静态文件仍需在部署时在服务器中专门指定,已免增加服务器负担
posted @ 2017-04-12 17:40  不及格大学士兼鹿鼎公  阅读(514)  评论(0编辑  收藏  举报