记一次很是痛苦的解决问题过程

零、背景python

 

以前给微信公众号“爱手工”作过微信后台,最近因为服务器要更换,因此须要将后台迁移到新服务器上。mysql

 

 

 

1、问题出现

 

原本觉得很轻松就能搞定,安装Django以及各类依赖库,迁移数据,上传代码。nginx

简短截说,这里很重要的一步就是我想固然的用mysqldump来迁移数据,这是第一处错误sql

 

迁移过去之后,配置好nginx,runfcgi,用微信测试了一下发现没法正常工做。django

 

kill掉Python进程,用runserver来检测到低出现什么问题,发现报错 Bad request 400 (\x00\x00\x80......)。json

 

搜了一下,有人说是Django1.6须要设置ALLOWED_HOSTS,设置完以后仍是一样的错误。服务器

 

而后就各类搜。。。。在这里卡了有2~3天,全部能找的文章都找了就是无论用。微信

 

 

 

2、各类尝试

 

分别进行了以下尝试:app

  • 新建一个全新的django project,发现依然没法运行
  • 直接runserver 0.0.0.0:8007,用IP访问,发现正常
  • 将另外一个域名解析过去进行访问,发现出错

得出结论,代码和域名解析都没问题,只能是nginx出问题了。工具

 

搜了各类nginx配置,好比编码啊,增长header size啊,甚至对比了新服务器和旧服务器的全部nginx文件,都无论用。

 

 

 

3、第一个坑

在测试的过程当中发现一个问题,直接用IP能够访问,而后尝试了一下admin操做数据发现出错。后来猛然想到前面直接用mysqldump迁移的数据,可能会出问题。

 

搜了半天找到了django的数据迁移方法:

$ python manage.py dumpdata > xxx.json   // 导出json格式数据
$ python manage.py syncdb
$ python manage.py loaddata xxx.json // 导入

使用时候发现导入出错,解决办法是导出时候加参数,不导出一些配置信息:

$ python manage.py dumpdata --exclude=contenttypes --exclude=auth.Permission > xxx.json

这样就能够正确迁移数据了。

 

 

 

4、剑走偏锋

 

如今又回到核心问题了,Bad request。

 

能找的办法都试过了,仍是不行。猜想应该是nginx的fastcgi接口编码出现问题,致使传给django的url没有正确编码,因此django没法解析。

 

和徐景讨论了一下,他说既然IP直接访问能够,那不如就用反向代理好了,不要用fastcgi。

 

研究了一下,反向代理理论上确实可行。

 

nginx配置:

 server { listen 80; server_name wx.aishougong.com; location / { proxy_pass http://127.0.0.1:8007;
 } }

 

django的server采用flup是不行的,由于flup使用fastcgi,可是反向代理并非经过fastcgi通讯。

 

因此这里采用gunicorn,一个wsgi服务器。

 

gunicorn使用很简单:

$ gunicorn myproject.wsgi:application


试了一下,能够成功访问了。

 

可是又有一个问题,这个命令没法后台执行。

 

解决办法是采用supervisor,这是一个能够后台运行任何命令的工具。

$ sudo apt-get install supervisor

安装完成后在 /etc/supervisor/conf.d/目录建立gunicorn.conf文件,内容:

[program:gunicorn] command=gunicorn -b 127.0.0.1:8007 wx.wsgi:application directory=/wx user=nobody autostart=true autorestart=true redirect_stderr=true

command就是刚才执行的命令,directory是执行路径。

 

保存文件,运行:

$ sudo supervisorctl reread gunicorn: available $ sudo supervisorctl update

这样gunicorn就运行起来了,再用微信试一下,正常了。

 

记录一下supervisor的经常使用命令:

$ sudo supervisorctl status hello hello RUNNING pid 18020, uptime 0:00:50 $ sudo supervisorctl stop hello hello: stopped $ sudo supervisorctl start hello hello: started $ sudo supervisorctl restart hello hello: stopped hello: started

 

 

 

5、后记

 

写出来很简单,实际解决很是困难,耗费的时间超过10小时。好在最后仍是解决了,又学到了很多东西。

相关文章
相关标签/搜索