Π Π°Π±ΠΎΡ‚ΠΈΠ»Π½ΠΈΡ†Π° RHEL 8 Beta: Π“Ρ€Π°Π΄Π΅ΡšΠ΅ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ Π²Π΅Π±-Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ

RHEL 8 Beta ΠΈΠΌ Π½ΡƒΠ΄ΠΈ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΌΠ½ΠΎΠ³Ρƒ Π½ΠΎΠ²ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡ΠΈΠ΅ Π½Π°Π²Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π±ΠΈ ΠΌΠΎΠΆΠ΅Π»ΠΎ Π΄Π° ΠΏΠΎΡ‚Ρ€Π°Π΅ страници, Π½ΠΎ ΡƒΡ‡Π΅ΡšΠ΅Ρ‚ΠΎ Π½ΠΎΠ²ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π΅ сСкогаш ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ Π²ΠΎ пракса, ΠΏΠ° ΠΏΠΎΠ΄ΠΎΠ»Ρƒ Π½ΡƒΠ΄ΠΈΠΌΠ΅ Ρ€Π°Π±ΠΎΡ‚ΠΈΠ»Π½ΠΈΡ†Π° Π·Π° Π²ΡΡƒΡˆΠ½ΠΎΡΡ‚ создавањС Π½Π° апликациска инфраструктура Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Red Hat Enterprise Linux 8 Beta.

Π Π°Π±ΠΎΡ‚ΠΈΠ»Π½ΠΈΡ†Π° RHEL 8 Beta: Π“Ρ€Π°Π΄Π΅ΡšΠ΅ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ Π²Π΅Π±-Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ

Π”Π° Π³ΠΎ Π·Π΅ΠΌΠ΅ΠΌΠ΅ Python, ΠΏΠΎΠΏΡƒΠ»Π°Ρ€Π΅Π½ програмски јазик ΠΌΠ΅Ρ“Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΎ основа, ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ˜Π° ΠΎΠ΄ Django ΠΈ PostgreSQL, ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ Π²ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ˜Π° Π·Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π΄Π° Π³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΠΌΠ΅ RHEL 8 Beta Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ со Π½ΠΈΠ². ΠŸΠΎΡ‚ΠΎΠ° ќС Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ ΡƒΡˆΡ‚Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ (нСкласифицирани) ΡΠΎΡΡ‚ΠΎΡ˜ΠΊΠΈ.

ΠžΠΊΠΎΠ»ΠΈΠ½Π°Ρ‚Π° Π·Π° Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅ ќС сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ, бидСјќи Π΅ интСрСсно Π΄Π° сС истраТат моТноститС Π·Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°, Ρ€Π°Π±ΠΎΡ‚Π° со ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈ ΠΈ ΠΏΡ€ΠΎΠ±Π½ΠΈ ΠΎΠΊΠΎΠ»ΠΈΠ½ΠΈ со повСќС сСрвСри. Π—Π° Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ со Π½ΠΎΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ со создавањС Π½Π° ΠΌΠ°Π», СдноставСн ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ€Π°Ρ‡Π½ΠΎ Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС случи ΠΈ ΠΊΠ°ΠΊΠΎ Ρ‚ΠΎΡ˜ ΠΊΠΎΠΌΡƒΠ½ΠΈΡ†ΠΈΡ€Π°, Π° ΠΏΠΎΡ‚ΠΎΠ° Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅Ρ‚Π΅ Π½Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°ΡšΠ΅ ΠΈ создавањС послоТСни ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. ДСнСс Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌΠ΅ Π·Π° создавањС Π½Π° Ρ‚Π°ΠΊΠΎΠ² ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ.

Π”Π° ΠΏΠΎΡ‡Π½Π΅ΠΌΠ΅ со Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° сликата RHEL 8 Beta VM. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° инсталиратС Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π° машина ΠΎΠ΄ Π½ΡƒΠ»Π° ΠΈΠ»ΠΈ Π΄Π° ја користитС сликата Π·Π° гости Π½Π° KVM достапна со Π²Π°ΡˆΠ°Ρ‚Π° Π‘Π΅Ρ‚Π° ΠΏΡ€Π΅Ρ‚ΠΏΠ»Π°Ρ‚Π°. Кога користитС слика Π·Π° гости, ќС Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½ΠΎ Π¦Π” ΠΊΠΎΠ΅ ќС содрТи ΠΌΠ΅Ρ‚Π°ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ кориснички ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π·Π° ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Π½Π° ΠΎΠ±Π»Π°ΠΊΠΎΡ‚ (cloud-init). НС Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Π½ΠΈΡˆΡ‚ΠΎ посСбно со структурата Π½Π° дискот ΠΈΠ»ΠΈ достапнитС ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ; сСкоја ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° ќС Π³ΠΎ стори Ρ‚ΠΎΠ°.

АјдС Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π½ΠΎ Π΄Π° Π³ΠΎ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Ρ†Π΅Π»ΠΈΠΎΡ‚ процСс.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅ Π½Π° Django

Π‘ΠΎ Π½Π°Ρ˜Π½ΠΎΠ²Π°Ρ‚Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π° Django, ќС Π²ΠΈ Ρ‚Ρ€Π΅Π±Π° Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π° срСдина (virtualenv) со Python 3.5 ΠΈΠ»ΠΈ ΠΏΠΎΠ½ΠΎΠ²Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π°. Π’ΠΎ Π‘Π΅Ρ‚Π°-Π±Π΅Π»Π΅ΡˆΠΊΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π΄Π΅ΠΊΠ° Python 3.6 Π΅ достапСн, ајдС Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌΠ΅ Π΄Π°Π»ΠΈ навистина Π΅ Ρ‚Π°ΠΊΠ°:

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

Red Hat Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π³ΠΎ користи Python ΠΊΠ°ΠΊΠΎ систСмски ΠΏΠ°ΠΊΠ΅Ρ‚ со Π°Π»Π°Ρ‚ΠΊΠΈ Π²ΠΎ RHEL, ΠΏΠ° Π·ΠΎΡˆΡ‚ΠΎ Ρ‚ΠΎΠ° Ρ€Π΅Π·ΡƒΠ»Ρ‚ΠΈΡ€Π°?

Π€Π°ΠΊΡ‚ Π΅ Π΄Π΅ΠΊΠ° ΠΌΠ½ΠΎΠ³Ρƒ Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‡ΠΈ Π½Π° Python сè ΡƒΡˆΡ‚Π΅ размислуваат Π·Π° ΠΏΡ€Π΅ΠΌΠΈΠ½ ΠΎΠ΄ Python 2 Π½Π° Python 2, Π΄ΠΎΠ΄Π΅ΠΊΠ° самиот Python 3 Π΅ Π²ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ Ρ€Π°Π·Π²ΠΎΡ˜, Π° сС повСќС ΠΈ повСќС Π½ΠΎΠ²ΠΈ Π²Π΅Ρ€Π·ΠΈΠΈ ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Π½ΠΎ сС ΠΏΠΎΡ˜Π°Π²ΡƒΠ²Π°Π°Ρ‚. Π—Π°Ρ‚ΠΎΠ°, Π·Π° Π΄Π° сС Π·Π°Π΄ΠΎΠ²ΠΎΠ»ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±Π°Ρ‚Π° Π·Π° стабилни систСмски Π°Π»Π°Ρ‚ΠΊΠΈ Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π° корисницитС ΠΈΠΌ сС Π½ΡƒΠ΄ΠΈ пристап Π΄ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½ΠΎΠ²ΠΈ Π²Π΅Ρ€Π·ΠΈΠΈ Π½Π° Python, систСмот Python бСшС прСмСстСн Π²ΠΎ Π½ΠΎΠ² ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ моТност Π΄Π° сС инсталираат ΠΈ Python 2.7 ΠΈ 3.6. ПовСќС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΈ Π·ΠΎΡˆΡ‚ΠΎ Ρ‚ΠΈΠ΅ сС Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°Ρ˜Π΄Π΅Ρ‚Π΅ Π²ΠΎ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π²ΠΎ Π‘Π»ΠΎΠ³ΠΎΡ‚ Π½Π° Π›Π΅Π½Π³Π΄ΠΎΠ½ Π’Π°Ρ˜Ρ‚ (Π›Π°Π½Π³Π΄ΠΎΠ½ Π’Π°Ρ˜Ρ‚).

Π—Π½Π°Ρ‡ΠΈ, Π·Π° Π΄Π° Π³ΠΎ Π΄ΠΎΠ±ΠΈΠ΅Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π΅Π½ Python, Ρ‚Ρ€Π΅Π±Π° само Π΄Π° инсталиратС Π΄Π²Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, со python3-pip Π²ΠΊΠ»ΡƒΡ‡Π΅Π½ ΠΊΠ°ΠΊΠΎ зависност.

sudo yum install python36 python3-virtualenv

Π—ΠΎΡˆΡ‚ΠΎ Π΄Π° Π½Π΅ користитС Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΈ ΠΏΠΎΠ²ΠΈΡ†ΠΈ Π½Π° ΠΌΠΎΠ΄ΡƒΠ» ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ ΠΏΡ€Π΅Π΄Π»Π°Π³Π° Π›Π°Π½Π³Π΄ΠΎΠ½ ΠΈ Π΄Π° Π½Π΅ инсталиратС pip3? Имајќи ја ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ ΠΏΡ€Π΅Ρ‚ΡΡ‚ΠΎΡ˜Π½Π°Ρ‚Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°, ΠΏΠΎΠ·Π½Π°Ρ‚ΠΎ Π΅ Π΄Π΅ΠΊΠ° Ansible ќС Π±Π°Ρ€Π° инсталиран ΠΏΠΈΠΏ Π·Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ, бидСјќи ΠΌΠΎΠ΄ΡƒΠ»ΠΎΡ‚ pip Π½Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΠΆΡƒΠ²Π° virtualenvs со ΠΏΡ€ΠΈΠ»Π°Π³ΠΎΠ΄Π΅Π½Π° ΠΈΠ·Π²Ρ€ΡˆΠ½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° ΠΏΠΈΠΏ.

Π‘ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅Π½ ΠΏΡ€Π΅Π²Π΅Π΄ΡƒΠ²Π°Ρ‡ Π½Π° python3 Π½Π° Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡšΠ΅, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅ со процСсот Π½Π° ΠΈΠ½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ˜Π° Π½Π° Django ΠΈ Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π΅Π½ систСм Π·Π°Π΅Π΄Π½ΠΎ со Π½Π°ΡˆΠΈΡ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ. ΠŸΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ ΠΌΠ½ΠΎΠ³Ρƒ ΠΎΠΏΡ†ΠΈΠΈ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° достапни Π½Π° Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚. ΠŸΠΎΡΡ‚ΠΎΠΈ Π΅Π΄Π½Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° прСтставСна ΠΎΠ²Π΄Π΅, Π½ΠΎ корисницитС ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° Π³ΠΈ користат сопствСнитС процСси.

ЌС Π³ΠΈ инсталирамС Π²Π΅Ρ€Π·ΠΈΠΈΡ‚Π΅ PostgreSQL ΠΈ Nginx достапни Π²ΠΎ RHEL 8 стандардно ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Yum.

sudo yum install nginx postgresql-server

PostgreSQL ќС Π±Π°Ρ€Π° psycopg2, Π½ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅ достапСн само Π²ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π° срСдина, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ ќС Π³ΠΎ инсталирамС ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ pip3 Π·Π°Π΅Π΄Π½ΠΎ со Django ΠΈ Gunicorn. Но, ΠΏΡ€Π²ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° поставимС virtualenv.

БСкогаш ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³Ρƒ Π΄Π΅Π±Π°Ρ‚ΠΈ Π½Π° Ρ‚Π΅ΠΌΠ°Ρ‚Π° Π·Π° ΠΈΠ·Π±ΠΎΡ€ Π½Π° вистинското мСсто Π·Π° ΠΈΠ½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ Π½Π° Django, Π½ΠΎ ΠΊΠΎΠ³Π° сС сомнСватС, сСкогаш ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС свртитС ΠΊΠΎΠ½ стандардот Π·Π° Ρ…ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡ˜Π° Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅Ρ‡Π½ΠΈΠΎΡ‚ систСм Linux. ΠŸΠΎΡ‚ΠΎΡ‡Π½ΠΎ, FHS Π²Π΅Π»ΠΈ Π΄Π΅ΠΊΠ° /srv сС користи Π·Π°: β€žΠ·Π°Ρ‡ΡƒΠ²ΡƒΠ²Π°ΡšΠ΅ спСцифични ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π·Π° Π΄ΠΎΠΌΠ°ΡœΠΈΠ½ΠΎΡ‚ - ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΡˆΡ‚ΠΎ систСмот Π³ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄ΡƒΠ²Π°, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ сС ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ скрипти Π·Π° Π²Π΅Π±-сСрвСри, ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π·Π°Ρ‡ΡƒΠ²Π°Π½ΠΈ Π½Π° FTP сСрвСри ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π° Π½Π° систСмскитС ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π°.β€œ Π²Π΅Ρ€Π·ΠΈΠΈ (сС ΠΏΠΎΡ˜Π°Π²ΡƒΠ²Π°Π°Ρ‚ Π²ΠΎ FHS -2.3 Π²ΠΎ 2004 Π³ΠΎΠ΄ΠΈΠ½Π°).β€œ

Π’ΠΎΠΊΠΌΡƒ ΠΎΠ²Π° Π΅ Π½Π°ΡˆΠΈΠΎΡ‚ ΡΠ»ΡƒΡ‡Π°Ρ˜, ΠΏΠ° сè ΡˆΡ‚ΠΎ Π½ΠΈ Ρ‚Ρ€Π΅Π±Π° Π³ΠΎ ставамС Π²ΠΎ /srv, кој Π΅ Π²ΠΎ сопствСност Π½Π° Π½Π°ΡˆΠΈΠΎΡ‚ корисник Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° (cloud-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

ΠŸΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ PostgreSQL ΠΈ Django Π΅ лСсно: ΠΊΡ€Π΅ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, ΠΊΡ€Π΅ΠΈΡ€Π°Ρ˜Ρ‚Π΅ корисник, ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈ. Π•Π΄Π½ΠΎ Π½Π΅ΡˆΡ‚ΠΎ ΡˆΡ‚ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС ΠΈΠΌΠ° Π½Π° ΡƒΠΌ ΠΏΡ€ΠΈ ΠΏΡ€Π²ΠΈΡ‡Π½ΠΎ ΠΈΠ½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅ Π½Π° PostgreSQL Π΅ скриптата Π·Π° ΠΏΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ postgresql ΡˆΡ‚ΠΎ Π΅ инсталирана со ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚ Π½Π° сСрвСрот postgresql. Оваа скрипта Π²ΠΈ ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° Π³ΠΈ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°Ρ‚Π΅ основнитС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ со Π°Π΄ΠΌΠΈΠ½ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° кластСрот Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ сС ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° кластСрот ΠΈΠ»ΠΈ процСсот Π½Π° Π½Π°Π΄Π³Ρ€Π°Π΄Π±Π°. Π—Π° Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΠΌΠ΅ Π½ΠΎΠ² ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΊ PostgreSQL Π½Π° систСмот RHEL, Ρ‚Ρ€Π΅Π±Π° Π΄Π° ја ΠΈΠ·Π²Ρ€ΡˆΠΈΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π°:

sudo /usr/bin/postgresql-setup -initdb

ΠŸΠΎΡ‚ΠΎΠ° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ PostgreSQL ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ systemd, Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ Π΄Π° поставитС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π²ΠΎ Django. НС Π·Π°Π±ΠΎΡ€Π°Π²Π°Ρ˜Ρ‚Π΅ Π΄Π° Π³ΠΎ рСстартиратС PostgreSQL ΠΎΡ‚ΠΊΠ°ΠΊΠΎ ќС Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ конфигурациската Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° Π°Π²Ρ‚Π΅Π½Ρ‚ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΡ‚ (ΠΎΠ±ΠΈΡ‡Π½ΠΎ pg_hba.conf) Π·Π° Π΄Π° Π³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π»ΠΎΠ·ΠΈΠ½ΠΊΠΈ Π·Π° корисникот Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°. Ако Π½Π°ΠΈΠ΄Π΅Ρ‚Π΅ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ Ρ‚Π΅ΡˆΠΊΠΎΡ‚ΠΈΠΈ, ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ Π΄Π°Π»ΠΈ стС Π³ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠ»Π΅ поставкитС Π·Π° IPv4 ΠΈ IPv6 Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° 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

Π’ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° /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? Π’Π°ΠΈ?

Π Π°Π·Π²ΠΎΡ˜Π½ΠΈΠΎΡ‚ сСрвСр Π΅ корисСн Π·Π° Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅, Π½ΠΎ Π·Π° Π΄Π° ја ΠΈΠ·Π²Ρ€ΡˆΠΈΡ‚Π΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΌΠΎΡ€Π° Π΄Π° Π³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ соодвСтниот сСрвСр ΠΈ прокси Π·Π° ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜ΡΠΎΡ‚ Π½Π° ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π° Π½Π° Π²Π΅Π±-сСрвСрот (WSGI). ΠŸΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π²ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Apache HTTPD со uWSGI ΠΈΠ»ΠΈ Nginx со Gunicorn.

Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜ΡΠΎΡ‚ Π½Π° ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π° Π½Π° Π²Π΅Π±-сСрвСрот Π΅ Π΄Π° ΠΏΡ€Π΅ΠΏΡ€Π°ΡœΠ° Π±Π°Ρ€Π°ΡšΠ° ΠΎΠ΄ Π²Π΅Π±-сСрвСрот Π΄ΠΎ Π²Π΅Π±-Ρ€Π°ΠΌΠΊΠ°Ρ‚Π° Π½Π° ΠŸΠ°Ρ˜Ρ‚ΠΎΠ½. WSGI Π΅ остаток ΠΎΠ΄ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎΡ‚ΠΎ ΠΌΠΈΠ½Π°Ρ‚ΠΎ ΠΊΠΎΠ³Π° Π±Π΅Π° Π½Π°ΠΎΠΊΠΎΠ»Ρƒ CGI-ΠΌΠΎΡ‚ΠΎΡ€ΠΈΡ‚Π΅, Π° дСнСс WSGI Π΅ Π΄Π΅ Ρ„Π°ΠΊΡ‚ΠΎ стандард, Π±Π΅Π· ΠΎΠ³Π»Π΅Π΄ Π½Π° користСниот Π²Π΅Π±-сСрвСр ΠΈΠ»ΠΈ Ρ€Π°ΠΌΠΊΠ°Ρ‚Π° Π½Π° Python. Но, ΠΈ ΠΏΠΎΠΊΡ€Π°Ρ˜ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° ΡˆΠΈΡ€ΠΎΠΊΠ° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°, сè ΡƒΡˆΡ‚Π΅ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³Ρƒ нијанси ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° со ΠΎΠ²ΠΈΠ΅ Ρ€Π°ΠΌΠΊΠΈ ΠΈ ΠΌΠ½ΠΎΠ³Ρƒ ΠΈΠ·Π±ΠΎΡ€ΠΈ. Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜, ќС сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° воспоставимС ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΡ˜Π° ΠΏΠΎΠΌΠ΅Ρ“Ρƒ Gunicorn ΠΈ Nginx ΠΏΡ€Π΅ΠΊΡƒ ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊ.

Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ ΠΈ Π΄Π²Π΅Ρ‚Π΅ ΠΎΠ΄ ΠΎΠ²ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ сС инсталирани Π½Π° истиот сСрвСр, ајдС Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° користимС ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊ UNIX намСсто ΠΌΡ€Π΅ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊ. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π±Π°Ρ€Π° ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊ Π²ΠΎ сСкој ΡΠ»ΡƒΡ‡Π°Ρ˜, ајдС Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ ΡƒΡˆΡ‚Π΅ Π΅Π΄Π΅Π½ Ρ‡Π΅ΠΊΠΎΡ€ ΠΈ Π΄Π° Π³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΠΌΠ΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΡˆΡ‚Π΅ΠΊΠ΅Ρ€ΠΎΡ‚ Π·Π° Gunicorn ΠΏΡ€Π΅ΠΊΡƒ systemd.

ΠŸΡ€ΠΎΡ†Π΅ΡΠΎΡ‚ Π½Π° создавањС услуги со Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½ΠΈ сокСти Π΅ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ СдноставСн. ΠŸΡ€Π²ΠΎ, сС ΠΊΡ€Π΅ΠΈΡ€Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° која содрТи Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° ListenStream која ΡƒΠΊΠ°ΠΆΡƒΠ²Π° Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π° Π²ΠΎ која ќС сС ΠΊΡ€Π΅ΠΈΡ€Π° ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊΠΎΡ‚ UNIX, ΠΏΠΎΡ‚ΠΎΠ° Π΅Π΄ΠΈΠ½ΠΈΡ†Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° услугата Π²ΠΎ која Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°Ρ‚Π° Requires ќС ΡƒΠΊΠ°ΠΆΠ΅ Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊΠΎΡ‚. ΠŸΠΎΡ‚ΠΎΠ°, Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π½Π° услуТната Π΅Π΄ΠΈΠ½ΠΈΡ†Π°, останува само Π΄Π° сС ΠΏΠΎΠ²ΠΈΠΊΠ° Gunicorn ΠΎΠ΄ Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π°Ρ‚Π° срСдина ΠΈ Π΄Π° сС создадС WSGI Π²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ Π·Π° ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊΠΎΡ‚ UNIX ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Django.

Π•Π²Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π½Π° Π΅Π΄ΠΈΠ½Π΅Ρ‡Π½ΠΈ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΈ користитС ΠΊΠ°ΠΊΠΎ основа. ΠŸΡ€Π²ΠΎ Π³ΠΎ поставивмС ΡˆΡ‚Π΅ΠΊΠ΅Ρ€ΠΎΡ‚.

[Unit]
Description=Gunicorn WSGI socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Π‘Π΅Π³Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ Π΄Π΅ΠΌΠΎΠ½ΠΎΡ‚ Gunicorn.

[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, Сдноставно Π΅ Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π½Π° прокси ΠΈ Π΄Π° поставитС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅ статична содрТина Π°ΠΊΠΎ користитС Ρ‚Π°ΠΊΠΎΠ². Π’ΠΎ RHEL, конфигурацискитС Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ Nginx сС Π½Π°ΠΎΡ“Π°Π°Ρ‚ Π²ΠΎ /etc/nginx/conf.d. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΊΠΎΠΏΠΈΡ€Π°Ρ‚Π΅ слСдниов ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° /etc/nginx/conf.d/default.conf ΠΈ Π΄Π° ја стартуватС услугата. ΠŸΠΎΠ³Ρ€ΠΈΠΆΠ΅Ρ‚Π΅ сС Π΄Π° Π³ΠΎ поставитС ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° сСрвСрот Π΄Π° ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π° Π½Π° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Π²Π°ΡˆΠΈΠΎΡ‚ домаќин.

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 ΠΈ Nginx ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ systemd ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΈ стС Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ со Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅.

Π›ΠΎΡˆΠ° Π³Ρ€Π΅ΡˆΠΊΠ° Π½Π° ΠΏΠΎΡ€Ρ‚Π°Π»ΠΎΡ‚?

Ако ја внСсСтС адрСсата Π²ΠΎ Π²Π°ΡˆΠΈΠΎΡ‚ прСлистувач, Π½Π°Ρ˜Π²Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ ќС Π΄ΠΎΠ±ΠΈΠ΅Ρ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠ° 502 Bad Gateway. Π’ΠΎΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ°Π½ΠΎ ΠΎΠ΄ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΈ Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈ Π·Π° UNIX ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΡ†ΠΈ ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π΄ΠΎΠ»ΠΆΠΈ Π½Π° послоТСни ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ со ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π°Ρ‚Π° Π½Π° пристап Π²ΠΎ 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. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌΠ΅ Π΄Π΅ΠΌΠΎΠ½ Π·Π° кој Π½Π΅ Π΅ создадСна ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°, Ρ‚ΠΎΡ˜ Π΅ ΠΎΠ·Π½Π°Ρ‡Π΅Π½ ΠΊΠ°ΠΊΠΎ init_t. АјдС Π΄Π° ја тСстирамС ΠΎΠ²Π°Π° Ρ‚Π΅ΠΎΡ€ΠΈΡ˜Π° Π²ΠΎ пракса.

sudo setenforce 0

Π‘Π΅Ρ‚ΠΎ ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ° ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠΈ ΠΈ солзи ΠΊΡ€Π², Π½ΠΎ ΠΎΠ²Π° Π΅ само Π΄Π΅Π±Π°Π³ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΡ‚. АјдС Π΄Π° ја ΠΎΠ½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠΈΠΌΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ‚Π° само Π·Π° Π΄Π° сС ΡƒΠ²Π΅Ρ€ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° Ρ‚ΠΎΠ° Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚, ΠΏΠΎ ΡˆΡ‚ΠΎ ќС Π²Ρ€Π°Ρ‚ΠΈΠΌΠ΅ сè Π½Π° своСто мСсто.

Π‘ΠΎ ΠΎΡΠ²Π΅ΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° страницата Π²ΠΎ прСлистувачот ΠΈΠ»ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° curl, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ја Π²ΠΈΠ΄ΠΈΡ‚Π΅ тСст страницата Django.

Π’Π°ΠΊΠ°, ΠΎΡ‚ΠΊΠ°ΠΊΠΎ сС ΡƒΠ²Π΅Ρ€ΠΈΠ²ΠΌΠ΅ Π΄Π΅ΠΊΠ° сè Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ Π½Π΅ΠΌΠ° повСќС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ со Π΄ΠΎΠ·Π²ΠΎΠ»Π°Ρ‚Π°, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π³ΠΎ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π°ΠΌΠ΅ SELinux.

sudo setenforce 1

ОвдС Π½Π΅ΠΌΠ° Π΄Π° Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌ Π·Π° audit2allow ΠΈΠ»ΠΈ Π·Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ засновани Π½Π° ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ со sepolgen, бидСјќи Π²ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΡ‚ Π½Π΅ΠΌΠ° вистинска Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Django, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ Π½Π΅ΠΌΠ° цСлосна ΠΌΠ°ΠΏΠ° Π·Π° Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ Gunicorn Π±ΠΈ сакал Π΄Π° пристапи ΠΈ Π΄ΠΎ ΡˆΡ‚ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΎΠ΄Π±ΠΈΠ΅ пристап. Π—Π°Ρ‚ΠΎΠ°, Π½Π΅ΠΎΠΏΡ…ΠΎΠ΄Π½ΠΎ Π΅ SELinux Π΄Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π·Π° Π΄Π° сС Π·Π°ΡˆΡ‚ΠΈΡ‚ΠΈ систСмот, Π° Π²ΠΎ исто Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° сС Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ Π΄Π° остава ΠΏΠΎΡ€Π°ΠΊΠΈ Π²ΠΎ Π΄Π½Π΅Π²Π½ΠΈΠΊΠΎΡ‚ Π·Π° Ρ€Π΅Π²ΠΈΠ·ΠΈΡ˜Π° Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠ° Π΄Π° сС ΠΊΡ€Π΅ΠΈΡ€Π° вистинската ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° ΠΎΠ΄ Π½ΠΈΠ².

ΠžΠ΄Ρ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈΠ²ΠΈ Π΄ΠΎΠΌΠ΅Π½ΠΈ

НС сСкој ΡΠ»ΡƒΡˆΠ½Π°Π» Π·Π° Π΄ΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΈ Π΄ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ SELinux, Π½ΠΎ Ρ‚ΠΈΠ΅ Π½Π΅ сС Π½ΠΈΡˆΡ‚ΠΎ Π½ΠΎΠ²ΠΎ. ΠœΠ½ΠΎΠ³ΡƒΠΌΠΈΠ½Π° Π΄ΡƒΡ€ΠΈ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅Π° со Π½ΠΈΠ² Π±Π΅Π· Π΄Π° сС свСсни. Кога ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°Ρ‚Π° сС ΠΊΡ€Π΅ΠΈΡ€Π° Π²Ρ€Π· основа Π½Π° рСвизорски ΠΏΠΎΡ€Π°ΠΊΠΈ, ΠΊΡ€Π΅ΠΈΡ€Π°Π½Π°Ρ‚Π° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Π³ΠΎ прСтставува Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΎΡ‚ Π΄ΠΎΠΌΠ΅Π½. АјдС Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° создадСмС Сдноставна ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Π·Π° Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈ.

Π—Π° Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ спСцифичСн Π΄ΠΎΠ·Π²ΠΎΠ»Π΅Π½ Π΄ΠΎΠΌΠ΅Π½ Π·Π° Gunicorn, ΠΏΠΎΡ‚Ρ€Π΅Π±Π΅Π½ Π²ΠΈ Π΅ Π½Π΅ΠΊΠ°ΠΊΠ²Π° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°, Π° исто Ρ‚Π°ΠΊΠ° Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΈ ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚Π΅ соодвСтнитС Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ, ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ сС Π°Π»Π°Ρ‚ΠΊΠΈ Π·Π° Π΄Π° сС собСрат Π½ΠΎΠ²ΠΈ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ.

sudo yum install selinux-policy-devel

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΡ‚ Π·Π° Π΄ΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΈ Π΄ΠΎΠΌΠ΅Π½ΠΈ Π΅ ΠΎΠ΄Π»ΠΈΡ‡Π½Π° Π°Π»Π°Ρ‚ΠΊΠ° Π·Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΡƒΠ²Π°ΡšΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, особСно ΠΊΠΎΠ³Π° станува Π·Π±ΠΎΡ€ Π·Π° приспособСна Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ΠΈΠ»ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΡˆΡ‚ΠΎ сС испорачуваат Π±Π΅Π· вСќС ΠΊΡ€Π΅ΠΈΡ€Π°Π½ΠΈ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ. Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜, Π΄ΠΎΠ·Π²ΠΎΠ»Π΅Π½Π°Ρ‚Π° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Π½Π° Π΄ΠΎΠΌΠ΅Π½ Π·Π° Gunicorn ќС Π±ΠΈΠ΄Π΅ ΡˆΡ‚ΠΎ Π΅ ΠΌΠΎΠΆΠ½ΠΎ поСдноставна - прогласСтС Π³Π»Π°Π²Π΅Π½ Ρ‚ΠΈΠΏ (gunicorn_t), прогласСтС Ρ‚ΠΈΠΏ ΡˆΡ‚ΠΎ ќС Π³ΠΎ користимС Π·Π° ΠΎΠ±Π΅Π»Π΅ΠΆΡƒΠ²Π°ΡšΠ΅ повСќС ΠΈΠ·Π²Ρ€ΡˆΠ½ΠΈ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ (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 Π±Π»ΠΎΠΊΠΈΡ€Π° Π½Π΅ΡˆΡ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ освСн ΠΎΠ½Π° ΡˆΡ‚ΠΎ Π³ΠΎ пристапува Π½Π°ΡˆΠΈΠΎΡ‚ Π½Π΅ΠΏΠΎΠ·Π½Π°Ρ‚ Π΄Π΅ΠΌΠΎΠ½.

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 Π³ΠΎ спрСчува Nginx Π΄Π° ΠΏΠΈΡˆΡƒΠ²Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π²ΠΎ ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊΠΎΡ‚ UNIX ΡˆΡ‚ΠΎ Π³ΠΎ користи Gunicorn. Π’ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½ΠΎ, Π²ΠΎ Ρ‚Π°ΠΊΠ²ΠΈ случаи, ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈΡ‚Π΅ ΠΏΠΎΡ‡Π½ΡƒΠ²Π°Π°Ρ‚ Π΄Π° сС ΠΌΠ΅Π½ΡƒΠ²Π°Π°Ρ‚, Π½ΠΎ ΠΏΡ€Π΅Ρ‚ΡΡ‚ΠΎΡ˜Π°Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΡ†ΠΈ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ исто Ρ‚Π°ΠΊΠ° Π΄Π° Π³ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ поставкитС Π½Π° Π΄ΠΎΠΌΠ΅Π½ΠΎΡ‚ ΠΎΠ΄ Π΄ΠΎΠΌΠ΅Π½ Π·Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ Π΄ΠΎΠΌΠ΅Π½ Π·Π° Π΄ΠΎΠ·Π²ΠΎΠ»Π°. Π‘Π΅Π³Π° Π΄Π° Π³ΠΎ прСмСстимС httpd_t Π²ΠΎ Π΄ΠΎΠΌΠ΅Π½ΠΎΡ‚ Π½Π° Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈ. Ова ќС ΠΌΡƒ Π΄Π°Π΄Π΅ Π½Π° Nginx ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈΠΎΡ‚ пристап ΠΈ ќС ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌΠ΅ со ΠΏΠΎΠ½Π°Ρ‚Π°ΠΌΠΎΡˆΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π·Π° ΠΎΡ‚ΡΡ‚Ρ€Π°Π½ΡƒΠ²Π°ΡšΠ΅ Π³Ρ€Π΅ΡˆΠΊΠΈ.

sudo semanage permissive -a httpd_t

Π—Π½Π°Ρ‡ΠΈ, ΡˆΡ‚ΠΎΠΌ ќС успССтС Π΄Π° Π³ΠΎ Π·Π°ΡˆΡ‚ΠΈΡ‚ΠΈΡ‚Π΅ SELinux (навистина Π½Π΅ Ρ‚Ρ€Π΅Π±Π° Π΄Π° оставитС SELinux ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π²ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ) ΠΈ Π΄ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π·Π° Π΄ΠΎΠ·Π²ΠΎΠ»Π° сС Π²Ρ‡ΠΈΡ‚Π°Π½ΠΈ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ΅Ρ‚Π΅ ΡˆΡ‚ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΎ ΠΊΠ°ΠΊΠΎ gunicorn_exec_t Π·Π° Π΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π° сè ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Ρ‚Ρ€Π΅Π±Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ. АјдС Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° ја посСтимС Π²Π΅Π±-Π»ΠΎΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ Π½ΠΎΠ²ΠΈ ΠΏΠΎΡ€Π°ΠΊΠΈ Π·Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΡšΠ°Ρ‚Π° Π·Π° пристап.

sudo ausearch -m AVC -c gunicorn

ЌС Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΌΠ½ΠΎΠ³Ρƒ ΠΏΠΎΡ€Π°ΠΊΠΈ ΠΊΠΎΠΈ содрТат 'comm="gunicorn"' ΠΊΠΎΠΈ ΠΏΡ€Π°Π²Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ Π²ΠΎ /srv/djangoapp, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ ΠΎΠ²Π° Π΅ ΠΎΡ‡ΠΈΠ³Π»Π΅Π΄Π½ΠΎ Π΅Π΄Π½Π° ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ Π²Ρ€Π΅Π΄ΠΈ Π΄Π° сС ΠΎΠ·Π½Π°Ρ‡ΠΈ.

Но, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ сС ΠΏΠΎΡ˜Π°Π²ΡƒΠ²Π° Π²Π°ΠΊΠ²Π° ΠΏΠΎΡ€Π°ΠΊΠ°:

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 ΠΈΠ»ΠΈ ја ΠΈΠ·Π²Ρ€ΡˆΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ps, Π½Π΅ΠΌΠ° Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ процСси ΠΊΠΎΠΈ сС ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°Π°Ρ‚. ИзглСда ΠΊΠ°ΠΊΠΎ Gunicorn сС ΠΎΠ±ΠΈΠ΄ΡƒΠ²Π° Π΄Π° пристапи Π΄ΠΎ Ρ‚ΠΎΠ»ΠΊΡƒΠ²Π°Ρ‡ΠΎΡ‚ Π½Π° Python Π²ΠΎ Π½Π°ΡˆΠ°Ρ‚Π° Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π° срСдина, ΠΌΠΎΠΆΠ΅Π±ΠΈ Π·Π° Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΠΈ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ скрипти. Π‘Π΅Π³Π°, ајдС Π΄Π° Π³ΠΈ ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌΠ΅ ΠΎΠ²ΠΈΠ΅ Π΄Π²Π΅ ΠΈΠ·Π²Ρ€ΡˆΠ½ΠΈ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌΠ΅ Π΄Π°Π»ΠΈ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ја ΠΎΡ‚Π²ΠΎΡ€ΠΈΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° тСст страница Π·Π° Django.

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

Услугата Gunicorn ќС Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС рСстартира ΠΏΡ€Π΅Π΄ Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·Π±Π΅Ρ€Π΅ Π½ΠΎΠ²Π°Ρ‚Π° ΠΎΠ·Π½Π°ΠΊΠ°. ΠœΠΎΠΆΠ΅Ρ‚Π΅ вСднаш Π΄Π° Π³ΠΎ рСстартиратС ΠΈΠ»ΠΈ Π΄Π° ја ΠΏΡ€Π΅ΠΊΠΈΠ½Π΅Ρ‚Π΅ услугата ΠΈ Π΄Π° Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚Π΅ ΡˆΡ‚Π΅ΠΊΠ΅Ρ€ΠΎΡ‚ Π΄Π° ја стартува ΠΊΠΎΠ³Π° ќС ја ΠΎΡ‚Π²ΠΎΡ€ΠΈΡ‚Π΅ страницата Π²ΠΎ прСлистувачот. ΠŸΠΎΡ‚Π²Ρ€Π΄Π΅Ρ‚Π΅ Π΄Π΅ΠΊΠ° процСситС Π³ΠΈ Π΄ΠΎΠ±ΠΈΠ»Π΅ Ρ‚ΠΎΡ‡Π½ΠΈΡ‚Π΅ ΠΎΠ·Π½Π°ΠΊΠΈ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ps.

ps -efZ | grep gunicorn

НС Π·Π°Π±ΠΎΡ€Π°Π²Π°Ρ˜Ρ‚Π΅ Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ Π½ΠΎΡ€ΠΌΠ°Π»Π½Π° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Π½Π° SELinux ΠΏΠΎΠ΄ΠΎΡ†Π½Π°!

Ако сСга Π³ΠΈ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ AVC ΠΏΠΎΡ€Π°ΠΊΠΈΡ‚Π΅, послСдната ΠΏΠΎΡ€Π°ΠΊΠ° содрТи permissive=1 Π·Π° сè ΡˆΡ‚ΠΎ Π΅ ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΎ со Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΈ permissive=0 Π·Π° остатокот ΠΎΠ΄ систСмот. Ако Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚Π΅ ΠΊΠ°ΠΊΠΎΠ² пристап ΠΈ Ρ‚Ρ€Π΅Π±Π° Π½Π° вистинска Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π±Ρ€Π·ΠΎ Π΄Π° Π³ΠΎ Π½Π°Ρ˜Π΄Π΅Ρ‚Π΅ Π½Π°Ρ˜Π΄ΠΎΠ±Ρ€ΠΈΠΎΡ‚ Π½Π°Ρ‡ΠΈΠ½ Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°ΡšΠ΅ Π½Π° Π²Π°ΠΊΠ²ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. Но, Π΄ΠΎΡ‚ΠΎΠ³Π°Ρˆ, Π½Π°Ρ˜Π΄ΠΎΠ±Ρ€ΠΎ Π΅ систСмот Π΄Π° Π±ΠΈΠ΄Π΅ Π±Π΅Π·Π±Π΅Π΄Π΅Π½ ΠΈ Π΄Π° сС Π΄ΠΎΠ±ΠΈΠ΅ јасна, ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΠΈΠ²Π° Ρ€Π΅Π²ΠΈΠ·ΠΈΡ˜Π° Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ Џанго.

sudo ausearch -m AVC

Π‘Π΅ случи!

Π‘Π΅ појави Ρ€Π°Π±ΠΎΡ‚Π΅Π½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Django со Ρ„Ρ€ΠΎΠ½Ρ‚Π°Π½Π΄ Π±Π°Π·ΠΈΡ€Π°Π½ Π½Π° Nginx ΠΈ Gunicorn WSGI. Π“ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π²ΠΌΠ΅ Python 3 ΠΈ PostgreSQL 10 ΠΎΠ΄ RHEL 8 Beta ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π°Ρ‚Π°. Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС Π΄Π²ΠΈΠΆΠΈΡ‚Π΅ Π½Π°ΠΏΡ€Π΅Π΄ ΠΈ Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ (ΠΈΠ»ΠΈ Сдноставно Π΄Π° распорСдитС) Django Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ Π΄Π° истраТуватС Π΄Ρ€ΡƒΠ³ΠΈ достапни Π°Π»Π°Ρ‚ΠΊΠΈ Π²ΠΎ RHEL 8 Beta Π·Π° Π΄Π° Π³ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ процСсот Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, Π΄Π° Π³ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΈΡ‚Π΅ пСрформанситС ΠΈΠ»ΠΈ Π΄ΡƒΡ€ΠΈ ΠΈ Π΄Π° ја ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ ΠΎΠ²Π°Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€