このブログは VPS で動作していますが、Python3.6 で Mezzanine と Wagtail を共存させています。
現在 Wagtail の最新版 は Django 2.0.x, 2.1.x and 2.2.x
をサポートしていて、Mezzanine は、"django >= 1.11, < 2.1"
をサポートしています。
共存でもうまく動くことは動くのですが、Wagtail の version を上がると芋づるで Django の version が上り、Mezzanine のアプリケーションが動かなくなったりしていました。
Wagtail の version を塩漬けにしていたのですが、最新版との乖離のそれなりに出てきているので、venv で環境を分けてそれぞれデプロイをしようと思いました。
実施した結果を記載します。
前提
以下の環境で移行を実施しています。
-
OS
cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)
-
Apache の Version
httpd -v Server version: Apache/2.4.39 (IUS) Server built: Apr 2 2019 14:11:06
-
Python の Version
python3.6 -V Python 3.6.7
-
Python の 仮装環境の状態
使用していないため、作成から始めます。 -
Apache での Web アプリケーションの稼働状況
複数の Python アプリケーションを mod_wsgi で動かしています。
Python 仮装環境の作成
venv の仮想環境がないので、仮想環境を作成します。
Wagtail のアプリケーションの実行環境の作成
-
仮装環境のディレクトリを作成
cd /var/www mkdir python-venv cd python-venv mkdir mutter cd mutter pwd /var/www/python-venv/mutter
/var/www/python-venv/mutter
というディレクトリを作成しました。 -
仮装環境作成
以下のコマンドで、仮想環境を作成します。
python3.6 -mvenv .venv
-
仮想環境の有効化
カレントディレクトリが、/var/www/python-venv/mutter
として以下のコマンドを実行します。
source ./.venv/bin/activate
-
pip の upgrade
仮想環境構築後、pip のversion が古いことがあります。まずpip を upgradeします。
pip install --upgrade pip Collecting pip Downloading https://files.pythonhosted.org/packages/d8/f3/413bab4ff08e1fc4828dfc59996d721917df8e8583ea85385d51125dceff/pip-19.0.3-py2.py3-none-any.whl (1.4MB) 100% |████████████████████████████████| 1.4MB 6.2MB/s Installing collected packages: pip Found existing installation: pip 10.0.1 Uninstalling pip-10.0.1: Successfully uninstalled pip-10.0.1 Successfully installed pip-19.0.3
-
ライブラリのインストール
Wagtail の plugin APSL/puput: A Django blog app implemented in Wagtail を使用しており、芋づるで最新版がインストールされるため、puput をインストールします。
以下、モジュールがインストールされました。pip install puput Collecting puput ... Running setup.py install for puput ... done Successfully installed puput-1.0.3
pip list pip list Package Version -------------------- -------- beautifulsoup4 4.6.0 certifi 2019.3.9 chardet 3.0.4 Django 2.1.8 django-colorful 1.3 django-el-pagination 3.2.4 django-modelcluster 4.4 django-social-share 1.3.2 django-taggit 0.23.0 django-treebeard 4.3 djangorestframework 3.9.2 draftjs-exporter 2.1.5 html5lib 1.0.1 idna 2.8 Pillow 5.4.1 pip 19.0.3 puput 1.0.3 pytz 2019.1 requests 2.21.0 setuptools 39.0.1 six 1.12.0 Unidecode 1.0.23 urllib3 1.24.2 wagtail 2.3 webencodings 0.5.1 Willow 1.1
モジュールインストールが行われていない実行環境の作成
mod_wsgi の環境調整にモジュールインストールが行われていない venv 環境 が必要になるので作成します。
-
仮装環境のディレクトリを作成
cd /var/www cd python-venv mkdir empty cd empty pwd /var/www/python-venv/empty
/var/www/python-venv/empty
というディレクトリを作成しました。 -
仮装環境作成
以下のコマンドで、仮想環境を作成します。
python3.6 -mvenv .venv
mod_wsgi の設定変更
activate_this.py の作成
Virtual Environments — mod_wsgi 4.6.5 documentation
を確認したところ、mod_wsgi は 設定ファイルで、アプリケーションごとの Python の path の変更はできないことがわかりました。
path の変更を行う activate_this.py
というスクリプトを作成して、wsgi.py
から読み込み環境を調整します。
- activate_this.py
python_home = '/var/www/python-venv/mutter/.venv' import sys import site # Calculate path to site-packages directory. python_version = '.'.join(map(str, sys.version_info[:2])) site_packages = python_home + '/lib/python%s/site-packages' % python_version site.addsitedir(site_packages) # Remember original sys.path. prev_sys_path = list(sys.path) # Add the site-packages directory. site.addsitedir(site_packages) # Reorder sys.path so new directories at the front. new_sys_path = [] for item in list(sys.path): if item not in prev_sys_path: new_sys_path.append(item) sys.path.remove(item) sys.path[:0] = new_sys_path
wsgi.py の修正
wsgi.py
で、activate_this.py
を実行して path を調整する実装を追加します。
"""
WSGI config for mutter project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/
"""
from __future__ import absolute_import, unicode_literals
# ここで activate_this.py を読み込む。環境依存になるので、wsgi 自体を分ける等検討の余地はありそう。
# サンプルのままだと python3 では動作しない。exec に変更する。
# [Alternative to execfile in Python 3? - Stack Overflow](https://stackoverflow.com/questions/6357361/alternative-to-execfile-in-python-3)
activate_this = '/var/www/python-venv/mutter/.venv/bin/activate_this.py'
exec(open(activate_this).read(),dict(__file__=activate_this))
# activate_this.py で site package のパスは設定されるが、アプリケーションディレクトリのパスは通らないので、sys.path.insert で追加する
import sys
sys.path.insert(0, "/var/xxxxxx/backend")
import os
import mutter.settings.production
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mutter.settings.base")
application = get_wsgi_application()
wsgi.conf の 修正
副作用を避けるため、wsgi.conf の WSGIDaemonProcess に python-home
を追加、モジュールインストールが行われていない実行環境 を指定します。
- wsgi.conf
以上で、mod_wsgi 関連の設定は終了です。WSGIDaemonProcess proc user=app_usr group=app python-home=/var/www/python-venv/empty/.venv lang=ja_JP.utf8
crontab の変更
一部、Django コマンドを crontab でスケジュール実行していますが、Python のパスを仮想環境のパスに変更する必要があります。
この変更は、django-crontab を使用しているため比較的簡単に実行することができました。
過去にインストール記事を書いているので、よろしければご確認ください。
Mezzanine django-crontab をインストールしてジョブスケジュールをしてみる | Monotalk
以下、コマンド実行で仮想環境の設定でcron定義を追加できました。
# Django のプロジェクトのホームディレクトリに移動
cd /var/www/site/mutter.monotalk.xyz/backend/
# 仮想環境を有効化する
source /var/www/python-venv/mutter/.venv/bin/activate
# 既存のcron定義を削除
python manage.py crontab remove
# 新たにcron定義を追加
python manage.py crontab add
crontab -e
----------------------
00 */4 * * * /var/www/python-venv/mutter/.venv/bin/python /var/www/site/mutter.monotalk.xyz/backend/manage.py crontab run b3566f4bb9e6c276e923efc21ffb00be >> /tmp/poll_gists.log # django-cronjobs for mutter
10 */4 * * * /var/www/python-venv/mutter/.venv/bin/python /var/www/site/mutter.monotalk.xyz/backend/manage.py crontab run 39205c29f65e9f6b3fcd8cce2071d34f >> /tmp/create_related_posts.log # django-cronjobs for mutter
15 */4 * * * /var/www/python-venv/mutter/.venv/bin/python /var/www/site/mutter.monotalk.xyz/backend/manage.py crontab run a42264b4ad29b364122c651305fa698c >> /tmp/send_notifications.log # django-cronjobs for mutter
15 */4 * * * /var/www/python-venv/mutter/.venv/bin/python /var/www/site/mutter.monotalk.xyz/backend/manage.py crontab run e1afba0f90c8220d09cacb5c8cfb015d >> /tmp/blog_jobs/clearsessions.log # django-cronjobs for mutter
00 01 * * * /var/www/python-venv/mutter/.venv/bin/python /var/www/site/mutter.monotalk.xyz/backend/manage.py crontab run 45961d18ca57cabac3a3fc711ca0b013 >> /tmp/blog_jobs/collect_hatena_keywords.log # django-cronjobs for mutter
15 01 * * * /var/www/python-venv/mutter/.venv/bin/python /var/www/site/mutter.monotalk.xyz/backend/manage.py crontab run f4035cc25327585d140630754e3f6c27 >> /tmp/blog_jobs/collect_search_console_data.log # django-cronjobs for mutter
30 01 * * * /var/www/python-venv/mutter/.venv/bin/python /var/www/site/mutter.monotalk.xyz/backend/manage.py crontab run e6c43c4ec0e5a38b11a4ce830be8a06e >> /tmp/blog_jobs/classify_entry.log # django-cronjobs for mutter
以上で、venv への移行作業は完了です。
Wagtail の Version Up によるエラー
venv 移行で Wagtail の Version Up、 Django の Version Up も同時に行ったのですが、Version Up に伴う変更点がそこそこあり、修正を行ったので対応した部分を覚えている限り記載します。
-
移行前の Django Wagtail の Version
Django 1.10.8 wagtail 1.13.1
-
移行後の Django Wagtail の Version
Django 2.1.8 wagtail 2.3
Wagtail の変更箇所
Wagtail 1.13.1 のまま、Wagtail 2.3 を動かすと、モジュールが見つからない旨のエラーが多発します。
ModuleNotFoundError: No module named 'wagtail.wagtailembeds'
Wagtail 2.0 release notes — Wagtail 2.0 documentation
Django のエラー
-
Model での on_delete の必須になったことによるエラー
ForeignKey の指定箇所でエラーになりました。on_delete 属性が必須になり、指定していない旨のエラーが出力されました。
以下、記事を読み対処しました。
Django2.0から必須になったon_deleteの使い方 - Django2の実力をつけるチュートリアルサイトDjangoBrothers -
urls.py の include メソッド の使用箇所でのエラー
指定すべき内容の違いでエラーが発生しました。- 1つ目
django.core.exceptions.ImproperlyConfigured: Passing a 3-tuple to include() is not supported. Pass a 2-tuple containing the list of patterns and app_name, and provide the namespace argument to include() instead.
- 2つ目
Wagtail の 場合、あらかじめ include しているメソッドがあり、include の指定が必要だったり不要であったりします。TypeError: view must be a callable or a list/tuple in the case of include().
以下、記事を読んでinclude 記述が不要な箇所を削除しました。
Solving “django.core.exceptions.ImproperlyConfigured: Passing a 3-tuple to include()…” error after Django/Wagtail 2.0 upgrade | TimOnWeb
- 1つ目
参考
以下、作業中に参考にした記事になります。
- venv: Python 仮想環境管理 - Qiita
- [Django][Apache]VirtualHostごとに異なるvenvでDjangoを動かす|WEBプログラム覚書
- CentOS7にApache2.4最新版をyum installする
- pyenv環境に入らないでpyenv依存モジュールを使ったscriptを実行する - Qiita
- Alternative to execfile in Python 3? - Stack Overflow * Wagtail 2.0 release notes — Wagtail 2.0 documentation
- python - Cron and virtualenv - Stack Overflow
- No module named ‘wagtail.wagtailcore.edit_handlers’ getting this error after import · Issue #3862 · wagtail/wagtail
- Memo:[Django]バージョンによるurls.py内のincludeの仕様の違い - Qiita
以上です。
コメント