読者です 読者をやめる 読者になる 読者になる

PythonでWebアプリを作る その1

目的

  • httpsに対応したWebサービスをつくりたい(ログイン機能とかも付けたい)
  • 開発言語はPythonを使いたい
  • ApacheとかNginxとか良く分からんのでuWSGI(本来はWSGIサーバーだが、単体でWSGI対応http/httpsサーバーとしも使用可能)だけでサーバーを構築したい
  • サーバー証明書は無料のLet's Encryptで取得

下準備

環境構築

Python3のビルド&インストール

CeontOS7の公式リポジトリにはPython3が無いので、ソースからビルド&インストール

開発ツールのインストール

$ yum groupinstall "Development tools"

opensslのインストール(pipのインストールに必要)

$ yum install openssl-devel

ソースをダウンロードし展開

$ wget https://www.python.org/ftp/python/3.x.x/Python-3.x.x.tgz
$ tar xf Python-3.x.x.tgz

ビルドしてインストール(pipも同時にインストールされる)

$ cd Python-3.x.x
$ ./configure
$ make
$ make install

uWSGIのインストール

pipからインストールする場合

pipからインストールする場合、systemdのunitファイルがインストールされない?

$ pip3 install uwsgi

yumからインストールする場合

yum (若しくは apt, pacman 等) からインストールする場合、uwsgi-plugin-pythonパッケージも必要。

$ yum install uwsgi uwsgi-plugin-python

ポートの開放

http(80番)およびhttps(443番)を開放する(Webサービスの公開、Let's Encryptでの証明書取得に必要)。

$ firewall-cmd --add-service=http --zone=public

$ firewall-cmd --add-service=http --zone=public

(永続的にポートを解放する場合は--permanentオプションを追加)

サーバー証明書の取得

Let's Encryptでhttps用のサーバー証明書を取得する。ポート80(http)と443(https)が開放されており、ホスト名(hogehoge.com, www.hogehoge.com)がDNSに登録されている必要がある。また、DNSのAレコードに記載されたIPアドレスのマシンで下記コマンドを実 行する必要がる(詳細はLet's Encrypt の使い方 - Let's Encrypt 総合ポータルを参照)。

リポジトリを取得

$ git clone https://github.com/letsencrypt/letsencrypt

環境が整っているかテスト

$ cd letsencrypt

$./letsencrypt--auto --help

証明書の取得

$ ./letsencrypt-auto certonly -a standalone -d hogehoge.com -d www.hogehoge.com

取得した証明書は/etc/letsencrypt/live/hogehoge.com/下に保存されている。

Webサーバーを起動

uWSGIをWebサーバーとして起動し、簡単なWebアプリを実行する。

Webアプリのコード

下記のコードをtest.pyとして保存

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]

uWSGIを起動

$ uwsgi --https :443,/etc/letsencrypt/live/hogehoge.com/cert.pem,/etc/letsencrypt/live/hogehoge.com/privkey.pem --wsgi-file test.py

ブラウザでhttps://www.hogehoge.com/にアクセスし、「Hello World」と表示されれば成功!

今後の予定

  • uWSGIをサービスとして起動したい
  • 下準備は出来たので、今後はWebアプリの開発に注力したい(セッション管理やログイン・ログアウト機能などの実装)