Flask + uWSGI + Nginx を使って Web アプリを作っていきます。
▼ Web アプリ作成の下準備
必要なパッケージをインストール。
$ sudo apt update $ sudo apt upgrade $ sudo apt install python-is-python3 $ sudo apt install python-pip $ sudo apt install python3-pip $ sudo pip install flask $ sudo pip install uwsgi $ sudo apt install nginx
ホームディレクトリに app ディレクトリを作成。
$ mkdir app
▼ 常時 SSL 化(HTTPS 化)の下準備
私がドメインを取得している Xserver Domain と Xserver SSL での設定例になります。
Xserver Domain の DNSレコード設定で Web アプリに使うドメインに A レコードを追加(インスタンスの IP アドレス)。
SSL 証明書を Xserver SSL で申し込み。利用環境は他社サーバー。「取得申請」から「DNS認証」(TXT レコードを DNSレコード設定に追加)。
「SSL証明書」と「秘密鍵」をダウンロード。
「SSL証明書」と「秘密鍵」を app ディレクトリに設置。
> scp -P 2222 -i ~/.ssh/private_key.txt ~/Downloads/letsencrypt12345678.crt ユーザー名@IPアドレス:/home/ユーザー名/app/ (SSL証明書) > scp -P 2222 -i ~/.ssh/private_key.txt ~/Downloads/letsencrypt12345678.key ユーザー名@IPアドレス:/home/ユーザー名/app/ (秘密鍵)
▼ Web アプリの作成
アプリの本体 main.py を app ディレクトリに作成。
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '<h1>WebARENA Indigo (Ubuntu) で Flask + uWSGI + Nginx を使って Web アプリを作る。</h1>' if __name__ == "__main__": import ssl ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) ssl_context.load_cert_chain( '/home/ユーザー名/app/letsencrypt12345678.crt', '/home/ユーザー名/app/letsencrypt12345678.key' ) app.run(host='0.0.0.0', port=443, ssl_context=ssl_context)
※ ローカルでアプリのテストを行う場合は、10~15行目を「app.run()」に置き換えてください。インスタンス上での確認には curl や wget を使います。
▼ uWSGI の設定
アプリを呼び出す WSGI のエントリポイント wsgi.py を app ディレクトリに作成。
from main import app if __name__ == '__main__': app.run()
uWSGI の設定ファイル app.ini を app ディレクトリに作成。
[uwsgi] module = wsgi:app master = true processes = 5 socket = /tmp/myapp.sock chmod-socket = 666 vacuum = true die-on-term = true wsgi-file = /home/ユーザー名/app/wsgi.py logto = /home/ユーザー名/app/uwsgi.log
※ sock や log ファイルは自動で作成されます。
▼ Nginx の設定
サーバーブロック構成ファイル myapp.conf を /etc/nginx/sites-available ディレクトリに作成。
server { listen 80; server_name サーバー名(Web アプリのドメイン); return 301 https://$host$request_uri; } server { listen 443 ssl; ssl on; server_name サーバー名(Web アプリのドメイン); ssl_certificate /home/ユーザー名/app/letsencrypt12345678.crt; ssl_certificate_key /home/ユーザー名/app/letsencrypt12345678.key; location / { include uwsgi_params; uwsgi_pass unix:///tmp/myapp.sock; } }
※ HTTP (80番ポート) へのアクセスは HTTPS (443番ポート) にリダイレクトされます。
myapp.conf を /etc/nginx/sites-enabled ディレクトリにリンク。デフォルトの構成ファイルのリンクを削除。
$ sudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled $ sudo unlink /etc/nginx/sites-enabled/default
※ nginx.conf から読み込まれるのは sites-enabled ディレクトリ内のファイルになります。
セキュリティ上好ましくないので Nginx のバージョンを表示させなくする。
$ sudo nano /etc/nginx/nginx.conf http { ~ server_tokens off; (コメントアウトを外す) ~ }
Nginx を起動。自動起動を有効化。
$ sudo systemctl start nginx $ sudo systemctl enable nginx
▼ サービス化(デーモン化)
myapp.service を /etc/systemd/system ディレクトリに作成。
[Unit] Description=uWSGI instance for myapp After=syslog.target [Service] ExecStart=/usr/local/bin/uwsgi --ini /home/ユーザー名/app/app.ini WorkingDirectory=/home/ユーザー名/app/ User=ユーザー名 Group=www-data RuntimeDirectory=uwsgi Restart=always KillSignal=SIGQUIT Type=notify StandardError=syslog NotifyAccess=all [Install] WantedBy=multi-user.target
myapp を起動。自動起動を有効化。
$ sudo systemctl start myapp $ sudo systemctl enable myapp
・
・
・
ということで完成です。
uWSGI、Nginx あたりの理解がまだいまいちなのですが、とりあえず動かしながら学習していければと思います。
・関連投稿
・広告
Twitter (@nkkmd) 日々更新中です。