pythonのWebアプリをデプロイするためのIaaS入門に必要になった知識
さくらインターネットさんのさくらのクラウド2万円無料券があったのと、line botを作りたくなったり、elasticsearchが使いたくなったのでさくらのクラウドを使用。
そこで、IaaSを使うのに、Unixサーバの知識とかいろいろ必要で苦労したのでやったことをまとめ。とりあえずAWS使ったほうが楽そうだった...
ちなみに、今回はUbuntu16.04を使いました。
ここで説明する知識は
です。最小限の公開ならば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にて。
サーバーアプリ公開(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サービスを利用。こちらもお試しに使いたかったので。
さくらのクラウドのサーバ一覧より、発行してもらうサーバの詳細画面に移動し、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; } }
記憶が曖昧なので、下記の参考記事読んだ方がいいかも...
参考
トラブル
急にサーバーに接続できなくなった
以下のスクリプトを作成して実行。
ファイヤウォールのルールをリセットとあるが本当にこんなことをしていいのだろうか?
#!/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