🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Q&A

解決済

2回答

4700閲覧

flaskを使ってサーバーを立てたい

Shouka

総合スコア34

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

0グッド

2クリップ

投稿2019/09/12 06:44

編集2019/09/12 07:28

こちらのサイトを参考にPythonでAPIの実装をしました。
このサイトの通りAPI.pyを作り、ローカルでhost='0.0.0.0'ならうまく動きました。

これを発展してラボマシンにサーバーを立てたいと思ったのですが、うまく繋がりません。
イメージ説明
ポートはちゃんと解放されているのになぜコネクトできないのでしょうか…。
ちなみにポートは今こんな感じです。イメージ説明
オンラインでできるポートチェックテストをやってみたら80や22はアクセスできるのに2112はアクセスできませんでした…。ちゃんと開放できていないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FiroProchainezo

2019/09/12 07:35

HTTPサーバは何を使っていますか? また、flaskアプリはどうやって起動していますか? gunicornでも使っているのでしょうか?
Shouka

2019/09/12 07:48

初心者で申し訳ないのですが、「何を使っている」にどう答えれば良いのかわかりません…ゼミ室に置いてある物理マシンにssh接続して使っているだけで…汗 flaskはサイトからの引用になりますが ``` # 必要なモジュールの読み込み from flask import Flask, jsonify, abort, make_response # Flaskクラスのインスタンスを作成 # __name__は現在のファイルのモジュール名 api = Flask(__name__) # GETの実装 @api.route('/get', methods=['GET']) def get(): result = { "greeting": 'hello flask' } return make_response(jsonify(result)) # エラーハンドリング @api.errorhandler(404) def not_found(error): return make_response(jsonify({'error': 'Not found'}), 404) # ファイルをスクリプトとして実行した際に # ホスト0.0.0.0, ポート3001番でサーバーを起動 if __name__ == '__main__': api.run(host='0.0.0.0', port=3001) ``` こんな感じのプログラムがあって、ローカルで`curl -i http://0.0.0.0:2112/get`で呼び出しています。
guest

回答2

0

ベストアンサー

クライアントとサーバが同じ LAN 内にいると仮定します。 <--- とっても大事
もし同じ LAN 内にいない場合は、NAT を設定する必要があります。

Step 1. サーバ側

ifconfig コマンドで IP アドレスを確認します。

$ ifconfig

Step 2. クライアント側

ping が通ることを確認します。仮にサーバの IP アドレスが 192.168.11.3 だったとします。

$ ping 192.168.11.3

Step 3. サーバ側

host を確認した IP アドレスに書き換えます。

python

1if __name__ == '__main__': 2 # api.run(host='0.0.0.0', port=3001) <--- これでは疎通しないことを確認しました。 3 api.run(host='192.168.11.3', port=3001)

Step 4. クライアント側

これでブラウザ経由でアクセスできるはずです。

補足 1

サブネットマスク, WAN, LAN をキーワードにして、ググったり書籍を当たると分かりやすいかもしれません。

サブネットマスク
ネットワークが同一のパソコンやサーバは容易に通信することができます。逆にネットワークが同一でないパソコンやサーバは、ルータやネットワーク機器(L3など)を使用してネットワークを切り替えて通信する必要があります。

補足 2

ちなみに...

0.0.0.0 - Wikipedia
IPv4において、0.0.0.0は全ビットが0のIPアドレスであり、無効、不明、または適用外の対象を指定するために使用されるルーティング不可のメタアドレスである。このアドレスには、いくつかの特別な意味が割り当てられている。

補足 3

Flask を起動すると "WARNING: This is a development server. Do not use it in a production deployment." という文章が見えます。

$ python hello.py * Serving Flask app "sample" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://192.168.11.5:5000/ (Press CTRL+C to quit)

セキュリティの問題なのか、それともパフォーマンスの問題からなのか、わからないのですが WAN での公開は控えた方が望ましいと考えています。おそらくパフォーマンスの問題だろうとは思うのですが...

Information
The development server is not intended to be used on production systems. It was designed especially for development purposes and performs poorly under high load. For deployment setups have a look at the Application Deployment pages.
Serving WSGI Applications

投稿2019/09/12 15:04

編集2019/09/13 01:07
nico25

総合スコア830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shouka

2019/09/13 05:22 編集

同じLAN内でできました…!すごく丁寧にありがとうございます!!! しかしやりたいのは異なるLANでの接続なのでNATの設定をしたいのですが変換後のIPアドレスっててきとうに決めてもよいものなのでしょうか…?
nico25

2019/09/13 03:36

この 192.168.11.3 という IP アドレスを誰が割り振っているかというと 実は **ルータが** 自動で割り振っています。 と、いうことは **ルータに** 手動で設定をしてあげれば良いわけです。 ① ARP テーブルの設定 MAC アドレス <-> IP アドレス 3c:07:53:2d:20:c5 <-> 192.168.11.3 あと NAT/NAPT の設定のイメージは、こんな感じです。 ② NAT/NAPT の設定 WAN 側の IP アドレス:80 <-> 192.168.11.3:5000 ただルータの WAN 側の IP アドレスがグローバル IP アドレスでない場合は、 NAT/NAPT を設定しても繋がりません。 その場合は諦めて Heroku にアップロードするのが楽だと思います。 ネット上にも資料はたくさんあるので... https://tanuhack.com/python/deploy-flask-heroku/
Shouka

2019/09/13 05:24

WAN側のIPアドレスとサーバーのIPアドレスを紐づけて、サーバのIPアドレスとクライアントのMACアドレスを紐づけるということでしょうか…?
nico25

2019/09/13 05:58

その理解で正しいです。 > WAN側のIPアドレスとサーバーのIPアドレスを紐づけて、 ---> NAT/NAPT https://www.geolocation.co.jp/learn/ip/07.html これはちょっと違って... 「サーバのIPアドレス」と「サーバのMACアドレス」を紐付ける設定を「ルータ」に設定します。ARPテーブルを設定することになります。 > サーバのIPアドレスとクライアントのMACアドレスを紐づける ---> ARPテーブル https://wa3.i-3-i.info/word13551.html 設定の仕方はルータごとに異なります。マニュアルまたはルータの設定画面を色々と見てまわらないといけなくなります。
guest

0

ApacheやNginx等のHTTPServerが無いと外から見えないです。

代表的な組み合わせとして、Nginx + Gunicorn + Flaskというものがあります。
以下のサイトの一番上の画像を参照ください。

画像だけ参照してほしいサイト

80が見えると書いてありますので、なんらかのHTTPServerが動作しているんだと思います。
そこに、2112へのリバースプロキシを構築し、gunicornで動作させたflaskにつなぐようにするとアクセス可能と思います。

Nginx + Gunicorn + Flaskの組み合わせでは、以下のサイトで構築方法を解説していらっしゃるかたがいましたので参考にしてください。
gunicorn + Flask + nginx + Systemdで動かしてみた

Apache + mod_wsgiの場合は、以下のサイトが参考になりそうです。
PythonのFlaskを初めて触ってから30分で本番環境にデプロイ+ HTTPS通信まで完成

投稿2019/09/12 08:02

FiroProchainezo

総合スコア2421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shouka

2019/09/13 02:19

gunicorn + Flask + nginx + Systemdで動かしてみたをみながらやってみます!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問