Officina REL 8 Beta: Aedificium opus applicationes interretiales

RHEL 8 Beta tincidunt multas novas lineas praebet, quarum enumerationem paginas capere potuerunt, tamen res novas discentes semper in usu meliores sunt, ita infra officinam praebemus in actu creandi applicationem infrastructuram innixa Linux Red Hat Enterprise 8 Beta.

Officina REL 8 Beta: Aedificium opus applicationes interretiales

Python, popularem programmandi linguam inter tinctiones sumamus, ut fundamentum, compositum ex Django et PostgreSQL, satis commune compositum ad applicationes creandas, et REL 8 Beta configurare cum illis operari. Deinde duo medicamenta plura (unclassified) addemus.

Expertus ambitus mutabit, quia interesting explorare possibilitates automationis est, operando cum vasis et ambitus cum pluribus servientibus quaerit. Ut cum novo incepto incipias, incipias per parvum, simplex prototypum manu creando, ut exacte videre potes quid evenire debeat et quomodo inter se cohaereant, et postea ad automate movendum et figurationes magis implicandas efficiant. Hodie loquimur de tali prototypo creatione.

Incipiamus explicando REL 8 Beta VM imaginem. Rectam machinam a scabere instituere potes, vel imagini KVM hospitis utere praesto cum subscriptione tua Beta. Cum imagine hospitis uteris, virtualem CD configurare debes quae metadatam et usoris notitias pro nube initialization continebit (nubes-init). Non opus est tibi facere aliquid speciale cum structurae orbis ac fasciculis in promptu, quaelibet configuratione faciet.

Propius inspiciamus totum processum.

Django installing

Cum versione novissima Django, virtualis ambitus (virtualenv) cum Pythone 3.5 vel serius indigebis. In Beta notis videre potes Python 3.6 in promptu esse, si ita sit, s reprehendo;

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

Red Hat active utitur Pythone ut systema toolkit in RHEL, quare hoc facit?

Ita res est, multas tincidunt Pythonis adhuc transitus a Pythone 2 ad Pythonem 2 contemplantes, cum ipsa Pytho 3 sub actuosa progressione sit, ac magis magisque novae versiones constanter appareant. Quapropter ut ratio instrumentorum stabilium necessariorum occurreret, dum utentes accessum praeberet ad varias novas Pythonis versiones, ratio Python in novam sarcinam commota est et facultatem instruendi pariter Python 2.7 et 3.6 praebebat. Plura de mutationibus et quare factae inveniri possunt in publicatione Langdon White's blog (Langdon White).

Itaque, ut Python laborat, tantum opus est duas sarcinas instituere, python3-pipe inclusa ut dependentia.

sudo yum install python36 python3-virtualenv

Cur moduli directi usus non vocat ut Langdon suggerit et inaugurat pip3? Praesentis automationis prae oculis habito, notum est Ansible pituitam inauguratam requiret ad currendum, quia pituita moduli virtualenvs cum consuetudine pituitae exsecutabilis non sustinet.

Cum interpretis python3 operante tuo arbitrio, pergere potes cum processu institutionis Django et systema operarium cum aliis nostris componentibus habere. Multae optiones exsequendi in interreti praesto sunt. Una litera hic exhibetur, sed utentes suis processibus uti possunt.

Nos versiones PostgreSQL et Nginx in RHEL 8 defalta usura Yum instituemus.

sudo yum install nginx postgresql-server

PostgreSQL psycopg2 requiret, sed solum in virtualenv ambitu praesto esse debet, sic eam instituemus utendo pituita cum Django et Gunicorn. Sed prius oportet constituere virtualenv.

Semper multum disputandum est de loco eligendi ius loci ad incepta Django instituendi, sed cum dubitas, semper potes ad Linux Filesystem Hierarchy Standard. Speciatim, FHS dicit /srv adhibitum esse: "copia data hostiis specialibus-data quae ratio producit, ut interretialem datorum et scriptorum, data in servientibus FTP reposita, et systematis repositoria moderari" versiones (apparentes in FHS. -2.3 in 2004)."

Ita prorsus res nostra est, ut omnia quae in /srv indigemus posuimus, quae usuario nostro possidetur (nubes-user).

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

Erectio PostgreSQL et Django facilis est: creare database, user creare, permissiones configurare. Unum memorare cum initio insertum PostgreSQL scriptum est postgresql-setup quod cum involucro postgresql-servo installatur. Hoc scriptum adiuvat ut officia fundamentalia cum botri datorum administratione coniungantur, ut botrum initialization vel processus upgrade. Ad novam instantiam PostgreSQL configurare in systemate RHEL, opus est ut praeceptum detegere;

sudo /usr/bin/postgresql-setup -initdb

Incipere potes PostgreSQL systemd utens, database crea, et consilium in Django erige. Memento sileo PostgreSQL postquam emendationes clientium authenticas configurationis fasciculi (plerumque pg_hba.conf) configurare tesseram repositam pro applicatione usoris configurare. Si alias difficultates occurras, fac ut IPv4 et IPv6 occasus in lima pg_hba.conf mutes.

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

In tabella /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

In tabella /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 }}',
   }
}

Configurans fasciculum in incepto et constituendo configurationem datorum, potes incipere progressionem ministrare ut omnia opera fac. Incipiens progressionem servo, utilem est creare user admin ut nexum datorum experiatur.

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

WSGI? Wai?

Procurator progressionis utilis est ad probationem, sed ad applicationem currendam configurare debet idoneum ministratorem et procuratorem Web Servo Gateway Interface (WSGI). Comunes plures sunt compositiones, exempli gratia: Apache HTTPD cum uWSGI vel Nginx cum Gunicorn.

Officium Web Servo Gateway Interface est petitiones interretialem interretialem interretialem interretialem pythoni postulare. WSGI reliquia est praeteritorum terribilium cum machinae CGI circum essent, et hodie WSGI vexillum de facto est, cuiuscumque instrumenti interretialis vel Pythonis usus est. Sed, quamvis diffusum usum, adhuc multae sunt extenuationum cum his compagibus laborantes, et multae electiones. In hoc casu conabimur commercium inter Gunicorn et Nginx per nervum statuere.

Cum utrumque horum partium eodem servo installatur, conemur utere nervum UNIX loco nervus retis. Cum communicatio nervum in quolibet casu requirit, unum gradum accipere conemur et nervum activum Gunicorn per systemd configurare.

Processus creandi nervum operarum refectum est admodum simplex. Primum, fasciculus unitas creatus est qui contineat ListenStream directivam demonstrativam ad punctum quo UNIX nervus creabitur, deinde fasciculus unitas pro servitio quo Requires directivum monstrabit ad nervum unitatis fasciculi. Deinde, in usu fasciculi unitatis, omnia quae restant Gunicorn ex ambitu virtuali vocare est et WSGI ligamen pro nervum UNIX et Django applicationem crea.

Hic exempla quaedam imaginum unitatis quae pro fundamento uti potes. Primum nervum erigimus.

[Unit]
Description=Gunicorn WSGI socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Nunc necesse est Gunicornum daemonem configurare.

[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

Pro Nginx, materia simplex est tabularum configurationum procuratorem creandi et constituendo directorium ad contenta static reponenda si uno usus es. In RHEL, Nginx imaginum conformationis in /etc/nginx/conf.d sita sunt. Hoc exemplum in tabella /etc/nginx/conf.d/default.conf imitari potes et officium incipere. Fac ut servo_nomen tuum constituas ut nomini hospitio tuo respondeas.

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

Satus Gunicornis nervum et Nginx systemd utens et paratus es ad tentationem incipere.

Malum porta error!

Si electronicam ingredieris in navigatro tuo, fere 502 Mala Porta errorem accipies. Causari potest ex permissionibus nervum UNIX perperam conformatis, vel ob plures quaestiones implicatas relatas ad imperium in SELinux relatas.

In nginx errore log videre lineam sic:

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"

Si Gunicornum directe temptamus, responsum inane dabimus.

curl β€”unix-socket /run/gunicorn.sock 8beta1.example.com

Quid hoc fiat figura sit. Si trabem aperueris, verisimiliter videbis quaestionem ad SELinux referri. Cum daemonem currimus, cui nulla ratio creata est, init_t signatum est. Experiamur hanc theoriam in usu.

sudo setenforce 0

Haec omnia criticae et lacrimae sanguinis causare possunt, sed hoc modo prototypum debugging. Perscriptio inactivabilis sit modo fac ut hoc sit problema, post quod omnia in suum locum revertemur.

Reficiendo paginam in navigatro vel curl nostro mandato recurrens, paginam testam Django videre potes.

Ita ut opera omnia explorata et difficultates non sint licentiae, SELinux iterum dabimus.

sudo setenforce 1

Nolo loqui de audit2allow vel creandis consiliis cum sepolgen hic erectis, quia nulla actualis Django applicatio in tempore est, ideo nulla est tabula plenaria quae Gunicornus accedere velit et quid accessum negare debeat. Ideo necesse est ut SELinux cursus ad systema tuendum custodiat, cum simul applicationes ad currendum et emittentes nuntios in calculis relinquant, ut ratio ipsa tunc ex illis creari possit.

Permissive domains speciem

Non omnes res publicas in SELinux audiverunt, sed nihil novi sunt. Multi etiam cum iis laboraverunt, ne id quidem animadvertentes. Cum consilium ex nuntiis computis creatum est, consilium creatum imperium definitum repraesentat. Studeamus consilium permittentes simplicem creare.

Ad Gunicornum specificatum permissum dominium creare, aliquo consilio debes, et tabellas aptas notare etiam debes. Praeterea instrumenta ad nova consilia convocanda necessaria sunt.

sudo yum install selinux-policy-devel

Permissa ditiones mechanismum magnum est instrumentum ad difficultates edendas, praesertim cum ad praxim applicationis vel applicationes quae navis sine consiliis iam creatis obvenit. In hoc casu, permissum consilium dominii Gunicornis quam maxime simplex erit - principale genus declarabit (gunicorn_t), typus declarabit nos utemur ad plures executables (gunicorn_exec_t), ac deinde transitum ad systema recte designandum. currit processus. Ultima linea consilium ponit ut defaltam tempore oneratur.

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;

Potes hoc consilium lima componere et ad rationem tuam addere.

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

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

Reprehendamus videamus an SELinux aliud quidpiam intercludat quam quod noster daemon ignotus accedit.

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 prohibet Nginx notitias scribere ad nervum UNIX a Gunicorno adhibitum. De more, in talibus, consilia mutare incipiunt, sed aliae sunt provocationes ante. Occasus domain ex restrictione dominii ad permissionem domain mutare potes. Nunc httpd_t transeamus ad domain permissiones. Haec Nginx necessariam accessum dabit et pergere possumus cum ulteriore opere debugging.

sudo semanage permissive -a httpd_t

Cum igitur SELinux custodiri curasti (ne vere SELinux project in stricto modo relinquere debes) et permissio ditiones oneratae sunt, debes indicare quid prorsus notandum sit sicut gunicorn_exec_t ut omnia recte operata iterum. Experiamur adire website ut novas nuntios de accessu restrictiones videas.

sudo ausearch -m AVC -c gunicorn

Multas epistulas videbis quae "comm="gunicorn"" continentes varias res in scriniis in /srv/djangoapp faciunt, ut hoc unum manifesto mandatorum flagitiosorum valet.

Sed praeterea huius rei nuntius apparet;

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

Si statum gunicornis servitii spectes vel mandatum ps cucurreris, processum currentem non videbis. Similis gunicornis spectat ad Pythonem interpretem in nostro ambitu virtualenv, fortasse ad scriptorem laborantem currere. Nunc ergo has duas tabellas exsecutabiles note et deprime si paginam test Django nostram aperire possumus.

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

Ministerium gunicornum necesse erit ut sileo antequam novus tag seligi possit. Potes illud statim sileo vel servitium desistere et illud nervum incipere cum locum in navigatro aperis. Cognoscere quod processus receperunt pittacia rectam utentes ps.

ps -efZ | grep gunicorn

Noli oblivisci SELinux normalem consilium postea creandi!

Si nunc nuntios AVC spectes, ultimus nuntius permissivum continet=1 omnia ad applicationem pertinentia, ac permissiva =0 reliquis systematis. Si intelleges qualem accessum verae applicationis esse oporteat, cito invenire optimum modum potes ad solvendas huiusmodi difficultates. Donec autem, optimum est servare rationem securam et claram, utibile audit de Django project.

sudo ausearch -m AVC

Accidit!

Project opus Django apparuit cum fronte in Nginx et Gunicorni WSGI innixa. Configuramus Pythonem 3 et PostgreSQL 10 ex RHEL 8 Beta repositoria. Iam progredi potes et creare (vel simpliciter explicandi) Django applicationes vel alia instrumenta prompta explora in RHEL 8 Beta ad automate processum configurationis, ad meliorem effectum faciendam, vel etiam hanc configurationem continens.

Source: www.habr.com