تحضير خادم لنشر تطبيق ويب في Python

يوم جيد ، هابروفسك!

كان هناك وقت فراغ ، وكانت هناك رغبة في إنشاء تطبيق ويب صغير. هناك فكرة (لتلقي البيانات من مستشعر الطقس ، وتخزينها في قاعدة البيانات ثم القيام بشيء مثير للاهتمام) ، خادم مجاني على Centos أيضًا. يبدو أن البرامج التعليمية حول الإعداد هي نفسها أيضًا ... ولكن في وقت كتابة هذا التقرير ، لم يتم العثور على واحد يعمل بشكل كامل . إذا كنت تريد أيضًا نشر التطبيق على خادم CentOS 7.4 باستخدام python3. * Bundle و uwsgi و nginx ، مرحبًا بك في cat.

لذا ، ما الذي يجب أن يكون بالفعل وما لن يتم تناوله في هذه المقالة:

  1. خادم فعلي أو ظاهري يعمل بنظام CentOS 7.4 (الأداء غير مضمون لأنظمة التشغيل والإصدارات الأخرى).
  2. الوصول إلى الخادم بامتيازات المستخدم الخارق * إذا كان الخادم افتراضيًا ، فمن المفترض أن هناك القدرة والقدرة على الاتصال به عبر SSH).

بعد الاتصال كمستخدم أساسي ، تكون الخطوة الأولى هي إنشاء مستخدم جديد بحقوق المسؤول (هذا ليس ضروريًا ، ولكن على الأقل نغمة جيدة):

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(فيما يلي سأستخدم المحرر السادس ، ولكن هذه مسألة ذوق)

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:

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:

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. socket = /tmp/uwsgi/myproject.sock - لتسريع الخدمة يجب عليك استخدام مقبس unix ، ولكي تتمكن nginx من الاتصال به ، قم بإنشائه في المجلد المؤقت / tmp / uwsgi
  2. chown-socket = nginx: ستنقل 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 هو الأمر الذي يبدأ الخدمة مباشرة ، وفيها ننتقل بالتسلسل إلى دليل العمل ، وننشط البيئة الافتراضية ونبدأ خادم uwsgi من ملف ini.
  3. ExecStartPost - أمر يتم تشغيله بعد بدء تشغيل الخدمة. في حالتنا ، فإنه مطلوب للنقل الصحيح للطلبات من خادم nginx إلى خادم uwsgi.
  4. PrivateTmp = false هي معلمة تجعل المجلد المؤقت الذي تم إنشاؤه مرئيًا للعمليات الأخرى.

الآن قم بتشغيل الخدمة:

systemctl start myproject
systemctl status myproject
systemctl enable myproject

الأمر الأخير سيجعله يبدأ تلقائيًا بعد إعادة تشغيل الخادم.

وأخيرًا - سنقوم بتكوين خادم nginx وإتاحة تطبيق الويب الخاص بنا للشبكة الخارجية. يمكن دائمًا عرض سجل عمله باستخدام الأمر

journalctl -u  myproject

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

ابحث عن كتلة [الخدمة] وأضف PrivateTmp = false في النهاية.

بعد ذلك ، أعد تشغيل daemons بالأمر ، 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

الآن ، عند الوصول إلى الخادم عن طريق اسم المجال أو عنوان IP ، سوف نتلقى ردًا من تطبيق Flask.

آمل أن تكون هذه المواد مفيدة.

All Articles