【CentOS 7】Apache+wsgi+FlaskでWebアプリをデプロイする上でのエラー原因&解決法

この記事は約10分で読めます。

 

Apache&Flaskが起動しない時のトラブルシューティング

 

前回はVPSサーバー上でFlask+Wsgi+Apacheで自作のWebアプリをインターネット上にデプロイする流れを一通り説明しました。

 

ですが、ApacheとWsgiの設定はCentOSのバージョンや環境によってhttpd.confに記述する内容が微妙に変わるために、記事の通りにやったはずだけど中々うまく起動しない・・・という人が多いと思います。

 

なので、今回は自分が実際にflask+Wsgi+Apacheを連携させてWebアプリをデプロイするまでにハマった点をすべてメモしておいたので、その時のエラー原因&解決策を公開しておきます。

 

 

Apacheのエラーの原因が分からない

 

プログラミングでも特にサーバー系のエラーは、エラーログを見るのが本当に大切になります。エラー内容はエラーログに保存されているので、そのエラーログを見て原因を推測し、対処法を考えましょう。

 

 

#Apacheの起動失敗のエラーのログを確認
$journalctl -xe

 

 

仮想環境内でもない限り、VPSサーバーだとApache起動後のエラーログは「/var/log/httpd」に置いてあります。ここのerror.logsを確認してエラーの内容を把握しましょう。

 

一応自分のApacheとPythonのバージョンを再確認とApacheの再起動を行いたい場合はコマンドラインで以下のコマンドを実行することでできます。

 

 

#Pythonのバージョンを確認する
$python -V

 

#Apacheのバージョンを確認する
$httpd -v

 

#Apacheを再起動する
$sudo service httpd restart

 

 

 

Apacheが何故かPython2.7で起動してしまう

 

Apacheは起動したもののWebページが表示されない、おかしいと思って「/var/log/httpd」のログを見ると、Apache/2.4.6 (CentOS) mod_wsgi/3.6.5 Python/2.7 configured — resuming normal operationsと、なんとPythonが2.7で起動している。。。そういう場合はCentOSがデフォルトのPython2.7を読み込んでいることが原因です。

 

 

#Pythonのバージョンを確認する
$python -V

 

 

これでPython2.7が返ってくる場合は、Wsgi.confにWsgi python Path Wsgi pythonHOMEを追記して、Apacheにこれから読み込むWsgiとPythonは3系であることを教えてやる必要があります。

 

またyumでwsgiをインストールするとWsgi3がインストールされ、これはPython2にしか対応していないので、yumでインストールしたwsgiが生成されたmod_wegi.soをWsgi.confの「Load Module wsgi Module~」の部分で指定すると、ApacheはPython2.7.5で起動します。

 

解決策としてはpipでインストールしたwsgi4.0以降のmod_wegi.soを「Load Module wsgi Module~」で指定するとうまくいきます。

 

Mod_wsgi.soに紐づけられているPythonのパスを確認してCentOSがデフォルトでインストールしているPython2.7系と紐づけられていないかを確認しましょう。紐づけられていた場合はアンインストールしてインストールしなおしましょう。

 

 

#Mod_wsgi.soのPython設定を確認する

$ldd /usr/lib64/python3.4/site-packages/mod_wsgi/server/mod_wsgi-py34.cpython-34m.so

※実行結果
linux-vdso.so.1 => (0x00007ffc42be5000)
libpython3.4m.so.1.0 => /usr/lib64/libpython3.4m.so.1.0 (0x00007f0715a0e000)
libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007f07157f2000)
libc.so.6 => /usr/lib64/libc.so.6 (0x00007f0715425000)
libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007f0715221000)
libutil.so.1 => /usr/lib64/libutil.so.1 (0x00007f071501e000)
libm.so.6 => /usr/lib64/libm.so.6 (0x00007f0714d1c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f07160da000)

 

 

ちなみにCentOSにデフォルトでインストールされているPython2.7を取り除こうとするとCentOS自体がバグってとんでもないことになるので絶対にやめましょう。

 

あと私の場合はAnacondaの仮想環境内にある/.pyenv内のPython3.6にwsgiをインストールして、その中にインストールされたmod_wsgi.soを読み込ませようとしたのですが、うまくいかなかったので、デフォルトの環境に新しくPython3.4をインストールして「pip3.4 install wsgi 」「pip3.4 Install flask」でwsgiとflaskをインストールしました。

 

 

CANNOT Load ModuleでAppacheが起動しない

 

WSGIのバージョンが4.0以降なのに、Apacheを起動せず、$journalctl -xeでエラーログを確認すると、Syntax Error CANNOT Load ModuleでPythonが起動しない場合は、loadmodules WSGI moduleの前にWSGI PythonPATH WSGI python HOMEで読み込むwsgiがPython3系であることを教えてあげる必要があります。

 

私はこのLoad Module errorが一番ハマりました。私のハマった原因はLoad ModuleをApacheの起動ファイルである「httpd.conf(etc/httpd/conf/httpd.conf)」に記述していたことにありました。

 

Apacheは起動すると、まず最初にhttpd.confを読み込んでそこに記述している 「IncludeOptional conf.d/*.conf」で「etc/httpd/Conf.d」にあるconfファイルを全部読み込みます。なので、「/conf.d」内にwsgi.confなり、任意の名前でwsgi用の処理を記述したconfファイルを新規作成します。

 

ここにLoadModule wsgi_module (任意のMod_wsgi.soのパス)を記述するとエラーは起こりません。それでも「cannot Load module」のエラーが起こる場合はhttpd.confにmod_Wsgi.soへのアクセス権限がないことが原因かもしれません。

 

そういう場合は「chmod 755 (PythonHomeのパスのトップ)」または「chmod 755 /usr」で、httpd.confがmod_wsgi.soがあるフォルダにアクセスできるようにしましょう。

 

権限についてよく分からない人はまず、mod_wsgi.soをetc/httpd/modulesにおいて「LoadModule wsgi_module /modules/mod_wsgi.so」に変えてみるとうまくいくかもしれません。

 

 

No module ”encording”でサイトが表示されない

 

これは、Wsgi.confに記述しているであろうWsgi Python HOMEのパスが間違っている可能性が高いです。コンソール画面で任意のバージョン(mod_wsgi.soとAppacheに連結させるPythonのバージョン)のPythonを起動して以下のコードを入力して出力されるディレクトリをPythonHomeのパスに指定します。(私の場合は/usrでした。)

 

 

$python

>>> import sys
>>> sys.prefix
'/usr'

>>>sys.path
['',
 '/usr/lib64/python34.zip',
 '/usr/lib64/python3.4',
 '/usr/lib64/python3.4/plat-linux',
 '/usr/lib64/python3.4/lib-dynload',
 '/usr/lib64/python3.4/site-packages',
 '/usr/lib/python3.4/site-packages']

 

 

Appacheが起動したのに「403 Forbidden」でwebページが表示されない

 

これはOther(外部からのアクセス者)にアクセス権限が付与されていないことが原因です。Appache2.4以降からの場合は

 

Order allow,deny
Allow from all

 

の変わりに/conf.d/wsgi.confに

 

all granted

 

 

を追記すると外部からのアクセス者にディレクトリのファイルの読み取り権限が付与されます。

 

 

Appacheがちゃんと起動しているのにhtmlが表示されない

 

Apacheはちゃんと起動しているのにwebページにアクセスすると、「Index Of/~」と表示されてサーバー内のファイルのディレクトリが丸見えになっていてwebページが表示されない場合がwsgi.aria scriptで指定しているパスが間違えています。

 

私の場合は/appにしていたのを気付かずトップページ(example.com)にアクセスしていたので、Flaskのルーティングが行われずファイルのディレクトリの.pyファイルやhtmlが丸見えになっていました。

 

wsgi script / にしておかないとトップページにアクセスした場合内部のディレクトリが丸見えになりますので注意しましょう。

 

他にも「from test import app as application」は注意ポイントです。今回は起動ファイルをtest.pyに記述していたので、from test~としていますが、もし実行ファイルが(任意の名前).pyであれば、「from (任意の名前) import app as application」と記述することになります。

 

</var/www/html/app/as.wsgiの中身>

import sys
import os

#wsgi, Flaskファイルのディレクトリを指定
sys.path.insert(0, '/var/www/html/app')
from test import app as application

 

 

 

終わり

 

以上が私がさくらVPSのCentOS7+Apache+Flaskで自作webアプリケーションをインターネット上にデプロイする上でぶち当たったエラーとその原因&解決策です。皆さんのお役に立てば幸いです。

 

ここにある対処法でもうまくいかない場合はteratailで質問するなりすると、より優秀なエンジニアの方からアドバイスが受けれるのにどうしようもない人はそうしてみてはいかがでしょうか?

 

 

 

 

 

コメント

タイトルとURLをコピーしました