Xserverのサーバー移行でDjangoがおかしくなった1

Xserverの自動更新でトラブル発生

先日Xserverのお知らせページで「『sv1~sv1999サーバー』ハードウェアの大幅増強および最新サーバー環境への移行スケジュールについて」というお知らせがあった。

自動で移行してくれるって話なので放っておいたら、夜中に最新サーバー環境へと移行していた。

問題はそれでサーバーに入れていたDjangoの動作がおかしくなってしまったことだ。

いろいろやってどうにか解決したけれど、かなり面倒だったので後々のためにメモ。
なおXserverのサポートに問い合わせたところ、

Django」や「Python2.7」など、お客様側で設置されたプログラムは基本的に【サポート外】としております。
ただし、移行メンテナンスではサーバー側の仕様が一部変更となり、メンテナンスに起因してエラーが発生している場合もございますので、 当サポートにて、可能な範囲で確認を行いたく存じます。

とのことで、今回は対応してくれた。

Djangoの環境

Xserverレンタルサーバ
Django1.8.2 (ユーザーディレクトリにインストール)FastCGIで動作。
Python2.7.10 (Djangoを入れるためにユーザーディレクトリにインストール。)

仮想環境にしておけばよかった

今からやるなら、xserverはlinuxbrewとpipenvで仮想環境を構築できるので、そちらにしたほうが良いと思う。

ページが500サーバーエラーになる

公開しているURLにアクセスしても500サーバーエラーとなる。 管理画面からサーバーのエラーログをダウンロードすると、こんな感じでエラーが記録されていた。

[Thu Oct 11 08:17:06.581422 2018] [fcgid:warn] [pid 57417] (104)Connection reset by peer: [client xxx.xxx.xxx.xxx:37926] mod_fcgid: error reading data from FastCGI server, referer: https://xxx/
[Thu Oct 11 08:17:06.581455 2018] [core:error] [pid 57417] [client xxx.xxx.xxx.xxx:37926] End of script output before headers: mysite.fcgi, referer: https://xxx/

そしてSSHpythonで例えばimport md5をしようとすると

ERROR:root:code for hash md5 was not found.
Traceback (most recent call last):
  File "/home/xxx/local/lib/python2.7/hashlib.py", line 147, in <module>
    globals()[__func_name] = __get_hash(__func_name)
  File "/home/xxx/local/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor
    raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type md5
ERROR:root:code for hash sha1 was not found.
Traceback (most recent call last):
  File "/home/xxx/local/lib/python2.7/hashlib.py", line 147, in <module>
    globals()[__func_name] = __get_hash(__func_name)
  File "/home/xxx/local/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor
    raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type sha1
ERROR:root:code for hash sha224 was not found.
Traceback (most recent call last):
  File "/home/xxx/local/lib/python2.7/hashlib.py", line 147, in <module>
    globals()[__func_name] = __get_hash(__func_name)
  File "/home/xxx/local/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor
    raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type sha224
ERROR:root:code for hash sha256 was not found.
Traceback (most recent call last):
  File "/home/xxx/local/lib/python2.7/hashlib.py", line 147, in <module>
    globals()[__func_name] = __get_hash(__func_name)
  File "/home/xxx/local/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor
    raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type sha256
ERROR:root:code for hash sha384 was not found.
Traceback (most recent call last):
  File "/home/xxx/local/lib/python2.7/hashlib.py", line 147, in <module>
    globals()[__func_name] = __get_hash(__func_name)
  File "/home/xxx/local/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor
    raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type sha384
ERROR:root:code for hash sha512 was not found.
Traceback (most recent call last):
  File "/home/xxx/local/lib/python2.7/hashlib.py", line 147, in <module>
    globals()[__func_name] = __get_hash(__func_name)
  File "/home/xxx/local/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor
    raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type sha512
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/xxx/local/lib/python2.7/md5.py", line 10, in <module>
    from hashlib import md5
ImportError: cannot import name md5

このようなエラーが出る。

Pythonのリビルドで解決

これはサポートが解決してくれた。

お客様が導入されたPython2.7のライブラリ参照先が、現在のサーバー環境に即していないようでございます。 お手数ではございますが、Python2.7につきまして、 現在のサーバーにてリビルドすることで解消する可能性がございます。

指示通りリビルドすると500サーバーエラーは出なくなった。

$ cd ~/local/src/Python-2.7.10
$ ./configure --prefix=$HOME/local
$ make
$ make install

/local/src/Python-2.7.10は、前回ビルドした時のを削除していなかったのでそのまま利用した。

しかし、今度は別のエラーが現れた!

長くなりそうなので、続きは次の記事に。