पायथन में एक वेब-ऐप प्रकाशित करने के लिए एक सर्वर तैयार करना

शुभ दिन, हब्रोस्क!

खाली समय था, और एक छोटा सा वेब एप्लिकेशन बनाने की इच्छा थी। एक विचार है (मौसम सेंसर से डेटा प्राप्त करने के लिए, डेटाबेस में स्टोर करें और फिर कुछ दिलचस्प करें), सेंटो पर एक मुफ्त सर्वर भी। स्थापित करने के ट्यूटोरियल भी समान प्रतीत होते हैं ... लेकिन लेखन के समय, पूरी तरह से काम करने वाला एक भी नहीं मिला। अगर आप भी python3 का उपयोग करके CentOS 7.4 सर्वर पर एप्लिकेशन को तैनात करना चाहते हैं । * बंडल, uwsgi और nginx, बिल्ली का स्वागत है।

तो, पहले से ही क्या होना चाहिए और इस लेख में क्या शामिल नहीं होगा:

  1. CentOS 7.4 पर चलने वाला एक भौतिक या वर्चुअल सर्वर (अन्य ऑपरेटिंग सिस्टम और संस्करणों के लिए प्रदर्शन की गारंटी नहीं है)।
  2. सुपरसुसर विशेषाधिकारों के साथ सर्वर तक पहुंच * यदि सर्वर आभासी है, तो यह माना जाता है कि एसएसएच के माध्यम से इसे कनेक्ट करने की क्षमता और क्षमता है)।

रूट उपयोगकर्ता के रूप में कनेक्ट होने के बाद, पहला कदम एक नया उपयोगकर्ता है, जिसके पास व्यवस्थापक अधिकार हैं (यह आवश्यक नहीं है, लेकिन कम से कम एक अच्छा टोन है):

adduser developer
passwd developer

यहां आपको उपयोगकर्ता पासवर्ड दर्ज करने और पुष्टि करने की आवश्यकता होगी

usermod -aG wheel developer

स्थानीय व्यवस्थापक समूह में उपयोगकर्ता जोड़ें

su - developer

नए सिरे से बनाए गए उपयोगकर्ता पर जाएँ।

अब पर्यावरण तैयार करें:

sudo yum install -y epel-release
sudo yum install -y python3 python3-pip python3-devel nginx gcc
sudo yum update -y python36 python2
sudo yum groupinstall -y "Development Tools" "Development Libraries"
sudo yum install -y python3-devel python36-virtualenv

मैं आभासी वातावरण के सही प्रक्षेपण के लिए आवश्यक है - "विकास उपकरण" और "विकास पुस्तकालय" पर ध्यान आकर्षित करना चाहूंगा हम ध्वज का उपयोग करते हैं ताकि टीम पुष्टि के बिना पूछे पूरा करे।

अब आप कार्य निर्देशिका बनाना शुरू कर सकते हैं:

sudo mkdir /opt/myproject && cd /opt/myproject
sudo chown -R developer /opt/
python3 -m venv myprojectenv
source myprojectenv/bin/activate

pip3 install --upgrade pip
pip3 install uwsgi flask

अब हम वेब एप्लिकेशन के लिए प्रवेश बिंदु तैयार

vi /opt/myproject/wsgi.pyकरेंगे : (इसके बाद मैं vi संपादक का उपयोग करूंगा, हालांकि यह स्वाद का मामला है)

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return ["<h1 style='color:blue'>Testing Success!</h1>"]

लॉन्च के बाद यह कोड हमें यह सुनिश्चित करने की अनुमति देगा कि पहले उठाए गए सभी कदम सफल थे। परीक्षण करने के लिए, सेवा को चलाएं:

uwsgi --socket 0.0.0.0:8080 --protocol=http -w wsgi

एक शारीरिक ljcnegt या rdp कनेक्शन के साथ, परिणाम 0.0.0.0:8080 पर एक ब्राउज़र में चेक किया जा सकता है। SSH कनेक्शन के साथ, एक नया सत्र खोलें और कर्ल के साथ परीक्षण करें:

curl -v 0.0.0.0:8080

-V ध्वज आपको पूर्ण आउटपुट देखने की अनुमति देता है।

परीक्षण पूरा होने के बाद, आपको CTRL + C दबाकर सेवा को समाप्त करना चाहिए (अन्यथा आपको प्रक्रिया को देखना होगा और इसे मारना होगा। यह भी एक निकास है, लेकिन निश्चित रूप से कम सुविधाजनक है)।

अब आप मुख्य वेब एप्लिकेशन बना सकते हैं:

vi /opt/myproject/myproject.py

from flask import Flask
application = Flask(__name__)

@application.route("/")
def hello():
   return "<h1 style='color:blue'>Hello There!</h1>"

if __name__ == "__main__":
   application.run(host='0.0.0.0')

परीक्षण प्रक्रिया पिछले एक के समान है - हम कमांड python3 /opt/myproject/myproject.pyऔर चेक का उपयोग करके एप्लिकेशन लॉन्च करते हैं परिणाम समान होना चाहिए।

अब प्रवेश बिंदु को संपादित करें ताकि जब इसे बुलाया जाए तो हमारा आवेदन शुरू हो:

vi /opt/myproject/wsgi.py

from myproject import application

if __name__ == "__main__":
   application.run()

अब सबसे कठिन और दिलचस्प है। यह इस एप्लिकेशन से एक सेवा बनाने का समय है जो स्वचालित रूप से और पृष्ठभूमि में काम करेगा।

सबसे पहले, uwsgi के लिए ini-file तैयार करें:

vi /opt/myproject/myproject.ini

[uwsgi]
wsgi-file = myproject/wsgi.py

master = true
processes = 2

uid = developer
socket = /tmp/uwsgi/myproject.sock
chown-socket = nginx:nginx
chmod-socket = 666
vacuum = true

die-on-term = true

यहाँ मैं निम्नलिखित पंक्तियों पर ध्यान देना चाहता हूँ:

  1. सॉकेट = /tmp/uwsgi/myproject.sock - सेवा को गति देने के लिए आपको यूनिक्स-सॉकेट का उपयोग करना चाहिए, और इसे कनेक्ट करने के लिए nginx के लिए, इसे अस्थायी फ़ोल्डर / tmp / uvgi में बनाएँ
  2. chown-socket = nginx: nginx उपयोगकर्ता को सॉकेट उपयोग अधिकार हस्तांतरित करेगा
  3. chmod- सॉकेट = 666 - पिछले एक के समान उद्देश्य को पूरा करता है। विभिन्न मैनुअल और युक्तियों के अलग-अलग पैरामीटर मान हैं - 664, 665, 777 - लेकिन यह प्रायोगिक रूप से स्थापित किया गया है कि 666 न्यूनतम रूप से काम करने वाला है।

अब आप सीधे सेवा बनाने के लिए आगे बढ़ सकते हैं:

sudo vi /etc/systemd/system/myproject.service

[Unit]
Description=uWSGI instance to serve myproject app
After=network.target

[Service]
ExecStartPre=-/usr/bin/bash -c 'mkdir -p /tmp/uwsgi chown nginx:nginx /tmp/uwsgi'
ExecStart=/usr/bin/bash -c 'cd /opt/myproject; source myprojectenv/bin/activate; uwsgi --ini myproject.ini'
ExecStartPost=/usr/bin/bash -c 'setenforce 0'
PrivateTmp=false
[Install]
WantedBy=multi-user.target

सभी रोचक लाइनें सेवा ब्लॉक में हैं:

  1. ExecStartPre एक कमांड है जिसे सिस्टम मैनेजर सेवा शुरू करने से पहले निष्पादित करेगा।

    - - usr / bin / bash -c कमांड के अगले सीक्वेंस की शुरुआत की घोषणा करता है, और 'mkdir -p / tmp / uwsgi chown nginx: nginx / tmp / uwsgi' सॉकेट के लिए एक अस्थायी फ़ोल्डर बनाता है और nginx उपयोगकर्ता के अधिकारों को स्थानांतरित करता है।
  2. ExecStart वह कमांड है जो सीधे सेवा शुरू करती है, और इसमें हम क्रमिक रूप से वर्किंग डायरेक्टरी में जाते हैं, वर्चुअल वातावरण को सक्रिय करते हैं और ini फाइल से uwsgi-server को शुरू करते हैं।
  3. ExecStartPost - एक कमांड जो सेवा शुरू होने के बाद चलती है। हमारे मामले में, यह nginx सर्वर से uwsgi सर्वर के लिए अनुरोधों के सही हस्तांतरण के लिए आवश्यक है।
  4. PrivateTmp = false एक पैरामीटर है जो निर्मित अस्थायी फ़ोल्डर को अन्य प्रक्रियाओं के लिए दृश्यमान बनाता है।

अब सेवा चलाएं:

systemctl start myproject
systemctl status myproject
systemctl enable myproject

अंतिम आदेश सर्वर रिबूट के बाद इसे ऑटोस्टार्ट कर देगा।

और अंतिम झटका - हम नंगेक्स सर्वर को कॉन्फ़िगर करेंगे और हमारे वेब एप्लिकेशन को बाहरी नेटवर्क के लिए उपलब्ध कराएंगे। उनके काम का लॉग हमेशा कमांड का उपयोग करके देखा जा सकता है

journalctl -u  myproject

sudo vi /usr/lib/systemd/system/nginx.service

[सेवा] ब्लॉक ढूंढें और अंत में PrivateTmp = false जोड़ें।

उसके बाद, कमांड के साथ डेमों को रिबूट करें। systemctl daemon-reload

अब हम सीधे सर्वर कॉन्फ़िगरेशन के लिए आगे बढ़ते हैं:

vi /etc/nginx/nginx.conf

http {
    . . .

    include /etc/nginx/conf.d/*.conf;

    server {
        listen 80 default_server;

        . . .

Http ब्लॉक ढूंढें और एक नया सर्वर जोड़ें:

server {
    listen 80;
    server_name server_domain_or_IP;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/tmp/uwsgi/myproject.sock;
    }
}

अब यह सर्वर को चालू करने और फ़ायरवॉल पर नियमों को संपादित करने के लिए बना हुआ है:

systemctl start nginx
systemctl enable nginx

firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --zone=public --permanent --add-service=https

firewall-cmd --reload

अब, जब सर्वर को उसके डोमेन नाम या आईपी पते से एक्सेस किया जाता है, तो हम अपने फ्लास्क एप्लिकेशन से प्रतिक्रिया प्राप्त करेंगे।

मुझे उम्मीद है कि यह सामग्री उपयोगी होगी।

All Articles