Ceardlann RHEL 8 Beta: Feidhmchláir ghréasáin oibre a thógáil

Cuireann RHEL 8 Beta go leor gnéithe nua ar fáil d'fhorbróirí, agus d'fhéadfadh an liosta díobh leathanaigh a ghlacadh, áfach, tá sé níos fearr i gcónaí rudaí nua a fhoghlaim, mar sin thíos cuirimid ceardlann ar fáil maidir le bonneagar iarratais a chruthú bunaithe ar Red Hat Enterprise Linux 8 Beta.

Ceardlann RHEL 8 Beta: Feidhmchláir ghréasáin oibre a thógáil

Tógaimis Python, teanga ríomhchlárúcháin a bhfuil an-tóir uirthi i measc forbróirí, mar bhunús, meascán de Django agus PostgreSQL, teaglaim measartha coitianta chun feidhmchláir a chruthú, agus RHEL 8 Beta a chumrú chun oibriú leo. Ansin cuirfimid cúpla comhábhair eile (neamhrangaithe).

Athróidh an timpeallacht tástála, toisc go bhfuil sé suimiúil féidearthachtaí uathoibrithe a iniúchadh, oibriú le coimeádáin agus timpeallachtaí a thriail le freastalaithe iolracha. Chun tús a chur le tionscadal nua, is féidir leat tosú le fréamhshamhail bheag shimplí a chruthú de láimh ionas gur féidir leat a fheiceáil go díreach cad is gá a tharlóidh agus conas a idirghníomhaíonn sé, agus ansin bogadh ar aghaidh chun cumraíochtaí níos casta a uathoibriú agus a chruthú. Sa lá atá inniu táimid ag caint faoi chruthú fréamhshamhail den sórt sin.

Tosaímid trí íomhá RHEL 8 Beta VM a imscaradh. Is féidir leat meaisín fíorúil a shuiteáil ón tús, nó úsáid a bhaint as an íomhá aoi KVM atá ar fáil le do shíntiús Beta. Agus íomhá aoi á úsáid agat, beidh ort CD fíorúil a chumrú ina mbeidh meiteashonraí agus sonraí úsáideora le haghaidh tosaigh scamall (scamall isteach). Ní gá duit aon rud speisialta a dhéanamh leis an struchtúr diosca nó leis na pacáistí atá ar fáil; déanfaidh aon chumraíocht.

A ligean ar ghlacadh le breathnú níos dlúithe ar an bpróiseas ar fad.

Django a shuiteáil

Leis an leagan is nuaí de Django, beidh timpeallacht fhíorúil (virtualenv) uait le Python 3.5 nó níos déanaí. Sna nótaí Beta is féidir leat a fheiceáil go bhfuil Python 3.6 ar fáil, déanaimis seiceáil an bhfuil sé seo fíor:

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

Úsáideann Red Hat Python go gníomhach mar fhoireann uirlisí córais i RHEL, mar sin cén fáth a bhfuil sé seo mar thoradh air?

Is é an fírinne ná go bhfuil go leor forbróirí Python fós ag smaoineamh ar an aistriú ó Python 2 go Python 2, cé go bhfuil Python 3 féin á fhorbairt go gníomhach, agus tá níos mó agus níos mó leaganacha nua le feiceáil i gcónaí. Mar sin, chun freastal ar an ngá atá le huirlisí córais cobhsaí agus rochtain á thairiscint d'úsáideoirí ar leaganacha nua éagsúla de Python, aistríodh córas Python isteach i bpacáiste nua agus chuir sé an cumas Python 2.7 agus 3.6 araon a shuiteáil. Tá tuilleadh eolais faoi na hathruithe agus cén fáth a ndearnadh iad le fáil san fhoilseachán i Blag Langdon White (Langdon Bán).

Mar sin, chun Python a oibriú, ní gá duit ach dhá phacáiste a shuiteáil, le python3-pip san áireamh mar spleáchas.

sudo yum install python36 python3-virtualenv

Cén fáth nach n-úsáidfeá glaonna modúl díreacha mar a mhol Langdon agus pip3 a shuiteáil? Ag cuimhneamh ar an uathoibriú atá le teacht, tá a fhios go n-éileoidh Ansible pip suiteáilte le rith, ós rud é nach dtacaíonn an modúl pip le virtualenvs le pip saincheaptha inrite.

Le ateangaire python3 oibre ar fáil duit, is féidir leat leanúint ar aghaidh le próiseas suiteála Django agus córas oibre a bheith agat in éineacht lenár gcomhpháirteanna eile. Tá go leor roghanna cur chun feidhme ar fáil ar an Idirlíon. Tá leagan amháin curtha i láthair anseo, ach is féidir le húsáideoirí a bpróisis féin a úsáid.

Déanfaimid na leaganacha PostgreSQL agus Nginx atá ar fáil i RHEL 8 a shuiteáil de réir réamhshocraithe ag baint úsáide as Yum.

sudo yum install nginx postgresql-server

Beidh psycopg2 ag teastáil ó PostgreSQL, ach ní mór é a bheith ar fáil ach i dtimpeallacht virtualenv, mar sin déanfaimid é a shuiteáil ag baint úsáide as pip3 in éineacht le Django agus Gunicorn. Ach ar dtús ní mór dúinn virtualenv a bhunú.

Bíonn go leor díospóireachta i gcónaí ar an ábhar a bhaineann leis an áit cheart a roghnú chun tionscadail Django a shuiteáil, ach nuair a bhíonn amhras ort, is féidir leat dul i gcónaí chuig Caighdeán Ordlathais Córas Comhad Linux. Go sonrach, deir an FHS go n-úsáidtear /srv chun: “sonraí ósta-shonracha a stóráil a tháirgeann an córas, mar shampla sonraí freastalaí gréasáin agus scripteanna, sonraí a stóráiltear ar fhreastalaithe FTP, agus stórtha córais rialaithe.” leaganacha (le feiceáil i FHS -2.3 in 2004)."

Is é seo go díreach ár gcás, agus mar sin cuirimid gach rud atá uainn i / srv, atá faoi úinéireacht ár n-úsáideoir feidhmchlár (úsáideoir scamall).

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

Tá sé éasca PostgreSQL agus Django a bhunú: bunachar sonraí a chruthú, úsáideoir a chruthú, ceadanna a chumrú. Rud amháin a choinneáil i gcuimhne agus PostgreSQL á shuiteáil ar dtús ná an script postgresql-setup atá suiteáilte leis an bpacáiste postgresql-server. Cabhraíonn an script seo leat buntascanna a bhaineann le riaradh braisle bunachar sonraí a dhéanamh, mar thúsú braisle nó an próiseas uasghrádaithe. Chun sampla PostgreSQL nua a chumrú ar chóras RHEL, ní mór dúinn an t-ordú a rith:

sudo /usr/bin/postgresql-setup -initdb

Is féidir leat PostgreSQL a thosú ansin ag baint úsáide as systemd, bunachar sonraí a chruthú, agus tionscadal a bhunú i Django. Cuimhnigh PostgreSQL a atosú tar éis athruithe a dhéanamh ar chomhad cumraíochta fíordheimhnithe an chliaint (pg_hba.conf de ghnáth) chun stóráil phasfhocal a chumrú don úsáideoir feidhmchláir. Má bhíonn deacrachtaí eile agat, déan cinnte na socruithe IPv4 agus IPv6 a athrú sa chomhad pg_hba.conf.

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

Sa chomhad /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

Sa chomhad /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 }}',
   }
}

Tar éis duit an comhad settings.py a chumrú sa tionscadal agus cumraíocht an bhunachair shonraí a shocrú, is féidir leat an freastalaí forbartha a thosú chun a chinntiú go n-oibríonn gach rud. Tar éis duit an freastalaí forbartha a thosú, is smaoineamh maith é úsáideoir riaracháin a chruthú chun an nasc leis an mbunachar sonraí a thástáil.

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

WSGI? Wai?

Tá an freastalaí forbartha úsáideach le haghaidh tástála, ach chun an feidhmchlár a rith ní mór duit an freastalaí agus an seachfhreastalaí cuí a chumrú don Chomhéadan Geata Freastalaí Gréasáin (WSGI). Tá roinnt teaglaim coitianta ann, mar shampla, Apache HTTPD le uWSGI nó Nginx le Gunicorn.

Is é post Chomhéadain Tairseach an Fhreastalaí Gréasáin ná iarratais a chur ar aghaidh ón bhfreastalaí gréasáin chuig an gcreat gréasáin Python. Is iarsma den am atá caite uafásach é WSGI nuair a bhí innill CGI thart, agus inniu is é WSGI an caighdeán de facto, beag beann ar an bhfreastalaí gréasáin nó ar an gcreat Python a úsáidtear. Ach in ainneoin a úsáid fhorleathan, tá go leor nuances fós agus tú ag obair leis na creataí seo, agus go leor roghanna. Sa chás seo, déanfaimid iarracht idirghníomhaíocht a bhunú idir Gunicorn agus Nginx trí soicéad.

Ós rud é go bhfuil an dá chomhpháirt seo suiteáilte ar an bhfreastalaí céanna, déanaimis iarracht soicéad UNIX a úsáid in ionad soicéad líonra. Ós rud é go n-éilíonn an chumarsáid soicéad ar aon nós, déanaimis iarracht céim amháin eile a ghlacadh agus gníomhachtú soicéad a chumrú do Gunicorn trí systemd.

Tá an próiseas chun seirbhísí soicéad gníomhachtaithe a chruthú simplí go leor. Ar dtús, cruthaítear comhad aonaid ina bhfuil treoir ListenStream a dhíríonn go dtí an pointe ag a gcruthófar an soicéad UNIX, ansin díreoidh comhad aonaid don tseirbhís ina ndíreoidh an Treoir Éilíonn an comhad aonaid soicéad. Ansin, sa chomhad aonad seirbhíse, níl fágtha ach glaoch a chur ar Gunicorn ón timpeallacht fhíorúil agus ceangal WSGI a chruthú don soicéad UNIX agus don fheidhmchlár Django.

Seo roinnt samplaí de chomhaid aonaid is féidir leat a úsáid mar bhunús. Ar dtús leagamar an soicéad.

[Unit]
Description=Gunicorn WSGI socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Anois ní mór duit an deamhan Gunicorn a chumrú.

[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

Maidir le Nginx, is ábhar simplí é comhaid cumraíochta seachfhreastalaí a chruthú agus eolaire a bhunú chun ábhar statach a stóráil má tá ceann á úsáid agat. I RHEL, tá comhaid cumraíochta Nginx lonnaithe i /etc/nginx/conf.d. Is féidir leat an sampla seo a leanas a chóipeáil isteach sa chomhad /etc/nginx/conf.d/default.conf agus tús a chur leis an tseirbhís. Cinntigh go bhfuil an server_name socraithe chun d'ainm ósta a mheaitseáil.

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;
   }
}

Tosaigh an soicéad Gunicorn agus Nginx ag baint úsáide as systemd agus tá tú réidh chun tástáil a thosú.

Earráid Droch Gateway?

Má chuireann tú an seoladh isteach i do bhrabhsálaí, is dócha go bhfaighidh tú earráid 502 Bad Gateway. D'fhéadfadh sé a bheith mar gheall ar cheadanna soicéad UNIX atá cumraithe go mícheart, nó d'fhéadfadh sé a bheith mar gheall ar shaincheisteanna níos casta a bhaineann le rialú rochtana i SELinux.

I loga earráide nginx is féidir leat líne mar seo a fheiceáil:

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"

Má dhéanaimid tástáil ar Gunicorn go díreach, gheobhaidh muid freagra folamh.

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

A ligean ar a dhéanamh amach cén fáth a tharlaíonn sé seo. Má osclaíonn tú an logáil, is dóichí go bhfeicfidh tú go bhfuil baint ag an bhfadhb le SELinux. Ós rud é go bhfuil deamhan á reáchtáil againn nach bhfuil aon pholasaí cruthaithe ina leith, tá sé marcáilte mar init_t. Déanaimis an teoiric seo a thástáil go praiticiúil.

sudo setenforce 0

Féadfaidh sé seo go léir a bheith ina chúis le cáineadh agus deora fola, ach níl sé seo ach ag dífhabhtú an fhréamhshamhail. Déanaimis an seic a dhíchumasú ach chun a chinntiú gurb é seo an fhadhb, agus ina dhiaidh sin cuirfimid gach rud ar ais go dtí a áit.

Tríd an leathanach sa bhrabhsálaí a athnuachan nó ár n-ordú curl a athreáchtáil, is féidir leat leathanach tástála Django a fheiceáil.

Mar sin, tar éis dúinn a chinntiú go n-oibríonn gach rud agus nach bhfuil níos mó fadhbanna ceada ann, cuirimid ar chumas SELinux arís.

sudo setenforce 1

Ní bheidh mé ag caint faoi audit2allow nó polasaithe foláirimh-bhunaithe a chruthú le sepolgen anseo, ós rud é nach bhfuil aon iarratas Django iarbhír i láthair na huaire, mar sin níl aon léarscáil iomlán de cad a d'fhéadfadh Gunicorn iarraidh a rochtain agus cad ba chóir dó a dhiúltú rochtain air. Dá bhrí sin, is gá SELinux a choinneáil ar siúl chun an córas a chosaint, agus ag an am céanna ligean don iarratas teachtaireachtaí a reáchtáil agus a fhágáil sa logáil iniúchta ionas gur féidir an polasaí iarbhír a chruthú uathu.

Fearainn cheada a shonrú

Níor chuala gach duine faoi fhearainn cheadaithe i SELinux, ach ní haon rud nua iad. D'oibrigh go leor fiú leo gan fiú a bhaint amach. Nuair a chruthaítear polasaí bunaithe ar theachtaireachtaí iniúchta, is ionann an beartas cruthaithe agus an fearann ​​réitithe. Déanaimis iarracht polasaí ceadúcháin simplí a chruthú.

Chun fearann ​​ceadaithe ar leith a chruthú do Gunicorn, tá polasaí de chineál éigin ag teastáil uait, agus ní mór duit na comhaid chuí a mharcáil freisin. Ina theannta sin, tá gá le huirlisí chun beartais nua a chur le chéile.

sudo yum install selinux-policy-devel

Is uirlis iontach é meicníocht na bhfearann ​​​​cheadaithe chun fadhbanna a aithint, go háirithe nuair a bhaineann sé le feidhmchlár saincheaptha nó le feidhmchláir a sheolann gan beartais a cruthaíodh cheana féin. Sa chás seo, beidh an polasaí fearainn ceadaithe le haghaidh Gunicorn chomh simplí agus is féidir - dearbhaigh príomhchineál (gunicorn_t), dearbhaigh cineál a úsáidfimid chun il-roghanna inrite a mharcáil (gunicorn_exec_t), agus ansin socraigh trasdul don chóras chun é a mharcáil i gceart. próisis reatha . Socraíonn an líne dheireanach an polasaí mar atá cumasaithe de réir réamhshocraithe ag an am a luchtaítear é.

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;

Is féidir leat an comhad polasaí seo a thiomsú agus é a chur le do chóras.

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

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

Déanaimis seiceáil féachaint an bhfuil SELinux ag cur bac ar rud éigin eile seachas a bhfuil rochtain ag ár ndeamhan anaithnid.

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

Cuireann SELinux cosc ​​ar Nginx ó shonraí a scríobh chuig an soicéad UNIX a úsáideann Gunicorn. Go hiondúil, i gcásanna den sórt sin, tosaíonn polasaithe ag athrú, ach tá dúshláin eile romhainn. Is féidir leat freisin na socruithe fearainn a athrú ó fhearann ​​srianta go fearann ​​ceada. Anois bogadh httpd_t chuig an bhfearann ​​​​ceadanna. Tabharfaidh sé seo an rochtain riachtanach do Nginx agus is féidir linn leanúint ar aghaidh le tuilleadh oibre dífhabhtaithe.

sudo semanage permissive -a httpd_t

Mar sin, a luaithe a d'éirigh leat SELinux a chosaint (níor cheart duit tionscadal SELinux a fhágáil i mód srianta) agus na fearainn cheada lódáilte, ní mór duit a dhéanamh amach cad go díreach atá le marcáil mar gunicorn_exec_t chun gach rud a oibriú i gceart arís. Déanaimis iarracht cuairt a thabhairt ar an suíomh Gréasáin chun teachtaireachtaí nua a fheiceáil faoi shrianta rochtana.

sudo ausearch -m AVC -c gunicorn

Feicfidh tú go leor teachtaireachtaí ina bhfuil 'comm="gunicorn"' a dhéanann rudaí éagsúla ar chomhaid in / srv/djangoapp, mar sin is léir gurb é seo ceann de na horduithe ar fiú a lua.

Ach ina theannta sin, tá teachtaireacht mar seo le feiceáil:

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

Má fhéachann tú ar stádas na seirbhíse gunicorn nó má ritheann tú an t-ordú ps, ní fheicfidh tú aon phróisis reatha. Tá an chuma ar an scéal go bhfuil gunicorn ag iarraidh teacht ar an ateangaire Python inár dtimpeallacht virtualenv, b'fhéidir scripteanna oibrithe a rith. Mar sin anois déanaimis an dá chomhad inrite seo a mharcáil agus seiceáil an féidir linn ár leathanach tástála Django a oscailt.

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

Ní mór an tseirbhís gunicorn a atosú sular féidir an chlib nua a roghnú. Is féidir leat é a atosú láithreach nó an tseirbhís a stopadh agus ligean don soicéad é a thosú nuair a osclaíonn tú an suíomh sa bhrabhsálaí. Fíoraigh go bhfuil na lipéid chearta faighte ag próisis ag baint úsáide as ps.

ps -efZ | grep gunicorn

Ná déan dearmad gnáthpholasaí SELinux a chruthú níos déanaí!

Má fhéachann tú ar na teachtaireachtaí AVC anois, tá cead = 1 sa teachtaireacht dheireanach do gach rud a bhaineann leis an bhfeidhmchlár, agus ceadaitheach = 0 don chuid eile den chóras. Má thuigeann tú cén cineál rochtana a theastaíonn ó fheidhmchlár fíor, is féidir leat teacht go tapa ar an mbealach is fearr chun fadhbanna den sórt sin a réiteach. Ach go dtí sin, is fearr an córas a choinneáil slán agus iniúchadh soiléir inúsáidte a fháil ar thionscadal Django.

sudo ausearch -m AVC

Tharla!

Tá tionscadal Django ag obair le feiceáil le tosach bunaithe ar Nginx agus Gunicorn WSGI. Rinneamar Python 3 agus PostgreSQL 10 a chumrú ó stórtha RHEL 8 Beta. Anois is féidir leat dul ar aghaidh agus feidhmchláir Django a chruthú (nó go simplí a imscaradh) nó iniúchadh a dhéanamh ar uirlisí eile atá ar fáil i RHEL 8 Beta chun an próiseas cumraíochta a uathoibriú, feidhmíocht a fheabhsú, nó fiú an chumraíocht seo a choimeád.

Foinse: will.com

Add a comment