LoginSignup
5
7

More than 5 years have passed since last update.

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

Posted at

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

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

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

(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

※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アプリを勉強していこうと思います。

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7