追逐繁星的孩子

お帰りなさい

首页 标签 归档 分类 关于
Django+Uwsgi+Nginx部署踩坑记
日期 2017-07-03   |    标签 Django   |    评论

最近写完博客的大部分内容,就想着抽个空把项目部署下。毕竟不能指着django的runsever(开发服务器)过日子。虽然最开始我竟然直接把nginx的location指向runserver IP:Port。而且淡定的思考着我要这uwsgi有何用:)。好吧,卖萌可耻,咱们进入正题!正如题目所说,这里采用uwsgi(python web服务器)+nginx来部署django应用。服务器是搬瓦工上的,有些坑也是是由于服务器配置低造成的,之后讨论!

一、环境准备

  • python3.5
  • django1.10
  • nginx1.1
  • 32位centos6.9 512M内存
  • mysql5.6
  • uwsgi--pip安装

二、操作步骤(简要)

这里主要聊部署方面,具体软件安装就不过多描述,后面针对我碰到的问题点到一下就行。

django部署需要修改settings.py,比如:

#settings.py
DEBUG = False
ALLOWED_HOSTS = ['*']

检查项目运行情况,测试访问一下。

python manage.py runserver 0.0.0.0:8000

测试访问OK进入项目根目录下,启动uwsgi,lm是我的项目名,-d 指定uwsgi运行日志文件位置,后台运行。正常情况下外网能通过 IP:8000 进行访问(静态文件除外——因为这边用nginx来处理)。关服务直接查进程kill就行。

uwsgi --socket :8000 --module lm.wsgi -d ./uwsgi.log

这里介绍下uwsgi运行方式: http方式和socket方式。

http方式启动,uwsgi自己会开启一个http进程用来处理http请求。一般适用于uwsgi独立部署。 socket启动则不会开启http进程,由前端webserver(比如nginx)服务器处理http请求。

接下来配置nginx之前先准备项目下的静态文件,以下命令为django部署时收集静态文件命令。STATIC_ROOT说明命令执行之后会在项目根目录下生成static文件夹,里面是根据各app生成的对应静态文件文件夹。

MEDIA_ROOT说明上传文件路径在根目录下media文件夹(这里我只是方便管理与静态文件放在一起而已)。

#收集静态文件
python manage.py collectstatic
#静态文件路径
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
#上传文件路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

接下来贴一下对应nginx配置:

server {
    listen 80;
    server_name localhost;  #自己指定相应IP或域名
    #项目访问路径
    location / {
        uwsgi_pass 127.0.0.1:8000;
    #根据自己的uwsgi_params填写
        include /usr/local/nginx/conf/uwsgi_params;
    }
    #静态文件,lm是我的项目名
    location /static {
        alias /opt/site/lm/static;
    }
    #上传文件
    location /media {
        alias /opt/site/lm/media;
    }
}
#仅允许域名访问,禁用IP访问
server {
    listen 80 default;
    return 500;
}

三、一些坑

这里就列举一下自己遇到的一些坑吧,包括但不限于部署。

mysql启动不了,或者启动了无故挂了,报错如下:

MySQL. ERROR! The server quit without updating PID file (/var/lib/mysql/localhost.localdomain.pid).

解决方法: 查看mysql启动日志,比如我的是因为mysql默认配置不能在我这个小内存上通用,故指定mysql相关配置(512M小内存下的配置)。

python3下mysql连接库。python3下使用PyMySQL,但是python3.5不支持PyMySQL,导致django启动报错如下:

No module named MySQLdb

解决方法:

pip install mysqlclient

OR

#项目名下__init__.py添加
import pymysql
pymysql.install_as_MySQLdb()

django后台插入中文报错

解决方法: 其中一个原因是由于数据库编码格式不对,建库的时候指定utf-8吧!

四、结语

  1. python的版本问题坑比较多,同一环境下装多个python环境要特别注意,很容易出现兼容或者库不存在问题等等。

  2. 碰到问题首先面向日志、报错debug,之后才google,sof等等。

  3. 很多时候google不到只是你的搜索方式不对而已。