TeraBytesMemo

プログラミング関連で自分のメモをまとめて書いたり気が向いたら書いたり

pythonのWebアプリをデプロイするためのIaaS入門に必要になった知識

さくらインターネットさんのさくらのクラウド2万円無料券があったのと、line botを作りたくなったり、elasticsearchが使いたくなったのでさくらのクラウドを使用。

そこで、IaaSを使うのに、Unixサーバの知識とかいろいろ必要で苦労したのでやったことをまとめ。とりあえずAWS使ったほうが楽そうだった...

ちなみに、今回はUbuntu16.04を使いました。

ここで説明する知識は

  • nginx(サーバー)
  • systemd
  • gunicorn(python用サーバーアプリケーション)
  • freenom(無料DNS
  • Let's encrypt(無料SSL証明書作成)

です。最小限の公開ならばSSL証明書は必要ないですが、line botの作成に必要になったので記載。ページの信頼性の向上もできますし、覚えて損はないかと。

(2016/6/19追記:経験したトラブルへの対策も書きました)

サーバー設立

nginxを使用。

sudo apt install nginx

インストールしたサーバーのIPにアドレスに接続すれば、Welcome to nginx!のページが表示されるはず。

サーバーの設定には、/etc/nginx/nginx.confという設定ファイルや/etc/nginx/conf.d/以下、/etc/nginx/site-enable/以下にある設定ファイルを編集・作成で。

ちなみに、nginxを使った時に面倒だったのがnginxの再起動や停止など。頻繁に使いました。エイリアス書くと楽かも。

sudo nginx # 起動
sudo nginx -s stop # 停止
sudo nginx -s reload # 再起動

systemdの使い方

サーバーなどの自動起動に使いました。

よく使うコマンドや実際にsystemdを使った例を記載します。

よく使ったコマンド
sudo systemctl restart # systemctlの再起動
elasticsearchの自動起動

ubuntu16.04でもaptでインストールしたelasticsearchに専用の設定ファイルも用意されているので

systemctl enable elasticsearch.service

で稼働可能に。詳しい適用の仕方は以下のURLにて。

15分で作る、Logstash+Elasticsearchによるログ収集・解析環境 - さくらのナレッジ

サーバーアプリ公開(python

pythonだとgunicornを使うのがクッソ楽だった。ちなみに今回使ったpythonのバージョンはは2.7.11。

gunicornのインストールはpipで。ちなみにvirtualenvは使っていません。

sudo pip install gunicorn

例えば、bottleなんかでサーバーを作る際は下記のようなコードを書きます。

#!/usr/bin/env python
# coding: utf-8

from bottle import request, route, default_app

@route('/')
def hello():
    return 'Hello world!'

app = default_app()

このコードを /var/www/app.py として保存した場合、

systemdでgunicornを自動起動させるスクリプトは下記のようになりますね。

#!/bin/bash

PID=/var/run/gunicorn.pid

if [ -f $PID ]; then rm $PID; fi

cd /var/www/app.py
exec gunicorn app:app --pid=${PID}

runapp.shという名前で保存したスクリプトをsystemdで自動起動をさせるスクリプトを書く

[Unit]
Description=gunicorn
After=syslog.target

[Service]
ExecStart=/path/to/runapp.sh
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

設定ファイルの書き方はどこかから参考にしたのですが、どこか忘れた・・・参考記事さんごめんなさい。

無料DNS

サーバードメインが決まらなかったので、freenomという無料のDNSサービスを利用。こちらもお試しに使いたかったので。

Freenom.com

ドメインの発行には、IPアドレスが必要となります。

さくらのクラウドのサーバ一覧より、発行してもらうサーバの詳細画面に移動し、NIC項へ移動、そこでIPアドレスを確認することができます。

登録には数分かかります。しばらくしたら、発行したドメインより、サーバのホームページに移動できるはずです。

SSL証明書

試したかっただけなので、無料のSSL証明書を発行。Let's encryptを使いました。

ちなみに、Line bot を制作するのに、Let's encryptは使えないとのことでしたが、2016年6月時点ではLet's encrpytの証明書でもbotが作れました。

SSL証明書の取得にはホスト名が必要なので、freenomなどであらかじめ取っておきましょう。

インストール

git clone https://github.com/certbot/certbot.git

証明書作成コマンド。事前にnginxやapacheなどサーバーを止めないと実行できません。作成の際に規約の同意が聞かれます。

./certbot-auto certonly --standalone --email admin@example.com -d example.jp -d www.example.jp

証明書の作成が完了すると、メッセージが表示されます。

そのメッセージ内の'Your certificate and chain have been saved at' の後に書いてあるパスが証明書の保存場所ですね。

んで、nginxの設定

server {
    listen       443 ssl;

    ssl_certificate /etc/letsencrypt/live/example.jp/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.jp/privkey.pem;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!aNULL!eNull:!EXPORT:!DES:!3DES:!MD5:!DSS;

    server_name www.example.jp;

    access_log /var/log/nginx/app_access.log;

    location / {
        proxy_pass http://127.0.0.1:8000; # gunicornで立ち上げたサーバーのポート
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

記憶が曖昧なので、下記の参考記事読んだ方がいいかも...

参考

Let's Encrypt の使い方 - Let's Encrypt 総合ポータル

Let's Encryptの証明書をnginxに設定してhttps化した | tsuchikazu blog

トラブル

急にサーバーに接続できなくなった

以下のスクリプトを作成して実行。

ファイヤウォールのルールをリセットとあるが本当にこんなことをしていいのだろうか?

#!/bin/sh
echo "Flushing iptables rules..."
sleep 1
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT


insanelabs.net

その他

やりたいこと

dockerを使った開発環境やデプロイをやってみたい

ssl通信について勉強してまとめたい