#前提環境
Apache 2.4.41
Python 3.8.10
Ubuntu 20.04.3
#参考
#環境構築
$ sudo apt-get update
$ sudo apt -y install python3-pip libapache2-mod-wsgi-py3
$ sudo a2enmod wsgi
$ sudo pip3 install flask
Web Server Gateway Interface (WSGI; ウィスキー) は、プログラミング言語Pythonにおいて、WebサーバとWebアプリケーション(あるいはWebアプリケーションフレームワーク)を接続するための、標準化されたインタフェース定義である。また、WSGIから着想を得て、他の言語でも同様のインタフェースが作られた。
引用:Wikipedia「Web Server Gateway Interface」2021年3月20日 (土) 12:13版
#Apache上の準備
##ディレクトリの作成
今回は /var/www/app/
に作業ファイルを配置することとします。
権限の設定についてはこちらを参照(www-dataに自身を追加しているのであれば対策不要)
$ sudo mkdir /var/www/app
$ sudo chown -R www-data:www-data /var/www/app
$ sudo chmod 775 -R /var/www/app
##VirtualHostの設定
CloudflareのSSLを登録する方法についてはこちらの記事にて詳しく解説しています。(無料)
$ sudo vim /etc/apache2/sites-available/ドメイン名.conf
次の内容でファイルを作成します
<VirtualHost *:80>
ServerAdmin 管理者メールアドレス
ServerName ドメイン
ServerAlias www.ドメイン
DocumentRoot /var/www/app/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =ドメイン [OR]
RewriteCond %{SERVER_NAME} =www.ドメイン
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<VirtualHost *:443>
ServerAdmin 管理者メールアドレス
ServerName ドメイン
ServerAlias www.ドメイン
DocumentRoot /var/www/app/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile pemの場所
SSLCertificateKeyFile keyの場所
WSGIDaemonProcess app2 user=www-data group=www-data threads=5
WSGIScriptAlias / /var/www/app/project/index.wsgi
</VirtualHost>
ファイルを保存したら次のコマンドを実行します
$ sudo a2ensite ドメイン名.conf
$ sudo systemctl restart apache2
その後、自分のドメインにアクセスして404が表示されたら成功です。
##ファイルの設置
そうしましたら、こちらを参考にファイルを置いていきます。
$ cd /var/www/app/
$ mkdir ./{project,project/app,project/app/controller}
###index.wsgi
$ vim project/index.wsgi
import sys, os
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))
from app.controller.index import app as application
###index.py
$ vim project/app/controller/index.py
from flask import Flask
app = Flask(__name__)
@app.route("/", methods=['GET'])
def index():
return "Hello World!"
if __name__ == "__main__":
app.run()
###完成系
project
|-- app
| `-- controller
| `-- index.py
`-- index.wsgi
その後、自分のサイトにアクセスしてHello world!と表示されれば成功です。
ちなみに、エラーログはsudo cat /var/log/apache2/error.log
にて確認できます。