メインコンテンツへスキップ

Flask アプリをさくらのレンタルサーバで動かす

·2 分
ひとりアドベントカレンダー2024 Python Flask Cgi
目次

はじめに
#

「OKAZAKI Shogo のひとりアドベントカレンダー2024」の4日目です。 今回のインフラの条件である、さくらのレンタルサーバに Flask のアプリをおいて動かすことを試みます。

今回の契約形態
#

  • さくらのレンタルサーバ スタンダートプラン
    • sudo とかが使えなかったりして一部制限がある
    • Python 3.8.12 が標準でインストールされている(2024年12月現在)
      • pyenv 入れて別のバージョンを動かす、みたいなことは試みたけど出来なかった
      • pip install はできる
    • デプロイ方法は FTP クライアントを使って直接アプリを所定の場所に置く

Flask アプリを動かすまでの準備
#

レンタルサーバーに SSH で接続。デフォルトで csh なので bash に変更する。

1% chsh -s /usr/local/bin/bash
2Password:
3chsh: user information updated

一旦接続をやめて再度接続すると bash になっている。為念 Python のバージョンを確認する。

1$ python -V
2Python 3.8.12
3$ which python
4/usr/local/bin/python

pip を使うためのインストーラをダウンロードして、実行する。

 1$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
 2$ python get-pip.py
 3Defaulting to user installation because normal site-packages is not writeable
 4Collecting pip
 5  Using cached pip-24.3.1-py3-none-any.whl.metadata (3.7 kB)
 6Using cached pip-24.3.1-py3-none-any.whl (1.8 MB)
 7Installing collected packages: pip
 8  Attempting uninstall: pip
 9    Found existing installation: pip 24.3.1
10    Uninstalling pip-24.3.1:
11      Successfully uninstalled pip-24.3.1
12  WARNING: The scripts pip, pip3 and pip3.8 are installed in '/home/<アカウント名>/.local/bin' which is not on PATH.
13  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
14Successfully installed pip-24.3.1

/home/<アカウント名>/.local/bin にパスが通ってないので通す。

1$ echo 'export PATH=~/.local/bin/:$PATH' >> .bash_profile

Flask をインストールする。

1$ pip install flask
2$ flask --version
3Python 3.8.12
4Flask 3.0.3
5Werkzeug 3.0.6

Flask アプリを cgi で動かす
#

src ディレクトリ配下に以下のものを作成する

index.cgi

 1#!/usr/local/bin/python
 2# -*- coding: utf-8 -*-
 3
 4import cgitb
 5cgitb.enable()
 6
 7
 8from wsgiref.handlers import CGIHandler
 9from app import app
10
11
12class ProxyFix(object):
13  def __init__(self, app):
14      self.app = app
15      
16  def __call__(self, environ, start_response):
17      return self.app(environ, start_response)
18
19
20if __name__ == '__main__':
21   app.wsgi_app = ProxyFix(app.wsgi_app)
22   CGIHandler().run(app)

.htaccess

1RewriteEngine On
2RewriteCond %{REQUEST_FILENAME} !-f
3RewriteRule ^(.*)$ /index.cgi/$1 [QSA,L]
4<Files ~ "\.py$">
5  deny from all
6</Files>

src ディレクトリ以下のものをサーバーのルートにアップし、index.cgi.htaccess のパーミッションを 755 にする。

 1$ ls -la
 2total 28
 3drwx---r-x  4 <アカウント名>  users  512 Dec  4 23:35 .
 4drwx---r-x  5 <アカウント名>  users  512 Dec  4 20:48 ..
 5-rw----r--  1 <アカウント名>  users  136 Dec  4 23:35 .htaccess
 6-rw----r--  1 <アカウント名>  users  188 Dec  4 23:34 app.py
 7-rw----r--  1 <アカウント名>  users  419 Dec  4 23:34 index.cgi
 8drwx---r-x  4 <アカウント名>  users  512 Dec  4 23:34 static
 9drwx---r-x  2 <アカウント名>  users  512 Dec  4 23:34 templates
10$ chmod 755 .htaccess index.cgi
11$ ls -la
12total 28
13drwx---r-x  4 <アカウント名>  users  512 Dec  4 23:35 .
14drwx---r-x  5 <アカウント名>  users  512 Dec  4 20:48 ..
15-rwxr-xr-x  1 <アカウント名>  users  136 Dec  4 23:35 .htaccess
16-rw----r--  1 <アカウント名>  users  188 Dec  4 23:34 app.py
17-rwxr-xr-x  1 <アカウント名>  users  419 Dec  4 23:34 index.cgi
18drwx---r-x  4 <アカウント名>  users  512 Dec  4 23:34 static
19drwx---r-x  2 <アカウント名>  users  512 Dec  4 23:34 templates

これでルートにアクセスして、ローカルで表示されたものと同じものが表示されれば成功。

参考資料
#