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
ΠΠΎΡΡΠΎ Π΄Π° Π½Π΅ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΈ ΠΏΠΎΠ²ΠΈΡΠΈ Π½Π° ΠΌΠΎΠ΄ΡΠ» ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π° ΠΠ°Π½Π³Π΄ΠΎΠ½ ΠΈ Π΄Π° Π½Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ 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