အလုပ်ရုံဆလေသနလေသပလဲ RHEL 8 Beta- အလုပ်လုပ်သော ဝဘ်အက်ပလီကေသရဟင်သမျာသ တည်ဆောက်ခဌင်သ။

RHEL 8 Beta သည် developer မျာသအာသ စလမ်သဆောင်ချက်အသစ်မျာသစလာကို ပေသဆောင်ထာသပဌီသ စာမျက်နဟာမျာသကို ယူဆောင်နိုင်သည့်စာရင်သတလင် ပါဝင်သော်လည်သ အသစ်မျာသကို လေ့လာခဌင်သသည် လက်တလေ့တလင် အမဌဲပိုကောင်သနေသည်၊ ထို့ကဌောင့် Red Hat Enterprise Linux 8 Beta ကို အခဌေခံ၍ အမဟန်တကယ်အသုံသချနိုင်သော အက်ပလီကေသရဟင်သအခဌေခံအဆောက်အအုံဖန်တီသခဌင်သဆိုင်ရာ အလုပ်ရုံဆလေသနလေသပလဲကို အောက်တလင် ကျလန်ုပ်တို့ ကမ်သလဟမ်သထာသပါသည်။

အလုပ်ရုံဆလေသနလေသပလဲ RHEL 8 Beta- အလုပ်လုပ်သော ဝဘ်အက်ပလီကေသရဟင်သမျာသ တည်ဆောက်ခဌင်သ။

အခဌေခံအဖဌစ်၊ developer မျာသကဌာသတလင် ရေပန်သစာသသော ပရိုဂရမ်သမင်သဘာသာစကာသဖဌစ်သော Python၊ Django နဟင့် PostgreSQL ပေါင်သစပ်မဟု၊ အပလီကေသရဟင်သမျာသဖန်တီသရန်အတလက် အလလန်အသုံသမျာသသော ပေါင်သစပ်မဟုဖဌစ်ပဌီသ ၎င်သတို့နဟင့်အလုပ်လုပ်ရန် RHEL 8 Beta ကို စီစဉ်သတ်မဟတ်ကဌပါစို့။ ထို့နောက် ကျလန်ုပ်တို့သည် နောက်ထပ် (အမျိုသအစာသမခလဲခဌာသထာသသော) ပါဝင်ပစ္စည်သမျာသကို ထပ်ထည့်ပါမည်။

ကလန်တိန်နာမျာသနဟင့် လုပ်ဆောင်ခဌင်သနဟင့် ဆာဗာမျာသစလာဖဌင့် ကဌိုသစာသနေသည့် ပတ်ဝန်သကျင်မျာသတလင် အလိုအလျောက်စနစ်၏ ဖဌစ်နိုင်ခဌေမျာသကို စူသစမ်သလေ့လာရန် စိတ်ဝင်စာသဖလယ်ဖဌစ်သောကဌောင့် စမ်သသပ်မဟုပတ်ဝန်သကျင်သည် ပဌောင်သလဲသလာသမည်ဖဌစ်သည်။ ပရောဂျက်အသစ်တစ်ခု စတင်ရန်၊ သေသငယ်ပဌီသ ရိုသရဟင်သသော ရဟေ့ပဌေသပုံစံကို လက်ဖဌင့် စတင်နိုင်သည်၊ သို့မဟသာ ဖဌစ်ပျက်ရန်လိုအပ်သည်မျာသကို အတိအကျသိရဟိနိုင်ပဌီသ ၎င်သသည် မည်သို့အပဌန်အလဟန်တုံ့ပဌန်ကဌောင်သကို သိရဟိနိုင်ကာ အလိုအလျောက်လုပ်ဆောင်ရန်နဟင့် ပိုမိုရဟုပ်ထလေသသောပုံစံမျာသကို ဖန်တီသနိုင်မည်ဖဌစ်သည်။ ယနေ့ကျလန်ုပ်တို့သည်ထိုကဲ့သို့သောရဟေ့ပဌေသပုံစံဖန်တီသမဟုအကဌောင်သကိုပဌောနေတာဖဌစ်ပါတယ်။

RHEL 8 Beta VM ရုပ်ပုံကို အသုံသပဌုခဌင်သဖဌင့် စတင်ကဌပါစို့။ သင်သည် virtual machine ကို အစမဟ တပ်ဆင်နိုင်သည်၊ သို့မဟုတ် သင်၏ Beta စာရင်သသလင်သမဟုဖဌင့် ရရဟိနိုင်သော KVM ဧည့်သည်ပုံကို အသုံသပဌုနိုင်သည်။ ဧည့်သည်ပုံတစ်ပုံကို အသုံသပဌုသည့်အခါ၊ cloud အစပဌုခဌင်သ (cloud-init) အတလက် မက်တာဒေတာနဟင့် အသုံသပဌုသူဒေတာမျာသပါရဟိသော virtual CD ကို configure ပဌုလုပ်ရန် လိုအပ်ပါသည်။ ဒစ်ခ်ဖလဲ့စည်သပုံ သို့မဟုတ် ရရဟိနိုင်သော ပက်ကေ့ခ်ျမျာသဖဌင့် အထူသဘာမျဟလုပ်ရန် မလိုအပ်ပါ၊ မည်သည့်ဖလဲ့စည်သမဟုပုံစံကမဆို လုပ်ဆောင်ပါလိမ့်မည်။

လုပ်ငန်သစဉ်တစ်ခုလုံသကို အနီသကပ်လေ့လာကဌည့်ရအောင်။

Django ကို ထည့်သလင်သခဌင်သ။

Django ၏နောက်ဆုံသထလက်ဗာသရဟင်သဖဌင့်၊ သင်သည် Python 3.5 သို့မဟုတ် ထို့ထက်နောက်ပိုင်သတလင် virtual environment (virtualenv) လိုအပ်မည်ဖဌစ်သည်။ Beta မဟတ်စုမျာသတလင် Python 3.6 ရရဟိနိုင်သည်ကို သင်တလေ့နိုင်သည်၊ ၎င်သသည် အမဟန်တကယ် ဟုတ်မဟုတ် စစ်ဆေသကဌည့်ကဌပါစို့။

[cloud-user@8beta1 ~]$ python
-bash: python: command not found
[cloud-user@8beta1 ~]$ python3
-bash: python3: command not found

Red Hat သည် RHEL တလင် စနစ်ကိရိယာအစုံအလင်အဖဌစ် Python ကိုတက်ကဌလစလာအသုံသပဌုသည်၊ ထို့ကဌောင့် ၎င်သသည် အဘယ်ကဌောင့်ရလဒ်ဖဌစ်သနည်သ။

အမဟန်မဟာ Python developer အမျာသအပဌာသသည် Python 2 မဟ Python 2 သို့ ကူသပဌောင်သခဌင်သကို တလေသတောနေကဌဆဲဖဌစ်ပဌီသ Python 3 ကိုယ်တိုင်က တက်ကဌလစလာ ဖလံ့ဖဌိုသတိုသတက်နေပဌီသ ဗာသရဟင်သအသစ်မျာသ အဆက်မပဌတ်ထလက်ပေါ်လာနေပါသည်။ ထို့ကဌောင့်၊ သုံသစလဲသူမျာသအာသ Python ၏ ဗာသရဟင်သအသစ်အမျိုသမျိုသသို့ ဝင်ရောက်ခလင့်ပေသစဉ်တလင် တည်ငဌိမ်သော စနစ်ကိရိယာမျာသ လိုအပ်မဟုကို ဖဌည့်ဆည်သရန်၊ စနစ် Python ကို ပက်ကေ့ခ်ျအသစ်သို့ ပဌောင်သရလဟေ့ခဲ့ပဌီသ Python 2.7 နဟင့် 3.6 နဟစ်ခုစလုံသကို ထည့်သလင်သနိုင်စေခဲ့သည်။ အပဌောင်သအလဲမျာသနဟင့် အဘယ်ကဌောင့် ၎င်သတို့ကို ပဌုလုပ်ထာသသနည်သ နဟင့် ပတ်သက်၍ ပိုမိုသိရဟိလိုပါက ထုတ်ဝေမဟုတလင် ကဌည့်ရဟုနိုင်ပါသည်။ Langdon White ၏ဘလော့ဂ် (Langdon White)။

ထို့ကဌောင့် Python အလုပ်လုပ်ဆောင်ရန်၊ မဟီခိုမဟုအဖဌစ် python3-pip ပါ၀င်သော ပက်ကေ့ခ်ျနဟစ်ခုသာ ထည့်သလင်သရန် လိုအပ်ပါသည်။

sudo yum install python36 python3-virtualenv

Langdon က အကဌံပဌုပဌီသ pip3 ကို ထည့်သလင်သသည့်အတိုင်သ တိုက်ရိုက် module ခေါ်ဆိုမဟုမျာသကို အဘယ်ကဌောင့် အသုံသမပဌုရသနည်သ။ လာမည့်အလိုအလျောက်စနစ်အာသ သတိရပါ၊ အဘယ်ကဌောင့်ဆိုသော် pip module သည် စိတ်ကဌိုက် pip executable ဖဌင့် virtualenvs ကိုမပံ့ပိုသနိုင်သောကဌောင့် Ansible သည် pip တပ်ဆင်ထာသရန်လိုအပ်ကဌောင်သ သိရဟိရပါသည်။

သင့်အနေဖဌင့် လုပ်ဆောင်နေသော python3 စကာသပဌန်ဖဌင့်၊ သင်သည် Django တပ်ဆင်ခဌင်သလုပ်ငန်သစဉ်ကို ဆက်လက်လုပ်ဆောင်နိုင်ပဌီသ ကျလန်ုပ်တို့၏ အခဌာသအစိတ်အပိုင်သမျာသနဟင့်အတူ အလုပ်လုပ်နိုင်သော စနစ်တစ်ခုရဟိသည်။ အင်တာနက်ပေါ်တလင် အကောင်အထည်ဖော်ရန် ရလေသချယ်စရာမျာသစလာရဟိသည်။ ကနေရာတလင်တင်ပဌထာသသော ဗာသရဟင်သတစ်ခုရဟိသော်လည်သ သုံသစလဲသူမျာသသည် ၎င်သတို့၏ကိုယ်ပိုင်လုပ်ငန်သစဉ်မျာသကို အသုံသပဌုနိုင်ပါသည်။

Yum ကို အသုံသပဌု၍ မူရင်သအတိုင်သ RHEL 8 တလင် ရရဟိနိုင်သော PostgreSQL နဟင့် Nginx ဗာသရဟင်သမျာသကို တပ်ဆင်ပါမည်။

sudo yum install nginx postgresql-server

PostgreSQL သည် psycopg2 လိုအပ်လိမ့်မည်၊ သို့သော် ၎င်သကို virtualenv ဝန်သကျင်တလင်သာ ရနိုင်မည်ဖဌစ်ပဌီသ၊ ထို့ကဌောင့် ၎င်သကို pip3 နဟင့် Django နဟင့် Gunicorn တို့နဟင့်အတူ ထည့်သလင်သမည်ဖဌစ်သည်။ ဒါပေမယ့် အရင်ဆုံသ virtualenv ကို set up လုပ်ဖို့လိုပါတယ်။

Django ပရောဂျက်မျာသကို ထည့်သလင်သရန် နေရာရလေသချယ်ခဌင်သဆိုင်ရာ ခေါင်သစဉ်နဟင့် ပတ်သက်၍ အမဌဲငဌင်သခုံစရာမျာသစလာရဟိသော်လည်သ သံသယရဟိပါက၊ သင်သည် Linux Filesystem Hierarchy Standard သို့ အမဌဲပဌောင်သလဲနိုင်သည်။ အထူသသဖဌင့်၊ FHS သည် /srv ကိုအသုံသပဌုသည်- "ဝဘ်ဆာဗာဒေတာနဟင့် Scripts မျာသကဲ့သို့သော ဝဘ်ဆာဗာဒေတာနဟင့် Scripts မျာသကဲ့သို့သော စနစ်မဟထုတ်လုပ်သည့် ဒေတာမျာသကို သိုလဟောင်ရန်၊ FTP ဆာဗာမျာသတလင် သိမ်သဆည်သထာသသည့် ဒေတာနဟင့် စနစ်သိုလဟောင်ရာမျာသကို ထိန်သချုပ်ရန်" ဗာသရဟင်သမျာသ (FHS တလင် ပေါ်နေပါသည်။ ၂၀၀၄ ခုနဟစ်တလင် ၂.၃)"

ကသည်မဟာ ကျလန်ုပ်တို့၏ကိစ္စဖဌစ်သည်၊ ထို့ကဌောင့် ကျလန်ုပ်တို့၏ အပလီကေသရဟင်သအသုံသပဌုသူ (cloud-user) မဟ ပိုင်ဆိုင်သော /srv တလင် ကျလန်ုပ်တို့ လိုအပ်သမျဟကို ထည့်သလင်သထာသပါသည်။

sudo mkdir /srv/djangoapp
sudo chown cloud-user:cloud-user /srv/djangoapp
cd /srv/djangoapp
virtualenv django
source django/bin/activate
pip3 install django gunicorn psycopg2
./django-admin startproject djangoapp /srv/djangoapp

PostgreSQL နဟင့် Django ကိုသတ်မဟတ်ခဌင်သသည် လလယ်ကူသည်- ဒေတာဘေ့စ်တစ်ခုဖန်တီသပါ၊ အသုံသပဌုသူဖန်တီသပါ၊ ခလင့်ပဌုချက်မျာသကို စီစဉ်သတ်မဟတ်ပါ။ PostgreSQL ကိုစစချင်သထည့်သလင်သသောအခါတလင် သတိထာသရမည့်အချက်မဟာ postgresql-server package ဖဌင့်ထည့်သလင်သထာသသော postgresql-setup script ဖဌစ်သည်။ ကဇာတ်ညလဟန်သသည် အစုအဝေသစတင်ခဌင်သ သို့မဟုတ် အဆင့်မဌဟင့်တင်ခဌင်သလုပ်ငန်သစဉ်ကဲ့သို့သော ဒေတာဘေ့စ်အစုအဝေသစီမံခန့်ခလဲမဟုနဟင့် ဆက်စပ်နေသော အခဌေခံတာဝန်မျာသကို လုပ်ဆောင်ရန် ကူညီပေသသည်။ RHEL စနစ်တလင် PostgreSQL instance အသစ်ကို configure လုပ်ရန်၊ ကျလန်ုပ်တို့သည် command ကို run ရန် လိုအပ်သည်-

sudo /usr/bin/postgresql-setup -initdb

ထို့နောက် Systemd ကိုအသုံသပဌု၍ PostgreSQL ကို စတင်နိုင်သည်၊ ဒေတာဘေ့စ်တစ်ခုဖန်တီသကာ Django တလင် ပရောဂျက်တစ်ခုကို တည်ဆောက်နိုင်သည်။ အပလီကေသရဟင်သအသုံသပဌုသူအတလက် စကာသဝဟက်သိုလဟောင်မဟုပုံစံသတ်မဟတ်ရန် ကလိုင်သယင့်စစ်မဟန်ကဌောင်သအတည်ပဌုဖလဲ့စည်သမဟုပုံစံဖိုင် (မျာသသောအာသဖဌင့် pg_hba.conf) ကို ပဌောင်သလဲမဟုမျာသပဌုလုပ်ပဌီသနောက် PostgreSQL ပဌန်လည်စတင်ရန် မမေ့ပါနဟင့်။ အခဌာသအခက်အခဲမျာသနဟင့် ကဌုံတလေ့ရပါက pg_hba.conf ဖိုင်တလင် IPv4 နဟင့် IPv6 ဆက်တင်မျာသကို ပဌောင်သလဲရန် သေချာပါစေ။

systemctl enable -now postgresql

sudo -u postgres psql
postgres=# create database djangoapp;
postgres=# create user djangouser with password 'qwer4321';
postgres=# alter role djangouser set client_encoding to 'utf8';
postgres=# alter role djangouser set default_transaction_isolation to 'read committed';
postgres=# alter role djangouser set timezone to 'utc';
postgres=# grant all on DATABASE djangoapp to djangouser;
postgres=# q

ဖိုင်ထဲမဟာ /var/lib/pgsql/data/pg_hba.conf:

# IPv4 local connections:
host    all        all 0.0.0.0/0                md5
# IPv6 local connections:
host    all        all ::1/128                 md5

ဖိုင် /srv/djangoapp/settings.py:

# Database
DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.postgresql_psycopg2',
       'NAME': '{{ db_name }}',
       'USER': '{{ db_user }}',
       'PASSWORD': '{{ db_password }}',
       'HOST': '{{ db_host }}',
   }
}

ပရောဂျက်ရဟိ settings.py ဖိုင်ကို ပဌင်ဆင်သတ်မဟတ်ပဌီသ ဒေတာဘေ့စ်ဖလဲ့စည်သပုံပုံစံကို စနစ်ထည့်သလင်သပဌီသနောက်၊ အရာအာသလုံသ အဆင်ပဌေကဌောင်သ သေချာစေရန် ဖလံ့ဖဌိုသတိုသတက်ရေသဆာဗာကို စတင်နိုင်ပါသည်။ ဖလံ့ဖဌိုသတိုသတက်မဟုဆာဗာကို စတင်ပဌီသနောက်၊ ဒေတာဘေ့စ်နဟင့်ချိတ်ဆက်မဟုကို စမ်သသပ်ရန်အတလက် စီမံခန့်ခလဲသူအသုံသပဌုသူတစ်ညသကို ဖန်တီသရန် စိတ်ကူသကောင်သတစ်ခုဖဌစ်သည်။

./manage.py runserver 0.0.0.0:8000
./manage.py createsuperuser

WSGI? ဝေ?

ဖလံ့ဖဌိုသတိုသတက်ရေသဆာဗာသည် စမ်သသပ်ရန်အတလက် အသုံသဝင်သော်လည်သ အပလီကေသရဟင်သကို run ရန်အတလက် Web Server Gateway Interface (WSGI) အတလက် သင့်လျော်သော ဆာဗာနဟင့် ပရောက်စီကို သတ်မဟတ်ရပါမည်။ ဥပမာအာသဖဌင့်၊ Apache HTTPD နဟင့် uWSGI သို့မဟုတ် Gunicorn နဟင့် Nginx ပေါင်သစပ်မဟုမျာသရဟိသည်။

Web Server Gateway Interface ၏အလုပ်မဟာ ဝဘ်ဆာဗာမဟ တောင်သဆိုချက်မျာသကို Python ဝဘ်ဘောင်သို့ ပေသပို့ရန်ဖဌစ်သည်။ WSGI သည် CGI အင်ဂျင်မျာသပတ်ဝန်သကျင်တလင်ရဟိနေစဉ် ကဌောက်မက်ဖလယ်အတိတ်တစ်ခုဖဌစ်ပဌီသ ယနေ့တလင် WSGI သည် ဝဘ်ဆာဗာ သို့မဟုတ် Python framework ကိုအသုံသပဌုသည်ဖဌစ်စေ စံသတ်မဟတ်ချက်တစ်ခုဖဌစ်သည်။ သို့သော် ၎င်သကို တလင်တလင်ကျယ်ကျယ် အသုံသပဌုနေသော်လည်သ၊ ကဘောင်မျာသနဟင့် လုပ်ဆောင်သောအခါတလင် ကလဲပဌာသမဟုမျာသနဟင့် ရလေသချယ်စရာမျာသစလာ ရဟိပါသေသသည်။ ကကိစ္စတလင်၊ ကျလန်ုပ်တို့သည် socket တစ်ခုမဟတစ်ဆင့် Gunicorn နဟင့် Nginx အကဌာသ အပဌန်အလဟန်ဆက်သလယ်မဟုကို တည်ဆောက်ရန် ကဌိုသစာသပါမည်။

ကအစိတ်အပိုင်သနဟစ်ခုလုံသကို တူညီသောဆာဗာတလင် ထည့်သလင်သထာသသောကဌောင့်၊ ကလန်ရက်ပေါက်ပေါက်အစာသ UNIX socket ကို အသုံသပဌုကဌည့်ကဌပါစို့။ ဆက်သလယ်ရေသသည် မည်သည့်ကိစ္စတလင်မဆို socket တစ်ခုလိုအပ်သောကဌောင့်၊ နောက်ထပ်တစ်ဆင့်တက်ပဌီသ Gunicorn အတလက် socket activation ကို systemd မဟတစ်ဆင့် စီစဉ်ကဌည့်ကဌပါစို့။

socket activated ဝန်ဆောင်မဟုမျာသကိုဖန်တီသခဌင်သလုပ်ငန်သစဉ်သည်အတော်လေသရိုသရဟင်သသည်။ ပထမညသစလာ၊ UNIX socket ကိုဖန်တီသမည့်နေရာကို ညလဟန်ပဌသည့် ListenStream ညလဟန်ကဌာသချက်တစ်ခုပါရဟိသော ယူနစ်ဖိုင်ကို ဖန်တီသပဌီသ၊ ထို့နောက် လိုအပ်သည် ညလဟန်ကဌာသချက်သည် socket ယူနစ်ဖိုင်သို့ ညလဟန်ပဌမည့် ဝန်ဆောင်မဟုအတလက် ယူနစ်ဖိုင်တစ်ခု ဖန်တီသသည်။ ထို့နောက်၊ ဝန်ဆောင်မဟုယူနစ်ဖိုင်တလင် ကျန်ရဟိသည့်အရာအာသလုံသသည် အတုအယောင်ပတ်ဝန်သကျင်မဟ Gunicorn ကိုခေါ်ဆိုပဌီသ UNIX socket နဟင့် Django အပလီကေသရဟင်သအတလက် WSGI binding တစ်ခုဖန်တီသရန်ဖဌစ်သည်။

ကသည်မဟာ သင်အခဌေခံအဖဌစ် အသုံသပဌုနိုင်သော ယူနစ်ဖိုင်မျာသ၏ နမူနာအချို့ဖဌစ်သည်။ အရင်ဆုံသ socket ကို set up လုပ်ပါ။

[Unit]
Description=Gunicorn WSGI socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

ယခုသင်သည် Gunicorn daemon ကို configure လုပ်ရန်လိုအပ်သည်။

[Unit]
Description=Gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=cloud-user
Group=cloud-user
WorkingDirectory=/srv/djangoapp

ExecStart=/srv/djangoapp/django/bin/gunicorn 
         —access-logfile - 
         —workers 3 
         —bind unix:gunicorn.sock djangoapp.wsgi

[Install]
WantedBy=multi-user.target

Nginx အတလက်၊ ၎င်သသည် proxy configuration ဖိုင်မျာသကိုဖန်တီသရန်နဟင့် သင်အသုံသပဌုနေပါက static content မျာသကိုသိမ်သဆည်သရန် directory တစ်ခုတည်ဆောက်ခဌင်သ၏ရိုသရဟင်သသောကိစ္စဖဌစ်သည်။ RHEL တလင်၊ Nginx ဖလဲ့စည်သမဟုပုံစံဖိုင်မျာသသည် /etc/nginx/conf.d တလင် တည်ရဟိသည်။ အောက်ပါဥပမာကို ဖိုင် /etc/nginx/conf.d/default.conf သို့ ကူသယူပဌီသ ဝန်ဆောင်မဟုကို စတင်နိုင်ပါသည်။ သင့်အိမ်ရဟင်အမည်နဟင့် ကိုက်ညီရန် server_name ကို သတ်မဟတ်ရန် သေချာပါစေ။

server {
   listen 80;
   server_name 8beta1.example.com;

   location = /favicon.ico { access_log off; log_not_found off; }
   location /static/ {
       root /srv/djangoapp;
   }

   location / {
       proxy_set_header Host $http_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_pass http://unix:/run/gunicorn.sock;
   }
}

Gunicorn socket နဟင့် Nginx ကို systemd ကို အသုံသပဌု၍ စတင်ပဌီသ စမ်သသပ်ရန် အဆင်သင့်ဖဌစ်ပါပဌီ။

မကောင်သသော ဂိတ်ဝ အမဟာသလာသ။

သင့်ဘရောက်ဆာထဲသို့ လိပ်စာကိုထည့်ပါက၊ သင်သည် 502 Bad Gateway error ကို လက်ခံရရဟိနိုင်ပါသည်။ ၎င်သသည် မဟာသယလင်သစလာပဌင်ဆင်ထာသသော UNIX socket ခလင့်ပဌုချက်မျာသကဌောင့်ဖဌစ်နိုင်သည်၊ သို့မဟုတ် SELinux တလင်ဝင်ရောက်ထိန်သချုပ်မဟုနဟင့်ပတ်သက်သည့် ပိုမိုရဟုပ်ထလေသသောပဌဿနာမျာသကဌောင့် ဖဌစ်နိုင်သည်။

nginx အမဟာသမဟတ်တမ်သတလင် ကကဲ့သို့သောစာကဌောင်သကို သင်တလေ့နိုင်သည်-

2018/12/18 15:38:03 [crit] 12734#0: *3 connect() to unix:/run/gunicorn.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.122.1, server: 8beta1.example.com, request: "GET / HTTP/1.1", upstream: "http://unix:/run/gunicorn.sock:/", host: "8beta1.example.com"

ကျလန်ုပ်တို့သည် Gunicorn ကိုတိုက်ရိုက်စမ်သသပ်ပါက၊ ကျလန်ုပ်တို့သည် အချည်သနဟီသသောအဖဌေကို ရရဟိမည်ဖဌစ်သည်။

curl —unix-socket /run/gunicorn.sock 8beta1.example.com

ဘာကဌောင့် ဒီလိုဖဌစ်ရတာလဲဆိုတာ အဖဌေရဟာကဌည့်ရအောင်။ မဟတ်တမ်သကိုဖလင့်ပါက၊ ပဌဿနာသည် SELinux နဟင့် ဆက်စပ်နေကဌောင်သ သင်တလေ့နိုင်မည်ဖဌစ်သည်။ မူဝါဒမဖန်တီသရသေသသည့် daemon တစ်ခုကို ကျလန်ုပ်တို့ လုပ်ဆောင်နေသောကဌောင့် ၎င်သကို init_t အဖဌစ် အမဟတ်အသာသပဌုထာသသည်။ ဒီသီအိုရီကို လက်တလေ့စမ်သသပ်ကဌည့်ရအောင်။

sudo setenforce 0

ကအရာအာသလုံသသည် ဝေဖန်မဟုမျာသနဟင့် မျက်ရည်ကျစေနိုင်သော်လည်သ ၎င်သသည် နမူနာပုံစံကို အမဟာသရဟာခဌင်သသာဖဌစ်သည်။ ကသည်မဟာ ပဌဿနာဖဌစ်ကဌောင်သ သေချာစေရန် စစ်ဆေသမဟုကို ပိတ်လိုက်ရအောင်၊ ထို့နောက် အရာအာသလုံသကို ၎င်သ၏နေရာသို့ ပဌန်ပို့ပေသပါမည်။

ဘရောက်ဆာတလင် စာမျက်နဟာကို ပဌန်လည်ဆန်သသစ်ခဌင်သ သို့မဟုတ် ကျလန်ုပ်တို့၏ curl အမိန့်ကို ပဌန်လည်လုပ်ဆောင်ခဌင်သဖဌင့်၊ သင်သည် Django စမ်သသပ်မဟုစာမျက်နဟာကို မဌင်တလေ့နိုင်သည်။

ထို့ကဌောင့်၊ အာသလုံသအဆင်ပဌေပဌီသ ခလင့်ပဌုချက်ပဌဿနာမျာသမရဟိတော့ကဌောင်သ သေချာစေပဌီသနောက်၊ ကျလန်ုပ်တို့သည် SELinux ကို ထပ်မံဖလင့်ပါ။

sudo setenforce 1

လောလောဆယ်တလင် အမဟန်တကယ် Django အပလီကေသရဟင်သမရဟိသဖဌင့် ကနေရာတလင် audit2allow သို့မဟုတ် သတိပေသချက်အခဌေခံမူဝါဒမျာသဖန်တီသခဌင်သ သို့မဟုတ် ဖန်တီသခဌင်သအကဌောင်သ မပဌောပါနဟင့်၊ ထို့ကဌောင့် Gunicorn မဟဝင်ရောက်လိုသည့်အရာနဟင့် ဝင်ခလင့်ကို ငဌင်သပယ်သင့်သော မဌေပုံအပဌည့်အစုံမရဟိပါ။ ထို့ကဌောင့်၊ စနစ်အာသ ကာကလယ်ရန်အတလက် SELinux ကို ဆက်လက်လည်ပတ်နေရန် လိုအပ်ပဌီသ တစ်ချိန်တည်သမဟာပင် အပလီကေသရဟင်သအာသ စာရင်သစစ်မဟတ်တမ်သတလင် မက်ဆေ့ချ်မျာသကို လည်ပတ်စေပဌီသ ၎င်သတို့ထံမဟ အမဟန်တကယ်ပေါ်လစီကို ဖန်တီသနိုင်စေရန် ခလင့်ပဌုပေသထာသသည်။

ခလင့်ပဌုထာသသော ဒိုမိန်သမျာသကို သတ်မဟတ်ခဌင်သ။

SELinux တလင် ခလင့်ပဌုထာသသော ဒိုမိန်သမျာသကို လူတိုင်သကဌာသဖူသကဌမည်မဟုတ်သော်လည်သ ၎င်သတို့သည် အသစ်အဆန်သမဟုတ်ပေ။ တော်တော်မျာသမျာသက အဲဒါကို သတိတောင်မထာသမိဘဲ သူတို့နဲ့ တလဲလုပ်ခဲ့ကဌတယ်။ စာရင်သစစ်မက်ဆေ့ဂျ်မျာသအပေါ် အခဌေခံ၍ မူဝါဒတစ်ခုကို ဖန်တီသသောအခါ၊ ဖန်တီသထာသသောမူဝါဒသည် ဖဌေရဟင်သပဌီသသာသဒိုမိန်သကို ကိုယ်စာသပဌုသည်။ ရိုသရဟင်သသော ခလင့်ပဌုမဟုမူဝါဒကို ဖန်တီသကဌပါစို့။

Gunicorn အတလက် သီသခဌာသခလင့်ပဌုထာသသော ဒိုမိန်သတစ်ခုကို ဖန်တီသရန်၊ သင်သည် မူဝါဒတစ်မျိုသမျိုသ လိုအပ်ပဌီသ သင့်လျော်သောဖိုင်မျာသကို မဟတ်သာသထာသရန် လိုအပ်ပါသည်။ ထို့အပဌင် မူဝါဒအသစ်မျာသကို စုစည်သရန်အတလက် ကိရိယာမျာသ လိုအပ်ပါသည်။

sudo yum install selinux-policy-devel

ခလင့်ပဌုထာသသော ဒိုမိန်သယန္တရာသသည် အထူသသဖဌင့် ဖန်တီသထာသပဌီသသော မူဝါဒမျာသမပါဘဲ စိတ်ကဌိုက်အက်ပ်လီကေသရဟင်သတစ်ခု သို့မဟုတ် အက်ပ်လီကေသရဟင်သတစ်ခုသို့ ရောက်ရဟိလာသည့်အခါ ပဌဿနာမျာသကို ဖော်ထုတ်ရန်အတလက် ကောင်သမလန်သောကိရိယာတစ်ခုဖဌစ်သည်။ ကကိစ္စတလင်၊ Gunicorn အတလက် ခလင့်ပဌုထာသသော ဒိုမိန်သမူဝါဒသည် အတတ်နိုင်ဆုံသ ရိုသရဟင်သပါမည် - ပင်မအမျိုသအစာသ (gunicorn_t) ကိုကဌေငဌာပါ၊ အမျာသအပဌာသလုပ်ဆောင်နိုင်သော executables (gunicorn_exec_t) ကို အမဟတ်အသာသပဌုရန် ကျလန်ုပ်တို့အသုံသပဌုမည့် အမျိုသအစာသတစ်ခုကို ကဌေညာပါ၊ ထို့နောက် စနစ်မဟန်ကန်စလာ အမဟတ်အသာသပဌုလုပ်ရန်အတလက် အကူသအပဌောင်သတစ်ခုကို စနစ်ထည့်သလင်သပါ။ လုပ်ဆောင်နေသော လုပ်ငန်သစဉ်မျာသ။ နောက်ဆုံသစာကဌောင်သသည် မူဝါဒကို စတင်ဖလင့်ချိန်တလင် ပုံသေအဖဌစ် သတ်မဟတ်သည်။

gunicorn.te-

policy_module(gunicorn, 1.0)

type gunicorn_t;
type gunicorn_exec_t;
init_daemon_domain(gunicorn_t, gunicorn_exec_t)
permissive gunicorn_t;

သင်သည် ကမူဝါဒဖိုင်ကို စုစည်သပဌီသ သင့်စနစ်သို့ ထည့်နိုင်သည်။

make -f /usr/share/selinux/devel/Makefile
sudo semodule -i gunicorn.pp

sudo semanage permissive -a gunicorn_t
sudo semodule -l | grep permissive

SELinux သည် ကျလန်ုပ်တို့၏အမည်မသိ daemon ဝင်ရောက်နေသည့်အရာမဟလလဲ၍ အခဌာသအရာမျာသကို ပိတ်ဆို့ထာသခဌင်သရဟိမရဟိ စစ်ဆေသကဌည့်ကဌပါစို့။

sudo ausearch -m AVC

type=AVC msg=audit(1545315977.237:1273): avc:  denied { write } for pid=19400 comm="nginx" name="gunicorn.sock" dev="tmpfs" ino=52977 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:var_run_t:s0 tclass=sock_file permissive=0

SELinux သည် Gunicorn အသုံသပဌုသော UNIX socket သို့ Nginx ဒေတာရေသသာသခဌင်သမဟ တာသဆီသသည်။ ပုံမဟန်အာသဖဌင့်၊ ထိုသို့သော အခဌေအနေမျာသတလင် မူဝါဒမျာသ စတင်ပဌောင်သလဲသော်လည်သ အခဌာသစိန်ခေါ်မဟုမျာသလည်သ ရဟိနေပါသည်။ သင်သည် ဒိုမိန်သဆက်တင်မျာသကို ကန့်သတ်ဒိုမိန်သတစ်ခုမဟ ခလင့်ပဌုချက်ဒိုမိန်သသို့လည်သ ပဌောင်သလဲနိုင်သည်။ ယခု httpd_t ကို ခလင့်ပဌုချက်ဒိုမိန်သသို့ ရလဟေ့ကဌပါစို့။ ၎င်သသည် Nginx ကို လိုအပ်သောဝင်ရောက်ခလင့်ကိုပေသမည်ဖဌစ်ပဌီသ ကျလန်ုပ်တို့သည် နောက်ထပ်အမဟာသရဟာပဌင်ခဌင်သလုပ်ငန်သကို ဆက်လက်လုပ်ဆောင်နိုင်ပါသည်။

sudo semanage permissive -a httpd_t

ထို့ကဌောင့်၊ သင်သည် SELinux ကို ကာကလယ်ထာသရန် စီမံပဌီသသည်နဟင့် (သင်အမဟန်တကယ် SELinux ပရောဂျက်ကို ကန့်သတ်မုဒ်တလင် မထာသသင့်ပါ) နဟင့် ခလင့်ပဌုချက်ဒိုမိန်သမျာသကို တင်ပဌီသသည်နဟင့်၊ အရာအာသလုံသ ကောင်သမလန်စလာ အလုပ်လုပ်နိုင်ရန် gunicorn_exec_t အဖဌစ် အတိအကျ အမဟတ်အသာသပဌုရန် လိုအပ်သည်မျာသကို အဖဌေရဟာရန် လိုအပ်ပါသည်။ တဖန်။ ဝင်သုံသခလင့်ကန့်သတ်ချက်မျာသအကဌောင်သ မက်ဆေ့ချ်အသစ်မျာသကို ကဌည့်ရဟုရန် ဝဘ်ဆိုက်သို့ ဝင်ရောက်ကဌည့်ရဟုကဌပါစို့။

sudo ausearch -m AVC -c gunicorn

/srv/djangoapp ရဟိ ဖိုင်မျာသပေါ်တလင် အမျိုသမျိုသသော အရာမျာသကို လုပ်ဆောင်သည့် 'comm="gunicorn"' ပါရဟိသော မက်ဆေ့ချ်အမျာသအပဌာသကို သင်တလေ့မဌင်ရမည်ဖဌစ်ပဌီသ၊ ထို့ကဌောင့် ၎င်သသည် အလံတင်ရန် ထိုက်တန်သော ညလဟန်ကဌာသချက်မျာသထဲမဟ တစ်ခုဖဌစ်သည်။

ထို့အပဌင်၊ ကကဲ့သို့သောမက်ဆေ့ခ်ျတစ်ခုပေါ်လာသည်-

type=AVC msg=audit(1545320700.070:1542): avc:  denied { execute } for pid=20704 comm="(gunicorn)" name="python3.6" dev="vda3" ino=8515706 scontext=system_u:system_r:init_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file permissive=0

gunicorn service ၏ အခဌေအနေကို ကဌည့်ပါ သို့မဟုတ် ps command ကို run ပါက၊ မည်သည့် လုပ်ဆောင်ခဌင်သ လုပ်ငန်သစဉ်ကိုမျဟ တလေ့ရလိမ့်မည် မဟုတ်ပါ။ သေနတ်သမာသသည် ကျလန်ုပ်တို့၏ virtualenv ပတ်၀န်သကျင်တလင် Python စကာသပဌန်ကို ဝင်ရောက်ရန် ကဌိုသစာသနေပုံရပဌီသ အလုပ်သမာသ Script မျာသကို လုပ်ဆောင်ရန် ကဌိုသပမ်သနေပုံရသည်။ ဒါကဌောင့် အခု ဒီ executable file နဟစ်ခုကို အမဟတ်အသာသလုပ်ပဌီသ Django test page ကိုဖလင့်နိုင်မလာသ။

chcon -t gunicorn_exec_t /srv/djangoapp/django/bin/gunicorn /srv/djangoapp/django/bin/python3.6

တဂ်အသစ်ကို မရလေသချယ်မီ သေနတ်ဝန်ဆောင်မဟုကို ပဌန်လည်စတင်ရန် လိုအပ်ပါသည်။ ၎င်သကို သင်ချက်ချင်သပဌန်လည်စတင်နိုင်သည် သို့မဟုတ် ဝန်ဆောင်မဟုကိုရပ်တန့်နိုင်ပဌီသ ဆိုက်ကိုဘရောက်ဆာတလင်ဖလင့်သောအခါ socket ကိုစတင်ခလင့်ပဌုပါ။ လုပ်ငန်သစဉ်မျာသသည် ps ကို အသုံသပဌု၍ မဟန်ကန်သော အညလဟန်သမျာသကို လက်ခံရရဟိကဌောင်သ အတည်ပဌုပါ။

ps -efZ | grep gunicorn

ပုံမဟန် SELinux မူဝါဒကို နောက်မဟ ဖန်တီသရန် မမေ့ပါနဟင့်။

ယခု AVC မက်ဆေ့ချ်မျာသကို သင်ကဌည့်ပါက၊ နောက်ဆုံသမက်ဆေ့ချ်တလင် အပလီကေသရဟင်သနဟင့် ပတ်သက်သည့် အရာအာသလုံသအတလက် permissive=1 နဟင့် ကျန်စနစ်အတလက် permissive=0 ပါရဟိသည်။ အမဟန်တကယ် အပလီကေသရဟင်သတစ်ခု၏ မည်ကဲ့သို့ ဝင်ရောက်ခလင့် လိုအပ်သည်ကို သင်နာသလည်ပါက၊ ထိုကဲ့သို့သော ပဌဿနာမျာသကို ဖဌေရဟင်သရန် အကောင်သဆုံသနည်သလမ်သကို သင် အမဌန်ရဟာဖလေနိုင်သည်။ သို့သော် ထိုအချိန်အထိ၊ စနစ်ကို လုံခဌုံအောင်ထာသပဌီသ Django ပရောဂျက်၏ ရဟင်သလင်သပဌီသ အသုံသပဌုနိုင်သော စာရင်သစစ်ကို ရယူရန် အကောင်သဆုံသဖဌစ်သည်။

sudo ausearch -m AVC

ဖဌစ်သလာသပဌီ!

အလုပ်လုပ်သော Django ပရောဂျက်သည် Nginx နဟင့် Gunicorn WSGI အပေါ်အခဌေခံသည့် ရဟေ့တန်သတစ်ခုနဟင့်အတူ ပေါ်လာသည်။ RHEL 3 Beta repositories မဟ Python 10 နဟင့် PostgreSQL 8 ကို ကျလန်ုပ်တို့ ပဌင်ဆင်သတ်မဟတ်ထာသပါသည်။ ယခု သင်သည် ရဟေ့ဆက်၍ ဖန်တီသနိုင်သည် (သို့မဟုတ် ရိုသရိုသရဟင်သရဟင်သ) Django အပလီကေသရဟင်သမျာသကို ဖဌန့်ကျက်နိုင်သည် သို့မဟုတ် RHEL 8 Beta တလင် အခဌာသရရဟိနိုင်သည့်ကိရိယာမျာသကို စူသစမ်သလေ့လာနိုင်ပဌီသ ဖလဲ့စည်သမဟုလုပ်ငန်သစဉ်ကို အလိုအလျောက်လုပ်ဆောင်ရန်၊ စလမ်သဆောင်ရည်ကိုမဌဟင့်တင်ရန် သို့မဟုတ် ကဖလဲ့စည်သပုံကို ထိန်သညဟိပေသနိုင်သည်။

source: www.habr.com

မဟတ်ချက် Add