আমি ফ্ল্যাশকে পোর্ট 80 এ চালানোর জন্য কীভাবে পেতে পারি?


212

আমার 5000 বন্দর দিয়ে ফ্লাস্ক সার্ভার চলছে এবং এটি ঠিক আছে। আমি এটি http://example.com:5000 এ অ্যাক্সেস করতে পারি

তবে এটি কি কেবলমাত্র http://example.com এ অ্যাক্সেস করা সম্ভব ? আমি ধরে নিচ্ছি তার মানে আমাকে বন্দরটি 5000 থেকে 80 এ পরিবর্তন করতে হবে But তবে আমি যখন ফ্লাস্কে চেষ্টা করি তখন এটি চালানোর সময় আমি এই ত্রুটি বার্তাটি পাই।

Traceback (most recent call last):
  File "xxxxxx.py", line 31, in <module>
app.run(host="0.0.0.0", port=int("80"), debug=True)
   File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 772, in run
run_simple(host, port, self, **options)
  File "/usr/local/lib/python2.6/dist-packages/werkzeug/serving.py", line 706, in run_simple
    test_socket.bind((hostname, port))
  File "<string>", line 1, in bind
socket.error: [Errno 98] Address already in use

চলছে lsof -i :80রিটার্ন

COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
apache2   467     root    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2  4413 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14346 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14570 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14571 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14573 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)

আমার কি প্রথমে এই প্রক্রিয়াগুলি মেরে ফেলার দরকার আছে? এটা কি নিরাপদ? বা ফ্লাস্ককে 5000 বন্দর চলমান রাখার অন্য কোনও উপায় আছে তবে মূল ওয়েবসাইটের ডোমেনটি কোনওভাবে পুনঃনির্দেশিত আছে?


আপনি এটি অ্যাপাচি দিয়ে ফ্লাস্ক ব্যবহার করতে পারেন ।
সৈয়দ হাবিব এম

3
প্রশ্নের শিরোনাম প্রশ্নের সাথে খাপ খায় না। সম্ভবত এটি 'পোর্ট 80 এ চালানোর জন্য অন্যান্য জিনিস কীভাবে পাবেন না' তা পড়তে হবে। আমি কৌতূহল করছি কীভাবে বন্দরের ফ্ল্যাশ পরিবর্তন করা যায় যার উপর এই প্রশ্নটি জিজ্ঞাসা করে, তবে কীভাবে এখানে করবেন তা কখনই উল্লেখ করা হয়নি
এলিয়ট উডস

উত্তর:


76

সুতরাং এটি ত্রুটি বার্তাটি ছুঁড়ে ফেলছে কারণ আপনার apache280 বন্দরটিতে চলছে।

এটি যদি উন্নয়নের জন্য হয় তবে 5000 পোর্টে যেমন রয়েছে তেমনই ছেড়ে দেব।

এটি যদি উত্পাদনের জন্য হয়:

প্রস্তাবিত নয়

  • apache2প্রথমে থামো ;

ডকুমেন্টেশনে যেমন বলা আছে তেমন প্রস্তাবিত নয়:

আপনি উন্নয়নের সময় অন্তর্নির্মিত সার্ভারটি ব্যবহার করতে পারেন তবে উত্পাদন অ্যাপ্লিকেশনগুলির জন্য আপনার সম্পূর্ণ স্থাপনার বিকল্পটি ব্যবহার করা উচিত। (উত্পাদনে বিল্টিন ডেভলপমেন্ট সার্ভার ব্যবহার করবেন না))

প্রস্তাবিত

  • ফ্লাস্কের HTTPমাধ্যমে প্রক্সি ট্র্যাফিক apache2

এইভাবে, apache2আপনার সমস্ত স্ট্যাটিক ফাইলগুলি হ্যান্ডেল করতে পারে (যা এটি বেশ ভাল - ফ্লাস্কে নির্মিত ডিবাগ সার্ভারের চেয়ে অনেক ভাল) এবং ফ্ল্যাশকে অনুরোধগুলি পাস করে আপনার গতিশীল সামগ্রীর জন্য একটি বিপরীত প্রক্সি হিসাবে কাজ করতে পারে।

অ্যাপাচি + মোড_উজগির সাথে ফ্লাস্ক স্থাপন সম্পর্কে অফিসিয়াল ডকুমেন্টেশনের একটি লিঙ্ক এখানে

1 সম্পাদনা করুন - @ জ্যাকের জন্য ব্যাখ্যা ation

অ্যাপাচি 2 এর মাধ্যমে ফ্ল্যাকের কাছে প্রক্সি এইচটিটিপি ট্র্যাফিক

যখন 80 ( HTTP) বা পোর্ট 443 ( HTTPS) পোর্টের সার্ভারে একটি অনুরোধ আসে তখন অ্যাপাচি বা এনগিনেক্সের মতো একটি ওয়েব সার্ভার অনুরোধটির সংযোগটি পরিচালনা করে এবং এটি দিয়ে কী করবে তা নিয়ে কাজ করে। আমাদের ক্ষেত্রে প্রাপ্ত অনুরোধটি ডাব্লুএসজিআই প্রোটোকলে ফ্লাস্কের কাছে যাওয়ার জন্য এবং পাইথন কোড দ্বারা পরিচালিত হওয়ার জন্য কনফিগার করা উচিত। এটি "গতিশীল" অংশ।

গতিশীল সামগ্রীর জন্য বিপরীত প্রক্সি

উপরের মতো আপনার ওয়েব সার্ভারটি কনফিগার করার কয়েকটি সুবিধা রয়েছে;

  • এসএসএল সমাপ্তি - ওয়েব সার্ভারটি কেবলমাত্র একটি সামান্য কনফিগারেশন সহ এইচটিটিপিএস অনুরোধগুলি পরিচালনা করতে অনুকূলিত হবে। পাইথনে "নিজের রোল করবেন না" যা তুলনায় সম্ভবত খুব অনিরাপদ।
  • সুরক্ষা - ইন্টারনেটে একটি বন্দর খোলার জন্য সুরক্ষার যত্ন সহকারে বিবেচনা করা প্রয়োজন। ফ্লাস্কের ডেভলপমেন্ট সার্ভার এটির জন্য ডিজাইন করা হয়নি এবং এই উদ্দেশ্যে ডিজাইন করা ওয়েব সার্ভারের তুলনায় ওপেন বাগ বা সুরক্ষা সমস্যা থাকতে পারে। মনে রাখবেন যে একটি খারাপভাবে কনফিগার করা ওয়েব সার্ভারও নিরাপদ হতে পারে!
  • স্ট্যাটিক ফাইল হ্যান্ডলিং - বিল্টিন ফ্লাস্ক ওয়েব সার্ভারের পক্ষে স্থির ফাইলগুলি পরিচালনা করা সম্ভব তবে এটি প্রস্তাবিত নয়; চিত্র, সিএসএস, জাভাস্ক্রিপ্ট ফাইলের মতো স্ট্যাটিক ফাইলগুলি পরিচালনা করতে এনগিনেক্স / অ্যাপাচি অনেক বেশি দক্ষ এবং পাইথন কোড দ্বারা পরিচালিত হবার জন্য কেবল "গতিশীল" অনুরোধগুলি (যেখানে সামগ্রীগুলি প্রায়শই একটি ডাটাবেস থেকে পাঠানো হয় বা বিষয়বস্তু পরিবর্তিত হয়) তা পাস করবে।
  • + আরও। এটি এই প্রশ্নের সুযোগে সীমানা বদ্ধ করছে। আপনি যদি আরও তথ্য চান তবে এই অঞ্চলটি সম্পর্কে কিছু গবেষণা করুন।

সত্যিই এটি একটি দুর্দান্ত উত্তর! আপনি " Proxy HTTP traffic to Flask through apache2" এবং " reverse proxy for dynamic content" যে উচ্চ প্রযুক্তিগত জারগান ব্যবহার করেছেন, আপনি কি সরল ইংরেজিতে আপত্তি জানাতে পারেন ?
জন স্ট্রুড

2
@ জ্যাক - আপডেট করা উত্তর তবে এটি প্রশ্নের সুযোগের সীমানা বর্ধমান তাই আরও তথ্যের জন্য দয়া করে অনলাইনে অনুসন্ধান করুন।
ইভান

1
কীওয়ার্ড দেওয়ার জন্য আপনাকে ধন্যবাদ। আমি অবশ্যই একটি অনলাইন অনুসন্ধান করব।
জন স্ট্রুড

419

1- অন্যান্য অ্যাপ্লিকেশনগুলি যা পোর্ট 80 ব্যবহার করছে তা বন্ধ করুন 2 2- পোর্ট 80 দিয়ে অ্যাপ্লিকেশন চালান:

if __name__ == '__main__':
      app.run(host='0.0.0.0', port=80)

1
শুধুমাত্র উইন্ডোজ পরিবেশে কাজ করে জরিমানা, যখন Apache অনুপস্থিত .. :)।
Jose

1
এটা আমার জন্য কাজ করে না। এটি হওয়া উচিত: ফ্লাস্ক রান
হারুন-উর-রশিদ

1
@ জোস আমি উবুন্টুতে পাইচার্ম ব্যবহার করার চেষ্টা করেছি, ঠিকঠাক কাজ করে।
বাগ বাগি

@ জোস অ্যাপাচি লিনাক্স চালানোর জন্য প্রয়োজন হয় না, আপনি এটি আনইনস্টল করতে পারেন বা এটির বন্দর পরিবর্তন করতে পারেন।
নুরেটিন

145

বাহ্যিকভাবে দৃশ্যমান সার্ভারের জন্য, যেখানে আপনি কেবল অ্যাপাচি বা অন্যান্য ওয়েব সার্ভার ব্যবহার করেন না just

flask run --host=0.0.0.0 --port=80

এই কমান্ডটি env vars ব্যবহার করে চালানো যাবে? আমি CMD flask run --host=0.0.0.0 --port=$PORTআমার ডকফাইফিলের মধ্যে চেষ্টা করছি (হিরকু কারণে) এবং আমি আমার বন্দরের জন্য একটি পূর্ণসংখ্যার প্রয়োজন সম্পর্কে ত্রুটি পেতে থাকি
স্মোকিন জো

এটি আমার লোকাল (ল্যাপটপ) এ দুর্দান্ত কাজ করেছে তবে আমি যখন এটি আমার এডাব্লুএস ইসি 2 উদাহরণে ব্যবহার করি তখন এটি "অনুমতি অস্বীকৃত" বলে। যদি আমি শুরুতে "সুডো" যুক্ত করি তবে এতে বলা হয়েছে "ফ্লাস্ক" কমান্ডটি স্বীকৃত নয় ...
ব্যবহারকারীর 3768495

1
@ ব্যবহারকারী 68686868৪৯৯ সম্ভবত ফ্লাস্কটি রুট (সুডো) ব্যবহারকারীর মধ্যে ইনস্টল করা নেই
হারুন-উর-রশিদ

2
হাই @ হারুন-উর-রশিদ, সম্ভবত এটিই হ'ল - আমি এটি ভার্চুয়াল পরিবেশে ইনস্টল করেছি। আমি এটি ঠিক করব কীভাবে তা ঠিক করব। আপনার উত্তর দেওয়ার জন্য ধন্যবাদ.
ব্যবহারকারী 3768495

22

আপনি যদি বন্দর বা হোস্টটি পরিবর্তন করতে নিম্নলিখিত ব্যবহার করেন:

if __name__ == '__main__':
  app.run(host='0.0.0.0', port=80)

সার্ভার শুরু করতে নিম্নলিখিত কোডটি ব্যবহার করুন (ফ্লাস্কের জন্য আমার প্রধান প্রবেশদ্বারটি app.py):

python app.py

পরিবর্তে ব্যবহার:

flask run

10

যদি আপনি একই বন্দর অর্থাৎ পোর্ট = 5000 এ আপনার অ্যাপ্লিকেশন চান তবে আপনার টার্মিনালে এই কমান্ডটি চালান:

fuser -k 5000/tcp

এবং তারপরে চালান:

python app.py

আপনি যদি কোনও নির্দিষ্ট পোর্টে চলতে চান, যেমন আপনার প্রধান ফাইলটিতে আপনি যদি পোর্ট = 80 এ চালাতে চান তবে কেবল এটি উল্লেখ করুন:

if __name__ == '__main__':  
    app.run(host='0.0.0.0', port=80)

8

একটি স্বীকৃত উপায় প্যাকেজটি ব্যবহার করছে python-dotenv: এটি এমন একটি .flaskenvফাইল পড়ে যা আপনি ফ্লাস্কের জন্য পরিবেশের ভেরিয়েবল সঞ্চয় করতে পারেন।

  • pip install python-dotenv
  • .flaskenvআপনার অ্যাপ্লিকেশনটির মূল ডিরেক্টরিতে একটি ফাইল তৈরি করুন

আপনি যে ফাইলটি নির্দিষ্ট করেছেন তার ভিতরে:

FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80

এর পরে আপনাকে কেবল আপনার অ্যাপ্লিকেশনটি চালাতে হবে flask runএবং সেই বন্দরে আপনার অ্যাপ্লিকেশনটি অ্যাক্সেস করতে পারবেন।

দয়া করে মনে রাখবেন FLASK_RUN_HOSTডিফল্ট 127.0.0.1এবং FLASK_RUN_PORTডিফল্ট 5000


8

উবুন্টু -18 এ এটিই আমার জন্য একমাত্র সমাধান solution

ফাইলের অভ্যন্তরে app.py, ব্যবহার করুন:

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

উপরের কোডটি sudoচালানোর জন্য ব্যবহার না করা হলে একই অনুমতি ত্রুটি দেবে :

sudo python3 app.py

6

আপনার সমস্যাটি হ'ল, আপনার কাছে ইতিমধ্যে একটি অ্যাপাচি ওয়েবসভার চলছে যা ইতিমধ্যে 80 বন্দরটি ব্যবহার করছে So সুতরাং, আপনি এটি করতে পারেন:

  1. অ্যাপাচি মেরে ফেলুন: খালি /etc/init.d/apache2 stopখুন করার চেয়ে আপনার সম্ভবত এটি করা উচিত ।

  2. আপনার অ্যাপাচি প্রক্রিয়াতে আপনার ফ্লাস্ক অ্যাপটি স্থাপন করুন, যেমন অ্যাপাচে ফ্লাস্ক বর্ণনা করে।


5

আমাকে FLASK_RUN_PORTআমার পরিবেশে নির্দিষ্ট পোর্ট নম্বরে সেট করতে হয়েছিল। পরের বার আপনি আপনার অ্যাপ্লিকেশনটি শুরু করবেন, ফ্ল্যাস্ক আপনার নির্বাচিত পোর্ট নম্বর দিয়ে সেই পরিবেশের পরিবর্তনশীলটি লোড করবে।


3

আপনার অ্যাপ্লিকেশনের জন্য আপনার পোর্ট নম্বর পরিবর্তন করার দরকার নেই, কেবল আপনার www সার্ভারটি (এনজিনেক্স বা অ্যাপাচি) ফ্লাক্স বন্দরে প্রক্সি প্রশ্নগুলিতে কনফিগার করুন। অ্যাটানশন চালু uWSGI


3

app.run(port=80,debug=True) আপনার সাথে বন্দরটি সেট করা উচিত যখন ডি তে থাকাকালীন ডিবাগটি সত্য হয়ে যায়


2

সবচেয়ে সহজ এবং সর্বোত্তম সমাধান

আপনার .py ফাইলটি একটি ফোল্ডারে সংরক্ষণ করুন। এই ক্ষেত্রে আমার ফোল্ডারের নাম পরীক্ষা করা হয়। কমান্ড প্রম্পটে নিম্নলিখিতটি চালান

c:\test> set FLASK_APP=application.py
c:\test> set FLASK_RUN_PORT=8000
c:\test> flask run

----------------- নিম্নলিখিতগুলি ফেরত দেওয়া হবে ----------------

 * Serving Flask app "application.py"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
127.0.0.1 - - [23/Aug/2019 09:40:04] "[37mGET / HTTP/1.1[0m" 200 -
127.0.0.1 - - [23/Aug/2019 09:40:04] "[33mGET /favicon.ico HTTP/1.1[0m" 404 -

এখন আপনার ব্রাউজারে টাইপ করুন: http://127.0.0.1:8000 । ধন্যবাদ


তাকে এটি 80 এ চালানো দরকার যা একটি বিশেষ বন্দর। তাকে প্রথমে অন্যান্য জিনিস বন্ধ করতে হবে।
আহমেদন 1

1

আমার দৃশ্যে নিম্নলিখিত পদক্ষেপগুলি কবজির মতো কাজ করেছে:

  • প্যাকেজ ইনস্টল করা হচ্ছে:

    pip install --upgrade pip
    pip install python-dotenv
  • আমার অ্যাপ্লিকেশন ডিরেক্টরি "flaskr / .flaskenv" এ একটি লুকানো ফাইল তৈরি করা হচ্ছে

  • নিম্নলিখিত সামগ্রী যুক্ত করা:

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
  • অবশেষে, আরও একবার ফ্লাস্ক কমান্ড চালান:

    flask run
  • আমি যে সংস্করণে কাজ করছি তা হ'ল:

    pip freeze |grep -i flask
    Flask==1.1.1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.