(VPSでつくる) MariaDB(MySQL)インストール

連載第八回目です。

今回はMariaDBをインストールします。
MariaDBはMySQLの完全互換で、高速性を持っているので採用します。
SQLクエリも全く同じものが使えます。
詳しくはMariaDB vs MySQL: 徹底比較をご覧ください。

MariaDBとphpMyAdminにより、Flaskアプリのデータベースを設定し、GUI上で触れるようになります。

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
その他については上記ページをお読みください。

1. MariaDBインストール

PHPと同じように、MariaDBもyumのリポジトリではバージョンが古いので、MariaDBの公式サイトからインストールします。

vi /etc/yum.repos.d/MariaDB.repo

ファイルの内容は下記の通りにします。

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.5/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

インストールします。

yum -y install MariaDB-server MariaDB-client

バージョンを確認します。

mysql -V

下記のように表示されればOKです。

いつものごとく起動と自動起動設定を行っておきます。

systemctl start mariadb
systemctl enable mariadb

2. MariaDB(MySQL)初期設定

下記コマンドで始めます。

mysql_secure_installation

質問が色々と出てきますので、1つずつ丁寧に答えていってください。
1. パスワードを入力してね。(初回はそのままエンターを入力してください)
2. 認証にunix_socketを使うか? >> n
Yにすると別途設定が必要です。
3. MySQLのrootパスワードを変更するか? >> Y
パスワードの入力が必要です。
4. anynomous(無名)ユーザーを除外するか? >> Y
5. リモート接続を不許可にするか? >> Y
6. testデータベースは不要か? >> Y
7. 特権テーブルをリロードするか? >> Y

最後に、環境設定を行います。

vi /etc/my.cnf.d/server.cnf

[mysqld]に下記を追記してください。

character-set-server = utf8

再起動を行います。

systemctl restart mariadb

おわりに

今回はMariaDBをインストールしました。
これでphpMyAdminを導入する準備はできました!

次回はphpMyAdminをインストールします。

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
次は、9. phpMyAdminインストールです。

(VPSでつくる) Nginx+PHPでHello World

連載第七回目です。

今回はGUIでデータベースを操作できるphpMyAdminのインストール準備のために、PHPという言語をインストールします。

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
その他については上記ページをお読みください。

1. PHPのインストール

PHPはyumにPHP5系しか入っていないようなので、EpelとRemiレポジトリをインストールします。

yum -y install epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

最低限のPHP関連のモジュールをインストールします。

yum -y install --enablerepo=remi-php71 php php-cli php-common php-devel php-fpm php-mbstring php-mysqlnd

※今回はPHP7.1にしました。5系より7系の方が処理が早いらしいので、そちらに切り替えました。

PHPのバージョンを確認します。

php -v

7.1と表示されると完了です。

2. PHP関係の環境設定

PHP.iniの環境設定を行っておきます。

vi /etc/php.ini

下記の設定を変更しておきます。
「/」コマンドで検索すると早く終わります。

date.timezone = "Asia/Tokyo"
expose_php = Off ; サーバーがPHPを導入しているか公表するかどうか
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8 ; サーバー内での文字の扱い
mbstring.http_input = auto ; input_encodingが代わりに使われるべきなのでautoと明示しておく。

PHP-FPMの設定を行います。
NginxでPHPを使う場合はこのPHP-FPMが必須です。

vi /etc/php-fpm.d/www.conf

ただし、設定がApache用なのでそれを切り替えます。

user = nginx
group = nginx

設定を反映して起動、および自動起動設定をしておきます。

php-fpm -t
systemctl start php-fpm
systemctl enable php-fpm

3. PHPのテスト

PHPのテストコードを公開ディレクトリ(ルート)に作成します。

vi /usr/share/nginx/html/info.php

簡単なものにしておきます。

<?php
phpinfo();
?>

Nginxの設定を変更します。

sudo vi /etc/nginx/conf.d/default.conf

今の状態がコレです。

location / の中身を外に出して(緑枠)、新規追加(赤枠)を行います。

※最後の「;」を忘れるとエラーが出ます。

コピペ内容は以下の通りです。

    root        /usr/share/nginx/html;
    index       index.html index.htm index.php;

    location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
    }

Nginxを再起動します。

systemctl restart nginx

最後に、info.phpにアクセスして動作を確認してください。
http://XXX.XXX.XXX.XXX/info.php

下記のように表示されればOKです!

不要であればファイルを削除しておきましょう。

rm -f /usr/share/nginx/html/info.php

おわりに

今回はPHPを導入しました。
これで基本的なPHPプログラムは実行できるようになりました!

次回はデータベースであるMariaDB(MySQL)をインストールします。

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
次は、8. MariaDB(MySQL)インストールです。

(VPSでつくる) Nginx Unit+venv+FlaskでHello World

連載第六回目です。

色々と設定を行ってきましたが、今の状態ではNginx(Webサーバー)上で動的なサイトを表示することはできません。
そのため、今回はNginx Unit(APサーバー)を用いて、簡単なPythonアプリを作成してWebサイトで公開してみましょう!

そもそもAPサーバーって何ぞ?という方はミドルウェア(Web、AP、DB)について知ろうをご覧ください。

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
その他については上記ページをお読みください。

1. Nginx Unitのインストール

では、まずNginx Unitのインストールを行います。
Nginxと同じようにレポジトリ情報を作成します。

vi /etc/yum.repos.d/unit.repo

ファイルの中身は下記の通りです。
記入したら:wqコマンドで保存+終了してください。

[unit]
name=unit repo
baseurl=https://packages.nginx.org/unit/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

※先頭の何文字かが欠ける不具合があります。

それではインストールを行います。

yum install unit

最後に、必要な機能をインストールしておきます。

yum install unit-devel unit-jsc8 unit-jsc11 unit-php unit-python27 unit-python36

※公式サイトを参考にしていますが、今回不要なものはインストールしていないので、あなたの環境に必要なパッケージはインストールされない可能性があります。

環境設定は後で行います。

2. Python3.6.8のインストール

(仕様かどうかわかりませんが、)pyenvをそのままNginx Unitに反映することは難しいようです。
そのため、pyenvでインストールしたバージョンと同じPython3.6.8をVPSにインストールしておきます。

今回は、Python3.6.8のインストールは上記でunit-python36をインストールしたため、すでにインストール済みで不要です。別バージョンが必要であればこのページの下部にある補足. Python別バージョンのインストール方法をご覧ください。
もし別バージョンをインストールしたい(Python3.6.8か2.7.5以外の)場合はNginx Unitは非推奨です。Nginx Unitを使うには、Dockerコンテナ等別途準備が必要です。(参考ページ)

3. Flaskアプリの作成、仮想環境作成

続いて、Flaskアプリをインストールします。

まずは作業ディレクトリを移動して、Nginx公開用のディレクトリにします。

cd /usr/share/nginx/

test_flask仮想環境を作っておきます。

python3 -m venv venv/flask_test

仮想環境をアクティブ化して、flaskをインストールします。

source venv/flask_test/bin/activate
pip install flask

pythonインタプリタを起動して、flaskのバージョンを確認しておきましょう。

python
import flask
flask.__version__

下記のように表示が出ればOKです。

このとき、仮想環境以外にはflaskをインストールできていません。
つまり、もし実行するとエラーが出るはずです。確認しておきましょう。

pythonインタプリンタはControl+Zコマンドで出て、仮想環境を下記コマンドで非アクティブ化します。

deactivate

pythonインタプリタを起動して、flask_test仮想環境以外でflaskがインポートできないことを確認してください。

python
import flask

下記のようなエラーが出ますが、問題ありません。

最後に、Flaskアプリを作成しておきます。
まずは、アプリ用ディレクトリを作成します。

mkdir app/flask_test

続いて、viエディタで下記ファイルを作成します。

vi app/flask_test/main.py

ファイルの内容は下記の通りです。
下記の2通りの関数どちらもをアプリの1機能として表示させられるようにします。

from flask import Flask

application = Flask(__name__)

@application.route('/')
def index():
    return "Hello Flask1"

@application.route('/test2')
def test2():
    return "Hello Flask2"

※application = ~としているのは、Nginxで動作させるときのデフォルト値なので守ってください。
※変更したい場合は、conf.jsonのapplicationsのcallable設定を変更ください。

想定では、Flaskアプリを下記URLで表示できるようにします。
http://XXX.XXX.XXX.XXX/sample/

http://XXX.XXX.XXX.XXX/sample/
“Hello Flask1”

http://XXX.XXX.XXX.XXX/sample/test2
“Hello Flask2”

動作確認として、flask_test仮想環境をアクティブ化した状態で下記コマンドを使用してください。

python app/flask_test/main.py

エラーが出なければ完了です!

4. NginxおよびNginx Unitの設定

Nginx Unitを起動します。自動起動設定もしておきましょう。

systemctl start unit
systemctl enable unit

続いて、Unitの設定ファイル(conf.json)を作成します。

vi conf.json

ファイルの内容は下記の通りです。コピペでOKです。

{
  "listeners": {
    "*:8081": {
      "application": "flask_test"
    }
  },

  "applications": {
    "flask_test": {
      "type": "python 3.6.8",
      "path": "/usr/share/nginx/app/flask_test/",
      "home": "/usr/share/nginx/venv/flask_test/",
      "module": "main",
    }
  }
}

Nginx Unitの構造として、
指定ポートへのアクセス
↓
Listener
↓
venv(test_flask)
↓
Application(test_flask)

となりますので、上記のように設定します。

各設定の解説としては以下の通りです。

{
  "listeners": {
    "*:8081": { // ポート番号設定
      "application": "flask_test" // アプリケーション名
    }
  },

  "applications": {
    "flask_test": { // アプリケーションごとに設定を記述できる
      "type": "python 3.6.8", // python3.6.8以外も可能だが、別途設定が必要
      "path": "/usr/share/nginx/app/flask_test/", // アプリディレクトリ
      "home": "/usr/share/nginx/venv/flask_test/", // 仮想環境
      "module": "main" // 作成したファイル名(.pyなしが正)
    }
  }
}

その他の設定について、詳しくは公式サイトをご覧ください。

設定ファイルの通りにNginx Unitの設定を変更します。

sudo curl -X PUT --data-binary @/usr/share/nginx/conf.json --unix-socket /var/run/unit/control.sock http://localhost/config

エラーが出る場合は下記コマンドでエラーログを確認します。

vi /var/log/unit/unit.log

Successと出れば問題ありません!

あとは、Nginxの2つの設定を行えば対応完了です。
nginx.confの設定を行います。

sudo vi /etc/nginx/nginx.conf

http{}内に下記を記載します。

    upstream unit_backend {
        server 127.0.0.1:8300;
    }

※ポート番号は他のモノと一致しないようにしてください。

記載例は以下の通り。

default.confの設定を行います。

sudo vi /etc/nginx/conf.d/default.conf

※バージョンによっては、nginx.conf内に記載する場合があります。どのファイルに記載があるかご注意ください。

server{}内に下記を記載します。

    location /sample/ {
        proxy_pass http://127.0.0.1:8081/;
    }

※ポート番号はUnitの設定と一致するようにしてください。

記載例は下記の通り。

最後に、NginxとNginx Unitを再起動しておきます。

sudo systemctl restart nginx
sudo systemctl restart unit

これにて設定は終了です!

5. Webサイトの動作確認

想定通りに表示できるか確認します。
http://XXX.XXX.XXX.XXX/sample/
“Hello Flask1”

http://XXX.XXX.XXX.XXX/sample/test2
“Hello Flask2”

問題ありませんでした。
おつかれさまでした!

参考サイト

【Python】CentOS7サーバ上にFlask+Nginx+Nginx UnitでWebアプリを構築する

補足. Python別バージョンのインストール方法

Python3.X(今回は3.7.0)をVPSにインストールしておきます。

まずは、pyenvを一旦非アクティブ化させるため、下記のbashファイルを編集します。

vi ~/.bashrc

~/.bashrcの内容の次の文字列を削除します。

export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

((VPSでつくる) Pythonのバージョンを3.Xにするの次の文字列(*1)に該当)

最後にリブートします。一旦CUIが閉じるで再ログインしてください。

sudo reboot

次に、yumにインストールしたいPythonのバージョンがあるか確認します。

yum search python3

Python3.6.8が最新のようですね…。

目的の3.7.0がないので、適当なディレクトリを作って、その中で作業をします。

mkdir /usr/share/nginx/temp
cd /usr/share/nginx/temp

続いて、ファイルをダウンロードします。

curl -O https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz

※必要であれば、https://www.python.org/ftp/python/から検索できます。

ファイルを解凍して、ディレクトリに移動します。

tar xf Python-3.7.0.tgz
cd Python-3.7.0

インストールを行います。
このままインストールすると、Pythonは/usr/local/ディレクトリにインストールされます。

./configure
make
sudo make altinstall

もし、その他にインストールしたい場合は、./configure –prefixオプションを利用ください。

パスが通っていないのでパスを通しておきます。

sudo visudo

下記のように変更します。
かなり下の方にあるので、/コマンドでsecureを検索すると楽です。

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
↓
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

バージョンを確認します。

python3 -V

python3へのパスが3.6.8に通っていることが多いので、これも変更しておきます。

sudo ln -sf /usr/local/bin/python3.7 /usr/bin/python3

※python3ではなく、pythonにパスを通すのはおすすめしません。yumなど他の環境を壊してしまう可能性があるため、非推奨です。

もし指定したいバージョンのpythonへのパスが分からない場合は、下記で検索を行います。

whereis python

バージョンを再度確認します。

python3 -V

下記のように表示されればOKです。

最後に、ディレクトリの削除などの整理を行っておきます。

cd ../../
rm -rf temp

削除したこの内容を再度記述します。
→ ~/.bashrcの内容の次の文字列を削除します。

export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

シェルを再起動させます。

exec $SHELL

注意点としては、venvを作成した時のバージョンと、動作環境のpythonのバージョンは一定でなければなりません。
pyenvでバージョンを切り替えながら仮想環境を作ると、たまにミスするので取り扱いに注意してください。

おわりに

どうにかNginx Unitとvenv、Flaskを使ったアプリケーションができました。
ただ、Webアプリに重要な機能がまだ構築できていません。
データベースとFTPです。

データベースはこれまで使う必要がありませんでしたが、MariaDB(MySQLの完全互換)使えるように設定します。
データベースをGUI上で簡単に使えるように、phpMyAdminを導入します。
FTPは、viエディタでチマチマ記載していたものを転送で簡単に送ったり、アプリをデプロイするときに使います。
それぞれ、少し手間はかかりますが、今回ほどではないので一緒に頑張りましょう!

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
次は、7. Nginx+PHPでHello Worldです。

(VPSでつくる) Python仮想環境venvの導入

連載第五回目です。

前回の4. Pythonのバージョンを3.Xにする記事で、Pythonのバージョン管理をディレクトリごとに行えるようになりました。

ただし、アプリごとにモジュールのバージョンは変えることができません。
特に、機械学習や統計学関係だとモジュールを変える必要がたまにあります。
そのため、今回はvenvを使って、アプリごとにモジュールの管理を行えるような環境を作りましょう。

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
その他については上記ページをお読みください。

1. 環境の確認

3. NginxでHello Worldで簡単に確認した内容を再確認します。
今回確認したいのは、Nginxの公開ディレクトリ関連のフォルダです。

パス 説明
/etc/nginx/ Nginxの設定ファイルが色々と入っている
/etc/nginx/nginx.conf Nginx設定ファイル
/var/log/nginx/ ログ保存ディレクトリ
/usr/share/nginx/html/ WEBサイトの公開ディレクトリ

なぜかというと、「アプリをどのディレクトリに入れて、どの仮想環境で実行するか」を系統立てて決めておいた方が後の管理が楽だからです。

今回構想しているディレクトリ構成は以下の通りです。

/usr/share/nginx
 ┗ app アプリ用ディレクトリ
 | ┗ アプリA
 | ┗ アプリB
 | ┗ アプリC
 ┗ venv 仮想環境用ディレクトリ
 | ┗ アプリA用環境
 | ┗ アプリB&C用環境
 ┗ html 静的ファイル設置用

そのため、以降は上記に従ってアプリAを動かせるようなアプリA用環境を作っていきます。
そのために、まずは基本的なディレクトリを作っておきます。

mkdir /usr/share/nginx/app
mkdir /usr/share/nginx/venv

2. venv環境の作成

まずは、アプリA用環境のためのディレクトリを作成します。

mkdir /usr/share/nginx/venv/app_a

下記コマンドで仮想環境を作成します。

python -m venv /usr/share/nginx/venv/app_a

※完了した表示は一切出ませんが、エラーが出なければ問題ないです。

3. venv環境の利用

venv環境をアクティブにします。

source /usr/share/nginx/venv/app_a/bin/activate

アクティブ化に成功すると、下記のように(環境名)[ログインユーザー名@ログイン場所 ディレクトリ名]が表示されます。

仮想環境を使うことで、その環境内でインストールしたPythonモジュールはその環境内でのみ有効となります。
どこまでがアプリA用の環境であるのか区分がはっきりするので非常に扱いやすくなります。

仮想環境内でpythonインタプリタを実行する場合は下記コマンドを使用します。

python

pythonファイルを実行する場合は下記コマンドを使用します。

python XXX.py

仮想環境を非アクティブ化するには下記コマンドを使用します。

deactivate

その他の詳細はvenv公式サイトをご覧ください。

おわりに

今回はvenvを使い、モジュールの管理を簡単にすることができました。
しかし、今の状態ではNginx(Webサーバー)上で動的なサイトを表示することはできません。
そのため、次回はNginx Unit(APサーバー)を用いて、簡単なPythonアプリを作成してWebサイトで公開してみましょう!

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
次は、6. Nginx Unit+venv+FlaskでHello Worldです。

(VPSでつくる) Pythonのバージョンを2.7.5から3.6.8にする

連載第四回目です。
CentOS7にインストールされているPythonのバージョンが2.7なので、バージョンアップをします。

そうしないとPythonのアプリが動きません。
なぜなら、Python2と3はプログラムの記法が違います。そりゃ動かないですよね。。

今回はpyenvを使ってPythonのバージョンを上げます。
バージョンはNginx Unitで使われている3.6.8を利用します。
3.6.8以外にする場合は、Dockerコンテナ等別途準備が必要です。(参考ページ)

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
その他については上記ページをお読みください。

1. pyenvのインストール

まずは、Pythonのバージョンを確認します。
2.X.Xだと思います。

python -V # python --version も可

※もし3.X.Xになっている場合は下記工程は不要です。

続いてgitをインストールします。

sudo yum install git

pyenvのインストールを実施します。

curl https://pyenv.run | bash

実は、ウラで下記のようなコマンドが実行されています。(公式サイトより)
gitをインストールすることで、このコマンドを有効にできます。

curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

※上記のインストール後に、下記工程で入力すべき文字列(*1)が表示されるので参考にしてください。

続いて、シェルの起動時にpyenvを自動的に起動するようにしておきましょう。
ファイル~/.bashrcを下記コマンドで開いてください。

vi ~/.bashrc

最後に、~/.bashrcの内容に次の文字列(*1)を追記(赤枠)します。

export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"


※PATHの/root/部位が環境によって異なる場合があります。ご注意ください。

※シェルを再起動させた時、WARNINGが出る場合は2行目をeval “$(pyenv init –path)”に変換してみてください。
(参考:pyenv(Github) issue #1906)

シェルを再起動させます。
上記の変更が反映され、pyenvが使えるようになります。

exec $SHELL

確認のため、pyenvのバージョンを表示してください。
問題なくインストールされていれば、下記コマンドでバージョンが表示されます。

pyenv --version

2. Python3のインストール

まずは、Python3をインストールする前に、Python3に必要なモジュールをインストールします。

sudo yum install zlib-devel libffi-devel openssl-devel

続いて、インストールできるバージョンを確認します。
もしPython3.6.8以外を選ぶ場合はこちらの手順を参考にしてください。

pyenv install -l

それでは、指定されたバージョン(3.6.8)をインストールします。

pyenv install 3.6.8

少し時間が掛かるので注意が必要です。フリーズしているわけではありません。

それでは、インストールされたかどうかを確認します。
今回指定したバージョンが出力されればOKです。

pyenv versions

3. Python3に切り替える

Python2から3に切り替えます。

まずは現在のバージョンを確認します。
何もしていなければ2.7.5から変わっていないはずです。

python -V

続いて、下記でPythonのバージョンをGlobal環境で切り替えます。

pyenv global 3.6.8

※local(指定ディレクトリ以下)も可能です。

3.6.8に変わっているか確認します。

python -V

変わっていれば終了です!
おつかれさまでした。

追加でPIP(Pythonのパッケージ管理ソフト)をアップグレードをしておいてください。

pip install --upgrade pip

アップグレードしておかないと、必要なモジュールをインストールできない時があります。

おわりに

今回の方法以外で、venvを使わずにPython2と3を同じ環境に入れて切り替える方法もありますが、かなり面倒だったので今回はこちらの方法を使いました。

もし、Pythonで使いたいバージョンやモジュールのバージョンの組み合わせが複数通りあると困りますよね?
Pythonのバージョンだけなら、指定ディレクトリでpyenv local 3.X.Xのコマンドを打てばいいのですが、それではモジュールのバージョンは管理しきれません。
そのために、次は各々のアプリ用のモジュールバージョン管理用にvenvを導入していきます。

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
次は、5. Python仮想環境venvの導入です。

(VPSでつくる) NginxでHello World

連載第三回目です。
WebサーバーであるNginxをインストールして、オンライン上でアクセスしてみましょう。

今回の工程で、オンラインからWebサイトの閲覧が可能になります。

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
その他については上記ページをお読みください。

Nginxの選定理由

Apacheより処理速度が速く、複数アクセスに耐えやすいからです。
詳しくは、【入門】Nginx(エンジンエックス)とは?Apacheとの違いと初期設定をご覧ください。

1. Nginxのインストール準備

Nginx 公式サイトを参考に進めます。

まずは、VPSサーバーへログインします。

Nginxは公式でリポジトリを公開しているので、yumコマンドでインストールするための準備を行います。
まず、ファイル作成+エディタを開くコマンドを下記で行います。

sudo vi /etc/yum.repos.d/nginx.repo

viエディタが開いたら、下記の内容を入力します。

[nginx]
name=nginx repo
baseurl=http://NGINX.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

コピペするなら、コピーして、TeraTerm上で右クリックをしてください。
※先頭の数文字が欠ける場合がありますので注意してください。

viエディタを終了するために、Escキーを押して、:wq(書き込んで(w)終了する(q))コマンドを入力します。

最後に、nginxのリポジトリの情報が読めるか確認しておきましょう。

sudo yum info nginx

下記のような表示が出てくればOKです。

2. Nginxのインストール

リポジトリを前の手順で用意したので、下記コマンドでインストールしてみましょう。

sudo yum install nginx

yes/noを聞かれると思いますが、基本y(yes)でOKです。

インストールが終了すると、下記のように表示されます。

3. Nginxの起動

インストールができたので、Nginxを起動してみましょう。

sudo systemctl enable nginx # 自動起動設定をONにする
sudo systemctl start nginx # 起動する

起動できました・・・が、この状態だとまだWebサイトにアクセスできません。

※ちなみに、停止は下記のコマンドで可能です。

sudo systemctl stop nginx

4. さくらVPSコントロールパネルでの設定

さくらVPSはパケットフィルタと呼ばれる、開放ポートを制限する機能があります。
デフォルトで設定した場合は、SSH接続(TeraTermでのアクセス)のみ可能でHTTP接続はできません。
そのため、下記のようにWeb(と後で使うFTP)のパケットフィルタの設定をしてください。

パケットフィルター — さくらの VPS マニュアル

5. Webサイトへアクセス

最後に、あなたのサイトへアクセスしてみましょう。

VPSコントロールパネルにアクセスして、下記のように各サーバーごとにIP(XXX.XXX.XXX.XXX)またはホストアドレスが記載されていますので、そちらをコピーしてください。

例として下記のようなURLになります。
http://tk2-211-15368.vs.sakura.ne.jp

アクセスしてみて、下記のように表示された場合はOKです!

おつかれさまでした。
以上でインストールは完了です。 設定ファイルや公開ディレクトリなどのパスは下記の通りです。

パス 説明
/etc/nginx/ Nginxの設定ファイルが色々と入っている
/etc/nginx/nginx.conf Nginx設定ファイル
/var/log/nginx/ ログ保存ディレクトリ
/usr/share/nginx/html/ WEBサイトの公開ディレクトリ

ディレクトリ内のファイル・ディレクトリを見る場合は、下記コマンドを使用します。

ls /etc/nginx

ファイル内を見る場合は、下記コマンドを使用します。

vi /etc/nginx/nginx.conf

おわりに

Nginxを使いWebサーバーを構築することができました。
方法さえ分かっていれば、非常に簡単だったと思います。

今後は、Pythonなど動的コンテンツが扱えるAPサーバーとしてNginx Unitを導入し、NginxやPythonの仮想環境であるvenvと接続していきます。そのためには、設定ファイルなどを直接編集する必要があるので、そこも詳しく説明します。

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
次は、4. Pythonのバージョンを2.7.5から3.6.8にするです。

(VPSでつくる) CentOS7のインストール

連載第二回目です。
VPSサーバーのOSをCentOS7にします。
CentOS7は一般的に使われるLinuxベースのサーバーで、CentOS8よりサポート期間が長いので採用しました。

今回は、CentOS7を再インストールしてみます。
さくらVPSでは、GUI上でOSを再インストールできるので、設定ミスをした場合でも問題なくリセットできます。

CentOSってそもそも何ぞという方は、詳しくはネコでもわかる!さくらのVPS講座 〜第一回:VPSてなんだろう?〜の「VPSのOSはどれを選べばいい?」をご覧ください。

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
その他については上記ページをお読みください。

1. VPSコントロールパネルにアクセス

まずは、VPSコントロールパネルにアクセスしてください。

次に、サーバーリストから1つのサーバーをクリックしてください。

続いて、右にある「各種設定」の「OSインストール」をクリックします。

OSインストール形式の選択は、標準OSを選択してください。

標準OSインストールは、CentOS7 x86_64を選択してください。

管理パスワードは、自由に設定してください。
その他は、デフォルトの設定で問題ありません。

インストールを開始すると5分程度時間がかかります。

おつかれさまでした。

おわりに

今回はCentOS7をインストールしました。
OSによってコマンドや設定が異なるので、今回はよく使われるCentOS7を選びました。

OSでいう、WindowsとMacの違いが他のサーバーでもあります。

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
次は、3. NginxでHello Worldを行います。

(VPSでつくる) VPSへのログイン

連載第一回目です。
まずは、さくらVPSへログインしたいと思います。
ログインすることによって、VPSサーバーの設定ができるようになります。

連載の全体を俯瞰してみると、赤枠の部分です。
あなたのPC上から、VPSサーバーの制御ができるようになります。

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
その他については上記ページをお読みください。

1. さくらVPSにアクセス

まずは新規登録を行います。


・・・プランをどれを選べばいいかわからない?

一番安いモノで良いんじゃないかな。
どれを選んでも構築する内容は変わりませんし。

今回はたまたま2週間無料キャンペーンをしていましたが、
VPSはレンタルサーバーに比べて、コストパフォーマンス的にかなり性能が良いので一番安いモノであまり気にならないです。

ゾーンは、あなたの住んでいる場所に近い所でいいでしょう。
台数は1台。複数台にするとその分の料金が請求されます。
サーバー容量の増設は、無料であればすればいいでしょう。

2. VPSコントロールパネルにアクセス

新規登録すると、VPSコントロールパネルにアクセスできるようになります。

※複数台あるとこのような表示になります。

これでコントロールパネルにアクセスができることを確認しました。

最後に、サーバーを起動しておきましょう。
VPSへログインは、サーバーが起動していないとできません。

3. VPSへログインする

最後に、VPSへログインしてみましょう。
ログインできれば、サーバーの設定などがあなたのPC上で可能になります。

ターミナルソフトとして、TeraTermをインストールします。
※他のターミナルソフトでも問題ありません。

IPまたはホストアドレス(赤枠)のメモを行っておきます。

TeraTermを開いて、下記のように情報を入力して、OKをクリックします。

設定したユーザー名、パスワードでログインします。

接続できた場合は下記の表示が出ます。

おつかれさまでした。

おわりに

今回はVPS(サーバー)へログインしてみました。
新規登録して、SSHでログインするだけと言えばそうなります。

VPS?レンタルサーバー?ってよく分からないなあという方は、詳しくはネコでもわかる!さくらのVPS講座 〜第一回:VPSてなんだろう?〜の「VPSってなんだろう? 他のサーバーとの違い」をご覧ください。
よく話題にあがるAWS(Amazon Web Service)やGCP(Google Cloud Platform)はクラウドです。

この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
次は、2. CentOS7のインストールを行います。

VPSでつくるPythonでのWebアプリ運用環境(連載記事)

今風のWebアプリをリリースするにはレンタルサーバーでは物足りない!

例えば、PythonやRubyに対応しているレンタルサーバーはあまりありません。加えて、データサイエンスや機械学習に強いプログラム言語Pythonは頻繁にアップデートされますので、レンタルサーバーではアップデートに対応して即時に変更反映・・・なんてものはできません。

例えば、私はPython3.Xが入っていないから、変更後のライブラリ〇〇が使えない…ことを何度も体験してきましたorz

そこで、VPS(Virtual Private Server)を使って開発環境を丸ごと借り、自由度の高いサーバーを構築していきます。今回はさくらVPS(https://vps.sakura.ad.jp/)を使っていきます。

VPSにした理由は、クラウドサービスに比べVPSは割安だからです。

よく例に挙がるAWSやGCPは利用料金が高いです。本格的に収益の上がるサイトができた場合は移行するといいかもしれません。

AWSは、1ノードを20日程度放置していただけでも月3万の請求が来ていました。AWSの勉強をしてただけなのに怖いですね。GCPも、仕事で使う分には気にならない程度で、機械学習・データ分析用途でアクセスが多く(1000程度)ても月10万PV行かないくらいで3万以上です。個人開発では高いですね。

なんと、VPSは最小構成で月約650円です。レンタルサーバーに比べて自由度が高いので、ある程度満足できる金額ではないでしょうか。

さくらにした理由は、レンタルサーバーを借りていた際に満足できる経験をしたからです。
①2年以上運用していたが、サーバー停止など大きなトラブルがなかった。
②さくらサーバーからエックスサーバーへの移行時(利用停止時)にさくらのカスタマーサポートに相談したが、その時でさえサポートが充実していた。

まずは、構築環境を下記の通りに示します。
構築する環境はあくまでアプリに合わせて選ぶものなので、あなたのアプリに合わない場合は適宜変更してください。

続いて、具体的に何をするのか目次をリストアップします。
大きな目的である直接の運用コストを減らすためにVPSを採用していますが、VPSはセキュリティ等を含め全てを自分で管理する必要があります。
そのため、手間を減らす必要があるので、自動起動・アップデートの自動化なども忘れずに導入しておきます。

最後に、VPSの総括を行います。
良い点、悪い点、引っかかりやすいポイントなどなど。

補足として、この記事内に作者のバックグラウンド(Webサーバー関連の理解度など)も記載しておきます。ご参考に。

(1)構築環境

基本構成

OS:CentOS7

CentOS8までの中でサポートが一番長い。事例が多い。

Webサーバ:Nginx

Apacheより動的なアクセス処理が得意(らしいので)、今回のWebアプリに最適。

APサーバ:Nginx Unit

より新しく(2018年リリース)、Nginxと併用されやすいGunicornより導入が簡単だった。

その他構成

サーバーへのアクセス:SSH

サーバー管理・設定変更の安全のため。

FTP

サーバーへのファイル転送のため。

SSL接続(HTTPS)のみ

HTTPはNginxの設定で遮断。SSLは独自ドメインの取得が必須。

アプリ

ソーシャルトラッキングアプリ(目標管理+ルームチャット)です。
目標管理に加え、オンラインもくもく会や勉強会ができる感じのアプリです。
→ ある程度小さいデータのやり取りを何度も行う想定。
→ 将来的にレコメンドなどの機械学習システムを導入したい。

Python3.6.8(Flask)+pip3+MySQL

構築がより簡単なため。
Python3.6.8か2.7.5以外の場合はNginx Unitは非推奨。(理由は後述)

Flask+BluePrint

機能拡張を行うために、BluePrintを導入。

MySQL(MariaDB)+PHP+phpMyAdmin

GUIでデータベースを操作したい。(CUIでの操作は面倒…)

(2)利用環境

OS:Windows10

サーバーへのアクセス:TeraTerm

FTP:WinSCP

データベース管理:phpMyAdmin

仮想環境:pyenv+pip

以上が構築環境、利用環境です。
続いて、目次に移ります。

(3)目次

全体構成としては、下記の図の通りです。それを一つずつ構築していきます。

基礎設定

1. VPSへのログイン
2. CentOS7のインストール

PythonでHello World

3. NginxでHello World
4. Pythonのバージョンを2.7.5から3.6.8にする
5. Python仮想環境venvの導入
6. Nginx Unit+venv+FlaskでHello World

データベース+PHPインストール

7. Nginx+PHPでHello World
8. MariaDB(MySQL)インストール
9. phpMyAdminインストール

FTP

10. WinSCPでFTP接続

Pythonアプリ導入

11. PythonでMariaDB(MySQL)へ接続できるアプリを触ってみよう
12. Python(Flask)でMariaDB(MySQL)へ接続できるアプリをもっと読みやすく改良してみよう
13. Socket通信を使ったモダンなチャットアプリをFlaskで作ろう

その他

14. セキュリティ設定
15. Let’s EncryptでVPS上のWebサイトをSSL(HTTPS)接続にしよう

総括

総括・変更履歴

(4)作者のバックグラウンド

具体的には、このWebサーバー構築前はAPサーバーって何やねんってレベルでした…
インフラわからん!
趣味でレンタルサーバーを借りていて、Webサイト(ApacheでCakePHP2(PHP5+MySQL))を10年近く運営しています。
ただ、今回のWebサーバ(Nginx+Nginx Unit(or Gunicorn)でFlask(Python3+MariaDB))を構築するのに1か月近くかかった程度のレベル感です。orz

執筆時の状況は、仕事はエンジニアではなく、コンサルティング(データ・AI系)なので前知識ほぼありません。基本情報技術者レベルの知識はありました。

さいごに

最後までお読みいただき誠にありがとうございました。

試行錯誤の末にどうにかVPSでWebサーバーを動かせるようになりました…。
これまでは、個人ではレンタルサーバー任せ、仕事ではクラウド任せだったので、APサーバーなどを全く意識せずに使っていて今回かなり引っかかりましたorz
このページのように情報を統合して書いておくと、他の人も時間を無駄にしなくて済むといいな~と思って書いています。

分かり辛い点や解釈がおかしい部分があればコメントいただけると幸いです。
よろしくお願いいたします。

for内で選手個人データをSQLで呼び出すより、辞書型を利用した方が読み込みは早い

for内でSQLを呼び出すと遅い…。
自作野球ゲームMeisyoでは、明示的にデータを呼び出すためにfor内でSQLを利用していました。

CDs = {} # Cardデータ(選手id, 選手データ)を入れた辞書
for key in CDs:
    CD = CDs[key] # 選手IDで選手カードデータを呼び出し
    CD_BR = read_bt(key) # 打撃データ呼び出しSQL
    CD_PR = read_pc(key) # 投球データ呼び出しSQL
    print("キャラクター結果")

今回の改修で、下記のように書き換えました。

CDs = {} # Cardデータ(選手id, 選手データ)を入れた辞書
CD_BRs = reads_bt(my_id) # my_idが所持するカードの打撃データ(選手id, 打撃データ)を入れた辞書
CD_PRs = reads_pc(my_id) # my_idが所持するカードの投球データ(選手id, 投球データ)を入れた辞書
for key in CDs:
    CD = CDs[key] # 選手IDで選手カードデータを呼び出し
    CD_BR = CD_BRs[key] # 打撃データ呼び出しSQL
    CD_PR = CD_PRs[key] # 投球データ呼び出しSQL
    print("キャラクター結果")

こうすることで、「負荷の小さいSQLを何回も実行する」のではなく「1回で全てを取り切り、分割して表示する」ことになります。
ただし、辞書型を利用するため、あまりにも対象が多すぎるクエリの場合はサーバーのメモリ許容量に達しかねないので注意してください。