Idanileko RHEL 8 Beta: Ṣiṣe awọn ohun elo wẹẹbu ṣiṣẹ

RHEL 8 Beta nfunni awọn olupilẹṣẹ ọpọlọpọ awọn ẹya tuntun, atokọ eyiti o le gba awọn oju-iwe, sibẹsibẹ, kikọ awọn nkan tuntun nigbagbogbo dara julọ ni iṣe, nitorinaa ni isalẹ a funni ni idanileko lori ṣiṣẹda awọn amayederun ohun elo kan ti o da lori Red Hat Enterprise Linux 8 Beta.

Idanileko RHEL 8 Beta: Ṣiṣe awọn ohun elo wẹẹbu ṣiṣẹ

Jẹ ki a mu Python, ede siseto olokiki laarin awọn olupilẹṣẹ, gẹgẹbi ipilẹ, apapo Django ati PostgreSQL, apapọ apapọ ti o wọpọ fun ṣiṣẹda awọn ohun elo, ati tunto RHEL 8 Beta lati ṣiṣẹ pẹlu wọn. Lẹhinna a yoo ṣafikun tọkọtaya diẹ sii (awọn eroja ti a ko sọtọ).

Ayika idanwo yoo yipada, nitori pe o jẹ ohun ti o nifẹ lati ṣawari awọn iṣeeṣe ti adaṣe, ṣiṣẹ pẹlu awọn apoti ati awọn agbegbe igbiyanju pẹlu awọn olupin pupọ. Lati bẹrẹ pẹlu iṣẹ akanṣe tuntun, o le bẹrẹ nipasẹ ṣiṣẹda kekere kan, apẹrẹ ti o rọrun nipasẹ ọwọ ki o le rii deede ohun ti o nilo lati ṣẹlẹ ati bii o ṣe n ṣepọ, ati lẹhinna tẹsiwaju lati ṣe adaṣe ati ṣẹda awọn atunto eka diẹ sii. Loni a n sọrọ nipa ṣiṣẹda iru apẹrẹ kan.

Jẹ ki a bẹrẹ nipa gbigbe aworan RHEL 8 Beta VM ṣiṣẹ. O le fi ẹrọ foju kan sori ẹrọ lati ibere, tabi lo aworan alejo KVM ti o wa pẹlu ṣiṣe alabapin Beta rẹ. Nigbati o ba nlo aworan alejo, iwọ yoo nilo lati tunto CD foju kan ti yoo ni metadata ati data olumulo fun ipilẹṣẹ awọsanma (cloud-init). O ko nilo lati ṣe ohunkohun pataki pẹlu eto disiki tabi awọn idii ti o wa; eyikeyi iṣeto ni yoo ṣe.

Jẹ ká ya a jo wo ni gbogbo ilana.

Fifi Django sori ẹrọ

Pẹlu ẹya tuntun ti Django, iwọ yoo nilo agbegbe foju kan (virtualenv) pẹlu Python 3.5 tabi nigbamii. Ninu awọn akọsilẹ Beta o le rii pe Python 3.6 wa, jẹ ki a ṣayẹwo boya eyi jẹ ọran naa nitootọ:

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

Red Hat lo Python ni agbara bi ohun elo irinṣẹ ni RHEL, nitorinaa kilode ti abajade yii?

Otitọ ni pe ọpọlọpọ awọn olupilẹṣẹ Python tun n ronu iyipada lati Python 2 si Python 2, lakoko ti Python 3 funrararẹ wa labẹ idagbasoke ti nṣiṣe lọwọ, ati siwaju ati siwaju sii awọn ẹya tuntun ti n han nigbagbogbo. Nitorinaa, lati pade iwulo fun awọn irinṣẹ eto iduroṣinṣin lakoko fifun awọn olumulo ni iraye si ọpọlọpọ awọn ẹya tuntun ti Python, eto Python ti gbe sinu package tuntun ati pese agbara lati fi sori ẹrọ mejeeji Python 2.7 ati 3.6. Alaye diẹ sii nipa awọn iyipada ati idi ti wọn fi ṣe ni a le rii ninu atẹjade ni Langdon White ká bulọọgi (Langdon White).

Nitorinaa, lati gba Python ṣiṣẹ, o nilo lati fi awọn idii meji sori ẹrọ nikan, pẹlu python3-pip ti o wa bi igbẹkẹle.

sudo yum install python36 python3-virtualenv

Kilode ti o ko lo awọn ipe module taara bi Langdon ṣe daba ati fi pip3 sori ẹrọ? Ni lokan adaṣe adaṣe ti n bọ, o mọ pe Ansible yoo nilo pip ti a fi sori ẹrọ lati ṣiṣẹ, nitori module pip ko ṣe atilẹyin virtualenvs pẹlu adaṣe pip aṣa kan.

Pẹlu onitumọ python3 ti n ṣiṣẹ ni ọwọ rẹ, o le tẹsiwaju pẹlu ilana fifi sori Django ki o ni eto iṣẹ kan pẹlu awọn paati miiran. Ọpọlọpọ awọn aṣayan imuse wa lori Intanẹẹti. Ẹya kan wa ti a gbekalẹ nibi, ṣugbọn awọn olumulo le lo awọn ilana tiwọn.

A yoo fi sori ẹrọ ni PostgreSQL ati awọn ẹya Nginx ti o wa ni RHEL 8 nipasẹ aiyipada nipa lilo Yum.

sudo yum install nginx postgresql-server

PostgreSQL yoo nilo psycopg2, ṣugbọn o nilo lati wa nikan ni agbegbe virtualenv, nitorinaa a yoo fi sii ni lilo pip3 pẹlu Django ati Gunicorn. Ṣugbọn akọkọ a nilo lati ṣeto virtualenv.

Nigbagbogbo ariyanjiyan pupọ wa lori koko ti yiyan aaye ti o tọ lati fi sori ẹrọ awọn iṣẹ akanṣe Django, ṣugbọn nigbati o ba ni iyemeji, o le yipada nigbagbogbo si Ilana Ilana Faili Linux. Ni pato, FHS sọ pe / srv ni a lo lati: "fipamọ data-pato-data-data ti eto naa ṣejade, gẹgẹbi data olupin ayelujara ati awọn iwe afọwọkọ, data ti o fipamọ sori olupin FTP, ati awọn ibi ipamọ eto iṣakoso." awọn ẹya (ti o han ni FHS -2.3 ni ọdun 2004).

Eyi jẹ deede ọran wa, nitorinaa a fi ohun gbogbo ti a nilo sinu / srv, eyiti o jẹ ohun ini nipasẹ olumulo ohun elo wa (olumulo-awọsanma).

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

Ṣiṣeto PostgreSQL ati Django rọrun: ṣẹda data data, ṣẹda olumulo kan, tunto awọn igbanilaaye. Ohun kan lati tọju ni lokan nigbati fifi sori ẹrọ PostgreSQL lakoko ni iwe afọwọkọ postgresql-setup ti o ti fi sii pẹlu package olupin postgresql. Iwe afọwọkọ yii ṣe iranlọwọ fun ọ lati ṣe awọn iṣẹ ṣiṣe ipilẹ ti o ni nkan ṣe pẹlu iṣakoso iṣupọ data data, gẹgẹbi ipilẹṣẹ iṣupọ tabi ilana igbesoke. Lati tunto apẹẹrẹ PostgreSQL tuntun kan lori eto RHEL, a nilo lati ṣiṣẹ aṣẹ naa:

sudo /usr/bin/postgresql-setup -initdb

O le lẹhinna bẹrẹ PostgreSQL nipa lilo systemd, ṣẹda data data, ati ṣeto iṣẹ akanṣe kan ni Django. Ranti lati tun PostgreSQL bẹrẹ lẹhin ṣiṣe awọn ayipada si faili atunto ijẹrisi alabara (nigbagbogbo pg_hba.conf) lati tunto ibi ipamọ ọrọ igbaniwọle fun olumulo ohun elo. Ti o ba pade awọn iṣoro miiran, rii daju lati yi IPv4 ati awọn eto IPv6 pada ninu faili 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

Ninu faili /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

Ninu faili /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 }}',
   }
}

Lẹhin ti tunto awọn settings.py faili ninu ise agbese ati ki o ṣeto soke awọn database iṣeto ni, o le bẹrẹ awọn olupin idagbasoke lati rii daju pe ohun gbogbo ṣiṣẹ. Lẹhin ti o bẹrẹ olupin idagbasoke, o jẹ imọran ti o dara lati ṣẹda olumulo abojuto lati le ṣe idanwo asopọ si ibi ipamọ data.

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

WSGI? Wai?

Olupin idagbasoke jẹ iwulo fun idanwo, ṣugbọn lati ṣiṣẹ ohun elo o gbọdọ tunto olupin ti o yẹ ati aṣoju fun Interface Server Gateway Interface (WSGI). Ọpọlọpọ awọn akojọpọ ti o wọpọ wa, fun apẹẹrẹ, Apache HTTPD pẹlu uWSGI tabi Nginx pẹlu Gunicorn.

Iṣẹ ti Oju-ọna Oju-ọna Olupin Oju opo wẹẹbu ni lati firanṣẹ awọn ibeere lati ọdọ olupin wẹẹbu si ilana wẹẹbu Python. WSGI ni a relic ti awọn ẹru ti o ti kọja nigba ti CGI enjini wà ni ayika, ati loni WSGI ni de facto bošewa, lai ti awọn ayelujara server tabi Python ilana lo. Ṣugbọn pelu lilo rẹ ni ibigbogbo, ọpọlọpọ awọn nuances tun wa nigbati o n ṣiṣẹ pẹlu awọn ilana wọnyi, ati ọpọlọpọ awọn yiyan. Ni idi eyi, a yoo gbiyanju lati fi idi ibaraenisepo laarin Gunicorn ati Nginx nipasẹ iho kan.

Niwọn igba ti awọn paati mejeeji ti fi sori ẹrọ lori olupin kanna, jẹ ki a gbiyanju lati lo iho UNIX kan dipo iho nẹtiwọọki kan. Niwọn igba ti ibaraẹnisọrọ nilo iho ni eyikeyi ọran, jẹ ki a gbiyanju lati ṣe igbesẹ kan diẹ sii ki o tunto imuṣiṣẹ iho fun Gunicorn nipasẹ systemd.

Ilana ti ṣiṣẹda awọn iṣẹ ti a mu ṣiṣẹ iho jẹ ohun rọrun. Ni akọkọ, a ṣẹda faili ẹyọkan ti o ni itọsọna ListenStream ti o tọka si aaye nibiti iho UNIX yoo ṣẹda, lẹhinna faili ẹyọkan fun iṣẹ ninu eyiti itọsọna Nbeere yoo tọka si faili ẹyọ iho. Lẹhinna, ninu faili ẹyọ iṣẹ, gbogbo ohun ti o ku ni lati pe Gunicorn lati agbegbe foju ati ṣẹda abuda WSGI fun iho UNIX ati ohun elo Django.

Eyi ni diẹ ninu awọn apẹẹrẹ ti awọn faili ẹyọkan ti o le lo bi ipilẹ. Ni akọkọ a ṣeto soket.

[Unit]
Description=Gunicorn WSGI socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Bayi o nilo lati tunto Gunicorn daemon.

[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

Fun Nginx, o jẹ ọrọ ti o rọrun ti ṣiṣẹda awọn faili atunto aṣoju ati ṣeto ilana kan lati tọju akoonu aimi ti o ba nlo ọkan. Ni RHEL, awọn faili iṣeto Nginx wa ni /etc/nginx/conf.d. O le daakọ apẹẹrẹ atẹle sinu faili /etc/nginx/conf.d/default.conf ki o bẹrẹ iṣẹ naa. Rii daju pe o ṣeto orukọ olupin lati baamu orukọ agbalejo rẹ.

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

Bẹrẹ iho Gunicorn ati Nginx nipa lilo systemd ati pe o ti ṣetan lati bẹrẹ idanwo.

Aṣiṣe Gateway buburu?

Ti o ba tẹ adirẹsi sii sinu ẹrọ aṣawakiri rẹ, o ṣeese yoo gba aṣiṣe 502 Bad Gateway. O le ṣẹlẹ nipasẹ awọn igbanilaaye iho UNIX ti ko tọ, tabi o le jẹ nitori awọn ọran eka diẹ sii ti o ni ibatan si iṣakoso wiwọle ni SELinux.

Ninu akọọlẹ aṣiṣe nginx o le wo laini kan bii eyi:

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"

Ti a ba ṣe idanwo Gunicorn taara, a yoo gba idahun ofo.

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

Jẹ ká ro ero idi ti yi ṣẹlẹ. Ti o ba ṣii akọọlẹ naa, iwọ yoo rii daju pe iṣoro naa ni ibatan si SELinux. Niwọn bi a ti n ṣiṣẹ daemon kan ti ko si eto imulo ti a ṣẹda, o ti samisi bi init_t. Jẹ ki a ṣe idanwo yii ni iṣe.

sudo setenforce 0

Gbogbo eyi le fa ibawi ati omije ti ẹjẹ, ṣugbọn eyi n ṣatunṣe aṣiṣe nikan. Jẹ ki a mu ayẹwo naa kuro lati rii daju pe eyi ni iṣoro naa, lẹhin eyi a yoo da ohun gbogbo pada si ipo rẹ.

Nipa mimu oju-iwe naa pada ninu ẹrọ aṣawakiri tabi ṣiṣiṣẹsẹhin aṣẹ curl wa, o le wo oju-iwe idanwo Django.

Nitorinaa, ti rii daju pe ohun gbogbo ṣiṣẹ ati pe ko si awọn iṣoro igbanilaaye diẹ sii, a tun mu SELinux ṣiṣẹ lẹẹkansi.

sudo setenforce 1

Emi kii yoo sọrọ nipa audit2allow tabi ṣiṣẹda awọn eto imulo ti o da lori gbigbọn pẹlu sepolgen nibi, nitori ko si ohun elo Django gangan ni akoko, nitorinaa ko si maapu pipe ti kini Gunicorn le fẹ lati wọle si ati kini o yẹ ki o kọ iwọle si. Nitorina, o jẹ dandan lati jẹ ki SELinux nṣiṣẹ lati daabobo eto naa, lakoko ti o jẹ ki ohun elo naa ṣiṣẹ ati fi awọn ifiranṣẹ silẹ ni akọọlẹ ayẹwo ki eto imulo gangan le ṣẹda lati ọdọ wọn.

Pato awọn ibugbe iyọọda

Kii ṣe gbogbo eniyan ti gbọ ti awọn ibugbe laaye ni SELinux, ṣugbọn kii ṣe nkan tuntun. Ọpọlọpọ paapaa ṣiṣẹ pẹlu wọn laisi akiyesi rẹ. Nigbati eto imulo ba ṣẹda ti o da lori awọn ifiranṣẹ iṣayẹwo, eto imulo ti o ṣẹda duro fun agbegbe ti o yanju. Jẹ ki a gbiyanju lati ṣẹda eto imulo iyọọda ti o rọrun.

Lati ṣẹda aaye kan ti a gba laaye fun Gunicorn, o nilo diẹ ninu iru eto imulo, ati pe o tun nilo lati samisi awọn faili ti o yẹ. Ni afikun, awọn irinṣẹ nilo lati ṣajọ awọn eto imulo tuntun.

sudo yum install selinux-policy-devel

Ilana ibugbe ti a gba laaye jẹ ohun elo nla fun idamo awọn iṣoro, paapaa nigbati o ba de si ohun elo aṣa tabi awọn ohun elo ti o firanṣẹ laisi awọn eto imulo ti a ṣẹda tẹlẹ. Ni ọran yii, eto imulo agbegbe ti a gba laaye fun Gunicorn yoo rọrun bi o ti ṣee ṣe - sọ iru akọkọ kan (gunicorn_t), sọ iru kan ti a yoo lo lati samisi awọn adaṣe pupọ (gunicorn_exec_t), ati lẹhinna ṣeto iyipada fun eto lati samisi ni deede. awọn ilana ṣiṣe. Laini ti o kẹhin ṣeto eto imulo bi a ti ṣiṣẹ nipasẹ aiyipada ni akoko ti o ti kojọpọ.

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;

O le ṣajọ faili eto imulo yii ki o ṣafikun si eto rẹ.

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

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

Jẹ ki a ṣayẹwo lati rii boya SELinux n ṣe idiwọ nkan miiran yatọ si ohun ti daemon aimọ wa n wọle.

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 ṣe idiwọ Nginx lati kọ data si iho UNIX ti Gunicorn lo. Ni deede, ni iru awọn ọran, awọn eto imulo bẹrẹ lati yipada, ṣugbọn awọn italaya miiran wa niwaju. O tun le yi awọn eto ìkápá pada lati agbegbe ihamọ si aaye igbanilaaye. Bayi jẹ ki a gbe httpd_t lọ si agbegbe awọn igbanilaaye. Eyi yoo fun Nginx ni iwọle pataki ati pe a le tẹsiwaju pẹlu iṣẹ n ṣatunṣe aṣiṣe siwaju sii.

sudo semanage permissive -a httpd_t

Nitorinaa, ni kete ti o ti ṣakoso lati tọju aabo SELinux (iwọ ko yẹ ki o fi iṣẹ akanṣe SELinux kan silẹ ni ipo ihamọ) ati awọn ibugbe igbanilaaye ti kojọpọ, o nilo lati ṣawari kini gangan nilo lati samisi bi gunicorn_exec_t lati gba ohun gbogbo ṣiṣẹ daradara lẹẹkansi. Jẹ ki a gbiyanju lati ṣabẹwo si oju opo wẹẹbu lati wo awọn ifiranṣẹ tuntun nipa awọn ihamọ iwọle.

sudo ausearch -m AVC -c gunicorn

Iwọ yoo rii ọpọlọpọ awọn ifiranṣẹ ti o ni 'comm="gunicorn"' ti o ṣe ọpọlọpọ awọn nkan lori awọn faili ni / srv/djangoapp, nitorinaa eyi jẹ o han gedegbe ọkan ninu awọn aṣẹ ti o tọsi.

Ṣugbọn ni afikun, ifiranṣẹ kan han bi eleyi:

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

Ti o ba wo ipo ti iṣẹ gunicorn tabi ṣiṣe aṣẹ ps, iwọ kii yoo rii eyikeyi awọn ilana ṣiṣe. O dabi pe gunicorn n gbiyanju lati wọle si olutumọ Python ni agbegbe virtualenv wa, o ṣee ṣe lati ṣiṣe awọn iwe afọwọkọ oṣiṣẹ. Nitorinaa ni bayi jẹ ki a samisi awọn faili ṣiṣe ṣiṣe meji wọnyi ki o ṣayẹwo boya a le ṣii oju-iwe idanwo Django wa.

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

Iṣẹ gunicorn yoo nilo lati tun bẹrẹ ṣaaju ki o to yan aami tuntun. O le tun bẹrẹ lẹsẹkẹsẹ tabi da iṣẹ naa duro ki o jẹ ki iho bẹrẹ nigbati o ṣii aaye naa ni ẹrọ aṣawakiri. Daju pe awọn ilana ti gba awọn aami to pe ni lilo ps.

ps -efZ | grep gunicorn

Maṣe gbagbe lati ṣẹda eto imulo SELinux deede nigbamii!

Ti o ba wo awọn ifiranṣẹ AVC ni bayi, ifiranṣẹ ikẹhin ni permissive=1 fun ohun gbogbo ti o ni ibatan si ohun elo, ati iyọọda = 0 fun eto iyokù. Ti o ba loye iru iraye si ohun elo gidi kan nilo, o le yara wa ọna ti o dara julọ lati yanju iru awọn iṣoro bẹ. Ṣugbọn titi di igba naa, o dara julọ lati jẹ ki eto naa ni aabo ati ki o gba iṣayẹwo ti o han gbangba, ohun elo ti iṣẹ akanṣe Django.

sudo ausearch -m AVC

O ṣẹlẹ!

Ise agbese Django ti n ṣiṣẹ ti han pẹlu iwaju iwaju ti o da lori Nginx ati Gunicorn WSGI. A tunto Python 3 ati PostgreSQL 10 lati awọn ibi ipamọ RHEL 8 Beta. Bayi o le gbe siwaju ki o ṣẹda (tabi nirọrun ran) awọn ohun elo Django tabi ṣawari awọn irinṣẹ miiran ti o wa ni RHEL 8 Beta lati ṣe adaṣe ilana iṣeto ni adaṣe, mu iṣẹ ṣiṣe dara, tabi paapaa gba atunto yii.

orisun: www.habr.com

Fi ọrọìwòye kun