はじめに#
「OKAZAKI Shogo のひとりアドベントカレンダー2024」の4日目です。 今回のインフラの条件である、さくらのレンタルサーバに Flask のアプリをおいて動かすことを試みます。
今回の契約形態#
- さくらのレンタルサーバ スタンダートプラン
- sudo とかが使えなかったりして一部制限がある
- Python 3.8.12 が標準でインストールされている(2024年12月現在)
- pyenv 入れて別のバージョンを動かす、みたいなことは試みたけど出来なかった
- pip install はできる
- デプロイ方法は FTP クライアントを使って直接アプリを所定の場所に置く
Flask アプリを動かすまでの準備#
レンタルサーバーに SSH で接続。デフォルトで csh なので bash に変更する。
一旦接続をやめて再度接続すると bash になっている。為念 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 をインストールする。
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
これでルートにアクセスして、ローカルで表示されたものと同じものが表示されれば成功。