零、背景python
以前給微信公衆號「愛手工」作過微信後臺,最近因爲服務器要更換,因此須要將後臺遷移到新服務器上。mysql
原本覺得很輕鬆就能搞定,安裝Django以及各類依賴庫,遷移數據,上傳代碼。nginx
簡短截說,這裏很重要的一步就是我想固然的用mysqldump來遷移數據,這是第一處錯誤。sql
遷移過去之後,配置好nginx,runfcgi,用微信測試了一下發現沒法正常工做。django
kill掉Python進程,用runserver來檢測到低出現什麼問題,發現報錯 Bad request 400 (\x00\x00\x80......)。json
搜了一下,有人說是Django1.6須要設置ALLOWED_HOSTS,設置完以後仍是一樣的錯誤。服務器
而後就各類搜。。。。在這裏卡了有2~3天,全部能找的文章都找了就是無論用。微信
分別進行了以下嘗試:app
得出結論,代碼和域名解析都沒問題,只能是nginx出問題了。工具
搜了各類nginx配置,好比編碼啊,增長header size啊,甚至對比了新服務器和舊服務器的全部nginx文件,都無論用。
在測試的過程當中發現一個問題,直接用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
這樣就能夠正確遷移數據了。
如今又回到核心問題了,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
寫出來很簡單,實際解決很是困難,耗費的時間超過10小時。好在最後仍是解決了,又學到了很多東西。