pythonのwebサイトを外部公開しよう on windows 環境構築~ドメイン設定

はじめに

今回はpython のwebフレームワークflaskで作ったサイトを外部公開する手順。
以下を使用します。 ・flask Python性の必要最低限の機能を持ったwebフレームワーク。別に他のフレームワークでも問題ない。 ・nginx Webサーバ。webブラウザからの処理に応答するやつ。 ・uwsgi webサーバとpython をつないでくれるインターフェース。

準備

まずは、python をインストールしてない方はpythonをインストールして下さい。 この記事からどうぞ。 inmyzakki.hatenablog.com
flaskをインストールしてない方は、コマンドプロンプトから以下のコマンドでインストールして下さい。
pip install flask
nginxを公式サイトからnginx/Windows-1.13.1 落としてきます。 http://nginx.org/en/download.html
uwsgiをこの記事を参考にインストールします。 inmyzakki.hatenablog.com

まずはローカルで動かしてみる

以下のPythonファイルhello.pyを作ります。
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]
インストールしたcywinを立ち上げ、hello.pyがあるフォルダへ移動します。 以下のコマンドで作ったpythonファイルhello.pyをローカルで動かします。
uwsgi --http :9090 --wsgi-file hello.py
http://127.0.0.1:9090 ここにアクセスしてhello worldと表示されていれば、uwsgiは正常に動いています。 ※uwsgiは一応簡易的なwebサーバの機能も持っているので動きます。 一旦Ctrl+Cで終了します。
次にコマンドプロンプトでnginxを動かします。 nginx のあるフォルダまで移動して、以下のコマンドnginxを起動します。
nginx
http://localhost ここにアクセスしてwelcome nginxと表示されればOKです。 一旦nginxを終了させて、nginxとuwsgiの設定をします。 nginxの入ってるフォルダのconfフォルダのnginx.confを開いて以下の設定にします。
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        location / {
            include uwsgi_params;
            proxy_pass http://127.0.0.1:9090;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
これで、nginx、uwsgiを再び起動します。 この状態で下にアクセスすると、nginxがuwsgiと連携してくれるのでhelloworldが表示されます。 http://localhost

外部から繋げるようにする

ここら辺を参考にportを開放する。 www.akakagemaru.info 今回はnginx.confでport:80を使っているのでtcpの80でポートを開放します。
ルータを使用している場合は、ポートマッピングをする必要があります。 外部からあなたのグローバルIPアドレスにアクセスがあった場合、どのPCがwebサーバか設定する必要があるためです。 これは、ルータによって違うのでルータの機種名でググって設定してください。 基本的にはnginxを起動しているPCのIPアドレス、ポート番号(今回は80)、プロトコル(TCP)という情報で登録します。
これで、インターネットからhelloworldが表示されます。 以下のサイト等であなたのプロパイダのグローバルIPを調べてください。 www.cman.jp
グローバルIPを調べたらインターネット回線を通してグローバルIPに接続してみましょう。 スマホ等で上記のグローバルIPを下記の形で入力します。 http://XXX.XXX.XXX.XXX/ ※この時インターネット回線を通さない場合は、上記のアドレスにアクセスしてもhelloworldは表示されません。
これで外部への、公開はOKです。
ただIPアドレスでは、微妙なので最後にドメインを設定しましょう。 Free Dynamic DNS - Managed DNS - Managed Email - Domain Registration - No-IP このサイトで無料でDDNSを設定できます。 とても簡単(5分くらいでできる)なのではしょります。
手順は、ほしいドメイン名を入力して登録→windows用クライアントをダウンロード&インストール→公開するドメインを設定という感じです。 このサイトは30日間管理画面へアクセスがない場合ドメインが消されるので、 無料で使うのならばあくまでテストという感じが良さそうです。

終わり

windowsでflaskアプリを外部公開してみたが、uwsgiをwindowsで動かしている記事があまりなかったので手間取った。 多分セキュリティがこれだとガバガバなので認証を入れた方が良い。 だけどまずは、flaskでwebサイトを構築することを勉強しようかな。