---
title: "ApacheでpythonとflaskとSSLな環境を構築する"
description: "Ubuntu上のApacheで、Python・Flask・SSLの実行環境を構築した記録。"
url: "https://miyayu.jp/blog/qiita-aae13d1d8f93a59c2ad3/"
pubDate: "2021-12-20"
updatedDate: "2021-12-20"
tags: ["Python","Apache","Flask"]
---

# ApacheでpythonとflaskとSSLな環境を構築する

> **過去の記事（Qiitaから移行）**
>
> この記事は公開当時の知識・環境に基づいて書いたものです。現在の仕様に合わせた更新・動作確認は行っておらず、内容の正確性や動作を保証するものではありません。
>
> 初出：[2021-12-20・Qiita](https://qiita.com/yuu1111main/items/aae13d1d8f93a59c2ad3)

# 前提環境
Apache 2.4.41
Python 3.8.10
Ubuntu 20.04.3
# 参考

<https://tech-blog.s-yoshiki.com/entry/9>

<https://gb-j.com/column/ubuntu-flask/>

# 環境構築
```shell-session
 $ 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から着想を得て、他の言語でも同様のインタフェースが作られた。
> 引用：<a href="https://ja.wikipedia.org/wiki/Web_Server_Gateway_Interface">Wikipedia「Web Server Gateway Interface」2021年3月20日 (土) 12:13版</a>

# Apache上の準備
## ディレクトリの作成
今回は `/var/www/app/` に作業ファイルを配置することとします。
権限の設定についてはこちらを参照(www-dataに自身を追加しているのであれば対策不要)

<https://miyayu.jp/blog/qiita-77976d7ece0ecfb35157/>

```shell-session
 $ 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を登録する方法についてはこちらの記事にて詳しく解説しています。（無料）

<https://miyayu.jp/blog/qiita-2ab2b86f9fa4e24a0a8b/#cloudflare%E3%81%AEssl%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B>

```shell-session
 $ sudo vim /etc/apache2/sites-available/ドメイン名.conf
```
次の内容でファイルを作成します

**ドメイン名.conf**

```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>
```
ファイルを保存したら次のコマンドを実行します

```shell-session
 $ sudo a2ensite ドメイン名.conf
 $ sudo systemctl restart apache2
```
その後、自分のドメインにアクセスして404が表示されたら成功です。

## ファイルの設置
そうしましたら、こちらを参考にファイルを置いていきます。

```shell-session
 $ cd /var/www/app/
 $ mkdir ./{project,project/app,project/app/controller}
```
### index.wsgi
```shell-session
 $ vim project/index.wsgi
```
**index.wsgi**

```python
import sys, os
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))
from app.controller.index import app as application
```
### index.py
```shell-session
 $ vim project/app/controller/index.py
```
**index.py**

```python
from flask import Flask

app = Flask(__name__)

@app.route("/", methods=['GET'])
def index():
    return "Hello World!"

if __name__ == "__main__":
    app.run()
```
### 完成系
```text
project
|-- app
|   `-- controller
|       `-- index.py
`-- index.wsgi
```
その後、自分のサイトにアクセスしてHello world!と表示されれば成功です。
ちなみに、エラーログは`sudo cat /var/log/apache2/error.log`にて確認できます。
