スポンサーリンク

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

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で質問するなりすると、より優秀なエンジニアの方からアドバイスが受けれるのにどうしようもない人はそうしてみてはいかがでしょうか?

スポンサーリンク

プログラミングの独学はとても難しい


プログラミングは小学校の義務教育にも導入され始めており、これから社会人として生きていく上でプログラミングはもはや出来て当たり前、出来なれば論外というエクセルレベルの必須スキルになりつつあります。そしてそういう話を聞いて参考書なりを購入して独学でプログラミング勉強しようと思っている人も少なくないでしょう。しかしプログラミングを独学で勉強し始めようと思うものの



・「分からない箇所で詰まって挫折してしまった」

・「勉強する時間が足りない」

・「ネットの記事だと情報が断片的でよくわからない」

・「コードのエラーの原因が分からない」



という壁にぶち当たって、プログラミングの勉強を止めてしまう方が少なくありません。独学でプログラミングを勉強してる時間のほとんどはつまづいている時間です。実際僕も最初のころ独学でプログラミングを勉強していた頃はエラーの原因が分からず丸1日を不意にしてしまった・・・そんな苦い経験がありました。



それで僕は一度はプログラミングの学習を諦めてしまいましたが、就活で現実を知る中で「プログラミングを勉強して、いずれフリーランスとして自由な生き方がしたい」「エンジニアとして若いうちから高収入を得たい」という気持ちから一念発起して「侍エンジニアのwebサービスコース」に申し込み、プロのエンジニアの方に対面でマンツーマンでPythonによるWebサービス作り方とWeb技術の基本を教えてもらい、ようやくプログラミングが理解でき、今ではエンジニアとしてそこそこの暮らしができるようになりました。





侍エンジニアでは、とりあえずプログラミングやインターネットの基本を知っておきたい人から、HTML・cssなどでWebサイトやWebアプリを作ってみたい人やPythonを勉強してデータサイエンティストやAIエンジニアになりたい人まで幅広いニーズに応えた様々なコースが用意されています。



IT業界と言ってもエンジニアの仕事はプログラミング言語次第でサーバーから機械学習・ディープラーニングまで多種多様ですし、侍エンジニアの無料レッスン(カウンセリング)を受けてみて、自分のやりたいITの仕事は何なのか?を見つけるのがエンジニアへの第一歩になります。ちなみに今侍エンジニアの無料レッスンを受けると1000円分のAmazonギフト券がもらえるので、試しに受けてみるだけもお得です。


自分は半端に独学やオンラインスクールで勉強して金と時間を無駄にするくらいなら、リアルのプログラミングスクールに通ってしっかりプログラミングを勉強した方がいいと思います。ちなみに今、侍エンジニアに申し込むと、25歳以下の学生の方であれば、受講料が20%OFFになるので超お得です。


そして、プログラミングは大勢で授業を受けたり漫然とオンライン学習をするよりも自分が分からない箇所をピンポイントでプロの講師に直接質問して、ちゃんと納得するというスタイルの方がお金は確かに少し掛かりますが、独学で学ぶよりも絶対にモノになります。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする