近期在努力把自己的項目從python2轉到python3上,因為生產環境無法拋棄centos7,所以只好在centos7上安裝了python3。裝好了python3,將python命令軟連接改成python3的,同時也將pip指向了python3版本的pip。一切都很順利,但在用uwsgi啟動一個django的web服務時才發現出了問題:服務是啟動了,但是一訪問接口就返回500,再一看uwsgi這邊的日志,顯示:no python application found 。
nginx+uwsgi+django的模式在之前多次配過,都沒有出現問題啊,為啥一到了python3的環境下就出問題了?我的環境應該配置得差不多了啊,而且所有的模塊也都是在python3的環境下裝的啊。
再次檢查了我的配置文件:
[uwsgi]
socket = 127.0.0.1:3031
chdir = /opt/testproj/
wsgi-file = testproj/wsgi.py
processes = 4
threads = 2
感覺也沒有啥問題啊。於是又開始仔細查看uwsgi這邊輸出的日志,再往前看看,才看到了這么個報錯:
*** Operational MODE: preforking+threaded ***
Traceback (most recent call last):
File "testproj/wsgi.py", line 12, in <module>
from django.core.wsgi import get_wsgi_application
ModuleNotFoundError: No module named 'django'
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
沒有找到django模塊?原來成功啟動只是一個假象,實際上現在uwsgi沒找到django這個模塊,一提供服務肯定就500了。
但是為啥會沒有找到django模塊呢?uwsgi和django都是用python3的pip來裝的啊,雖然這個centos7上還有python2,但也只是為了讓yum還能正常使用而保留的啊。
在網上一頓找,才發現,uwsgi還真是有點特殊,在python2和python3共存的系統上就會有點問題,這次啟動時無法找到django模塊是因為uwsgi命令使用python2的環境來進行了啟動。需要在配置文件中指定所需要的庫環境才可以。
於是開始找django的環境,使用pip show可以看到django安裝的location:
[root@knktc testproj]# pip show django|grep -i location
Location: /usr/local/lib64/python3.6/site-packages
順便把pytz的路徑也找下:
[root@knktc testproj]# pip show pytz|grep -i location
Location: /usr/local/lib/python3.6/site-packages
把這兩個路徑使用pythonpath參數加入到配置文件中,修改后的uwsgi配置文件是下面的這個樣子的:
[uwsgi]
socket = 127.0.0.1:3031
chdir = /opt/testproj/
wsgi-file = testproj/wsgi.py
processes = 4
threads = 2
pythonpath = /usr/local/lib64/python3.6/site-packages
pythonpath = /usr/local/lib/python3.6/site-packages
再啟動一次試試:
uwsgi --ini uwsgi.ini
一切正常!