今まで、PythonのフレームワークDjangoで作成したアプリケーションをエックスサーバーにアップしていました。
今回、データベース移行の際に仮想環境をLinuxbrewからcondaに変更したのですが、その際にエラーが出てしまったので、その対処法をまとめています。
エックスサーバーの仮想環境をcondaに変更したら500エラーになった
ことの発端は、Linuxbrewが使えなくなったから
PythonのDjangoアプリケーションをエックスサーバーに入れたのは1年以上前の話でした。
そもそもエックスサーバーにはpipやDjangoが入っていないので、仮想環境で入れている形でした。
その時はLinuxbrewを使用して入れたのですが、
正直以前の環境は残っているのでそのまま使ってもいいのですが、使えないものを使い続けるのも怖いので。
心機一転、新しい仮想環境を使おうと思いました。
使用するのはさまざまなサイトで紹介されているAnacondaですね。
それの縮小版であるminicondaを使用しました。
minicondaインストールした瞬間、500エラー
入れたは良いんですけど、その瞬間にエラーでアプリが落ちてしまいました。
500エラーですね。エラーを確認すると以下のようなエラーが。
index.cgiのファイルを実行する際に、headerの前に落ちているようです。
元々のindex.cgiの中身は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/home/--旧仮想環境パス--/bin/python # coding: utf-8 import sys, os sys.path.insert(0, "/home/--旧仮想環境パス--/bin") os.environ['DJANGO_SETTINGS_MODULE'] = "--アプリ名--.settings.production" from wsgiref.handlers import CGIHandler from django.core.wsgi import get_wsgi_application application = get_wsgi_application() CGIHandler().run(application) |
Pythonのパスが以前の仮想環境になっていたので直したのですが、
それでも500エラーが解消されませんでした。
実際にエックスサーバーのcgiファイルをコンソールで叩いてみる
cgiファイルって何でエラーになっているか分かりませんよね。
サーバーのエラーログ見ても詳しいことは分かりませんし。
ということで、SSL上で直接index.cgiを叩いてみることにしました。
TeraTermでサーバーに入って、index.cgiを
で実行してみると以下のようなエラーが。
いやいや、そんな馬鹿な。
Djangoはもちろん新しい環境で入れています。
以前のindex.cgiでは動いていたのに、今回は受け取ってくれませんでした。
ちなみに
- #!/home/–旧仮想環境パス–/bin/pythonはPythonファイルの場所を
- sys.path.insert(0, “/home/–旧仮想環境パス–/bin”)はpythonファイルでimportするファイルの場所を
それぞれ示しています。
2番目の部分でDjangoを持ってきてくれると思ったのですが、ダメでしたね。
というわけで、Djangoの場所を教えてあげることにします。
site関数でDjangoのパスを指定する
書き直したindex,cgiは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/home/--新仮想環境パス--/bin/python # coding: utf-8 import sys, os,site site.addsitedir("/home/--新仮想環境パス--/lib/python3.9/site-packages") sys.path.insert(0, "/home/--新仮想環境パス--/bin") os.environ['DJANGO_SETTINGS_MODULE'] = "--アプリ名--.settings.production" from wsgiref.handlers import CGIHandler from django.core.wsgi import get_wsgi_application application = get_wsgi_application() CGIHandler().run(application) |
Djangoのフォルダだけlibの配下にあるので、そこは注意ですね。
site関数で明示してあげることで、無事今まで通りに表示が出来ました。