このブログは 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
    WSGIDaemonProcess proc user=app_usr group=app python-home=/var/www/python-venv/empty/.venv lang=ja_JP.utf8
    
    以上で、mod_wsgi 関連の設定は終了です。

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 のエラー


参考

以下、作業中に参考にした記事になります。

以上です。

コメント