エックスサーバーでは、最初からpipは入ってはいますが、root権限がないためデフォルトではpipを使えません。Flask環境を構築するために、何とかしてpipを使えるようにしたいのですが、調べてみるとLinuxbrewをインストールしてからpythonをインストールして、やっとpipが使えるようになるとか、すごく面倒です。しかも、予期しない不具合の原因になることがあるので、あまり余計なものをインストールしたくありません。
他の方法では、Linuxbrew、pyenv、AnacondaをインストールすればpipとFlaskを使えるようになるらしいです。それなら最初からAnacondaだけをインストールして使えないだろうかと思い、試してみました。
結論から言うと、Minicondaを使用すると比較的楽にpipの導入とFlaskの環境構築ができました。
エックスサーバーについて詳しく知りたい方は、こちら→エックスサーバー
もくじ
pipとcondaを使えるようにする
Flaskのためだけに、Anacondaをインストールするのは余計なものが多すぎますし、容量も大きくなるので、最小限のものしか入っていないMinicondaをインストールします。ルートフォルダにインストールしていきますので、他のフォルダにインストールする場合は、【/home/サーバーID/】の部分をインストールするフォルダに読み替えてください。
手順
- Minicondaをダウンロード
- FTPでルートフォルダにアップロード
- SSHでエックスサーバーに接続
- Minicondaをインストール
- PATHを通す
- 仮想環境を構築
- 仮想環境にFlaskをインストール
Minicondaをダウンロード
Minicondaのサイトから、最新のMinicondaをダウンロードしてインストールしようとするとエラーがでたため、過去バージョンのMinicondaをこちらからダウンロードします。
Miniconda3-py38_4.8.3-Linux-x86_64.sh | 88.7M |
上記のバージョンでは、問題なくインストール出来ました。
エラーの内容
/lib64/libc.so.6: version `GLIBC_2.4' not found
エックスサーバーのGLIBCのバージョンが2.17であることが原因のようです。
ldd --version
ldd (GNU libc) 2.17
FTPでアップロード
FTPソフトを使ってもいいのですが、今回はエックスサーバーのWebFTPでアップロードしました。ファイルサイズが大きいためか、アップロードボタンを押しても変化しませんが、しばらく待っていると(私の環境では1分ぐらい?)無事アップロードできました。
SSHでサーバーに接続
SSHの設定をし、TeraTermやRLoginなどのターミナルソフトでエックスサーバーに接続します。設定の仕方は、こちら。
Minicondaをインストール
sh Miniconda3-py38_4.8.3-Linux-x86_64.sh
アップロードしたMinicondaインストール用ファイルを置いてあるフォルダで、上の通り入力するとインストールが始まります。
Please, press ENTER to continue
>>>
ENTERを入力し、ライセンス条項がすべて表示されたら、
Do you accept the license terms? [yes|no]
[no] >>> yes
Miniconda3 will now be installed into this location:
/home/*****/miniconda3
- Press ENTER to confirm the location
- Press CTRL-C to abort the installation
- Or specify a different location below
[/home/*****/miniconda3] >>>
ENTERを入力
Do you wish the installer to initialize Miniconda3
by running conda init? [yes|no]
[no] >>> yes
PATHを通す
source .bashrc
インストールするときにすべてyesにしていると、これでPATHが通っていると思いますが、通っていない場合はPATHを通します。.bashrcに下の一文を追加して保存します。
仮想環境を構築
conda create -n flaskapp python=3.8
- Flaskをインストールするだけなら、仮想環境を構築しなくてもいいですが、今回は練習もかねて仮想環境を構築しています。
- flaskappという名前の仮想環境を構築しています。
- pythonをインストールするとpipもインストールされ、pipを使えるようになります。
- pythonのバージョンを指定せずにインストールすると、python3.9がインストールされFlaskが使えなかったので、python3.8をインストールしています。
(base) [***** ~]$ conda list
# packages in environment at /home/*****/miniconda3:
#
# Name Version Build Channel
_libgcc_mutex 0.1 main
ca-certificates 2020.1.1 0
certifi 2020.4.5.1 py38_0
cffi 1.14.0 py38he30daa8_1
chardet 3.0.4 py38_1003
conda 4.8.3 py38_0
conda-package-handling 1.6.1 py38h7b6447c_0
cryptography 2.9.2 py38h1ba5d50_0
idna 2.9 py_1
ld_impl_linux-64 2.33.1 h53a641e_7
libedit 3.1.20181209 hc058e9b_0
libffi 3.3 he6710b0_1
libgcc-ng 9.1.0 hdf63c60_0
libstdcxx-ng 9.1.0 hdf63c60_0
ncurses 6.2 he6710b0_1
openssl 1.1.1g h7b6447c_0
pip 20.0.2 py38_3
pycosat 0.6.3 py38h7b6447c_1
pycparser 2.20 py_0
pyopenssl 19.1.0 py38_0
pysocks 1.7.1 py38_0
python 3.8.3 hcff3b4d_0
readline 8.0 h7b6447c_0
requests 2.23.0 py38_0
ruamel_yaml 0.15.87 py38h7b6447c_0
setuptools 46.4.0 py38_0
six 1.14.0 py38_0
sqlite 3.31.1 h62c20be_1
tk 8.6.8 hbc83047_0
tqdm 4.46.0 py_0
urllib3 1.25.8 py38_0
wheel 0.34.2 py38_0
xz 5.2.5 h7b6447c_0
yaml 0.1.7 had09818_2
zlib 1.2.11 h7b6447c_3
conda install python
package | build
---------------------------|-----------------
ca-certificates-2020.10.14 | 0 121 KB
certifi-2020.6.20 | pyhd3eb1b0_3 155 KB
libedit-3.1.20191231 | h14c3975_1 116 KB
libffi-3.3 | he6710b0_2 50 KB
openssl-1.1.1h | h7b6447c_0 2.5 MB
pip-20.2.4 | py39h06a4308_0 1.8 MB
python-3.9.0 | hcff3b4d_1 18.1 MB
setuptools-50.3.0 | py39h06a4308_1 741 KB
sqlite-3.33.0 | h62c20be_0 1.1 MB
tk-8.6.10 | hbc83047_0 3.0 MB
tzdata-2020d | h14c3975_0 110 KB
wheel-0.35.1 | py_0 37 KB
------------------------------------------------------------
Total: 27.8 MB
仮想環境をアクティベート
conda activate flaskapp
参考:仮想環境の表示と削除
仮想環境リストを表示
conda info -e
仮想環境を削除(仮想環境名がflaskappの場合)
conda remove -n flaskapp --all
Flaskの環境構築
Flaskをインストール
conda install flask
インストールされたパッケージ
conda list
# packages in environment at /home/*****/miniconda3/envs/flaskapp:
#
# Name Version Build Channel
_libgcc_mutex 0.1 main
ca-certificates 2020.10.14 0
certifi 2020.6.20 pyhd3eb1b0_3
click 7.1.2 py_0
flask 1.1.2 py_0
itsdangerous 1.1.0 py_0
jinja2 2.11.2 py_0
ld_impl_linux-64 2.33.1 h53a641e_7
libedit 3.1.20191231 h14c3975_1
libffi 3.3 he6710b0_2
libgcc-ng 9.1.0 hdf63c60_0
libstdcxx-ng 9.1.0 hdf63c60_0
markupsafe 1.1.1 py38h7b6447c_0
ncurses 6.2 he6710b0_1
openssl 1.1.1h h7b6447c_0
pip 20.2.4 py38h06a4308_0
python 3.8.5 h7579374_1
readline 8.0 h7b6447c_0
setuptools 50.3.0 py38h06a4308_1
sqlite 3.33.0 h62c20be_0
tk 8.6.10 hbc83047_0
werkzeug 1.0.1 py_0
wheel 0.35.1 py_0
xz 5.2.5 h7b6447c_0
zlib 1.2.11 h7b6447c_3
ソースコードを配置
ドメイン直下のpublic_htmlフォルダにflask-testフォルダを作成し、ソースコードを配置していきます。templatesフォルダを作成していますが、今回は使用していません。
public_html
└─flask-test
│ .htaccess
│ helloFlask.py
│ index.cgi
│
└─templates
flask-testフォルダの中
.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /flask-test/index.cgi/$1 [QSA,L]
パーミッションは、644。フォルダ名がflask-testでない場合は、/flask-test/index.cgiの部分を変更してください。
常時SSL化する場合
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /flask-test/index.cgi/$1 [QSA,L]
パーミッションは、644。エックスサーバーでの常時SSL化の設定方法は、こちら。
helloFlask.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
パーミッションは、600。
index.cgi
#! /home/*****/miniconda3/envs/flaskapp/bin/python
from wsgiref.handlers import CGIHandler
from helloFlask import app
CGIHandler().run(app)
パーミッションは、755。pyファイル名をhelloFlask.pyから変えている場合は、from helloFlaskの部分を変更してください。
#! /home/*****/miniconda3/envs/flaskapp/bin/python 【*****】の部分は自分のサーバーIDに変更してください。
#! /home/*****/miniconda3/envs/flaskapp/bin/python3.8 とpythonのバージョンを指定することもできます。
仮想環境なしの場合
#! /home/*****/miniconda3/bin/python
from wsgiref.handlers import CGIHandler
from helloFlask import app
CGIHandler().run(app)
パーミッションは、755。pyファイル名をhelloFlask.pyから変えている場合は、from helloFlaskの部分を変更してください。
#! /home/*****/miniconda3/bin/python 【*****】の部分は自分のサーバーIDに変更してください。
ファイルのパーミッション
エックスサーバーで推奨されている通りにパーミッションを設定します。
出典:エックスサーバー
動作テスト
http://dattesar.com/flask-test/
Hello, World!と表示されれば、成功です。
*****の部分は、自分のサーバーIDに変更してください。
保存したら、source .bashrc