рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛ рдЖрд░рдПрдЪрдИрдПрд▓ 8 рдмреАрдЯрд╛: рдХрд╛рд░реНрдпрд╢реАрд▓ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг

рдЖрд░рдПрдЪрдИрдПрд▓ 8 рдмреАрдЯрд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдХрдИ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдХреА рд╕реВрдЪреА рдореЗрдВ рдкреЗрдЬ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдирдИ рдЪреАрдЬреЗрдВ рд╕реАрдЦрдирд╛ рд╣рдореЗрд╢рд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдиреАрдЪреЗ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░реЗрдб рд╣реИрдЯ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬ рд▓рд┐рдирдХреНрд╕ 8 рдмреАрдЯрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдмрдирд╛рдиреЗ рдкрд░ рдПрдХ рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВред

рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛ рдЖрд░рдПрдЪрдИрдПрд▓ 8 рдмреАрдЯрд╛: рдХрд╛рд░реНрдпрд╢реАрд▓ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг

рдЖрдЗрдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдмреАрдЪ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛, рдкрд╛рдпрдерди рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдВ, Django рдФрд░ PostgreSQL рдХрд╛ рд╕рдВрдпреЛрдЬрди, рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдпреЛрдЬрди рд╣реИ, рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП RHEL 8 рдмреАрдЯрд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред рдлрд┐рд░ рд╣рдо рдХреБрдЫ рдФрд░ (рдЕрд╡рд░реНрдЧреАрдХреГрдд) рд╕рд╛рдордЧреНрд░реА рдЬреЛрдбрд╝реЗрдВрдЧреЗред

рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рди рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛, рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдФрд░ рдХрдИ рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдПрдХ рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╣рд╛рде рд╕реЗ рдПрдХ рдЫреЛрдЯрд╛, рд╕рд░рд▓ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХреЗрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред рдЖрдЬ рд╣рдо рдРрд╕реЗ рд╣реА рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЖрдЗрдП рдЖрд░рдПрдЪрдИрдПрд▓ 8 рдмреАрдЯрд╛ рд╡реАрдПрдо рдЫрд╡рд┐ рдХреЛ рддреИрдирд╛рдд рдХрд░рдХреЗ рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВред рдЖрдк рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЕрдкрдиреЗ рдмреАрдЯрд╛ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рдХреЗрд╡реАрдПрдо рдЕрддрд┐рдерд┐ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрддрд┐рдерд┐ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рд╕реАрдбреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ рдХреНрд▓рд╛рдЙрдб рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди (рдХреНрд▓рд╛рдЙрдб-рдЗрдирд┐рдЯ) рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛ред рдЖрдкрдХреЛ рдбрд┐рд╕реНрдХ рд╕рдВрд░рдЪрдирд╛ рдпрд╛ рдЙрдкрд▓рдмреНрдз рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рдХреЛрдИ рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдЖрдЗрдП рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред

Django рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ

Django рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ Python 3.5 рдпрд╛ рдЙрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг (virtualenv) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдмреАрдЯрд╛ рдиреЛрдЯреНрд╕ рдореЗрдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Python 3.6 рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдорд▓рд╛ рд╣реИ:

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

Red Hat рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ RHEL рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдЯреВрд▓рдХрд┐рдЯ рдХреЗ рд░реВрдк рдореЗрдВ Python рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ?

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХрдИ рдкрд╛рдпрдерди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрднреА рднреА рдкрд╛рдпрдерди 2 рд╕реЗ рдкрд╛рдпрдерди 2 рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдкрд╛рдпрдерди 3 рд╕реНрд╡рдпрдВ рд╕рдХреНрд░рд┐рдп рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдзреАрди рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг рд▓рдЧрд╛рддрд╛рд░ рд╕рд╛рдордиреЗ рдЖ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрд╛рдпрдерди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реБрдП рд╕реНрдерд┐рд░ рд╕рд┐рд╕реНрдЯрдо рдЯреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рдкрд╛рдпрдерди рдХреЛ рдПрдХ рдирдП рдкреИрдХреЗрдЬ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рдФрд░ рдкрд╛рдпрдерди 2.7 рдФрд░ 3.6 рджреЛрдиреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИред рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ рд▓реИрдВрдЧрдбрди рд╡реНрд╣рд╛рдЗрдЯ рдХрд╛ рдмреНрд▓реЙрдЧ (рд▓реИрдВрдЧрдбрди рд╡реНрд╣рд╛рдЗрдЯ)ред

рддреЛ, рдкрд╛рдпрдерди рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рджреЛ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдпрдерди 3-рдкрд┐рдк рд╢рд╛рдорд┐рд▓ рд╣реИред

sudo yum install python36 python3-virtualenv

рд▓реИрдВрдЧрдбрди рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рддреНрдпрдХреНрд╖ рдореЙрдбреНрдпреВрд▓ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ рдФрд░ pip3 рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ? рдЖрдЧрд╛рдореА рд╕реНрд╡рдЪрд╛рд▓рди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ Ansible рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдк рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рдЗрдк рдореЙрдбреНрдпреВрд▓ рдХрд╕реНрдЯрдо рдкрд╛рдЗрдк рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЗ рд╕рд╛рде рд╡рд░реНрдЪреБрдЕрд▓рдПрдиреНрд╡реНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ Python3 рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд╕рд╛рде, рдЖрдк Django рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдп рдкреНрд░рдгрд╛рд▓реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдпрд╣рд╛рдВ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдо Yum рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ RHEL 8 рдореЗрдВ рдЙрдкрд▓рдмреНрдз PostgreSQL рдФрд░ Nginx рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗред

sudo yum install nginx postgresql-server

PostgreSQL рдХреЛ psycopg2 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╡рд░реНрдЪреБрдЕрд▓рдПрдиреНрд╡ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ Django рдФрд░ Gunicorn рдХреЗ рд╕рд╛рде pip3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓рдПрдиреНрд╡ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

Django рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрдЧрд╣ рдЪреБрдирдиреЗ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рд╣рдореЗрд╢рд╛ рдмрд╣реБрдд рдмрд╣рд╕ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд╕рдВрджреЗрд╣ рд╣реЛ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рд▓рд┐рдирдХреНрд╕ рдлрд╛рдЗрд▓рд╕рд┐рд╕реНрдЯрдо рдкрджрд╛рдиреБрдХреНрд░рдо рдорд╛рдирдХ рдХреА рдУрд░ рд░реБрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдПрдлрдПрдЪрдПрд╕ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ /srv рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: "рд╣реЛрд╕реНрдЯ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ - рдбреЗрдЯрд╛ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдбреЗрдЯрд╛ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдПрдлрд╝рдЯреАрдкреА рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛, рдФрд░ рд╕рд┐рд╕реНрдЯрдо рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред" рд╕рдВрд╕реНрдХрд░рдг (рдПрдлрдПрдЪрдПрд╕ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВ) -2.3 рдореЗрдВ 2004)ред"

рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╣рдорд╛рд░рд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬрд╝ /srv рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдХреНрд▓рд╛рдЙрдб-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛) рдХреЗ рдкрд╛рд╕ рд╣реИред

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 рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдзреНрдпрд╛рди рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдПрдХ рдмрд╛рдд рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕реНрдХреНрд▓-рд╕реЗрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬреЛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕реНрдХреНрд▓-рд╕рд░реНрд╡рд░ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдЗрдВрд╕реНрдЯреЙрд▓ рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдкреНрд░рд╢рд╛рд╕рди рд╕реЗ рдЬреБрдбрд╝реЗ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИ, рдЬреИрд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдЖрд░рдВрднреАрдХрд░рдг рдпрд╛ рдЕрдкрдЧреНрд░реЗрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ред RHEL рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдПрдХ рдирдпрд╛ PostgreSQL рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

sudo /usr/bin/postgresql-setup -initdb

рдлрд┐рд░ рдЖрдк systemd рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ PostgreSQL рдкреНрд░рд╛рд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ Django рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рд╕реНрдЯреЛрд░реЗрдЬ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ (рдЖрдорддреМрд░ рдкрд░ pg_hba.conf) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж PostgreSQL рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдиреНрдп рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рдЖрддреА рд╣реИрдВ, рддреЛ pg_hba.conf рдлрд╝рд╛рдЗрд▓ рдореЗрдВ IPv4 рдФрд░ IPv6 рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрджрд▓рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

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 }}',
   }
}

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕рд╣реЛрдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдХрд╛рд╕ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

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

рдбрдмреНрд▓реВрдПрд╕рдЬреАрдЖрдИ? рд╡рд╛рдИ?

рд╡рд┐рдХрд╛рд╕ рд╕рд░реНрд╡рд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдЧреЗрдЯрд╡реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдбрдмреНрд▓реВрдПрд╕рдЬреАрдЖрдИ) рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╕рд░реНрд╡рд░ рдФрд░ рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХрдИ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдпреЛрдЬрди рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, uWSGI рдХреЗ рд╕рд╛рде Apache HTTPD рдпрд╛ Gunicorn рдХреЗ рд╕рд╛рде Nginxред

рд╡реЗрдм рд╕рд░реНрд╡рд░ рдЧреЗрдЯрд╡реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рдо рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╕реЗ рдкрд╛рдпрдерди рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рддрдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИред рдбрдмреНрд▓реВрдПрд╕рдЬреАрдЖрдИ рдЙрд╕ рднрдпрд╛рдирдХ рдЕрддреАрдд рдХрд╛ рдЕрд╡рд╢реЗрд╖ рд╣реИ рдЬрдм рд╕реАрдЬреАрдЖрдИ рдЗрдВрдЬрди рдЖрд╕рдкрд╛рд╕ рдереЗ, рдФрд░ рдЖрдЬ рдбрдмреНрд▓реВрдПрд╕рдЬреАрдЖрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирдХ рд╣реИ, рднрд▓реЗ рд╣реА рд╡реЗрдм рд╕рд░реНрд╡рд░ рдпрд╛ рдкрд╛рдпрдерди рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЗрди рдврд╛рдБрдЪреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЕрднреА рднреА рдХрдИ рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ рдФрд░ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдПрдХ рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреБрдирд┐рдХреЙрд░реНрди рдФрд░ рдиреЗрдЧреНрдиреЗрдХреНрд╕ рдХреЗ рдмреАрдЪ рдЗрдВрдЯрд░реИрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред

рдЪреВрдБрдХрд┐ рдпреЗ рджреЛрдиреЛрдВ рдШрдЯрдХ рдПрдХ рд╣реА рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВ, рдЖрдЗрдП рдиреЗрдЯрд╡рд░реНрдХ рд╕реЙрдХреЗрдЯ рдХреЗ рдмрдЬрд╛рдп UNIX рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЪреВрдВрдХрд┐ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реЙрдХреЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЖрдЗрдП рдПрдХ рдФрд░ рдХрджрдо рдЙрдард╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рд╕рд┐рд╕реНрдЯрдордб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреБрдирд┐рдХреЙрд░реНрди рдХреЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯ рд╕рдХреНрд░рд┐рдпрдг рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред

рд╕реЙрдХреЗрдЯ рд╕рдХреНрд░рд┐рдп рд╕реЗрд╡рд╛рдПрдБ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдпреВрдирд┐рдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд▓рд┐рд╕рдирд╕реНрдЯреНрд░реАрдо рдирд┐рд░реНрджреЗрд╢ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рдмрд┐рдВрджреБ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ UNIX рд╕реЙрдХреЗрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдлрд┐рд░ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдпреВрдирд┐рдЯ рдлрд╝рд╛рдЗрд▓ рдЬрд┐рд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрджреЗрд╢ рд╕реЙрдХреЗрдЯ рдпреВрдирд┐рдЯ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ред рдлрд┐рд░, рд╕рд░реНрд╡рд┐рд╕ рдпреВрдирд┐рдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ рдЧреБрдирд┐рдХреЙрд░реНрди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдФрд░ UNIX рд╕реЙрдХреЗрдЯ рдФрд░ Django рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП WSGI рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рдирд╛ рдмрд╛рдХреА рд╣реИред

рдпрд╣рд╛рдВ рдпреВрдирд┐рдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рд╕реЙрдХреЗрдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

[Unit]
Description=Gunicorn WSGI socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

рдЕрдм рдЖрдкрдХреЛ рдЧреБрдирд┐рдХреЙрд░реНрди рдбреЗрдореЙрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

рд╕рд┐рд╕реНрдЯрдордбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреБрдирд┐рдХреЙрд░реНрди рд╕реЙрдХреЗрдЯ рдФрд░ рдиреЗрдЧреНрдиреЗрдХреНрд╕ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ рдФрд░ рдЖрдк рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред

рдЦрд╝рд░рд╛рдм рдЧреЗрдЯрд╡реЗ рддреНрд░реБрдЯрд┐?

рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкрддрд╛ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдВрднрд╡рддрдГ 502 рдЦрд╝рд░рд╛рдм рдЧреЗрдЯрд╡реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреАред рдпрд╣ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ 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"

рдпрджрд┐ рд╣рдо рд╕реАрдзреЗ рдЧреБрдирд┐рдХреЙрд░реНрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рдЙрддреНрддрд░ рдорд┐рд▓реЗрдЧрд╛ред

curl тАФunix-socket /run/gunicorn.sock 8beta1.example.com

рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ. рдпрджрд┐ рдЖрдк рд▓реЙрдЧ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдВрднрд╡рддрдГ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рдорд╕реНрдпрд╛ SELinux рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдЪреВрдБрдХрд┐ рд╣рдо рдПрдХ рдбреЗрдореЙрди рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдиреАрддрд┐ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдЗрд╕реЗ init_t рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдкрд░рдЦреЗрдВред

sudo setenforce 0

рдпрд╣ рд╕рдм рдЖрд▓реЛрдЪрдирд╛ рдФрд░ рдЦреВрди рдХреЗ рдЖрдВрд╕реВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рд╣реИред рдЖрдЗрдП рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ рдХрд┐ рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рд╕рдм рдХреБрдЫ рд╡рд╛рдкрд╕ рдЙрд╕рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд▓реМрдЯрд╛ рджреЗрдВрдЧреЗред

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреЗрдЬ рдХреЛ рд░реАрдлреНрд░реЗрд╢ рдХрд░рдХреЗ рдпрд╛ рд╣рдорд╛рд░реЗ рдХрд░реНрд▓ рдХрдорд╛рдВрдб рдХреЛ рджреЛрдмрд╛рд░рд╛ рдЪрд▓рд╛рдХрд░, рдЖрдк Django рдЯреЗрд╕реНрдЯ рдкреЗрдЬ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рдЕрдиреБрдорддрд┐ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдо SELinux рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВред

sudo setenforce 1

рдпрд╣рд╛рдВ рдСрдбрд┐рдЯ2рдЕрд▓реНрд▓реЛ рдпрд╛ рд╕реЗрдкреЛрд▓рдЬреЗрди рдХреЗ рд╕рд╛рде рдЕрд▓рд░реНрдЯ-рдЖрдзрд╛рд░рд┐рдд рдиреАрддрд┐рдпрд╛рдВ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╕рдордп рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ Django рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдмрд╛рдд рдХрд╛ рдХреЛрдИ рдкреВрд░рд╛ рдирдХреНрд╢рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреБрдирд┐рдХреЙрд░реНрди рдХрд┐рд╕ рддрдХ рдкрд╣реБрдВрдЪ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдХрд┐рд╕ рддрдХ рдкрд╣реБрдВрдЪ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП SELinux рдХреЛ рдЪрд╛рд▓реВ рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдФрд░ рдСрдбрд┐рдЯ рд▓реЙрдЧ рдореЗрдВ рд╕рдВрджреЗрд╢ рдЫреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдиреАрддрд┐ рдЙрдирд╕реЗ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХреЗред

рдЕрдиреБрдореЗрдп рдбреЛрдореЗрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛

рд╣рд░ рдХрд┐рд╕реА рдиреЗ SELinux рдореЗрдВ рдЕрдиреБрдордд рдбреЛрдореЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдХреЛрдИ рдирдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИрдВред рдХрдИрдпреЛрдВ рдиреЗ рддреЛ рдмрд┐рдирд╛ рд╕реЛрдЪреЗ-рд╕рдордЭреЗ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рднреА рдХрд░ рд▓рд┐рдпрд╛ред рдЬрдм рдСрдбрд┐рдЯ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдИ рдиреАрддрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рддреЛ рдмрдирд╛рдИ рдЧрдИ рдиреАрддрд┐ рд╣рд▓ рдХрд┐рдП рдЧрдП рдбреЛрдореЗрди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИред рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЕрдиреБрдорддрд┐ рдиреАрддрд┐ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рдЧреБрдирд┐рдХреЙрд░реНрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдордд рдбреЛрдореЗрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдиреАрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдЙрдкрдпреБрдХреНрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирдИ рдиреАрддрд┐рдпреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

sudo yum install selinux-policy-devel

рдЕрдиреБрдордд рдбреЛрдореЗрди рддрдВрддреНрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдЙрдкрдХрд░рдг рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдпрд╣ рдПрдХ рдХрд╕реНрдЯрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдиреАрддрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╢рд┐рдк рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдмрд╛рдд рдЖрддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧреБрдирд┐рдХреЙрд░реНрди рдХреЗ рд▓рд┐рдП рдЕрдиреБрдордд рдбреЛрдореЗрди рдиреАрддрд┐ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд╣реЛрдЧреА - рдПрдХ рдореБрдЦреНрдп рдкреНрд░рдХрд╛рд░ (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 рдХреЛ Gunicorn рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдпреБрдХреНрдд UNIX рд╕реЙрдХреЗрдЯ рдкрд░ рдбреЗрдЯрд╛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдиреАрддрд┐рдпрд╛рдВ рдмрджрд▓рдиреЗ рд▓рдЧрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдЧреЗ рдЕрдиреНрдп рдЪреБрдиреМрддрд┐рдпрд╛рдБ рднреА рд╣реЛрддреА рд╣реИрдВред рдЖрдк рдбреЛрдореЗрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдз рдбреЛрдореЗрди рд╕реЗ рдЕрдиреБрдорддрд┐ рдбреЛрдореЗрди рдореЗрдВ рднреА рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм 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

рдпрджрд┐ рдЖрдк рдЧрдирд┐рдХреЛрд░реНрди рд╕реЗрд╡рд╛ рдХреА рд╕реНрдерд┐рддрд┐ рджреЗрдЦрддреЗ рд╣реИрдВ рдпрд╛ рдкреАрдПрд╕ рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреЛрдИ рднреА рдЪрд╛рд▓реВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрдирд┐рдХреЛрд░реНрди рд╕рдВрднрд╡рддрдГ рд╡рд░реНрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд╡рд░реНрдЪреБрдЕрд▓рдПрдиреНрд╡ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкрд╛рдпрдерди рджреБрднрд╛рд╖рд┐рдпрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рддреЛ рдЕрдм рдЖрдЗрдП рдЗрди рджреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЕрдкрдирд╛ Django рдкрд░реАрдХреНрд╖рдг рдкреГрд╖реНрда рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред

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

рдирдП рдЯреИрдЧ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЧрдирд┐рдХреЛрд░реНрди рд╕реЗрд╡рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдЗрд╕реЗ рддреБрд░рдВрдд рдкреБрдирдГ рдкреНрд░рд╛рд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╕реЗрд╡рд╛ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕рд╛рдЗрдЯ рдЦреЛрд▓рдиреЗ рдкрд░ рд╕реЙрдХреЗрдЯ рдХреЛ рдЗрд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ ps рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╣реА рд▓реЗрдмрд▓ рдкреНрд░рд╛рдкреНрдд рд╣реБрдП рд╣реИрдВред

ps -efZ | grep gunicorn

рдмрд╛рдж рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп SELinux рдиреАрддрд┐ рдмрдирд╛рдирд╛ рди рднреВрд▓реЗрдВ!

рдпрджрд┐ рдЖрдк рдЕрдм рдПрд╡реАрд╕реА рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЕрдВрддрд┐рдо рд╕рдВрджреЗрд╢ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ = 1 рдФрд░ рдмрд╛рдХреА рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ = 0 рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрджрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рддреБрд░рдВрдд рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рддрдм рддрдХ, рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрдирд╛ рдФрд░ Django рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╕реНрдкрд╖реНрдЯ, рдЙрдкрдпреЛрдЧреА рдСрдбрд┐рдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред

sudo ausearch -m AVC

рдпрд╣ рдирд┐рдХрд▓рд╛!

Nginx рдФрд░ Gunicorn WSGI рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдлреНрд░рдВрдЯрдПрдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ Django рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реИред рд╣рдордиреЗ RHEL 3 рдмреАрдЯрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ Python 10 рдФрд░ PostgreSQL 8 рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ред рдЕрдм рдЖрдк рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ, рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдХрдВрдЯреЗрдирд░реАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Django рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ рдмрд╕ рддреИрдирд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдпрд╛ рдЖрд░рдПрдЪрдИрдПрд▓ 8 рдмреАрдЯрд╛ рдореЗрдВ рдЕрдиреНрдп рдЙрдкрд▓рдмреНрдз рдЯреВрд▓ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ