☆☆ 新着記事 ☆☆

2019年4月12日金曜日

mod_wsgiで一気にFlask環境まで構築する

VPS環境にApcheをインストールして、mod_wsgi(Daemon Mode)でFlaskを動かせるようにするための設定を、一気に終わらせます。
 

 
 
1.  Apacheをインストールする。
1) 利用可能なhttpdの確認
[root@ofcm9och /]# yum list available | grep httpd
httpd.x86_64                              2.4.6-88.el7.centos            base
httpd-devel.x86_64                        2.4.6-88.el7.centos            base
httpd-manual.noarch                       2.4.6-88.el7.centos            base
httpd-tools.x86_64                        2.4.6-88.el7.centos            base
keycloak-httpd-client-install.noarch      0.6-3.el7                      base
libmicrohttpd.i686                        0.9.33-2.el7                   base
libmicrohttpd.x86_64                      0.9.33-2.el7                   base
libmicrohttpd-devel.i686                  0.9.33-2.el7                   base
libmicrohttpd-devel.x86_64                0.9.33-2.el7                   base
libmicrohttpd-doc.noarch                  0.9.33-2.el7                   base
python2-keycloak-httpd-client-install.noarch
 
2) httpdのインストール
# yum -y install httpd httpd-tools httpd-devel httpd-manual
Complete!
 
3)確認
[root@ofcm9och /]# yum list installed | grep httpd
httpd.x86_64                       2.4.6-88.el7.centos            @base
httpd-devel.x86_64                 2.4.6-88.el7.centos            @base
httpd-manual.noarch                2.4.6-88.el7.centos            @base
httpd-tools.x86_64                 2.4.6-88.el7.centos            @base
 
4)  再起動する。
# systemctl start httpd
 
5) 起動の状態を確認する。
$ systemctl status httpd
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2018-12-24 23:32:33 JST; 23s ago
     Docs: man:httpd(8)
           man:apachectl(8)
Main PID: 1338 (httpd)
 
 
6) httpd自動起動の設定
$ systemctl enable httpd
 
7)自動起動設定の確認
$systemctl list-unit-files | grep httpd
httpd.service                                 enabled
 
2. SELinuxの無効化
 
1) 現状の確認
[root@ /]# sestatus
SELinux status:                 enabled
 
2Configファイルのコピーを保存。(??)
[root@ /]# cp -piv /etc/selinux/config /etc/selinux/config.`date "+%Y%m%d_%H%M%S "` ‘/etc/selinux/config’ -> ‘/etc/selinux/config.20181223’
 
 
3) Configファイルの修正
[root@ /]# cd  /etc/selinux/
[root@ selinux]# vi config
#SELINUX=enforcing
SELINUX=disabled
 
4) OSの再起動
[root@ selinux]#shutdown -r now
 
5)再確認
[root@ /]# sestatus
SELinux status:                 disabled
 
 
3. Firewallを設定する。
 
1) ファイアウォールが起動中かどうかを確認
# firewall-cmd --state
running
 
2) ファイアウォール設定を確認
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
 services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
 
3) http/httpsのサービス追加
[root@ ~]# firewall-cmd --zone=public --add-service=http –permanent
success
[root@ ~]# firewall-cmd --zone=public --add-service=https --permanent
success
[root@ /]# firewall-cmd –reload
success
[root@ /]# firewall-cmd --list-all
  public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh dhcpv6-client http https
  ports:       <- 後日、ポート番号を指定して解放する。
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
 
4. https通信に関する設定する。
 
1) mod_sslがインストールされているかの確認。
 (Loaded Modulesの確認): # httpd -M
 又は
 (Installed Packagesの確認): #yum list installed | grep mod_ssl
 
インストールされていないので、この段階では、両方とも、何も検知しない。
 
2) mod_sslのインストール
[root@ /]# yum install mod_ssl
Complete!
 
3)再起動で変更を反映します。
[root@ /]# systemctl restart httpd
 
4Loaded Modulesの確認
[root@ /]# httpd -M  
 ssl_module (shared)
 
https:// (IP address)で、ブラウザでも表示できることの確認)
 
5. Python3.7 pip のインストール
 
1) CentOSで必要なパッケージをインストールします。
# yum --setopt=group_package_types=mandatory,default,optional groupinstall "Development Tools"
#yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel python-devel libffi-devel
 
Complete!
#yum install httpd-devel python-devel
Package httpd-devel-2.4.6-88.el7.centos.x86_64 already installed and latest version Package python-devel-2.7.5-76.el7.x86_64 already installed and latest version Nothing to do
 
 
2) Pythonをソースからインストールする。
 
# cd /usr/local/src  ←このディレクトリに入れて管理することはとても大事。
 
 
でインストールしたいバージョンの確認。
 
[root@ofcm9och src]# yum -y install wget
 
[root@ofcm9och src]# ls -a
.  ..  Python-3.7.3.tgz
 
[root@ofcm9och src]# tar zxvf Python-3.7.3.tgz
([root@ofcm9och src]# tgz Python-3.7.3.tgz)
 
cd Python-3.7.3
[root@ueczshc7 Python-3.7.3]# ./configure --enable-shared
[root@ofcm9och Python-3.6.8]# ./configure --enable-optimizations <- Note1)
[root@ueczshc7 Python-3.7.3]# make && make altinstall
 
Collecting setuptools
Collecting pip
 
Installing collected packages: setuptools, pip
 
Successfully installed pip-19.0.3 setuptools-40.8.0
 
 
**Note 1) added on Jan.2019
何度か、ソースコードからpythonをビルドした時に気が付いたのだが、./configure --enable-shared を実行すると、「効率的なシステム構築の為に、 ./configure --enable-optimizations を実行することを合わせて考えてください。」というメッセージが出るので、実行していたが、このコマンドを実行すると、シェアド・ライブラリ用のファイル libpython3.7m.so が作成されないようだ。 wsgiは、shared library を使うことを強く推奨しているので、 ./configure --enable-optimizations は実行してはいけない。
 
 
3) シンボリックリンクを作成する。
 
[root@ofcm9och /]# cd /usr/local/bin
[root@ofcm9och bin]# ls -a
.   2to3-3.7          idle3.7  pydoc3.7   python3.7m         pyvenv-3.7
..  easy_install-3.7  pip3.7   python3.7  python3.7m-config
 
[root@ofcm9och /]# cd /usr/bin
[root@ofcm9och bin]# ls -a
python
ab                     gtroff                    python2
aclocal                gunzip                python2.7
aclocal-1.13           gzexe              python2.7-config
acpi_listen            gzip                 python2-config
addr2line              h2ph                python-config <- python3は無い。
 
 
(Symbolic Linkの作成:python3.7 (実在)にpython3というリンクを作る)
 
$ ln -s /usr/local/bin/python3.7 /usr/bin/python3
 
[root@ofcm9och bin]# ls -a
.                        gsoelim               pwmake
..                       gstack                  pwscore
[                        gtar                      pydoc
a2p                    gtbl                     python
ab                      gtroff                  python2
aclocal              gunzip                 python2.7
aclocal-1.13      gzexe                  python2.7-config
acpi_listen        gzip                     python2-config
addr2line           h2ph                   python3  <- 出来た。
 
この段階で、python3.7 とコマンドをうっても、起動できません。
以下のようなエラーになります。
[ ~]# python3.7
python3.7: error while loading shared libraries: libpython3.7m.so.1.0: cannot open shared object file: No such file or directory
 
[root@ofcm9och /]# cd /usr/local/lib
[root@ofcm9och lib]# ls -a
.   libpython3.7m.so      libpython3.so  python3.7
..  libpython3.7m.so.1.0  pkgconfig
 
[root@ofcm9och /]# find -name lib64
./usr/lib/debug/usr/lib64
./usr/lib/debug/lib64
./usr/lib64  <-ここにシンボリックファイルを作成する。
./usr/share/gdb/auto-load/usr/lib64
./usr/share/gdb/auto-load/lib64
./usr/local/lib64
./usr/src/kernels/3.10.0-957.10.1.el7.x86_64/arch/sh/lib64
./lib64
 
[root@ofcm9och /]$ ln -s /usr/local/lib/libpython3.7m.so.1.0 /lib64/
 
[root@ofcm9och /]# find -name libpython3.7m.so.1.0
./usr/lib64/libpython3.7m.so.1.0 <-出来た。
./usr/local/lib/libpython3.7m.so.1.0
./usr/local/src/Python-3.7.3/libpython3.7m.so.1.0
 
4) シンボリック・リンクが機能しているか確認
[root@ofcm9och /]# python3.7 –version
Python 3.7.3
 
[root@ueczshc7 /]# python3
Python 3.7.3 (default, Apr  9 2019, 02:55:23)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
 
[root@ueczshc7 /]# python3.7
Python 3.7.3 (default, Apr  9 2019, 02:55:23)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
 
[root@ofcm9och /]# which python <- pythonだけだとデフォルト
/usr/bin/python
[root@ofcm9och /]# python -V
Python 2.7.5
 
6. Virtualenvのインストール
pipでインストールします。 pipがインストールされているか、違うバージョンのpythonが既にインストールされているときのpipの実行の仕方など、こちらにまとめていますので、参考に。【 Python PIP  良く使うコマンド一覧 <https://mycodingjp.blogspot.com/2018/10/python-pip.html 】
 
[root@ueczshc7 /]# cd /home
[root@ueczshc7 home]#python3 -m pip install virtualenv  
Successfully installed virtualenv-16.4.3
 
グローバル環境にインストールされたpackageのリストの確認。
[root@ueczshc7 home]# python3 -m pip freeze
virtualenv==16.4.3
 
 
7. Virtual Environmentを作成する為のディレクトリー作成。
[root@ueczshc7 home]# mkdir venv_env
[root@ueczshc7 home]# virtualenv venv_env
Using base prefix '/usr/local'
New python executable in /home/venv_env/bin/python3
Also creating executable in /home/venv_env/bin/python
Installing setuptools, pip, wheel...
done.
 
 
7. 仮想環境(virtualenv)のアクティベート
[root@ueczshc7 home]# source venv_env/bin/activate
(venv_env) [root@ueczshc7 home]# which python
/home/venv_env/bin/python
(venv_env) [root@ueczshc7 home]# python -V
Python 3.7.3 <- virtualenvをインストールしたときのPython環境に準拠します。
(venv_env) [root@ueczshc7 home]# pip freeze
(venv_env) [root@ueczshc7 home]# <- インストールされたpackageはありません。
 
 
********************************************************************************
若し、cd /usr/local/src にインストールしたPython3の環境と別のPythonのバージョンをmod_wsgiで使用したい場合、この仮想化対象となるvenv_envフォルダ内に新しくインストールしても良い。
 
この場合、mod_wsgiをコンパイルする際に--with-python=/full/path/to/python で参照するPythonは、このインストールしたPython参照させる。
などによると、virtualenv(venv)環境下でmod_wsgiを利用する場合、virtualenvで使用するPythonのバージョンとmod_wsgiをコンパイルしたバージョンは同じでなくてはいけないらしい。 そうであれば、
 
 
********************************************************************************
 
8mod_wsgiをインストールする。
1) venv_env環境にインストールする。
 
[root@ueczshc7 venv_env]# wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.6.5.tar.gz            
2019-04-09 17:57:53 (1.10 MB/s) - ‘4.6.5.tar.gz’ saved [693825]
 
[root@ueczshc7 venv_env] # tar zxvf 4.6.5.tar.gz
[root@ueczshc7 venv_env]# cd /
 
[root@ueczshc7 /]# find -name apxs
./usr/bin/apxs
 
[root@ueczshc7 /]# cd /home
[root@ueczshc7 home]# source venv_env/bin/activate
 
(venv_env) [root@ueczshc7 home]# cd venv_env/mod_wsgi-4.6.5
(venv_env) [root@ueczshc7 mod_wsgi-4.6.5]#
 
(venv_env) [root@ueczshc7 mod_wsgi-4.6.5]# ./configure --with-apxs=/usr/bin/apxs --with-python=/usr/bin/python3 ←これは、cd /usr/local/srcにインストールしたPython
configure: creating ./config.status
config.status: creating Makefile
 
(venv_env) [root@ueczshc7 mod_wsgi-4.6.5]# make && make install
Libraries have been installed in:
    /usr/lib64/httpd/modules
chmod 755 /usr/lib64/httpd/modules/mod_wsgi.so <-後でmod_wsgi.soが、pythonshared libraryを使えているか確認します。
 

 
9Flaskをインストールする
1) Install
この段階で、virtualenv 環境で実行されるPIPを確認すると、
(venv_env) [root@ueczshc7 mod_wsgi-4.6.5]# pip -V
pip 19.0.3 from /home/venv_env/lib/python3.7/site-packages/pip (python 3.7)
 
venv_envのサイトパッケージに格納されていることが分かる。
 
 
(venv_env) [root@ueczshc7 mod_wsgi-4.6.5]# pip install flask==
Collecting flask==
(venv_env) [root@ueczshc7 mod_wsgi-4.6.5]# pip install flask==1.0.2
Successfully installed Jinja2-2.10 MarkupSafe-1.1.0 Werkzeug-0.14.1 click-7.0 flask-1.0.2 itsdangerous-1.1.0
 
2)確認
(venv_env) [root@ueczshc7 mod_wsgi-4.6.5]# pip freeze
Click==7.0
Flask==1.0.2
itsdangerous==1.1.0
Jinja2==2.10.1
MarkupSafe==1.1.1
Werkzeug==0.15.2
 
(venv_env) [root@ueczshc7 venv_env]# which flask
/home/venv_env/bin/flask
 

 
以下のコマンドで、venv_env配下のsite-packageに、Flask関連のパッケージがインストールされた事が確認できる。
(venv_env) [root@ueczshc7 venv_env]# ls -a lib/python3.7/site-packages
 
.                    Flask-1.0.2.dist-info         MarkupSafe-1.1.1.dist-info  setuptools-41.0.0.dist-info
..                   itsdangerous                  pip                         werkzeug
click                itsdangerous-1.1.0.dist-info  pip-19.0.3.dist-info        Werkzeug-0.15.2.dist-info
Click-7.0.dist-info  jinja2                        pkg_resources               wheel
easy_install.py      Jinja2-2.10.1.dist-info       __pycache__                 wheel-0.33.1.dist-info
flask                markupsafe                    setuptools
 
11VirtualHostの設定
1httpd.confに、virtualhostを使うことの宣言
記載する場所はどこでも可だが、とりあえず 'Listen 80'の下に書く。
NameVirtualHost *:80
 
2) Virtual Hostの記述
LoadModule wsgi_module /usr/lib64/httpd/modules/mod_wsgi.so
<VirtualHost *:80>
   ServerName uslife.mossymob.tk
   DocumentRoot /var/uslife/html
 
   <Directory /var/uslife/html>
    Require all granted
   </Directory>
 
WSGIDaemonProcess forum user=apache group=apache python-home=/home/venv_env/
   WSGIScriptAlias /app/forum /var/uslife/html/app/forum/app.wsgi
 
   <Directory /var/uslife/html/app/forum>
   WSGIProcessGroup forum
   WSGIApplicationGroup %{GLOBAL}
   Require all granted
   </Directory>
     CustomLog /home/venv_env/access.log common
     ErrorLog /home/venv_env/error.log
     LogLevel info
</VirtualHost>
 
 
 
 
12. Project Fileのアップロード
[root@ueczshc7 /] # mkdir /var/uslife
[root@ueczshc7 /] # cd  /var/uslife
[root@ueczshc7 uslife]# mkdir html
[root@ueczshc7 uslife]# mkdir html/app
[root@ueczshc7 uslife]# mkdir html/app/forum
 
 
[root@ueczshc7 uslife]# ls -a /home/venv_env/bin
 
app/forum/app.wsgi
# coding: utf-8
activate_this ='/home/venv_env/bin/activate_this.py'
 
with open(activate_this) as file_:
    exec(file_.read(),dict(__file__=activate_this))
 
import sys
sys.path.insert(0, '/var/uslife/html/app/forum')
 
from app import app as application

app/forum/app.py

from flask import Flask,render_template,request
app = Flask(__name__)

@app.route('/app') <- pyファイルの名前がindex.pyではない場合、ファイル名 
def index():
    message="Hi, there!"
    return render_template("sample01.html", message=message)
   
@app.route('/add',methods=['POST'])
def add():
    if request.method =='POST':
        result = request.form['new_num']
    #else:
    #    result = "No wish! Ah?"
       
    return render_template("sample02.html", result=result)

if __name__ == '__main__':
    app.run()

app/forum/templates/sample01.html

<html>
 <head>
   <meta charset="utf-8">
 </head>
 <body>
 {{message}}
<form action="/app/forum/add" method="post">   <-Document Rootからのフルパス
<p>Input the number you like:</p>
<input type="text" name="new_num" >
<input type="submit" value="Do">
</form>
 </body>
</html>

app/forum/templates/sample02.html
<html>
 <head>
   <meta charset="utf-8">
 </head>
 <body>

<p>Now we know the number you like is</p>
{{result}}
 </body>
</html>


おしまい。

0 件のコメント:

コメントを投稿