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
2)Configファイルのコピーを保存。(??)
[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
4)Loaded 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]#wget https://www.python.org/ftp/ python/3.7.3/Python-3.7.3.tgz
[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@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がインストールされているか、違うバージョンのpytho nが既にインストールされているときの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も)環境下でmo d_wsgiを利用する場合、virtualenvで使用するP ythonのバージョンとmod_wsgiをコンパイルしたバー ジョンは同じでなくてはいけないらしい。 そうであれば、
****************************** ****************************** ********************
8.mod_wsgiをインストールする。
1) venv_env環境にインストールする。
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が、pythonのshared libraryを使えているか確認します。
9.Flaskをインストールする
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
11.VirtualHostの設定
1)httpd.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>
おしまい。
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 件のコメント:
コメントを投稿