RHEL 8 Beta ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π½ΡΡΡ ΡΡΡΠ°Π½ΠΈΡΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΈΠ·ΡΡΠ°ΡΡ Π½ΠΎΠ²ΠΎΠ΅ Π²ΡΠ΅Π³Π΄Π° Π»ΡΡΡΠ΅ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Π½ΠΈΠΆΠ΅ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΠΌ ΠΏΡΠΎΠΉΡΠΈ ΠΏΡΠ°ΠΊΡΠΈΠΊΡΠΌ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Π±Π°Π·Π΅ Red Hat Enterprise Linux 8 Beta.
ΠΠ° ΠΎΡΠ½ΠΎΠ²Ρ Π²ΠΎΠ·ΡΠΌΠ΅ΠΌ Python, ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΉ ΡΡΠ΅Π΄ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠ·ΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ Django ΠΈ PostgreSQL, Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΡ ΡΠ²ΡΠ·ΠΊΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅ΠΌ RHEL 8 Beta Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π½ΠΈΠΌΠΈ. ΠΠΎΡΠΎΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅ΡΠ΅ ΠΏΠ°ΡΡ (Π½Π΅ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΡ
) ΠΈΠ½Π³ΡΠ΅Π΄ΠΈΠ΅Π½ΡΠΎΠ².
Π’Π΅ΡΡΠΎΠ²ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΌΠ΅Π½ΡΡΡΡΡ, Π²Π΅Π΄Ρ Π»ΡΠ±ΠΎΠΏΡΡΠ½ΠΎ ΠΈΠ·ΡΡΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ, ΡΠ°Π±ΠΎΡΡ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌΠΈ ΠΈ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΡΠ΅Π΄Ρ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°ΠΌΠΈ. ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΡΠ°Π±ΠΎΡΡ Ρ Π½ΠΎΠ²ΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΠ°ΡΡ Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ° Π²ΡΡΡΠ½ΡΡ β ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ ΠΈ ΠΊΠ°ΠΊ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΡ
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΉ. Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΡΠ°ΡΡΠΊΠ°Π· ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ°.
ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ°Π·Π° Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ RHEL 8 Beta VM. ΠΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΌΠ°ΡΠΈΠ½Ρ Ρ Π½ΡΠ»Ρ, ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π³ΠΎΡΡΠ΅Π²ΠΎΠΉ ΠΎΠ±ΡΠ°Π· KVM, Π΄ΠΎΡΡΡΠΏΠ½ΡΠΉ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΎΠΉ Π½Π° Beta. ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π³ΠΎΡΡΠ΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π·Π° ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π°ΡΡΡΠΎΠΈΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΉ CD, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΠΎΠ±Π»Π°ΡΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ (cloud-init). ΠΠΈΡΠ΅Π³ΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎ ΡΡΡΡΠΊΡΡΡΠΎΠΉ Π΄ΠΈΡΠΊΠ° ΠΈΠ»ΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ°ΠΌΠΈ Π΄Π΅Π»Π°ΡΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ, ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ Π»ΡΠ±Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π²Π΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Django
Π‘ Π½ΠΎΠ²Π΅ΠΉΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ Django ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ (virtualenv) Ρ Python 3.5 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ. Π ΠΏΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΡΡ ΠΊ Beta ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ Π΄ΠΎΡΡΡΠΏΠ΅Π½ 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, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΠΎΠ΄ΡΠ»Ρ pip Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ (virtualenvs) Ρ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠΌ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ pip.
ΠΠΌΠ΅Ρ Π² ΡΠ²ΠΎΠ΅ΠΌ ΡΠ°ΡΠΏΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ python3, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Django ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ Π½Π°ΡΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ. Π ΡΠ΅ΡΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ΄Π΅ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° ΠΎΠ΄Π½Π° Π²Π΅ΡΡΠΈΡ, Π½ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ.
ΠΠ΅ΡΡΠΈΠΈ PostgreSQL ΠΈ Nginx, Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ Π² RHEL 8 ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π±ΡΠ΄Π΅ΠΌ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Yum.
sudo yum install nginx postgresql-server
ΠΠ»Ρ PostgreSQL ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ psycopg2, Π½ΠΎ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΎ Π±ΡΠ»ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ virtualenv, ΠΏΠΎΡΡΠΎΠΌΡ Π΅Π³ΠΎ Π±ΡΠ΄Π΅ΠΌ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π΅Π³ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ pip3 Π²ΠΌΠ΅ΡΡΠ΅ Ρ Django ΠΈ Gunicorn. ΠΠΎ ΡΠ½Π°ΡΠ°Π»Π° Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ virtualenv.
ΠΠ° ΡΠ΅ΠΌΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ±ΠΎΡΠ° ΠΌΠ΅ΡΡΠ° ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Django Π²ΡΠ΅Π³Π΄Π° Π²Π΅Π΄Π΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ², Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΡΠΎΠΌΠ½Π΅Π½ΠΈΡ, Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ ΡΡΠ°Π½Π΄Π°ΡΡΡ Linux Filesystem Hierarchy Standard. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Π² 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-setup, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ postgresql-server. ΠΡΠΎΡ ΡΠΊΡΠΈΠΏΡ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π±Π°Π·ΠΎΠ²ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Π±Π°Π· Π΄Π°Π½Π½ΡΡ , Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ. ΠΠ»Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° 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 Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ admin Ρ ΡΠ΅Π»ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ .
./manage.py runserver 0.0.0.0:8000
./manage.py createsuperuser
WSGI? ΠΠ°ΠΉ?
Π‘Π΅ΡΠ²Π΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΏΡΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ, Π½ΠΎ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠ΅ΡΠ²Π΅Ρ ΠΈ ΠΏΡΠΎΠΊΡΠΈ Π΄Π»Ρ Web Server Gateway Interface (WSGI). Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΡ ΡΠ²ΡΠ·ΠΎΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Apache HTTPD Ρ uWSGI ΠΈΠ»ΠΈ Nginx Ρ Gunicorn.
ΠΠ°Π΄Π°ΡΠ° Web Server Gateway Interface β ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΡΡ Π·Π°ΠΏΡΠΎΡΡ ΠΎΡ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΊ Π²Π΅Π±-ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΡ Python. WSGI β ΡΡΠΎ ΡΠ΄Π°ΠΊΠΎΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΈΠ΅ ΡΠΆΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ»ΠΎΠ³ΠΎ, ΠΊΠΎΠ³Π΄Π° Π² Ρ ΠΎΠ΄Ρ Π±ΡΠ»ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ CGI, ΠΈ ΡΠ΅Π³ΠΎΠ΄Π½Ρ WSGI ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠΌ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈΠ»ΠΈ Python-ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°. ΠΠΎ Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° Π΅Π³ΠΎ ΡΠΈΡΠΎΠΊΠΎΠ΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅, Π²ΡΠ΅ ΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π½ΡΠ°Π½ΡΠΎΠ² ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΡΠΈΠΌΠΈ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°ΠΌΠΈ, ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ Π²ΡΠ±ΠΎΡΠ°. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΡΡΠ°ΡΠ°Π΅ΠΌΡΡ Π½Π°Π»Π°Π΄ΠΈΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Gunicorn ΠΈ Nginx ΡΠ΅ΡΠ΅Π· ΡΠΎΠΊΠ΅Ρ.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ±Π° ΡΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ ΡΠΎΠΌ ΠΆΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ΅, ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° ΡΠΎΠΊΠ΅Ρ UNIX. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π΄Π»Ρ ΠΊΠΎΠΌΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΉ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½ΡΠΆΠ΅Π½ ΡΠΎΠΊΠ΅Ρ, ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π³ ΠΈ Π½Π°ΡΡΡΠΎΠΈΡΡ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΡ ΡΠΎΠΊΠ΅ΡΠ° Π΄Π»Ρ Gunicorn ΡΠ΅ΡΠ΅Π· systemd.
ΠΡΠΎΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ², Π°ΠΊΡΠΈΠ²ΠΈΡΡΠ΅ΠΌΡΡ ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ (socket activated services), Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡ. Π‘Π½Π°ΡΠ°Π»Π° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ unit-ΡΠ°ΠΉΠ», ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ ListenStream, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ Π½Π° ΡΠΎΡΠΊΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ ΡΠΎΠΊΠ΅Ρ UNIX, Π·Π°ΡΠ΅ΠΌ β unit-ΡΠ°ΠΉΠ» Π΄Π»Ρ ΡΠ΅ΡΠ²ΠΈΡΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° Requires Π±ΡΠ΄Π΅Ρ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° unit-ΡΠ°ΠΉΠ» ΡΠΎΠΊΠ΅ΡΠ°. ΠΠ°ΡΠ΅ΠΌ Π² unit-ΡΠ°ΠΉΠ»Π΅ ΡΠ΅ΡΠ²ΠΈΡΠ° ΠΎΡΡΠ°Π½Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΠ·Π²Π°ΡΡ Gunicorn ΠΈΠ· Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ WSGI-ΠΏΡΠΈΠ²ΡΠ·ΠΊΡ Π΄Π»Ρ ΡΠΎΠΊΠ΅ΡΠ° UNIX ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Django.
ΠΠΎΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² unit ΡΠ°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡΡ Π·Π° ΠΎΡΠ½ΠΎΠ²Ρ. Π‘Π½Π°ΡΠ°Π»Π° Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΡΠΎΠΊΠ΅Ρ.
[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_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 ΠΈ Nginx Ρ ΠΏΠΎΠΌΠΎΡΡΡ systemd, ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΡΡΡΠΏΠ°ΡΡ ΠΊ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΡΠΈΠ±ΠΊΠ° Bad Gateway?
ΠΡΠ»ΠΈ Π²Ρ Π²Π²Π΅Π΄Π΅ΡΠ΅ Π°Π΄ΡΠ΅Ρ Π² Π±ΡΠ°ΡΠ·Π΅Ρ, ΡΠΎ, Π²Π΅ΡΠΎΡΡΠ½Π΅Π΅ Π²ΡΠ΅Π³ΠΎ, ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΎΡΠΈΠ±ΠΊΡ 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 Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΈ Π² ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ ΠΈ ΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΠΆΡΡΠ½Π°Π»Π΅ Π°ΡΠ΄ΠΈΡΠ°, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π·Π°ΡΠ΅ΠΌ Π½Π° ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΡ.
Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΡ Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² (permissive domains)
Π ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΡ Π΄ΠΎΠΌΠ΅Π½Π°Ρ Π² SELinux Π½Π΅ Π²ΡΠ΅ ΡΠ»ΡΡΠ°Π»ΠΈ, Π½ΠΎ Π² Π½ΠΈΡ Π½Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ. ΠΠ½ΠΎΠ³ΠΈΠ΅ Π΄Π°ΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Ρ Π½ΠΈΠΌΠΈ, ΡΠ°ΠΌΠΈ ΠΎΠ± ΡΡΠΎΠΌ Π½Π΅ Π΄ΠΎΠ³Π°Π΄ΡΠ²Π°ΡΡΡ. ΠΠΎΠ³Π΄Π° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π°ΡΠ΄ΠΈΡΠ°, ΡΠΎΠ·Π΄Π°Π½Π½Π°Ρ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΠΉ Π΄ΠΎΠΌΠ΅Π½. ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠΎΡΡΠ΅ΠΉΡΡΡ ΡΠ°Π·ΡΠ΅ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΡ.
Π§ΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΠΉ Π΄ΠΎΠΌΠ΅Π½ Π΄Π»Ρ Gunicorn, Π½ΡΠΆΠ½Π° Π½Π΅ΠΊΠ°Ρ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠΈΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ, ΡΡΠΎΠ±Ρ ΡΠΎΠ±ΡΠ°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ.
sudo yum install selinux-policy-devel
ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΡ Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² β ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ Π²ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΡΡ ΠΈΠ΄Π΅Ρ ΠΎ ΠΊΠ°ΡΡΠΎΠΌΠ½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΡΡΠ°Π²Π»ΡΡΡΡΡ Π±Π΅Π· ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ ΠΏΠΎΠ»ΠΈΡΠΈΠΊ. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π° Π΄Π»Ρ Gunicorn Π±ΡΠ΄Π΅Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎΠΉ β ΠΎΠ±ΡΡΠ²ΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠΈΠΏ (gunicorn_t), ΠΎΠ±ΡΡΠ²ΠΈΠΌ ΡΠΈΠΏ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΏΠΎΠΌΠ΅ΡΠΊΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² (gunicorn_exec_t), ΠΈ Π·Π°ΡΠ΅ΠΌ Π½Π°ΡΡΡΠΎΠΈΠΌ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ (transition) Π΄Π»Ρ system, ΡΡΠΎΠ±Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΡΠΌΠ΅ΡΠ°ΡΡ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ. ΠΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΡΡΠΎΡΠΊΠ° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΡ ΠΊΠ°ΠΊ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ Π΅Π΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ.
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 Π² Π½Π°ΡΠ΅ΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ virtualenv, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ°Π±ΠΎΡΠΈΡ ΡΠΊΡΠΈΠΏΡΠΎΠ² (workers). ΠΠΎΡΡΠΎΠΌΡ ΡΠ΅ΠΉΡΠ°Ρ ΠΏΠΎΠΌΠ΅ΡΠΈΠΌ ΡΡΠΈ Π΄Π²Π° ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ ΡΠ°ΠΉΠ»Π° ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ, ΠΏΠΎΠ»ΡΡΠΈΡΡΡ Π»ΠΈ ΠΎΡΠΊΡΡΡΡ Π½Π°ΡΡ ΡΠ΅ΡΡΠΎΠ²ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ 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 Π΄Π»Ρ Π²ΡΠ΅ΠΉ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΡΠ»ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄ΠΎΡΡΡΠΏ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΡΡΡΠ΅Π΅ Π½Π°ΠΉΡΠΈ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ. ΠΠΎ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ Π»ΡΡΡΠ΅, ΡΡΠΎΠ±Ρ ΡΠΈΡΡΠ΅ΠΌΠ° Π±ΡΠ»Π° Π·Π°ΡΠΈΡΠ΅Π½Π°, ΠΈ ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ½ΡΡΠ½ΡΠΉ ΠΈ ΠΏΡΠΈΠ³ΠΎΠ΄Π½ΡΠΉ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π°ΡΠ΄ΠΈΡ ΠΏΠΎ ΠΏΡΠΎΠ΅ΠΊΡΡ Django.
sudo ausearch -m AVC
ΠΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ!
ΠΠΎΡΠ²ΠΈΠ»ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Django Ρ ΡΡΠΎΠ½ΡΠ΅Π½Π΄ΠΎΠΌ Π½Π° Nginx ΠΈ Gunicorn WSGI. ΠΡ Π½Π°ΡΡΡΠΎΠΈΠ»ΠΈ Python 3 ΠΈ PostgreSQL 10 ΠΈΠ· ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π² RHEL 8 Beta. Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ Π΄Π°Π»ΡΡΠ΅ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ (ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°ΡΡ) ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Django ΠΈΠ»ΠΈ ΠΈΠ·ΡΡΠ°ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π² RHEL 8 Beta Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ, ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com