يوم جيد ، هابروفسك!كان هناك وقت فراغ ، وكانت هناك رغبة في إنشاء تطبيق ويب صغير. هناك فكرة (لتلقي البيانات من مستشعر الطقس ، وتخزينها في قاعدة البيانات ثم القيام بشيء مثير للاهتمام) ، خادم مجاني على Centos أيضًا. يبدو أن البرامج التعليمية حول الإعداد هي نفسها أيضًا ... ولكن في وقت كتابة هذا التقرير ، لم يتم العثور على واحد يعمل بشكل كامل . إذا كنت تريد أيضًا نشر التطبيق على خادم CentOS 7.4 باستخدام python3. * Bundle و uwsgi و nginx ، مرحبًا بك في cat.لذا ، ما الذي يجب أن يكون بالفعل وما لن يتم تناوله في هذه المقالة:- خادم فعلي أو ظاهري يعمل بنظام CentOS 7.4 (الأداء غير مضمون لأنظمة التشغيل والإصدارات الأخرى).
- الوصول إلى الخادم بامتيازات المستخدم الخارق * إذا كان الخادم افتراضيًا ، فمن المفترض أن هناك القدرة والقدرة على الاتصال به عبر 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
هنا أريد الانتباه إلى السطور التالية:- socket = /tmp/uwsgi/myproject.sock - لتسريع الخدمة يجب عليك استخدام مقبس unix ، ولكي تتمكن nginx من الاتصال به ، قم بإنشائه في المجلد المؤقت / tmp / uwsgi
- chown-socket = nginx: ستنقل nginx حقوق استخدام المقبس إلى مستخدم nginx
- مأخذ 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
جميع الخطوط المثيرة للاهتمام موجودة في كتلة الخدمة:- ExecStartPre هو أمر سينفذه مدير النظام قبل بدء الخدمة.
- / usr / bin / bash -c يعلن بدء التسلسل التالي للأوامر ، ويقوم 'mkdir -p / tmp / uwsgi chown nginx: nginx / tmp / uwsgi' بإنشاء مجلد مؤقت للمقبس ونقل الحقوق إلى مستخدم nginx. - ExecStart هو الأمر الذي يبدأ الخدمة مباشرة ، وفيها ننتقل بالتسلسل إلى دليل العمل ، وننشط البيئة الافتراضية ونبدأ خادم uwsgi من ملف ini.
- ExecStartPost - أمر يتم تشغيله بعد بدء تشغيل الخدمة. في حالتنا ، فإنه مطلوب للنقل الصحيح للطلبات من خادم nginx إلى خادم uwsgi.
- 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.آمل أن تكون هذه المواد مفيدة.