☆☆ 新着記事 ☆☆

2018年12月8日土曜日

* ステップ・バイ・ステップ Flaskのserver deploy


こんなに苦労するとは思わなかったCentOS ServerへのFlask導入。 ネット検索すると2014年頃がブームだったのだろか? みんな苦労しているポストが結構、みつかる。 情報の海の中から、自分の(2018年の)環境に合わせたセットアップ手順を、Step by Step で、確認しながら、初心者がやってみる。


◆ インストールと環境セットアップが必要なもの

・同じサーバー上でWordPressを動かしたく、且つ、将来的に、複数のホスト・ドメインを1台で動かしてみたい、という野望があるので、Apacheが必要と判断。

(Ubuntuはシンプルで高速だけど、phpの処理は、結局はApacheに任せるらしいので、最終的にapacheを学習しなくちゃいけないなら、最初からApacheだけでいいじゃん、という理解。)

・サーバーOSは、最新のLinux系ということでCentOS 7。 
(nginxって、ネットで調べられる資料がLinux系に比べてまだ少ないように見えるので、学習コストが高いかも、ということで後回し)

・この環境で、Python を入れて、Flaskを動かしたいので、mod_wsgiを入れる。
 且つ、Flaskは、Flaskがお勧めしているので、Python3.6 以降の推奨である 「venv」仮想環境
 中で動かしたい。

という理解だ。 この5つを連携させるのが初心者には非常に難しい。 これだけの条件が完全に一致してる設定手順がネット検索では見つからないので、もうあわてないで、1つ1つ確認しながらやってみることにする。


(参考)
・Flask Documentation
Deploy to Production
Deployment Options
mod_wsgi Quick Installation Guide
Installation Issues


◆導入の流れ

Step1: CentOSに導入したPython3.7でVirtual Environment作成
        (以下、全てをVirtual Environmentに導入)
 
Step2: Python 3.7のインストール
     ==Pythonインストール時に以下の対策がとれていることを確認
     ==Flask Installation Trouble Shooting Guide より
     (1) Missing Python Header Files
             (2) Lack Of Python Shared Library
             (3) Multiple Python Versions
             (4) Unable To Find Python Shared Library


Step3: Flask のインストール
Step4: Installing mod_wsgi
           (1) Unpacking The Source Code
          (2) Configuring The Source Code (Pathの設定)
         (3) Building The Source Code
         (4) Loading Module Into Apache
         (5) Cleaning Up After Build

Step5:Creating a .wsgi file
Step6:Configuring Apache



Step1: CentOSに導入したPython3.7でVirtual Environment作成
        (以下、全てをVirtual Environmentに導入)
 
Step2: Python 3.7のインストール
     ==Pythonインストール時に以下の対策がとれていることを確認
     ==Flask Installation Trouble Shooting Guide より

(1) Missing Python Header Files
On a Linux distribution where binary Python packages are split into a runtime package and a developer package, the developer package is often not installed by default. This means that you will be missing the header files required to compile mod_wsgi from source code.

・mod_wsgi from source code. をソースから正しくコンパイルする為には、ヘッダー情報が必要で、この情報の取得にはdeveloper Packageが必要。

To remedy the problem, install the developer package for Python corresponding to the Python runtime package you have installed.

・だから、developer Packageをいれろ。

Normally it has the same name as the Python runtime package with -dev appended to the package name.

・必要なdeveloper Packageは、Python runtime package に、-dev の名前がついている場合が多い。


>>これは
# yum --setopt=group_package_types=mandatory,default,optional groupinstall "Development Tools"
で、一括してインストールする。


(2) Lack Of  Python Shared Library

Although mod_wsgi will still work when compiled against a version of Python which only provides a static library, you are highly encouraged to ensure that your Python installation has been configured and compiled with the --enable-shared option to enable the production and use of a shared library for Python.

Libraryをshared にしておかないと、static libraryを使わざるを得ず、memoryをもの凄く消費するので、Pythonの enable-shared option を実行しておけ。


To determine whether the compiled mod_wsgi module is making use of a shared library for Python, many UNIX systems provide the ‘ldd’ program.

enable-shared option を実行したら、ldd コマンドで確認する。

$ ldd mod_wsgi.so
linux-vdso.so.1 =>  (0x00007fffeb3fe000)
libpython2.5.so.1.0 => /usr/local/lib/libpython2.5.so.1.0 (0x00002adebf94d000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00002adebfcba000)
libdl.so.2 => /lib/libdl.so.2 (0x00002adebfed6000)
libutil.so.1 => /lib/libutil.so.1 (0x00002adec00da000)
libc.so.6 => /lib/libc.so.6 (0x00002adec02dd000)
libm.so.6 => /lib/libm.so.6 (0x00002adec0635000)
/lib64/ld-linux-x86-64.so.2 (0x0000555555554000)

 Note how there is a dependency listed on the ‘.so’ file for Python. If this is not present then mod_wsgi is using a static Python library.


上のように ‘.so’file にdependency が表示されればOK. 出なければ、まだスタティックを使っているぞ! (これは、mod_wsgi インストール後に確認できますね。) 

If rebuilding Python to generate a shared library, do make sure that the Python shared library, or a symlink to it appears in the Python ‘config’ directory of your Python installation. If the shared library doesn’t appear here next to the static version of the library, ‘libtool’ will not be able to find it and will still use the static version of the library.

enable -shared option を実行するだけじゃダメ。 'libtool'が見つけられないので、Python shared library、又は symlink が Python  'config' directory' に書かれているように確認しろ。


To check, go to the Python ‘config’ directory of your Python installation and do a directory listing:
If you only see a ‘.a’ file (こんなやつ:libpython2.5.a)for Python library, then either Python wasn’t installed with the shared library, or the shared library was placed elsewhere.


What appears to normally happen is that the shared library is actually placed in the ‘lib’ directory two levels above the Python ‘config’ directory. In that case you need to create a symlink in the ‘config’ directory to where the shared library is actually installed:

$ ln -s ../../libpython2.5.so .
こういいうのを書いとく。


(3) Multiple Python Versions

Where there are multiple versions of Python installed on a system and it is necessary to ensure that a specific version is used, the --with-python option can be supplied to ‘configure’ when installing mod_wsgi:

./configure --with-python=/Path/to/Python/You/wish/to/use

Where multiple versions of Python are present and are installed under the same directory, this should generally be all that is required. If however the newer version of Python you wish to use is in a different location, for example under ‘/usr/local’, it is possible that when Apache is started that it will not be able find the Python library files for the version of Python you wish to use.

複数のバージョンのPythonが同じdirectoryにインストールされてる場合は、上の./configureの記述だけで良い場合がほとんどだけど、違う場所にインストールされていると、apacheが見つけられない可能性がある。

If these programs are not in a standard location, they cannot be found in your PATH, or you wish to use alternate versions to those found, the --with-apxs and --with-python options can be used in conjunction with the “configure” script:

On some Linux distributions, such as SUSE and CentOS, it will be necessary to use the --with-apxs option and specify either “/usr/sbin/apxs2-worker” or “/usr/sbin/apxs2-prefork”.

./configure --with-apxs=/usr/local/apache/bin/apxs

This is necessary as the Linux distribtions allow installation of “dev” packages for both Apache MPM variants at the same time, whereas other Linux distributions do not.

apxs2-worker とか、apxs2-prefork なんてないけど。
apxsはあったので、ネット検索してみると、そのapxsのPathを指定するのでも良いみたいだ。

そもそも、apxsというのは、こういうものらしい。 apxs2なんてなくても良いかも?という独自判断。
エラーが出たら考える。

"apxsとは - APache eXtenSion tool
apxs is a tool for building and installing extension modules for the Apache HyperText Transfer Protocol (HTTP) server. This is achieved by building a dynamic shared object (DSO) from one or more source or object files which then can be loaded into the Apache server under runtime via the LoadModule directive from mod_so."
-https://httpd.apache.org/docs/2.4/programs/apxs.html


(4) Unable To Find Python Shared Library


Step3: Flask のインストール



Step4: Installing mod_wsgi
 (1) Unpacking The Source Code

最新バージョンを確認し、wgetでいれる。
$ wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.6.5.tar.gz
解凍する。

(pipでインストールした方が良さそうです。
 pip install mod_wsgi: https://pypi.org/project/mod_wsgi/)

$ tar zxvf 4.6.5.tar.gz 
(2) Configuring The Source Code (Pathの設定)
mod_wisg 4.6.5 ディレクトリ内で


 ・PythonのPathに紐づける
  $ ./configure --with-python=/PATH/To/Python
 ・Apacheに紐づける
 ./configure --with-apxs=/PATH/To/apxs
 
(3) Building The Source Code
makeの実行

(4) Loading Module Into Apache

(5) Cleaning Up After Build



Step5:Creating a .wsgi file


Step6:Configuring Apache









(参考)
how to find mod_wsgi.so file
Run: mod_wsgi-express module-config
(doesn't work :pip でmod_wsgi をインストールした時だけ?)

mod_wsgi.so: Cannot load mod_wsgi.so into server: libpython2.5.so.1.0: cannot open shared object file: No such file or directory

0 件のコメント:

コメントを投稿