CentOS7+nginx+apache2.4+Python3の環境を作る-pipの設定
追記
Pythonの環境が構築できる環境構築スクリプトがありますので、そちらをつかうとすぐに構築できます
前回apacheとPythonのインストールと実行をしました。今回はpipの設定をしていきます。環境と手順は↓のようになってます
注意点
この記事の時点ではまだnginxはいないため、apacheは80番ポートで動いてます。今回の記事はmod_wsgiのインストールのためapacheと連携はしていません。
環境
- ベンダー:さくらのクラウド
- OS:CentOS7
- フロント:nginx(80番ポート)
- バックエンド:Apache2.4(8080番ポート)
- Python:3系(pyenvを使用)
- フレームワーク:bottle(8081番ポート)
基本的にsudo環境にする予定です。
手順
基本的には以下の手順になります
- Apacheのインストール
- Python(pyenv)のインストール
- pipの設定←ここ
- Apache+Pythonの連携
- nginxを使ってリバースプロキシ
今回の記事について
今回は手順の3を行います。
pipって何?
pipはPythonのパッケージをインストールするための物です。Pythonでかかれたパッケージソフトをインストールしたり、管理できるシステムです。多くのパッケージはPython Package Index というサイト上にあります
Python Package Indexから手動でダウンロードでもいいのでは?
そのやり方でも問題ないです。言ってしまえばwgetコマンド使ってもいいですが、zip形式でダウンロードになったり手間が増えるのでpipのほうが良いです。
なんでpipを使うの?
apacheとputhonを連携させるのに、mod_wsgiというのを使います。今回はこれのインストールになります。
yumでは駄目なの?
yumは主にシステム系(CentOSに関わる物)をインストールしたり管理したりする物に使います。例えばapacheやnginxなどはCentOSに関わる物です。サーバーとして提供するため。Pythonも関わっています(yum自体がPythonっだったりする)が今回はapacheとPythonの連携というのがあるため少し方向が違います。
また、yum自体Python2.7系のため今回Python3系とは違うため使用しません。Pythonでパッケージをインストールしたりするときはpipからと覚えておいてください。
mod_wsgiはyumもpipもインストールできる
結論からいうと、多くのサイトではpipとyumと紹介しているサイトがあります。mod_wsgiはapachのモジュールのためyumからインストールも可能です。Python3系ということもあり今回はpipからダウンロードします
pipを実際に使ってみる
pipを実際に使ってみたいと思います。Python3系ならデフォルトで入っていますが念のためインストールされているか確認します
[macan@localhost ~]$pip -V pip 10.0.1 from /usr/local/pyenv/versions/3.6.7/lib/python3.6/site-packages/pip (python 3.6)
ちゃんと入ってました
pipのアップグレード
まずはpipのアップグレードを行います。pip関連はrootで行います。sudoでもできる方はsudoでも問題ありません。
[root@localhost ~]# pip install --upgrade pip Collecting pip Downloading https://files.pythonhosted.org/packages/c2/d7/90f34cb0d83a6c5631cf71dfe64cc1054598c843a92b400e55675cc2ac37/pip-18.1-py2.py3-none-any.whl (1.3MB) 100% |████████████████████████████████| 1.3MB 18.9MB/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-18.1
アップグレードできました。
[root@localhost ~]# pip -V pip 18.1 from /usr/local/pyenv/versions/3.6.7/lib/python3.6/site-packages/pip (python 3.6)
バージョンが上がっていました。
pipのインストールを試してみる
実際にmod_wsgiのインストールをしてみます
[root@localhost ~]# pip install mod-wsgi /bin/ld: /usr/local/pyenv/versions/3.6.7/lib/libpython3.6m.a(parser.o): relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object。 -fPIC を付けて再コンパイルしてください。 /bin/ld: 最終リンクに失敗しました: 出力に対応するセクションがありません collect2: エラー: ld はステータス 1 で終了しました error: command 'gcc' failed with exit status 1 ---------------------------------------- Command "/usr/local/pyenv/versions/3.6.7/bin/python3.6 -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-zbbqryed/mod-wsgi/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-muqp_1sw/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-install-zbbqryed/mod-wsgi/
となぜかエラーがでました。ここにきて一体なんだ・・・
python-develが不足
調べたらpython-develというのが足りなかったのでインストールしました
[root@localhost ~]# yum install python-devel 読み込んだプラグイン:fastestmirror Loading mirror speeds from cached hostfile * elrepo: ftp.ne.jp * epel: ftp.iij.ad.jp 依存性の解決をしています --> トランザクションの確認を実行しています。 ---> パッケージ python-devel.x86_64 0:2.7.5-69.el7_5 を インストール --> 依存性解決を終了しました。 依存性を解決しました ============================================================================================================================================================================================================================================================================================================================= Package アーキテクチャー バージョン リポジトリー 容量 ============================================================================================================================================================================================================================================================================================================================= インストール中: python-devel x86_64 2.7.5-69.el7_5 updates 397 k トランザクションの要約 ============================================================================================================================================================================================================================================================================================================================= インストール 1 パッケージ 総ダウンロード容量: 397 k インストール容量: 1.1 M Is this ok [y/d/N]: y Downloading packages: python-devel-2.7.5-69.el7_5.x86_64.rpm | 397 kB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction インストール中 : python-devel-2.7.5-69.el7_5.x86_64 1/1 検証中 : python-devel-2.7.5-69.el7_5.x86_64 1/1 インストール: python-devel.x86_64 0:2.7.5-69.el7_5 完了しました!
今度はどうかな・・・失敗しました。次のエラーは error: command 'gcc' failed with exit status 1でした。gcc関連はインストール済みだったので他のかと思い調べてインストールしてみました
[root@localhost ~]# yum install libxslt-devel libffi-devel 読み込んだプラグイン:fastestmirror Loading mirror speeds from cached hostfile * elrepo: ftp.ne.jp * epel: ftp.iij.ad.jp 依存性の解決をしています --> トランザクションの確認を実行しています。 ---> パッケージ libffi-devel.x86_64 0:3.0.13-18.el7 を インストール ---> パッケージ libxslt-devel.x86_64 0:1.1.28-5.el7 を インストール --> 依存性の処理をしています: pkgconfig(libxml-2.0) のパッケージ: libxslt-devel-1.1.28-5.el7.x86_64 --> 依存性の処理をしています: libgcrypt-devel のパッケージ: libxslt-devel-1.1.28-5.el7.x86_64 --> トランザクションの確認を実行しています。 ---> パッケージ libgcrypt-devel.x86_64 0:1.5.3-14.el7 を インストール --> 依存性の処理をしています: libgpg-error-devel のパッケージ: libgcrypt-devel-1.5.3-14.el7.x86_64 ---> パッケージ libxml2-devel.x86_64 0:2.9.1-6.el7_2.3 を インストール --> 依存性の処理をしています: xz-devel のパッケージ: libxml2-devel-2.9.1-6.el7_2.3.x86_64 --> トランザクションの確認を実行しています。 ---> パッケージ libgpg-error-devel.x86_64 0:1.12-3.el7 を インストール ---> パッケージ xz-devel.x86_64 0:5.2.2-1.el7 を インストール --> 依存性解決を終了しました。 依存性を解決しました ============================================================================================================================================================================================================================================================================================================================= Package アーキテクチャー バージョン リポジトリー 容量 ============================================================================================================================================================================================================================================================================================================================= インストール中: libffi-devel x86_64 3.0.13-18.el7 base 23 k libxslt-devel x86_64 1.1.28-5.el7 base 309 k 依存性関連でのインストールをします: libgcrypt-devel x86_64 1.5.3-14.el7 base 129 k libgpg-error-devel x86_64 1.12-3.el7 base 16 k libxml2-devel x86_64 2.9.1-6.el7_2.3 base 1.0 M xz-devel x86_64 5.2.2-1.el7 base 46 k トランザクションの要約 ============================================================================================================================================================================================================================================================================================================================= インストール 2 パッケージ (+4 個の依存関係のパッケージ) 総ダウンロード容量: 1.6 M インストール容量: 12 M Is this ok [y/d/N]: y Downloading packages: (1/6): libffi-devel-3.0.13-18.el7.x86_64.rpm | 23 kB 00:00:00 (2/6): libgpg-error-devel-1.12-3.el7.x86_64.rpm | 16 kB 00:00:00 (3/6): libgcrypt-devel-1.5.3-14.el7.x86_64.rpm | 129 kB 00:00:00 (4/6): libxslt-devel-1.1.28-5.el7.x86_64.rpm | 309 kB 00:00:00 (5/6): xz-devel-5.2.2-1.el7.x86_64.rpm | 46 kB 00:00:00 (6/6): libxml2-devel-2.9.1-6.el7_2.3.x86_64.rpm | 1.0 MB 00:00:00 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 合計 1.9 MB/s | 1.6 MB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction インストール中 : libgpg-error-devel-1.12-3.el7.x86_64 1/6 インストール中 : libgcrypt-devel-1.5.3-14.el7.x86_64 2/6 インストール中 : xz-devel-5.2.2-1.el7.x86_64 3/6 インストール中 : libxml2-devel-2.9.1-6.el7_2.3.x86_64 4/6 インストール中 : libxslt-devel-1.1.28-5.el7.x86_64 5/6 インストール中 : libffi-devel-3.0.13-18.el7.x86_64 6/6 検証中 : xz-devel-5.2.2-1.el7.x86_64 1/6 検証中 : libffi-devel-3.0.13-18.el7.x86_64 2/6 検証中 : libxml2-devel-2.9.1-6.el7_2.3.x86_64 3/6 検証中 : libxslt-devel-1.1.28-5.el7.x86_64 4/6 検証中 : libgpg-error-devel-1.12-3.el7.x86_64 5/6 検証中 : libgcrypt-devel-1.5.3-14.el7.x86_64 6/6 インストール: libffi-devel.x86_64 0:3.0.13-18.el7 libxslt-devel.x86_64 0:1.1.28-5.el7 依存性関連をインストールしました: libgcrypt-devel.x86_64 0:1.5.3-14.el7 libgpg-error-devel.x86_64 0:1.12-3.el7 libxml2-devel.x86_64 0:2.9.1-6.el7_2.3 xz-devel.x86_64 0:5.2.2-1.el7 完了しました!
解決しません。調べてみるとTheanoをpyenvでインストールしたPython3.4.2で動かそうとしたら「PICオプションつけて再コンパイルしろよ」と怒られた時にやった対処メモという記事が見つかりました
Pythonを削除してインストールし直す
とりあえずやってみます。
[root@localhost /]# pyenv uninstall 3.6.7 pyenv: remove /usr/local/pyenv/versions/3.6.7? y [root@localhost /]# env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.7 Downloading Python-3.6.7.tar.xz... -> https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz Installing Python-3.6.7... Installed Python-3.6.7 to /usr/local/pyenv/versions/3.6.7
削除と再インストールしました
再度挑戦
[root@localhost /]# pip install mod-wsgi Collecting mod-wsgi Using cached https://files.pythonhosted.org/packages/47/69/5139588686eb40053f8355eba1fe18a8bee94dc3efc4e36720c73e07471a/mod_wsgi-4.6.5.tar.gz Installing collected packages: mod-wsgi Running setup.py install for mod-wsgi ... done Successfully installed mod-wsgi-4.6.5
普通にうまくいきました。こういうの大事ですね
[root@localhost /]# pip list Package Version ---------- ------- mod-wsgi 4.6.5 pip 18.1 setuptools 39.0.1
インストールされています
パッケージのインストール場所を調べる
インストールされたパッケージの場所を調べてみます
[root@localhost /]# pip show mod-wsgi Name: mod-wsgi Version: 4.6.5 Summary: Installer for Apache/mod_wsgi. Home-page: http://www.modwsgi.org/ Author: Graham Dumpleton Author-email: Graham.Dumpleton@gmail.com License: Apache License, Version 2.0 Location: /usr/local/pyenv/versions/3.6.7/lib/python3.6/site-packages Requires: Required-by:
Locationの位置になります。問題無く3のとこに入ってます
注意点
必ずLocationで3系のとこにいるのを確認してください。紐付けるのに必要になります。bottleを動かすだけならこれでよいのですが実際にテンプレートを使うとなるとエラーとなる可能性があります。詳しくは失敗談CentOS7+Apache2.4+mod_swgi+python3をやってみたら・・・を見てください。最終的にはモジュールは移動させるので意味無いのですが念のため
GCPだとpipで2になる?
さくらのクラウドはでは問題無く3に入りましたが、GCPで構築したときはここが上手くいきませんでした。GCPをお使いの方でもしpipやってもロケーションが2のとこに行く方は以下を試してみてください
#pipのインストール先を指定 [root@localhost /]# export PYTHONPATH=$HOME/local/lib/python/site-packages:$PYTHONPATH #pipをインストール [root@localhost /]# easy_install --prefix=$HOME/local pip #pipでインストール [root@localhost /]# pip install --install-option="--prefix=$HOME/local" mod-wsgi
これで3系のとこに入るかもしれません。今回は2.7に入っていても多分問題は無いです。4.6.5のmod_wsgiが必要なだけなのでインストール場所はそこまで大きくこだわりはありません。
個人支援・寄付について
サイトラボでは個人支援・寄付を受けております。ご協力いただける方はお願いいたします。当サイトではビットコインで受け付けております。
- ビットコイン:3LHnADwZwUbic2L45EnVJEykiG6KfbqrwS