【Django】エックスサーバーの仮想環境をcondaに変更したら500エラーになった

今まで、PythonのフレームワークDjangoで作成したアプリケーションをエックスサーバーにアップしていました。

今回、データベース移行の際に仮想環境をLinuxbrewからcondaに変更したのですが、その際にエラーが出てしまったので、その対処法をまとめています。

エックスサーバーの仮想環境をcondaに変更したら500エラーになった

ことの発端は、Linuxbrewが使えなくなったから

PythonのDjangoアプリケーションをエックスサーバーに入れたのは1年以上前の話でした。
そもそもエックスサーバーにはpipやDjangoが入っていないので、仮想環境で入れている形でした。

その時はLinuxbrewを使用して入れたのですが、

Linuxbrew、ついに使えなくなりました。

正直以前の環境は残っているのでそのまま使ってもいいのですが、使えないものを使い続けるのも怖いので。
心機一転、新しい仮想環境を使おうと思いました。

使用するのはさまざまなサイトで紹介されているAnacondaですね。
それの縮小版であるminicondaを使用しました。

minicondaインストールした瞬間、500エラー

入れたは良いんですけど、その瞬間にエラーでアプリが落ちてしまいました。
500エラーですね。エラーを確認すると以下のようなエラーが。

End of script output before headers: index.cgi

index.cgiのファイルを実行する際に、headerの前に落ちているようです。
元々のindex.cgiの中身は以下の通りです。

Pythonのパスが以前の仮想環境になっていたので直したのですが、
それでも500エラーが解消されませんでした。

実際にエックスサーバーのcgiファイルをコンソールで叩いてみる

cgiファイルって何でエラーになっているか分かりませんよね。
サーバーのエラーログ見ても詳しいことは分かりませんし。

ということで、SSL上で直接index.cgiを叩いてみることにしました。
TeraTermでサーバーに入って、index.cgiを

./index.cgi

で実行してみると以下のようなエラーが。

ModuleNotFoundError: No module named ‘django’

いやいや、そんな馬鹿な。
Djangoはもちろん新しい環境で入れています。

以前のindex.cgiでは動いていたのに、今回は受け取ってくれませんでした。

ちなみに

  • #!/home/–旧仮想環境パス–/bin/pythonはPythonファイルの場所を
  • sys.path.insert(0, “/home/–旧仮想環境パス–/bin”)はpythonファイルでimportするファイルの場所を

それぞれ示しています。
2番目の部分でDjangoを持ってきてくれると思ったのですが、ダメでしたね。
というわけで、Djangoの場所を教えてあげることにします。

site関数でDjangoのパスを指定する

書き直したindex,cgiは以下の通りです。

Djangoのフォルダだけlibの配下にあるので、そこは注意ですね。
site関数で明示してあげることで、無事今まで通りに表示が出来ました。