【初心者向け】さくらVPSで ubuntu – docker – apache2 – wsgi – flask 環境を作るまで、一通りやってみた。

どうも、dog-earsです。

最近はやりのpythonを勉強し始めたので、まずは、環境構築からまとめました。

タイトルのままですが、さらくVPSを契約するところから、
Flask(Pythonフレームワーク)のテストページをWebで公開するまでです。

Pythonのチュートリアルというよりは、サーバー環境の構築よりかもしれません。

では、始めます。

目次
(1)OSのインストール
(2)vimのインストール
(3)SSHの設定
(4)iptables
(5)公開鍵暗号を用いてのSSH接続設定
(6)Dockerのインストール
(7)apacheのインストール
(8)Python3.6のインストール
(9)mod_wsgiのインストール&設定、Flaskの設定
(10)Flaskのインストール&設定
(11)SSLの実装

(1)OSのインストール

さくらのVPS管理画面から、インストール

インストール形式:標準OS
OS:Ubuntu 16.04 amd64

スタートアップスクリプト:[public] Ubuntu_apt-get_update_upgrade

インストールが終わると「稼働中」になるとありますが、
アップグレードに時間がかかる場合があります。
管理画面、コンソールのVNCコンソールから、状況が確認できます。

(2)vimのインストール

sudo apt install vim

(3)SSHの設定

dpkg -l | grep openssh-server

で、openssh-serverがインストール済みか確認。

インストールされてなければ、

sudo apt install openssh-server

で、インストール

sudo vim /etc/ssh/sshd_config
  • Portを任意の番号に変更
  • PermitRootLogin は no に変更
sudo systemctl restart sshd

services の設定も変更する(やらなくても動きましたが・・・。)

sudo vim /etc/services

・SSHのポート番号を変更する

※この時点では、iptablesのせいで、新ポートで入れません。

(4)iptables

■iptablesの設定方法
https://help.sakura.ad.jp/hc/ja/articles/206208121

■ファイアウォールiptablesを簡単解説~初心者でもよくわかる!VPSによるWebサーバー運用講座(4)
https://knowledge.sakura.ad.jp/4048/

sudo vim /etc/iptables/iptables.rules

参考サイトをもとに修正
SSHとHTTP(80),HTTPS(443)を開けました。

iptablesの再起動
→やり方わからなかったので、サーバーごと再起動しました。

(5)公開鍵暗号を用いてのSSH接続設定

■公開鍵認証によるSSH接続 – Tera Termの使い方
https://webkaru.net/linux/tera-term-ssh-login-public-key/

■WinSCP の秘密鍵の設定方法
https://synclogue-navi.com/winscp-privatekey

Tera Termで、メニュー – SSH鍵生成

  • デフォルト設定で生成
  • パスフレーズは、空でもOK

秘密鍵と公開鍵をローカルに保存する。

Tera Termでサーバーに接続後、公開鍵をドラッグドロップ
「~/」と入力して「SCP」

mkdir .ssh
chmod 700 .ssh
mv sakura2.pub .ssh/authorized_keys

※別のPCからログインする場合は、別のPCでも公開鍵・秘密鍵を作成し、
公開鍵の内容を、すでにあるauthorized_keysに新しい行として追加すればOKです。

SShの再起動

sudo systemctl restart sshd

ここでいったんログアウトして、SSHログインできるかを確認。
確認できたらパスワードログインできないよう、以下ファイルを修正

sudo vim /etc/ssh/sshd_config
  • PasswordAuthentication no

SShの再起動

sudo systemctl restart sshd

パスワードでログインできなくなってることを確認する。

WinScpでもつなぐ
新しい接続で、パスワード欄は空にして、
設定 – SSH – 認証で、秘密鍵を設定する。

ppk形式に変換しますか?
と聞かれるので、yesを選択、
ppk形式で保存する。

変換したppk形式を選択すればOK

(6)Dockerのインストール

■Get Docker CE for Ubuntu(公式)
https://docs.docker.com/install/linux/docker-ce/ubuntu/

インストール準備

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

インストール実行

sudo apt-get update
sudo apt-get install docker-ce

インストール後の作業

Dockerグループを作成し、ubuntuのユーザーをDockerグループに追加する

sudo groupadd docker
sudo usermod -aG docker $USER

終了後、いったんログアウトして、再度ログインする。

これで、ubuntu ユーザーでもdockerを実行できるようになりました。

起動時にDockerが立ち上がるようにする

sudo systemctl enable docker

— Memo —

コンテナ状況の確認

docker images
docker ps -a

コンテナの作成・起動

docker pull ubuntu:16.04
docker run -it -d --name ubuntu1604 -p 80:80 -p 443:443 --restart=always -v /var/www:/var/www ubuntu:16.04

※コンテナに ubuntu1604 という名前を付けてます。
※restartをつけることで、ホスト再起動時に自動再起動されます。

— Memo —
コンテナの停止

docker stop ubuntu1604

コンテナの起動

docker start ubuntu1604

起動していないコンテナをすべて削除

sudo docker rm $(sudo docker ps -a -q)

コンテナ内 bashの起動

docker exec -it ubuntu1604 /bin/bash

以降、コンテナ内で作業。
デフォルト、rootになっているので、そのまま実行する場合、コマンドのsudoは省いてください。

aptアップデートしておく

sudo apt update
sudo apt upgrade -y

ついでにvimも入れておこう

sudo apt install vim

(7)apacheのインストール

sudo apt install apache2 apache2-dev

※apache2-devはこのあとのmod_wsgiインストールに必要らしい。

サービスの確認。

service --status-all

apache2がインストールされてますが、起動していない状態だった。

apache2の起動

sudo service apache2 start

ip直打ちで、Apacheデフォルトページが見えるようになりました。

ついでにドメインも設定してサブドメインで見れるようにします。
契約しているドメイン会社の管理画面で、Aレコードにipを登録すればOK。

(8)Python3.6のインストール

まず、add-apt-repositoryをインストール

■Ubuntu 14.04 で add-apt-repository が無いと言われた
https://loumo.jp/wp/archive/20150626000042/

sudo apt-get install apt-file
sudo apt-file update
sudo apt-file search add-apt-repository
sudo apt-get install software-properties-common

次に、python3.6とpipをインストール

■Ubuntu16.04でPythonのバージョンを2.7から3.6にバージョンアップする
https://tetechi.com/python3-6/

sudo add-apt-repository ppa:jonathonf/python-3.6
sudo apt-get update
sudo apt-get install python3.6 python3.6-dev
curl -fsSL -o get-pip.py https://bootstrap.pypa.io/get-pip.py
sudo python3.6 get-pip.py
rm get-pip.py

python3.6 -V で3.6.5が入ったことを確認

デフォルトバージョンを3.6に変更

ln -s /usr/bin/python3.6 /usr/bin/python

python -V で、
Python 3.6.5 と表示された。

(9)mod_wsgiのインストール&設定、Flaskの設定

■UbuntuのApacheでFlaskを用いてPython3でWebアプリケーションを作る
http://blog.akashisn.info/entry/%3Fp%3D258

■mod_wsgiでhello worldを描画する
https://qiita.com/shigechioyo/items/2b25f60918be6b81581a

■python3/mod_wsgiで日本語表示
http://www.ohneta.net/wiki/index.php?python3/mod_wsgi%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%A1%A8%E7%A4%BA

■[Python] mod_wsgiを使ってPython3.6をApacheで動かす(CentOS6系)
https://www.yoheim.net/blog.php?q=20170206

■Python: mod_wsgi の組み込みモードとデーモンモードについて
http://blog.amedama.jp/entry/2015/08/16/220628

■UbuntuでPython3.4 + mod_wsgi + mysql5を使うときの注意点
https://ur.edu-connect.net/archives/28888

■AssertionError using Apache2 and libapache2-mod-wsgi-py3 on Ubuntu 14.04 (Python 3.4)
https://askubuntu.com/questions/569550/assertionerror-using-apache2-and-libapache2-mod-wsgi-py3-on-ubuntu-14-04-python

いろいろ参考ページを試した結果、
以下のようなやり方で進めました。

mod_wsgiのインストール&ローディング

sudo pip install mod_wsgi

aptを使ってインストールする方法など、いろいろやり方はあるみたいですが、
pipでのインストールが無難なようです。

インストールされた場所の検索

find . -name mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

を実行したところ、
/usr/local/lib/python3.6/dist-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
にインストールされたようです。

このファイルをapacheに認識させます。

sudo vim /etc/apache2/mods-available/wsgi.load

以下、記述。wsgi_module の後は、先ほど検索した場所を書きましょう。

LoadModule wsgi_module /usr/local/lib/python3.6/dist-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

wsgiを有効化

sudo a2enmod wsgi

apache2 再起動

sudo service apache2 restart

apache2を再起動したところ、
AH00558: apache2: Could not reliably determine the server’s fully qualified domain name
とのエラーが出た。

■ubuntuにおけるapache2のAH00558エラーを解決する。
http://mk-55.hatenablog.com/entry/2014/07/07/004510

sudo echo ServerName $HOSTNAME > /etc/apache2/conf-available/fqdn.conf
sudo a2enconf fqdn
sudo service apache2 restart

これで、エラーが出なくなりました。

次、apacheのコンフィグ設定を変更します。
(一応バックアップもとる。)

sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.bk
sudo vim /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>

WSGIDaemonProcess myapp-process user=www-data group=www-data threads=5
WSGIScriptAlias / /var/www/html/app.wsgi

ServerAdmin webmaster@localhost
DocumentRoot /var/www/html

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

<Directory /var/www/html>
WSGIProcessGroup myapp-process
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>

</VirtualHost>

■Python: mod_wsgi の組み込みモードとデーモンモードについて
http://blog.amedama.jp/entry/2015/08/16/220628

mod_wsgiはデーモンモードがおすすめらしいので、
myapp-processという名前でプロセスを立ち上げ。

WSGIScriptAliasで、呼び出すwsgiファイルを指定してます。

apache再起動

sudo service apache2 restart

呼び出されるwsgiファイルを作る

vim /var/www/html/app.wsgi

以下、記述

def application(environ, start_response):
status = '200 OK'
output = b'Hello World!'

response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]

ブラウザでipアドレスまたは、設定したドメインを開くと、
Hello Worldを確認できました。

(10)Flaskのインストール&設定

Flaskのインストール

sudo pip install Flask

wsgi&pyファイルの設置

vim /var/www/html/app.wsgi

以下のように、記述を変更

import os,sys
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))
from main import app as application

main.pyからappをapplicationとしてインポートするだけ。

vim /var/www/html/main.py

以下記述

from flask import Flask
app = Flask(__name__)

@app.route("/")
def index():
return "Flask-index OK!"

ブラウザで開いて、表示を確認できた。

(11)SSLの実装

ついでに、Let’s Encryptを使ってSSL対応しましょう。

■Apache 2.4 on Ubuntu 16.04でSSL
https://qiita.com/tontan9616/items/bd8b2f1f360f26c7bb46

■さくらの VPS 上の Ubuntu で Let’s Encrypt の SSL 証明書を利用、Https へ移行する
https://loumo.jp/wp/archive/20171021120015/

■さくらのVPS(Cent OS6.8)でLet’s Encryptを自動更新する方法
https://qiita.com/childsview/items/e4bff3b32b8304553980

■意外と簡単!FlaskをHTTPS対応する方法【Let’s encrypt】
https://blog.capilano-fw.com/?p=374

certbot コマンドのインストール

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-apache

main.pyを変更

vim /var/www/html/main.py
from flask import Flask, render_template
app = Flask(__name__)

@app.route("/")
def index():
return "Flask-index OK!"

@app.route('/.well-known/acme-challenge/<filename>')
def well_known(filename):
return render_template('.well-known/acme-challenge/'+ filename)

テンプレートフォルダの作成

mkdir -p /var/www/html/templates
sudo certbot certonly --webroot -w /var/www/html/templates/ -d example.com -m info@example.com

example.comは、適宜置き換えてください。

では、認証キーの取得を取得しましょう。

認証キーの取得

sudo certbot certonly --webroot -w /var/www/html/templates/ -d example.com -m info@example.com

・・・しかしエラー。「認証しに見に行ったけど、notFoundだったよ」とのこと。

念のため、apache2 再起動

sudo service apache2 restart

で、再度認証キー取得を行ったところ、無事成功しました。

/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/privkey.pem

が、保存された。

最後にapache2の設定を変更します。
まず、sslとrewriteモジュールを有効にします。

sudo a2enmod ssl
sudo a2enmod rewrite
a2enmod rewrite

で、モジュールが読み込まれたことを確認します。

apacheのconfig設定

sudo vim /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
ServerName example.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule ^/(.*)$ https://example\.com/$1 [R=301,L]
</VirtualHost>

<VirtualHost *:443>

# SSL
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

ServerName example.com

# WSGI
WSGIDaemonProcess myapp-process user=www-data group=www-data threads=5
WSGIScriptAlias / /var/www/html/app.wsgi

<Directory /var/www/html>
WSGIProcessGroup myapp-process
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>

</VirtualHost>

保存したら、apache2を再起動する。

sudo service apache2 restart

ブラウザでドメインを開くと、
自動的にhttpsにリダイレクトされて、表示されました。

以上、さくらVPS上でFlaskアプリを公開するまででした。

次回以降、この環境でPythonアプリを勉強していこうと思います。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする