エックスサーバーで簡単にpythonのpipとFlaskの環境を構築する

エックスサーバーでは、最初からpipは入ってはいますが、root権限がないためデフォルトではpipを使えません。Flask環境を構築するために、何とかしてpipを使えるようにしたいのですが、調べてみるとLinuxbrewをインストールしてからpythonをインストールして、やっとpipが使えるようになるとか、すごく面倒です。しかも、予期しない不具合の原因になることがあるので、あまり余計なものをインストールしたくありません。

他の方法では、Linuxbrew、pyenv、AnacondaをインストールすればpipとFlaskを使えるようになるらしいです。それなら最初からAnacondaだけをインストールして使えないだろうかと思い、試してみました。

結論から言うと、Minicondaを使用すると比較的楽にpipの導入とFlaskの環境構築ができました。

エックスサーバーについて詳しく知りたい方は、こちら→エックスサーバー

pipとcondaを使えるようにする

Flaskのためだけに、Anacondaをインストールするのは余計なものが多すぎますし、容量も大きくなるので、最小限のものしか入っていないMinicondaをインストールします。ルートフォルダにインストールしていきますので、他のフォルダにインストールする場合は、【/home/サーバーID/】の部分をインストールするフォルダに読み替えてください。

手順

  1. Minicondaをダウンロード
  2. FTPでルートフォルダにアップロード
  3. SSHでエックスサーバーに接続
  4. Minicondaをインストール
  5. PATHを通す
  6. 仮想環境を構築
  7. 仮想環境にFlaskをインストール

Minicondaをダウンロード

Minicondaのサイトから、最新のMinicondaをダウンロードしてインストールしようとするとエラーがでたため、過去バージョンのMinicondaをこちらからダウンロードします。

Miniconda3-py38_4.8.3-Linux-x86_64.sh88.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に下の一文を追加して保存します。

.bashrc
export PATH=/home/*****/miniconda3/bin:$PATH

*****の部分は、自分のサーバーIDに変更してください。

保存したら、source .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

.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /flask-test/index.cgi/$1 [QSA,L]

パーミッションは、644。フォルダ名がflask-testでない場合は、/flask-test/index.cgiの部分を変更してください。

常時SSL化する場合
.htaccess
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

helloFlask.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

パーミッションは、600

index.cgi

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のバージョンを指定することもできます。

仮想環境なしの場合
index.cgi
#! /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をご確認ください。