RHEL 8 Beta ΠΏΡΠ΅Π΄Π»Π°Π³Π° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠΈΠΉΡΠΎ ΡΠΏΠΈΡΡΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΡΠ½Π΅ΠΌΠ΅ ΡΡΡΠ°Π½ΠΈΡΠΈ, Π½ΠΎ Π½Π°ΡΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π½ΠΎΠ²ΠΈ Π½Π΅ΡΠ° Π²ΠΈΠ½Π°Π³ΠΈ Π΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠΎ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΠΌΠ΅ ΡΠ΅ΠΌΠΈΠ½Π°Ρ Π·Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΎ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° Red Hat Enterprise Linux 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
ΠΠ°ΡΠΎ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° ΠΌΠΎΠ΄ΡΠ»ΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π° Langdon, ΠΈ Π½Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ pip3? ΠΠ°ΡΠΎ ΡΠ΅ ΠΈΠΌΠ° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ ΠΏΡΠ΅Π΄ΡΡΠΎΡΡΠ°ΡΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ, ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π΅, ΡΠ΅ Ansible ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ pip, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΌΠΎΠ΄ΡΠ»ΡΡ pip Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° virtualenvs Ρ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ pip ΡΠ°ΠΉΠ».
Π‘ ΡΠ°Π±ΠΎΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ Π½Π° python3 Π½Π° Π²Π°ΡΠ΅ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅ Ρ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΠΎΠ½Π½ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° Django ΠΈ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΡΠ°Π±ΠΎΡΠ΅ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π°Π΅Π΄Π½ΠΎ Ρ Π΄ΡΡΠ³ΠΈΡΠ΅ Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ. Π ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅. Π’ΡΠΊ Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½Π° Π΅Π΄Π½Π° Π²Π΅ΡΡΠΈΡ, Π½ΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ.
ΠΠΈΠ΅ ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Π²Π΅ΡΡΠΈΠΈΡΠ΅ Π½Π° PostgreSQL ΠΈ Nginx, Π½Π°Π»ΠΈΡΠ½ΠΈ Π² RHEL 8 ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Yum.
sudo yum install nginx postgresql-server
PostgreSQL ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° psycopg2, Π½ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π΅ Π½Π°Π»ΠΈΡΠ΅Π½ ΡΠ°ΠΌΠΎ Π²ΡΠ² Π²ΠΈΡΡΡΠ°Π»Π½Π° ΡΡΠ΅Π΄Π°, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅ Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° 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, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Ρ ΠΏΠ°ΠΊΠ΅ΡΠ° 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.
ΠΠ°Π΄Π°ΡΠ°ΡΠ° Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π½Π° ΡΠ»ΡΠ·Π° Π½Π° ΡΠ΅Π± ΡΡΡΠ²ΡΡΠ° Π΅ Π΄Π° ΠΏΡΠ΅ΠΏΡΠ°ΡΠ° Π·Π°ΡΠ²ΠΊΠΈ ΠΎΡ ΡΠ΅Π± ΡΡΡΠ²ΡΡΠ° ΠΊΡΠΌ ΡΠ΅Π± ΡΠ°ΠΌΠΊΠ°ΡΠ° Π½Π° Python. 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_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 ΠΈ ΡΡΠ΅ Π³ΠΎΡΠΎΠ²ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ.
ΠΡΠ΅ΡΠΊΠ° Π² Π»ΠΎΡΠΈΡ ΡΠ»ΡΠ·?
ΠΠΊΠΎ Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ Π°Π΄ΡΠ΅ΡΠ° Π² Π±ΡΠ°ΡΠ·ΡΡΠ° ΡΠΈ, Π½Π°ΠΉ-Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠ° 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 Π² Π½Π°ΡΠ°ΡΠ° ΡΡΠ΅Π΄Π° virtualenv, Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π·Π° Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΡΠ°Π±ΠΎΡΠ½ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅. Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΠΌΠ°ΡΠΊΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Π·ΠΈ Π΄Π²Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌΠΈ ΡΠ°ΠΉΠ»Π° ΠΈ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ Π΄Π°Π»ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΎΡΠ²ΠΎΡΠΈΠΌ Π½Π°ΡΠ°ΡΠ° ΡΠ΅ΡΡΠΎΠ²Π° ΡΡΡΠ°Π½ΠΈΡΠ° Π½Π° 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, Π·Π° Π΄Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅, Π΄Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΈΠ»ΠΈ Π΄ΠΎΡΠΈ Π΄Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΡΠ°Π·ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com