เชตเชฐเซเช•เชถเซ‹เชช RHEL 8 เชฌเซ€เชŸเชพ: เช•เชพเชฐเซเชฏเชฐเชค เชตเซ‡เชฌ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธเชจเซเช‚ เชจเชฟเชฐเซเชฎเชพเชฃ

RHEL 8 เชฌเซ€เชŸเชพ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เชจเซ‡ เช˜เชฃเซ€ เชจเชตเซ€ เชธเซเชตเชฟเชงเชพเช“ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡เชจเซ€ เชธเซ‚เชšเชฟ เชชเซƒเชทเซเช เซ‹ เชฒเชˆ เชถเช•เซ‡ เช›เซ‡, เชœเซ‹ เช•เซ‡, เชจเชตเซ€ เชตเชธเซเชคเซเช“ เชถเซ€เช–เชตเซ€ เชนเช‚เชฎเซ‡เชถเชพ เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เชตเชงเซ เชธเชพเชฐเซ€ เช›เซ‡, เชคเซ‡เชฅเซ€ เชจเซ€เชšเซ‡ เช…เชฎเซ‡ เช–เชฐเซ‡เช–เชฐ Red Hat Enterprise Linux 8 เชฌเซ€เชŸเชพ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เชฌเชจเชพเชตเชตเชพ เชชเชฐ เชตเชฐเซเช•เชถเซ‹เชช เช“เชซเชฐ เช•เชฐเซ€เช เช›เซ€เช.

เชตเชฐเซเช•เชถเซ‹เชช RHEL 8 เชฌเซ€เชŸเชพ: เช•เชพเชฐเซเชฏเชฐเชค เชตเซ‡เชฌ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธเชจเซเช‚ เชจเชฟเชฐเซเชฎเชพเชฃ

เชšเชพเชฒเซ‹ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เชฎเชพเช‚ เชฒเซ‹เช•เชชเซเชฐเชฟเชฏ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชฒเซ‡เช‚เช—เซเชตเซ‡เชœ เชชเชพเชฏเชฅเซ‹เชจเชจเซ‡ เช†เชงเชพเชฐ เชคเชฐเซ€เช•เซ‡ เชฒเชˆเช, Django เช…เชจเซ‡ PostgreSQL, เชเชชเซเชฒเซ€เช•เซ‡เชถเชจ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชเช•เชฆเชฎ เชธเชพเชฎเชพเชจเซเชฏ เชธเช‚เชฏเซ‹เชœเชจ, เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ€ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ RHEL 8 Beta เชจเซ‡ เช—เซ‹เช เชตเซ€เช. เชชเช›เซ€ เช…เชฎเซ‡ เชฅเซ‹เชกเชพ เชตเชงเซ (เช…เชตเชฐเซเช—เซ€เช•เซƒเชค) เช˜เชŸเช•เซ‹ เช‰เชฎเซ‡เชฐเซ€เชถเซเช‚.

เชชเชฐเซ€เช•เซเชทเชฃ เชตเชพเชคเชพเชตเชฐเชฃ เชฌเชฆเชฒเชพเชถเซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เช“เชŸเซ‹เชฎเซ‡เชถเชจเชจเซ€ เชถเช•เซเชฏเชคเชพเช“เชจเซเช‚ เช…เชจเซเชตเซ‡เชทเชฃ เช•เชฐเชตเซเช‚, เช•เชจเซเชŸเซ‡เชจเชฐ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เช…เชจเซ‡ เชฌเชนเซเชตเชฟเชง เชธเชฐเซเชตเชฐเซเชธ เชธเชพเชฅเซ‡ เชชเชฐเซเชฏเชพเชตเชฐเชฃเชจเซ‡ เช…เชœเชฎเชพเชตเชตเชพเชจเซเช‚ เชฐเชธเชชเซเชฐเชฆ เช›เซ‡. เชจเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชธเชพเชฅเซ‡ เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเซ‡ เชนเชพเชฅเชฅเซ€ เชเช• เชจเชพเชจเซ‹, เชธเชฐเชณ เชชเซเชฐเซ‹เชŸเซ‹เชŸเชพเช‡เชช เชฌเชจเชพเชตเซ€เชจเซ‡ เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เชœเซ‡เชฅเซ€ เชคเชฎเซ‡ เชฌเชฐเชพเชฌเชฐ เชœเซ‹เชˆ เชถเช•เซ‹ เช•เซ‡ เชถเซเช‚ เชฅเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เชชเช›เซ€ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เชฐเชตเชพ เช…เชจเซ‡ เชตเชงเซ เชœเชŸเชฟเชฒ เช—เซ‹เช เชตเชฃเซ€เช“ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช†เช—เชณ เชตเชงเซ‹. เช†เชœเซ‡ เช†เชชเชฃเซ‡ เช†เชตเชพ เชชเซเชฐเซ‹เชŸเซ‹เชŸเชพเช‡เชชเชจเซ€ เชฐเชšเชจเชพ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช.

เชšเชพเชฒเซ‹ เช†เชฐเชเชšเชˆเชเชฒ 8 เชฌเซ€เชŸเชพ เชตเซ€เชเชฎ เชˆเชฎเซ‡เชœ เชœเชฎเชพเชตเซ€เชจเซ‡ เชถเชฐเซ‚เช†เชค เช•เชฐเซ€เช. เชคเชฎเซ‡ เชถเชฐเซ‚เช†เชคเชฅเซ€ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เช…เชฅเชตเชพ เชคเชฎเชพเชฐเชพ เชฌเซ€เชŸเชพ เชธเชฌเซเชธเซเช•เซเชฐเชฟเชชเซเชถเชจ เชธเชพเชฅเซ‡ เช‰เชชเชฒเชฌเซเชง KVM เช—เซ‡เชธเซเชŸ เชˆเชฎเซ‡เชœเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชฎเชนเซ‡เชฎเชพเชจ เชˆเชฎเซ‡เชœเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เชคเชฎเชพเชฐเซ‡ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชธเซ€เชกเซ€เชจเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡ เช•เซ‡ เชœเซ‡เชฎเชพเช‚ เชฎเซ‡เชŸเชพเชกเซ‡เชŸเชพ เช…เชจเซ‡ เชฎเซ‡เชŸเชพเชกเซ‡เชŸเชพเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชถเซ‡ (เช•เซเชฒเชพเช‰เชก-เชˆเชจเชฟเชŸ). เชคเชฎเชพเชฐเซ‡ เชกเชฟเชธเซเช• เชธเซเชŸเซเชฐเช•เซเชšเชฐ เช…เชฅเชตเชพ เช‰เชชเชฒเชฌเซเชง เชชเซ‡เช•เซ‡เชœเซ‹ เชธเชพเชฅเซ‡ เช•เช‚เชˆ เช–เชพเชธ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€; เช•เซ‹เชˆเชชเชฃ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เช•เชฐเชถเซ‡.

เชšเชพเชฒเซ‹ เชธเชฎเช—เซเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชชเชฐ เชจเชœเซ€เช•เชฅเซ€ เชจเชœเชฐ เช•เชฐเซ€เช.

Django เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

Django เชจเชพ เชจเชตเซ€เชจเชคเชฎ เชธเช‚เชธเซเช•เชฐเชฃ เชธเชพเชฅเซ‡, เชคเชฎเชพเชฐเซ‡ Python 3.5 เช…เชฅเชตเชพ เชชเช›เซ€เชจเชพ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชชเชฐเซเชฏเชพเชตเชฐเชฃ (virtualenv) เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. เชฌเซ€เชŸเชพ เชจเซ‹เช‚เชงเซ‹เชฎเชพเช‚ เชคเชฎเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹ เช•เซ‡ เชชเชพเชฏเชฅเซ‹เชจ 3.6 เช‰เชชเชฒเชฌเซเชง เช›เซ‡, เชšเชพเชฒเซ‹ เชคเชชเชพเชธเซ€เช เช•เซ‡ เช† เช–เชฐเซ‡เช–เชฐ เช•เซ‡เชธ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ:

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

Red Hat เชธเช•เซเชฐเชฟเชฏเชชเชฃเซ‡ RHEL เชฎเชพเช‚ เชธเชฟเชธเซเชŸเชฎ เชŸเซ‚เชฒเช•เซ€เชŸ เชคเชฐเซ€เช•เซ‡ เชชเชพเชฏเชฅเซ‹เชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เชคเซ‹ เชถเชพ เชฎเชพเชŸเซ‡ เช† เชชเชฐเชฟเชฃเชพเชฎ เช†เชตเซ‡ เช›เซ‡?

เชนเช•เซ€เช•เชค เช เช›เซ‡ เช•เซ‡ เช˜เชฃเชพ เชชเชพเชฏเชฅเซ‹เชจ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชนเชœเซ€ เชชเชฃ เชชเชพเชฏเชฅเซ‹เชจ 2 เชฅเซ€ เชชเชพเชฏเชฅเซ‹เชจ 2 เชฎเชพเช‚ เชธเช‚เช•เซเชฐเชฎเชฃ เชตเชฟเชถเซ‡ เชตเชฟเชšเชพเชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ‡, เชœเซเชฏเชพเชฐเซ‡ เชชเชพเชฏเชฅเซ‹เชจ 3 เชชเซ‹เชคเซ‡ เชธเช•เซเชฐเชฟเชฏ เชตเชฟเช•เชพเชธ เชนเซ‡เช เชณ เช›เซ‡, เช…เชจเซ‡ เชตเชงเซ เช…เชจเซ‡ เชตเชงเซ เชจเชตเชพ เชธเช‚เชธเซเช•เชฐเชฃเซ‹ เชธเชคเชค เชฆเซ‡เช–เชพเชˆ เชฐเชนเซเชฏเชพ เช›เซ‡. เชคเซ‡เชฅเซ€, Python เชจเซ€ เชตเชฟเชตเชฟเชง เชจเชตเซ€ เช†เชตเซƒเชคเซเชคเชฟเช“ เชฎเชพเชŸเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ‡ เชเช•เซเชธเซ‡เชธ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชธเซเชฅเชฟเชฐ เชธเชฟเชธเซเชŸเชฎ เชŸเซ‚เชฒเซเชธเชจเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเชจเซ‡ เชชเชนเซ‹เช‚เชšเซ€ เชตเชณเชตเชพ เชฎเชพเชŸเซ‡, เชธเชฟเชธเซเชŸเชฎ Python เชจเซ‡ เชจเชตเชพ เชชเซ‡เช•เซ‡เชœเชฎเชพเช‚ เช–เชธเซ‡เชกเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€ เช…เชจเซ‡ Python 2.7 เช…เชจเซ‡ 3.6 เชฌเช‚เชจเซ‡เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เชชเซ‚เชฐเซ€ เชชเชพเชกเซ€ เชนเชคเซ€. เชซเซ‡เชฐเชซเชพเชฐเซ‹ เช…เชจเซ‡ เชคเซ‡ เชถเชพ เชฎเชพเชŸเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ เชคเซ‡ เชตเชฟเชถเซ‡ เชตเชงเซ เชฎเชพเชนเชฟเชคเซ€ เช†เชฎเชพเช‚เชจเชพ เชชเซเชฐเช•เชพเชถเชจเชฎเชพเช‚ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡ เชฒเซ‡เช‚เช—เชกเชจ เชตเซเชนเชพเช‡เชŸเชจเซ‹ เชฌเซเชฒเซ‹เช— (เชฒเซ‡เช‚เช—เชกเซ‹เชจ เชตเซเชนเชพเช‡เชŸ).

เชคเซ‡เชฅเซ€, เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ Python เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชซเช•เซเชค เชฌเซ‡ เชชเซ‡เช•เซ‡เชœเซ‹ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชœเซ‡เชฎเชพเช‚ python3-pip เชจเซ‡ เชจเชฟเชฐเซเชญเชฐเชคเชพ เชคเชฐเซ€เช•เซ‡ เชถเชพเชฎเซ‡เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

sudo yum install python36 python3-virtualenv

เชถเชพ เชฎเชพเชŸเซ‡ เชฒเซ‡เช‚เช—เชกเซ‹เชจเชจเชพ เชธเซ‚เชšเชจ เชฎเซเชœเชฌ เชกเชพเชฏเชฐเซ‡เช•เซเชŸ เชฎเซ‹เชกเซเชฏเซเชฒ เช•เซ‹เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชจ เช•เชฐเชตเซ‹ เช…เชจเซ‡ pip3 เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเซเช‚? เช†เช—เชพเชฎเซ€ เช“เชŸเซ‹เชฎเซ‡เชถเชจเชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฐเชพเช–เซ€เชจเซ‡, เชคเซ‡ เชœเชพเชฃเซ€เชคเซเช‚ เช›เซ‡ เช•เซ‡ Ansible เชจเซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ pip เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡, เช•เชพเชฐเชฃ เช•เซ‡ pip เชฎเซ‹เชกเซเชฏเซเชฒ เชตเซˆเชตเชฟเชงเซเชฏเชชเซ‚เชฐเซเชฃ เชชเชพเช‡เชช เชเช•เซเชเชฟเช•เซเชฏเซเชŸเซ‡เชฌเชฒ เชธเชพเชฅเซ‡ เชตเชฐเซเชšเซเชฏเซเช…เชฒเซ‡เชจเชตเซเชธเชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเชคเซเช‚ เชจเชฅเซ€.

เชคเชฎเชพเชฐเชพ เชจเชฟเช•เชพเชฒ เชชเชฐ เช•เชพเชฐเซเชฏเชฐเชค python3 เชฆเซเชญเชพเชทเชฟเชฏเชพ เชธเชพเชฅเซ‡, เชคเชฎเซ‡ Django เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชธเชพเชฅเซ‡ เชšเชพเชฒเซ เชฐเชพเช–เซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ เช…เชฎเชพเชฐเชพ เช…เชจเซเชฏ เช˜เชŸเช•เซ‹ เชธเชพเชฅเซ‡ เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชธเชฟเชธเซเชŸเชฎ เชงเชฐเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹. เช‡เชจเซเชŸเชฐเชจเซ‡เชŸ เชชเชฐ เช˜เชฃเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชตเชฟเช•เชฒเซเชชเซ‹ เช‰เชชเชฒเชฌเซเชง เช›เซ‡. เช…เชนเซ€เช‚ เชเช• เชธเช‚เชธเซเช•เชฐเชฃ เชชเซเชฐเชธเซเชคเซเชค เช›เซ‡, เชชเชฐเช‚เชคเซ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชคเซ‡เชฎเชจเซ€ เชชเซ‹เชคเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

เช…เชฎเซ‡ Yum เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชกเชฟเชซเซ‹เชฒเซเชŸ เชฐเซ‚เชชเซ‡ RHEL 8 เชฎเชพเช‚ เช‰เชชเชฒเชฌเซเชง PostgreSQL เช…เชจเซ‡ Nginx เชตเชฐเซเชเชจ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€เชถเซเช‚.

sudo yum install nginx postgresql-server

PostgreSQL เชจเซ‡ psycopg2 เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡ เชซเช•เซเชค เชตเชฐเซเชšเซเชฏเซเช…เชฒเซ‡เชจเชต เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช‚ เชœ เช‰เชชเชฒเชฌเซเชง เชนเซ‹เชตเซเช‚ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡, เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ Django เช…เชจเซ‡ Gunicorn เชธเชพเชฅเซ‡ pip3 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€เชถเซเช‚. เชชเชฐเช‚เชคเซ เชชเชนเซ‡เชฒเชพ เช†เชชเชฃเซ‡ เชตเชฐเซเชšเซเชฏเซเช…เชฒเซ‡เชจเชต เชธเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

Django เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เชธเซเชฅเชพเชจ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชจเชพ เชตเชฟเชทเชฏ เชชเชฐ เชนเช‚เชฎเซ‡เชถเชพ เช˜เชฃเซ€ เชšเชฐเซเชšเชพ เชฅเชพเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เชœเซเชฏเชพเชฐเซ‡ เชถเช‚เช•เชพ เชนเซ‹เชฏ, เชคเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชนเช‚เชฎเซ‡เชถเชพ Linux เชซเชพเช‡เชฒเชธเชฟเชธเซเชŸเชฎ เชนเชพเชฏเชฐเชพเชฐเซเช•เซ€ เชธเซเชŸเชพเชจเซเชกเชฐเซเชก เชคเชฐเชซ เชตเชณเซ€ เชถเช•เซ‹ เช›เซ‹. เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เชเชซเชเชšเชเชธ เช•เชนเซ‡ เช›เซ‡ เช•เซ‡ /เชเชธเช†เชฐเชตเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช† เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡: "เชนเซ‹เชธเซเชŸ-เชตเชฟเชถเชฟเชทเซเชŸ เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐ เช•เชฐเชตเชพ - เชกเซ‡เชŸเชพ เช•เซ‡ เชœเซ‡ เชธเชฟเชธเซเชŸเชฎ เช‰เชคเซเชชเชจเซเชจ เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ เชตเซ‡เชฌ เชธเชฐเซเชตเชฐ เชกเซ‡เชŸเชพ เช…เชจเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซเชธ, FTP เชธเชฐเซเชตเชฐเซเชธ เชชเชฐ เชธเช‚เช—เซเชฐเชนเชฟเชค เชกเซ‡เชŸเชพ เช…เชจเซ‡ เชธเชฟเชธเซเชŸเชฎ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชเชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ." เชธเช‚เชธเซเช•เชฐเชฃเซ‹ (FHS เชฎเชพเช‚ เชฆเซ‡เช–เชพเชฏ เช›เซ‡. -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 เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฐเชพเช–เชตเชพเชจเซ€ เชเช• เชฌเชพเชฌเชค เช postgresql-setup เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช›เซ‡ เชœเซ‡ postgresql-server เชชเซ‡เช•เซ‡เชœ เชธเชพเชฅเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒ เช›เซ‡. เช† เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชคเชฎเชจเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เช เช•เซเชฒเชธเซเชŸเชฐ เชเชกเชฎเชฟเชจเชฟเชธเซเชŸเซเชฐเซ‡เชถเชจ เชธเชพเชฅเซ‡ เชธเช‚เช•เชณเชพเชฏเซ‡เชฒ เชฎเซ‚เชณเชญเซ‚เชค เช•เชพเชฐเซเชฏเซ‹ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ เช•เซเชฒเชธเซเชŸเชฐ เชชเซเชฐเชพเชฐเช‚เชญ เช…เชฅเชตเชพ เช…เชชเช—เซเชฐเซ‡เชก เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ. 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 }}',
   }
}

เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ settings.py เชซเชพเช‡เชฒเชจเซ‡ เช—เซ‹เช เชตเซเชฏเชพ เชชเช›เซ€ เช…เชจเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เช เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชธเซ‡เชŸ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชฌเชงเซเช‚ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡เชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเซ‡ เชตเชฟเช•เชพเชธ เชธเชฐเซเชตเชฐ เชถเชฐเซ‚ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชกเซ‡เชตเชฒเชชเชฎเซ‡เชจเซเชŸ เชธเชฐเซเชตเชฐ เชถเชฐเซ‚ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชกเซ‡เชŸเชพเชฌเซ‡เช เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชถเชจเชจเซ‡ เชšเช•เชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เชเชกเชฎเชฟเชจ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฌเชจเชพเชตเชตเชพเชจเซ‹ เชธเชพเชฐเซ‹ เชตเชฟเชšเชพเชฐ เช›เซ‡.

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

WSGI? เชตเชพเชˆ?

เชกเซ‡เชตเชฒเชชเชฎเซ‡เชจเซเชŸ เชธเชฐเซเชตเชฐ เชชเชฐเซ€เช•เซเชทเชฃ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เซ€ เช›เซ‡, เชชเชฐเช‚เชคเซ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เชตเซ‡เชฌ เชธเชฐเซเชตเชฐ เช—เซ‡เชŸเชตเซ‡ เชˆเชจเซเชŸเชฐเชซเซ‡เชธ (WSGI) เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เชธเชฐเซเชตเชฐ เช…เชจเซ‡ เชชเซเชฐเซ‹เช•เซเชธเซ€ เช—เซ‹เช เชตเชตเซ€ เชชเชกเชถเซ‡. เช˜เชฃเชพ เชธเชพเชฎเชพเชจเซเชฏ เชธเช‚เชฏเซ‹เชœเชจเซ‹ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, uWSGI เชธเชพเชฅเซ‡ Apache HTTPD เช…เชฅเชตเชพ Gunicorn เชธเชพเชฅเซ‡ Nginx.

เชตเซ‡เชฌ เชธเชฐเซเชตเชฐ เช—เซ‡เชŸเชตเซ‡ เชˆเชจเซเชŸเชฐเชซเซ‡เชธเชจเซเช‚ เช•เชพเชฎ เชตเซ‡เชฌ เชธเชฐเซเชตเชฐเชฎเชพเช‚เชฅเซ€ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซ‡ เชชเชพเชฏเชฅเซ‹เชจ เชตเซ‡เชฌ เชซเซเชฐเซ‡เชฎเชตเชฐเซเช• เชชเชฐ เชซเซ‹เชฐเชตเชฐเซเชก เช•เชฐเชตเชพเชจเซเช‚ เช›เซ‡. WSGI เช เชญเชฏเช‚เช•เชฐ เชญเซ‚เชคเช•เชพเชณเชจเซ‹ เช…เชตเชถเซ‡เชท เช›เซ‡ เชœเซเชฏเชพเชฐเซ‡ CGI เชเชจเซเชœเชฟเชจ เช†เชธเชชเชพเชธ เชนเชคเชพ, เช…เชจเซ‡ เช†เชœเซ‡ WSGI เช เชกเซ€ เชซเซ‡เช•เซเชŸเซ‹ เชธเซเชŸเชพเชจเซเชกเชฐเซเชก เช›เซ‡, เชตเซ‡เชฌ เชธเชฐเซเชตเชฐ เช…เชฅเชตเชพ เชชเชพเชฏเชฅเซ‹เชจ เชซเซเชฐเซ‡เชฎเชตเชฐเซเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเซ‹เชฏ. เชชเชฐเช‚เชคเซ เชคเซ‡เชจเชพ เชตเซเชฏเชพเชชเช• เช‰เชชเชฏเซ‹เช— เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เช† เชซเซเชฐเซ‡เชฎเชตเชฐเซเช• เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชนเชœเซ เชชเชฃ เช˜เชฃเซ€ เช˜เซ‹เช‚เช˜เชพเชŸ เช›เซ‡ เช…เชจเซ‡ เช˜เชฃเซ€ เชชเชธเช‚เชฆเช—เซ€เช“ เช›เซ‡. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช…เชฎเซ‡ เช—เซเชจเชฟเช•เซ‹เชฐเซเชจ เช…เชจเซ‡ Nginx เชตเชšเซเชšเซ‡ เชธเซ‹เช•เซ‡เชŸ เชฆเซเชตเชพเชฐเชพ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เชถเซเช‚.

เช† เชฌเช‚เชจเซ‡ เช˜เชŸเช•เซ‹ เชเช• เชœ เชธเชฐเซเชตเชฐ เชชเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒเชพ เชนเซ‹เชตเชพเชฅเซ€, เชšเชพเชฒเซ‹ เชจเซ‡เชŸเชตเชฐเซเช• เชธเซ‹เช•เซ‡เชŸเชจเซ‡ เชฌเชฆเชฒเซ‡ เชฏเซเชจเชฟเช•เซเชธ เชธเซ‹เช•เซ‡เชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช. เช•เซ‹เชˆเชชเชฃ เชธเช‚เชœเซ‹เช—เซ‹เชฎเชพเช‚ เช•เซ‹เชฎเซเชฏเซเชจเชฟเช•เซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชธเซ‹เช•เซ‡เชŸเชจเซ€ เช†เชตเชถเซเชฏเช•เชคเชพ เชนเซ‹เชตเชพเชฅเซ€, เชšเชพเชฒเซ‹ เชเช• เชตเชงเซ เชชเช—เชฒเซเช‚ เชฒเซ‡เชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช เช…เชจเซ‡ เชธเชฟเชธเซเชŸเชฎเชกเซ€ เชฆเซเชตเชพเชฐเชพ เช—เซเชจเชฟเช•เซ‹เชฐเซเชจ เชฎเชพเชŸเซ‡ เชธเซ‰เช•เซ‡เชŸ เชธเช•เซเชฐเชฟเชฏเช•เชฐเชฃเชจเซ‡ เช—เซ‹เช เชตเซ€เช.

เชธเซ‹เช•เซ‡เชŸ เชธเช•เซเชฐเชฟเชฏ เชธเซ‡เชตเชพเช“ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชเช•เชฆเชฎ เชธเชฐเชณ เช›เซ‡. เชชเซเชฐเชฅเชฎ, เชเช• เชฏเซเชจเชฟเชŸ เชซเชพเช‡เชฒ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชฒเชฟเชธเชจเชธเซเชŸเซเชฐเซ€เชฎ เชกเชพเชฏเชฐเซ‡เช•เซเชŸเซ€เชต เชนเซ‹เชฏ เช›เซ‡ เชœเซ‡ เชฌเชฟเช‚เชฆเซ เชชเชฐ เชจเชฟเชฐเซเชฆเซ‡เชถ เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชœเซเชฏเชพเช‚ 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;
   }
}

Systemd เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Gunicorn เชธเซ‹เช•เซ‡เชŸ เช…เชจเซ‡ Nginx เชถเชฐเซ‚ เช•เชฐเซ‹ เช…เชจเซ‡ เชคเชฎเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ เช›เซ‹.

เช–เชฐเชพเชฌ เช—เซ‡เชŸเชตเซ‡ เชญเซ‚เชฒ?

เชœเซ‹ เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚ เชธเชฐเชจเชพเชฎเซเช‚ เชฆเชพเช–เชฒ เช•เชฐเซ‹ เช›เซ‹, เชคเซ‹ เชคเชฎเชจเซ‡ เชฎเซ‹เชŸเซ‡ เชญเชพเช—เซ‡ 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

เช† เชฌเชงเซเช‚ เชŸเซ€เช•เชพ เช…เชจเซ‡ เชฒเซ‹เชนเซ€เชจเชพ เช†เช‚เชธเซเชจเซเช‚ เช•เชพเชฐเชฃ เชฌเชจเซ€ เชถเช•เซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เช† เชซเช•เซเชค เชชเซเชฐเซ‹เชŸเซ‹เชŸเชพเช‡เชชเชจเซ‡ เชกเซ€เชฌเช— เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡. เชšเชพเชฒเซ‹ เชซเช•เซเชค เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‡ เช† เชธเชฎเชธเซเชฏเชพ เช›เซ‡ เชคเซ‡เชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชšเซ‡เช•เชจเซ‡ เช…เช•เซเชทเชฎ เช•เชฐเซ€เช, เชœเซ‡เชจเชพ เชชเช›เซ€ เช…เชฎเซ‡ เชฌเชงเซเช‚ เชคเซ‡เชจเชพ เชธเซเชฅเชพเชจเซ‡ เชชเชพเช›เซเช‚ เช†เชชเซ€เชถเซเช‚.

เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚ เชชเซƒเชทเซเช เชจเซ‡ เชคเชพเชœเซเช‚ เช•เชฐเซ€เชจเซ‡ เช…เชฅเชตเชพ เช…เชฎเชพเชฐเชพ curl เช†เชฆเซ‡เชถเชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชšเชฒเชพเชตเซ€เชจเซ‡, เชคเชฎเซ‡ Django เชชเชฐเซ€เช•เซเชทเชฃ เชชเซƒเชทเซเช  เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹.

เชคเซ‡เชฅเซ€, เชฌเชงเซเช‚ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเชฐเชตเชพเชจเช—เซ€เชจเซ€ เช•เซ‹เชˆ เชธเชฎเชธเซเชฏเชพ เชจเชฅเซ€ เชคเซ‡เชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เช…เชฎเซ‡ SELinux เชซเชฐเซ€เชฅเซ€ เชธเช•เซเชทเชฎ เช•เชฐเซ€เช เช›เซ€เช.

sudo setenforce 1

เชนเซเช‚ เช…เชนเซ€เช‚ เชธเซ‡เชชเซ‹เชฒเชœเซ‡เชจ เชธเชพเชฅเซ‡ audit2allow เช…เชฅเชตเชพ เชšเซ‡เชคเชตเชฃเซ€-เช†เชงเชพเชฐเชฟเชค เชจเซ€เชคเชฟเช“ เชฌเชจเชพเชตเชตเชพ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เชถ เชจเชนเซ€เช‚, เช•เชพเชฐเชฃ เช•เซ‡ เช† เช•เซเชทเชฃเซ‡ เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชตเชพเชธเซเชคเชตเชฟเช• 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 เชจเซ‡ 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

เชœเซ‹ เชคเชฎเซ‡ เช—เซเชฏเซเชจเชฟเช•เซ‹เชฐเซเชจ เชธเซ‡เชตเชพเชจเซ€ เชธเซเชฅเชฟเชคเชฟ เชœเซ‹เชถเซ‹ เช…เชฅเชตเชพ ps เช•เชฎเชพเชจเซเชก เชšเชฒเชพเชตเซ‹ เช›เซ‹, เชคเซ‹ เชคเชฎเซ‡ เช•เซ‹เชˆเชชเชฃ เชšเชพเชฒเซ€ เชฐเชนเซ‡เชฒ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เชœเซ‹เชถเซ‹ เชจเชนเซ€เช‚. เชเชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เช—เซเชจเชฟเช•เซ‹เชฐเซเชจ เช…เชฎเชพเชฐเชพ เชตเชฐเซเชšเซเชฏเซเช…เชฒเซ‡เชจเชต เชชเชฐเซเชฏเชพเชตเชฐเชฃเชฎเชพเช‚ เชชเชพเชฏเชฅเซ‹เชจ เชฆเซเชญเชพเชทเชฟเชฏเชพเชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡, เชธเช‚เชญเชตเชคเชƒ เชตเชฐเซเช•เชฐ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซเชธ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡. เชคเซ‹ เชนเชตเซ‡ เชšเชพเชฒเซ‹ เช† เชฌเซ‡ เชเช•เซเชเชฟเช•เซเชฏเซเชŸเซ‡เชฌเชฒ เชซเชพเชˆเชฒเซ‹เชจเซ‡ เชฎเชพเชฐเซเช• เช•เชฐเซ€เช เช…เชจเซ‡ เชคเชชเชพเชธ เช•เชฐเซ€เช เช•เซ‡ เชถเซเช‚ เช†เชชเชฃเซ‡ เช†เชชเชฃเซเช‚ Django เชŸเซ‡เชธเซเชŸ เชชเซ‡เชœ เช–เซ‹เชฒเซ€ เชถเช•เซ€เช เช›เซ€เช.

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

เชจเชตเชพ เชŸเซ…เช—เชจเซ‡ เชชเชธเช‚เชฆ เช•เชฐเซ€ เชถเช•เชพเชฏ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚ เช—เซเชฏเซเชจเชฟเช•เซ‹เชฐเซเชจ เชธเซ‡เชตเชพเชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชถเชฐเซ‚ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เชคเชฐเชค เชœ เชชเซเชจเชƒเชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชฅเชตเชพ เชธเซ‡เชตเชพ เชฌเช‚เชง เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚ เชธเชพเช‡เชŸ เช–เซ‹เชฒเซ‹ เช›เซ‹ เชคเซเชฏเชพเชฐเซ‡ เชธเซ‹เช•เซ‡เชŸเชจเซ‡ เชคเซ‡เชจเซ‡ เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฆเซ‹. เชšเช•เชพเชธเซ‹ เช•เซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เช ps เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฏเซ‹เช—เซเชฏ เชฒเซ‡เชฌเชฒเซเชธ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซเชฏเชพ เช›เซ‡.

ps -efZ | grep gunicorn

เชชเช›เซ€เชฅเซ€ เชธเชพเชฎเชพเชจเซเชฏ SELinux เชชเซ‹เชฒเชฟเชธเซ€ เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เชญเซ‚เชฒเชถเซ‹ เชจเชนเซ€เช‚!

เชœเซ‹ เชคเชฎเซ‡ เช…เชคเซเชฏเชพเชฐเซ‡ AVC เชธเช‚เชฆเซ‡เชถเชพเช“ เชœเซเช“ เช›เซ‹, เชคเซ‹ เช›เซ‡เชฒเซเชฒเชพ เชธเช‚เชฆเซ‡เชถเชฎเชพเช‚ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชธเชพเชฅเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค เชฆเชฐเซ‡เช• เชตเชธเซเชคเซ เชฎเชพเชŸเซ‡ permissive=1 เช…เชจเซ‡ เชฌเชพเช•เซ€เชจเซ€ เชธเชฟเชธเซเชŸเชฎ เชฎเชพเชŸเซ‡ permissive=0 เช›เซ‡. เชœเซ‹ เชคเชฎเซ‡ เชธเชฎเชœเซ‹ เช›เซ‹ เช•เซ‡ เชตเชพเชธเซเชคเชตเชฟเช• เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เช•เชฏเชพ เชชเซเชฐเช•เชพเชฐเชจเซ€ เชเช•เซเชธเซ‡เชธเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชคเซ‹ เชคเชฎเซ‡ เช†เชตเซ€ เชธเชฎเชธเซเชฏเชพเช“เชจเซ‡ เชนเชฒ เช•เชฐเชตเชพเชจเซ‹ เชถเซเชฐเซ‡เชทเซเช  เชฎเชพเชฐเซเช— เชเชกเชชเชฅเซ€ เชถเซ‹เชงเซ€ เชถเช•เซ‹ เช›เซ‹. เชชเชฐเช‚เชคเซ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€, เชธเชฟเชธเซเชŸเชฎเชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เชฐเชพเช–เชตเซ€ เช…เชจเซ‡ Django เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซเช‚ เชธเซเชชเชทเซเชŸ, เช‰เชชเชฏเซ‹เช—เซ€ เช“เชกเชฟเชŸ เชฎเซ‡เชณเชตเชตเซเช‚ เชถเซเชฐเซ‡เชทเซเช  เช›เซ‡.

sudo ausearch -m AVC

เชฅเชฏเซเช‚!

Nginx เช…เชจเซ‡ Gunicorn WSGI เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชซเซเชฐเชจเซเชŸเชเชจเซเชก เชธเชพเชฅเซ‡ เช•เชพเชฐเซเชฏเชฐเชค Django เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฆเซ‡เช–เชพเชฏเซ‹ เช›เซ‡. เช…เชฎเซ‡ RHEL 3 เชฌเซ€เชŸเชพ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชเชฎเชพเช‚เชฅเซ€ Python 10 เช…เชจเซ‡ PostgreSQL 8 เชจเซ‡ เช—เซ‹เช เชตเซเชฏเซเช‚ เช›เซ‡. เชนเชตเซ‡ เชคเชฎเซ‡ เช†เช—เชณ เชตเชงเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ Django เชเชชเซเชฒเซ€เช•เซ‡เชถเชจ เชฌเชจเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹ (เช…เชฅเชตเชพ เชซเช•เซเชค เชœเชฎเชพเชตเชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹) เช…เชฅเชตเชพ RHEL 8 เชฌเซ€เชŸเชพเชฎเชพเช‚ เช…เชจเซเชฏ เช‰เชชเชฒเชฌเซเชง เชŸเซ‚เชฒเซเชธเชจเซเช‚ เช…เชจเซเชตเซ‡เชทเชฃ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เชœเซ‡เชฅเซ€ เช—เซ‹เช เชตเชฃเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เชฐเซ€ เชถเช•เชพเชฏ, เช•เชพเชฎเช—เซ€เชฐเซ€ เชฌเชนเซ‡เชคเชฐ เชฌเชจเชพเชตเซ€ เชถเช•เชพเชฏ เช…เชฅเชตเชพ เช† เช—เซ‹เช เชตเชฃเซ€เชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชพเช‡เช เช•เชฐเซ€ เชถเช•เชพเชฏ.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹