เบเบญเบ‡เบ›เบฐเบŠเบธเบก RHEL 8 Beta: เบเบฒเบ™เบชเป‰เบฒเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป€เบงเบฑเบšเป„เบŠเบ•เปŒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบ

RHEL 8 Beta เบชเบฐเป€เบซเบ™เบตเปƒเบซเป‰เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เปƒเบซเบกเปˆเบซเบผเบฒเบ, เบฅเบฒเบเบŠเบทเปˆเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบญเบปเบฒเบซเบ™เป‰เบฒ, เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบเบฒเบ™เบฎเบฝเบ™เบฎเบนเป‰เบชเบดเปˆเบ‡เปƒเบซเบกเปˆเปเบกเปˆเบ™เบชเบฐเป€เบซเบกเบตเป„เบ›เบ—เบตเปˆเบ”เบตเบเบงเปˆเบฒเปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเบฐเป€เบซเบ™เบตเบเบญเบ‡เบ›เบฐเบŠเบธเบกเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ Red Hat Enterprise Linux 8 Beta.

เบเบญเบ‡เบ›เบฐเบŠเบธเบก RHEL 8 Beta: เบเบฒเบ™เบชเป‰เบฒเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป€เบงเบฑเบšเป„เบŠเบ•เปŒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบ

เปƒเบซเป‰เป€เบญเบปเบฒ Python, เบžเบฒเบชเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบ—เบตเปˆเบ™เบดเบเบปเบกเปƒเบ™เบšเบฑเบ™เบ”เบฒเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ, เป€เบ›เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™, เบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบ‚เบญเบ‡ Django เปเบฅเบฐ PostgreSQL, เบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบ—เบตเปˆเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ—เบปเปˆเบงเป„เบ›เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เปเบฅเบฐ configure RHEL 8 Beta เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบžเบงเบเป€เบ‚เบปเบฒ. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบžเบตเปˆเบกเบชเปˆเบงเบ™เบ›เบฐเบเบญเบš (เบšเปเปˆเป„เบ”เป‰เบˆเบฑเบ”เบ›เบฐเป€เบžเบ”) เบ•เบทเปˆเบกเบญเบตเบ.

เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบˆเบฐเบ›เปˆเบฝเบ™เปเบ›เบ‡, เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบ„เบปเป‰เบ™เบซเบฒเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เบญเบ‡เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”, เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบšเบฑเบ™เบˆเบธเปเบฅเบฐเบžเบฐเบเบฒเบเบฒเบกเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเบกเบตเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบซเบผเบฒเบ. เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป‚เบ„เบ‡เบเบฒเบ™เปƒเบซเบกเปˆ, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบปเป‰เบ™เปเบšเบšเบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ, เบ‡เปˆเบฒเบเบ”เบฒเบเบ”เป‰เบงเบเบกเบทเป€เบžเบทเปˆเบญเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เบŠเบฑเบ”เป€เบˆเบ™เบงเปˆเบฒเบชเบดเปˆเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เป€เบเบตเบ”เบ‚เบถเป‰เบ™เปเบฅเบฐเบกเบฑเบ™เป‚เบ•เป‰เบ•เบญเบšเปเบ™เบงเปƒเบ”, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเป‰เบฒเบเป„เบ›เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปเบฅเบฐเบชเป‰เบฒเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ. เบกเบทเป‰เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เป€เบงเบปเป‰เบฒเป€เบ–เบดเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เปเบšเบšเบ•เบปเป‰เบ™เปเบšเบšเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง.

เบกเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบฎเบนเบš RHEL 8 Beta VM. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป€เบ„เบทเปˆเบญเบ‡ virtual เบ•เบฑเป‰เบ‡เปเบ•เปˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบซเบผเบทเปƒเบŠเป‰เบฎเบนเบšเบžเบฒเบšเปเบ‚เบ KVM เบ—เบตเปˆเบกเบตเบขเบนเปˆเบเบฑเบšเบเบฒเบ™เบชเบฐเบซเบกเบฑเบเป€เบšเบ•เป‰เบฒเบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เป€เบกเบทเปˆเบญเปƒเบŠเป‰เบฎเบนเบšเบžเบฒเบšเปเบ‚เบ, เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ CD virtual เบ—เบตเปˆเบˆเบฐเบ›เบฐเบเบญเบšเบ”เป‰เบงเบ metadata เปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เบœเบนเป‰เปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ„เบฅเบฒเบง (cloud-init). เบ—เปˆเบฒเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบซเบเบฑเบ‡เบžเบดเป€เบชเบ”เบเบฑเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เปเบœเปˆเบ™เบซเบผเบทเบŠเบธเบ”เบ—เบตเปˆเบกเบตเบขเบนเปˆ;

เบ‚เปเปƒเบซเป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบขเปˆเบฒเบ‡เบฅเบฐเบญเบฝเบ”เบเปˆเบฝเบงเบเบฑเบšเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”.

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Django

เบ”เป‰เบงเบ Django เบฎเบธเปˆเบ™เปƒเบซเบกเปˆเบ—เบตเปˆเบชเบธเบ”, เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบกเบตเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก virtual (virtualenv) เบเบฑเบš Python 3.5 เบซเบผเบทเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™. เปƒเบ™เบšเบฑเบ™เบ—เบถเบ Beta เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เบงเปˆเบฒ Python 3.6 เปเบกเปˆเบ™เบกเบตเบขเบนเปˆ, เปƒเบซเป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡:

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

Red Hat เปƒเบŠเป‰ Python เบขเปˆเบฒเบ‡เบˆเบดเบ‡เบˆเบฑเบ‡เป€เบ›เบฑเบ™เบŠเบธเบ”เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบฅเบฐเบšเบปเบšเปƒเบ™ RHEL, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ™เบตเป‰เป€เบ›เบฑเบ™เบซเบเบฑเบ‡?

เบ„เบงเบฒเบกเบˆเบดเบ‡เปเบฅเป‰เบงเปเบกเปˆเบ™เบงเปˆเบฒเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Python เบซเบผเบฒเบเบ„เบปเบ™เบเบฑเบ‡เบ„เบดเบ”เป€เบ–เบดเบ‡เบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™เบˆเบฒเบ Python 2 เป„เบ› Python 2, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆ Python 3 เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เปเบกเปˆเบ™เบขเบนเปˆเบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบขเปˆเบฒเบ‡เบซเป‰เบฒเบงเบซเบฑเบ™, เปเบฅเบฐเบชเบฐเบšเบฑเบšเปƒเบซเบกเปˆเป†เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบžเบทเปˆเบญเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบฅเบฐเบšเบปเบšเบ—เบตเปˆเบซเบกเบฑเป‰เบ™เบ„เบปเบ‡เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบชเบฐเป€เบซเบ™เบตเปƒเบซเป‰เบœเบนเป‰เปƒเบŠเป‰เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ Python เบฎเบธเปˆเบ™เปƒเบซเบกเปˆเบ•เปˆเบฒเบ‡เป†, เบฅเบฐเบšเบปเบš Python เป„เบ”เป‰เบ–เบทเบเบเป‰เบฒเบเป„เบ›เบขเบนเปˆเปƒเบ™เบŠเบธเบ”เปƒเบซเบกเปˆเปเบฅเบฐเบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ—เบฑเบ‡ Python 2.7 เปเบฅเบฐ 3.6. เบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปเบฅเบฐเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบžเบงเบเบกเบฑเบ™เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เปƒเบ™เบเบฒเบ™เบžเบดเบกเปƒเบ™ blog เบ‚เบญเบ‡ Langdon White (Langdon White).

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰ Python เป€เบฎเบฑเบ”เบงเบฝเบ, เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบชเบญเบ‡เปเบžเบฑเบเป€เบเบฑเบ”, เป‚เบ”เบเบกเบต python3-pip เบฅเบงเบกเป€เบ›เบฑเบ™ dependency.

sudo yum install python36 python3-virtualenv

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบˆเบถเปˆเบ‡เบšเปเปˆเปƒเบŠเป‰เบเบฒเบ™เป‚เบ—เป‚เบกเบ”เบนเบ™เป‚เบ”เบเบเบปเบ‡เบ•เบฒเบกเบ—เบตเปˆ Langdon เปเบ™เบฐเบ™เปเบฒเปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡ pip3? เบเบฒเบ™เบฎเบฑเบเบชเบฒเบขเบนเปˆเปƒเบ™เปƒเบˆเบ‚เบญเบ‡เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ—เบตเปˆเบˆเบฐเบกเบฒเป€เบ–เบดเบ‡, เบกเบฑเบ™เป€เบ›เบฑเบ™เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเบงเปˆเบฒ Ansible เบˆเบฐเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ pip เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเป‚เบกเบ”เบนเบ™ pip เบšเปเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ virtualenvs เบ—เบตเปˆเบกเบต pip เบเปเบฒเบ™เบปเบ”เป€เบญเบ‡เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰.

เบ”เป‰เบงเบเบ™เบฒเบเบžเบฒเบชเบฒ python3 เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบเบฒเบ™เบเปเบฒเบˆเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบทเบšเบ•เปเปˆเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Django เปเบฅเบฐเบกเบตเบฅเบฐเบšเบปเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบžเป‰เบญเบกเบเบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเบญเบทเปˆเบ™เป†เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบกเบตเบซเบผเบฒเบเบ—เบฒเบ‡เป€เบฅเบทเบญเบเปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”. เบกเบตเบชเบฐเบšเบฑเบšเบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰, เปเบ•เปˆเบœเบนเป‰เปƒเบŠเป‰เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡.

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เป€เบงเบตเบŠเบฑเบ™ PostgreSQL เปเบฅเบฐ Nginx เบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™ RHEL 8 เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป‚เบ”เบเปƒเบŠเป‰ Yum.

sudo yum install nginx postgresql-server

PostgreSQL เบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™ psycopg2, เปเบ•เปˆเบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบกเบตเบขเบนเปˆเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก virtualenv เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰ pip3 เบžเป‰เบญเบกเบเบฑเบš Django เปเบฅเบฐ Gunicorn. เปเบ•เปˆเบ—เปเบฒเบญเบดเบ”เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ virtualenv.

เบกเบตเบเบฒเบ™เป‚เบ•เป‰เบงเบฒเบ—เบตเป€เบฅเบทเป‰เบญเบเป†เบเปˆเบฝเบงเบเบฑเบšเบซเบปเบงเบ‚เปเป‰เบ‚เบญเบ‡เบเบฒเบ™เป€เบฅเบทเบญเบเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเปƒเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ„เบ‡เบเบฒเบ™ Django, เปเบ•เปˆเป€เบกเบทเปˆเบญเบชเบปเบ‡เปƒเบช, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบซเบฑเบ™เป„เบ›เบซเบฒ Linux Filesystem Hierarchy Standard. เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, FHS เบเปˆเบฒเบงเบงเปˆเบฒ / srv เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญ: "เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เบชเบฐเป€เบžเบฒเบฐเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบžเบฒเบš - เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบฅเบฐเบšเบปเบšเบœเบฐเบฅเบดเบ”, เป€เบŠเบฑเปˆเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบŠเบตเบŸเป€เบงเบตเป€เบงเบฑเบšเปเบฅเบฐเบชเบฐเบ„เบดเบš, เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ FTP, เปเบฅเบฐเบฅเบฐเบšเบปเบšเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ (เบ›เบฐเบเบปเบ”เบขเบนเปˆเปƒเบ™ FHS -2.3 เปƒเบ™เบ›เบต 2004).

เบ™เบตเป‰เปเบกเปˆเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบ—เป‰เป†, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ / srv, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เป‚เบ”เบเบœเบนเป‰เปƒเบŠเป‰เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ (cloud-user).

sudo mkdir /srv/djangoapp
sudo chown cloud-user:cloud-user /srv/djangoapp
cd /srv/djangoapp
virtualenv django
source django/bin/activate
pip3 install django gunicorn psycopg2
./django-admin startproject djangoapp /srv/djangoapp

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ PostgreSQL เปเบฅเบฐ Django เปเบกเปˆเบ™เบ‡เปˆเบฒเบ: เบชเป‰เบฒเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เบชเป‰เบฒเบ‡เบœเบนเป‰เปƒเบŠเป‰, เบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”. เบชเบดเปˆเบ‡เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เบˆเบทเปˆเป„เบงเป‰เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ PostgreSQL เปเบกเปˆเบ™ script postgresql-setup เบ—เบตเปˆเบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบเบฑเบšเบŠเบธเบ” postgresql-server. เบชเบฐเบ„เบฃเบดเบšเบ™เบตเป‰เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบเบธเปˆเบกเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เป€เบŠเบฑเปˆเบ™: เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบเบธเปˆเบกเบซเบผเบทเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบเบปเบเบฅเบฐเบ”เบฑเบš. เป€เบžเบทเปˆเบญเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ•เบปเบงเบขเปˆเบฒเบ‡ PostgreSQL เปƒเบซเบกเปˆเปƒเบ™เบฅเบฐเบšเบปเบš RHEL, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡:

sudo /usr/bin/postgresql-setup -initdb

เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบก PostgreSQL เป‚เบ”เบเปƒเบŠเป‰ systemd, เบชเป‰เบฒเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เปเบฅเบฐเบ•เบฑเป‰เบ‡เป‚เบ„เบ‡เบเบฒเบ™เปƒเบ™ Django. เบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒเบˆเบฐเบ›เบดเบ”เป€เบ›เบตเบ” PostgreSQL เบ„เบทเบ™เปƒเปเปˆเบซเบผเบฑเบ‡เบˆเบฒเบเป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบžเบดเบชเบนเบ”เบขเบทเบ™เบขเบฑเบ™เบฅเบนเบเบ‚เปˆเบฒเบ (เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบง pg_hba.conf) เป€เบžเบทเปˆเบญเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบžเบปเบšเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบญเบทเปˆเบ™เป†, เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบ›เปˆเบฝเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ IPv4 เปเบฅเบฐ IPv6 เปƒเบ™เป„เบŸเบฅเปŒ pg_hba.conf.

systemctl enable -now postgresql

sudo -u postgres psql
postgres=# create database djangoapp;
postgres=# create user djangouser with password 'qwer4321';
postgres=# alter role djangouser set client_encoding to 'utf8';
postgres=# alter role djangouser set default_transaction_isolation to 'read committed';
postgres=# alter role djangouser set timezone to 'utc';
postgres=# grant all on DATABASE djangoapp to djangouser;
postgres=# q

เปƒเบ™เป„เบŸเบฅเปŒ /var/lib/pgsql/data/pg_hba.conf:

# IPv4 local connections:
host    all        all 0.0.0.0/0                md5
# IPv6 local connections:
host    all        all ::1/128                 md5

เปƒเบ™เป„เบŸเบฅเปŒ /srv/djangoapp/settings.py:

# Database
DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.postgresql_psycopg2',
       'NAME': '{{ db_name }}',
       'USER': '{{ db_user }}',
       'PASSWORD': '{{ db_password }}',
       'HOST': '{{ db_host }}',
   }
}

เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป„เบŸเบฅเปŒ settings.py เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เปเบฅเบฐเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบžเบทเปˆเบญเปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบ. เบซเบผเบฑเบ‡เบˆเบฒเบเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ, เบกเบฑเบ™เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เบœเบนเป‰เปƒเบŠเป‰ admin เป€เบžเบทเปˆเบญเบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.

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

WSGI? เบซเบงเบฒเบ?

เป€เบŠเบตเบšเป€เบงเบตเบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบกเปˆเบ™เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš, เปเบ•เปˆเป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเปเบฒเบซเบ™เบปเบ”เบ„เปˆเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเปเบฅเบฐเบ•เบปเบงเปเบ—เบ™เบชเปเบฒเบฅเบฑเบš Web Server Gateway Interface (WSGI). เบกเบตเบซเบผเบฒเบเบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบ—เบปเปˆเบงเป„เบ›, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, Apache HTTPD เบเบฑเบš uWSGI เบซเบผเบท Nginx เบเบฑเบš Gunicorn.

เบงเบฝเบเบ‚เบญเบ‡ Web Server Gateway Interface เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบชเบปเปˆเบ‡เบ•เปเปˆเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเป„เบŠเบ•เปŒเป„เบ›เบซเบฒเบเบญเบšเป€เบงเบฑเบš Python. WSGI เป€เบ›เบฑเบ™เบ—เบตเปˆเบฅเบถเบเบฅเบฑเบšเบ‚เบญเบ‡เบญเบฐเบ”เบตเบ”เบ—เบตเปˆเบ‚เบตเป‰เบฎเป‰เบฒเบเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ CGI เบ›เบฐเบกเบฒเบ™, เปเบฅเบฐเบกเบทเป‰เบ™เบตเป‰ WSGI เปเบกเปˆเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™ de facto, เบšเปเปˆเบงเปˆเบฒเบˆเบฐเป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเป„เบŠเบ•เปŒเบซเบผเบทเบเบญเบš Python เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰. เปเบ•เปˆเป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบขเปˆเบฒเบ‡เบเบงเป‰เบฒเบ‡เบ‚เบงเบฒเบ‡, เบเบฑเบ‡เบกเบตเบซเบผเบฒเบ nuances เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบเบญเบšเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰, เปเบฅเบฐเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบซเบผเบฒเบ. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบชเป‰เบฒเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบฅเบฐเบซเบงเปˆเบฒเบ‡ Gunicorn เปเบฅเบฐ Nginx เบœเปˆเบฒเบ™เป€เบ•เบปเป‰เบฒเบฎเบฑเบš.

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ—เบฑเบ‡เบชเบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ”เบฝเบงเบเบฑเบ™, เปƒเบซเป‰เบฅเบญเบ‡เปƒเบŠเป‰เบŠเบฑเบญเบเป€เบเบฑเบ” UNIX เปเบ—เบ™เบŠเบฑเบญเบเป€เบเบฑเบ”เป€เบ„เบทเบญเบ‚เปˆเบฒเบ. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบ•เบปเป‰เบฒเบฎเบฑเบšเปƒเบ™เบเปเบฅเบฐเบ™เบตเปƒเบ”เบเปเปˆเบ•เบฒเบก, เปƒเบซเป‰เบžเบฐเบเบฒเบเบฒเบกเบ”เปเบฒเป€เบ™เบตเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบซเบ™เบถเปˆเบ‡เปเบฅเบฐเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป€เบ›เบตเบ”เปƒเบŠเป‰ socket เบชเปเบฒเบฅเบฑเบš Gunicorn เบœเปˆเบฒเบ™ systemd.

เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡ socket activated services เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ. เบ—เปเบฒเบญเบดเบ”, เป„เบŸเบฅเปŒเบซเบ™เปˆเบงเบเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบ—เบตเปˆเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ„เปเบฒเบชเบฑเปˆเบ‡ ListenStream เบŠเบตเป‰เป„เบ›เบซเบฒเบˆเบธเบ”เบ—เบตเปˆเป€เบ•เบปเป‰เบฒเบฎเบฑเบš UNIX เบˆเบฐเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เป„เบŸเบฅเปŒเบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเบ„เปเบฒเบชเบฑเปˆเบ‡ Requires เบˆเบฐเบŠเบตเป‰เป„เบ›เบซเบฒเป„เบŸเบฅเปŒเบซเบ™เปˆเบงเบเป€เบ•เบปเป‰เบฒเบฎเบฑเบš. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เปƒเบ™เป„เบŸเบฅเปŒเบซเบ™เปˆเบงเบเบšเปเบฅเบดเบเบฒเบ™, เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเปเบกเปˆเบ™เป‚เบ—เบซเบฒ Gunicorn เบˆเบฒเบเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก virtual เปเบฅเบฐเบชเป‰เบฒเบ‡เบเบฒเบ™เบœเบนเบเบกเบฑเบ” WSGI เบชเปเบฒเบฅเบฑเบšเบŠเบฑเบญเบเป€เบเบฑเบ” UNIX เปเบฅเบฐเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ Django.

เบ™เบตเป‰เปเบกเปˆเบ™เบšเบฒเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เป„เบŸเบฅเปŒเบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เป€เบ›เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™. เบ—เปเบฒเบญเบดเบ”เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบ•เบปเป‰เบฒเบฎเบฑเบš.

[Unit]
Description=Gunicorn WSGI socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

เบ•เบญเบ™เบ™เบตเป‰เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Gunicorn daemon.

[Unit]
Description=Gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=cloud-user
Group=cloud-user
WorkingDirectory=/srv/djangoapp

ExecStart=/srv/djangoapp/django/bin/gunicorn 
         โ€”access-logfile - 
         โ€”workers 3 
         โ€”bind unix:gunicorn.sock djangoapp.wsgi

[Install]
WantedBy=multi-user.target

เบชเปเบฒเบฅเบฑเบš Nginx, เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเบ‚เบญเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ•เบปเบงเปเบ—เบ™เปเบฅเบฐเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเป€เบžเบทเปˆเบญเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป€เบ™เบทเป‰เบญเบซเบฒเบ„เบปเบ‡เบ—เบตเปˆเบ–เป‰เบฒเบ—เปˆเบฒเบ™เปƒเบŠเป‰เบซเบ™เบถเปˆเบ‡. เปƒเบ™ RHEL, เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Nginx เบขเบนเปˆเปƒเบ™ /etc/nginx/conf.d. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ„เบฑเบ”เบฅเบญเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป„เบŸเบฅเปŒ /etc/nginx/conf.d/default.conf เปเบฅเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™. เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบ•เบฑเป‰เบ‡ server_name เปƒเบซเป‰เบเบปเบ‡เบเบฑเบšเบŠเบทเปˆเป‚เบฎเบ”เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ.

server {
   listen 80;
   server_name 8beta1.example.com;

   location = /favicon.ico { access_log off; log_not_found off; }
   location /static/ {
       root /srv/djangoapp;
   }

   location / {
       proxy_set_header Host $http_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_pass http://unix:/run/gunicorn.sock;
   }
}

เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบŠเบฑเบญเบเป€เบเบฑเบ” Gunicorn เปเบฅเบฐ Nginx เป‚เบ”เบเปƒเบŠเป‰ systemd เปเบฅเบฐเบ—เปˆเบฒเบ™เบžเป‰เบญเบกเบ—เบตเปˆเบˆเบฐเป€เบฅเบตเปˆเบกเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš.

เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” Gateway เบšเปเปˆเบ”เบต?

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เปƒเบชเปˆเบ—เบตเปˆเบขเบนเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เบ—เปˆเบฒเบ™เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” 502 Bad Gateway. เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบชเบฒเป€เบซเบ”เบกเบฒเบˆเบฒเบเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบŠเบฑเบญเบเป€เบเบฑเบ” UNIX เบ—เบตเปˆเบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡, เบซเบผเบทเบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบเป‰เบญเบ™เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบเบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เปƒเบ™ SELinux.

เปƒเบ™เบšเบฑเบ™เบ—เบถเบเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” nginx เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป€เบชเบฑเป‰เบ™เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

2018/12/18 15:38:03 [crit] 12734#0: *3 connect() to unix:/run/gunicorn.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.122.1, server: 8beta1.example.com, request: "GET / HTTP/1.1", upstream: "http://unix:/run/gunicorn.sock:/", host: "8beta1.example.com"

เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบ—เบปเบ”เบชเบญเบš Gunicorn เป‚เบ”เบเบเบปเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบ„เปเบฒเบ•เบญเบšเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ.

curl โ€”unix-socket /run/gunicorn.sock 8beta1.example.com

เบ‚เปเปƒเบซเป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบชเบดเปˆเบ‡เบ™เบตเป‰เป€เบเบตเบ”เบ‚เบถเป‰เบ™. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบ›เบตเบ”เบšเบฑเบ™เบ—เบถเบ, เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™เบงเปˆเบฒเบšเบฑเบ™เบซเบฒเปเบกเปˆเบ™เบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบš SELinux. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เปƒเบŠเป‰ daemon เบ—เบตเปˆเบšเปเปˆเบกเบตเบ™เบฐเป‚เบเบšเบฒเบเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™, เบกเบฑเบ™เบˆเบฐเบ–เบทเบเบซเบกเบฒเบเป€เบ›เบฑเบ™ init_t. เปƒเบซเป‰เบ—เบปเบ”เบชเบญเบšเบ—เบดเบ”เบชเบฐเบ”เบตเบ™เบตเป‰เปƒเบ™เบžเบฒเบเบ›เบฐเบ•เบดเบšเบฑเบ”.

sudo setenforce 0

เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบเบฒเบ™เบงเบดเบžเบฒเบเบงเบดเบˆเบฒเบ™เปเบฅเบฐเบ™เป‰เปเบฒเบ•เบฒเบ‚เบญเบ‡เป€เบฅเบทเบญเบ”, เปเบ•เปˆเบ™เบตเป‰เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆ debugging เบ•เบปเป‰เบ™เปเบšเบš. เปƒเบซเป‰เบ›เบดเบ”เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบžเบฝเบ‡เปเบ•เปˆเป€เบžเบทเปˆเบญเปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบšเบฑเบ™เบซเบฒ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบปเปˆเบ‡เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบเบฑเบšเบ„เบทเบ™เบชเบนเปˆเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ‚เบญเบ‡เบกเบฑเบ™.

เป‚เบ”เบเบเบฒเบ™เป‚เบซเบผเบ”เบซเบ™เป‰เบฒเบˆเปเบ„เบทเบ™เบซเบ™เป‰เบฒเปƒเบ™เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบซเบผเบทเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡ 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 เบเปเบฒเบฅเบฑเบ‡เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบชเบดเปˆเบ‡เบญเบทเปˆเบ™เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบชเบดเปˆเบ‡เบ—เบตเปˆ daemon เบ—เบตเปˆเบšเปเปˆเบฎเบนเป‰เบˆเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เป€เบ‚เบปเป‰เบฒเบซเบฒ.

sudo ausearch -m AVC

type=AVC msg=audit(1545315977.237:1273): avc:  denied { write } for pid=19400 comm="nginx" name="gunicorn.sock" dev="tmpfs" ino=52977 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:var_run_t:s0 tclass=sock_file permissive=0

SELinux เบ›เป‰เบญเบ‡เบเบฑเบ™เบšเปเปˆเปƒเบซเป‰ Nginx เบ‚เบฝเบ™เบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆเป€เบ•เบปเป‰เบฒเบฎเบฑเบš UNIX เบ—เบตเปˆเปƒเบŠเป‰เป‚เบ”เบ Gunicorn. เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบด, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบ™เบฐเป‚เบเบšเบฒเบเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡, เปเบ•เปˆเบเบฑเบ‡เบกเบตเบชเบดเปˆเบ‡เบ—เป‰เบฒเบ—เบฒเบเบญเบทเปˆเบ™เป†เบขเบนเปˆเบ‚เป‰เบฒเบ‡เบซเบ™เป‰เบฒ. เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบ”เป€เบกเบ™เบˆเบฒเบเป‚เบ”เป€เบกเบ™เบˆเปเบฒเบเบฑเบ”เป„เบ›เบซเบฒเป‚เบ”เป€เบกเบ™เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”. เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบเป‰เบฒเบ httpd_t เป„เบ›เบซเบฒเป‚เบ”เป€เบกเบ™เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”. เบ™เบตเป‰เบˆเบฐเปƒเบซเป‰ Nginx เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบชเบทเบšเบ•เปเปˆเบเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบเบฒเบ™เบ”เบตเบšเบฑเบเบ•เบทเปˆเบกเบญเบตเบ.

sudo semanage permissive -a httpd_t

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เป„เบ”เป‰เบˆเบฑเบ”เบเบฒเบ™ SELinux เบ›เป‰เบญเบ‡เบเบฑเบ™ (เบ—เปˆเบฒเบ™เบเปเปˆเบšเปเปˆเบ„เบงเบ™เบ›เปˆเบญเบเปƒเบซเป‰เป‚เบ„เบ‡เบเบฒเบ™ SELinux เบขเบนเปˆเปƒเบ™เป‚เบซเบกเบ”เบˆเปเบฒเบเบฑเบ”) เปเบฅเบฐเป‚เบ”เป€เบกเบ™เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบ–เบทเบเป‚เบซเบฅเบ”, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบŠเบญเบเบซเบฒเบชเบดเปˆเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เบ–เบทเบเบซเบกเบฒเบเป€เบ›เบฑเบ™ gunicorn_exec_t เป€เบžเบทเปˆเบญเปƒเบซเป‰เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡. เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡. เบฅเบญเบ‡เป€เบ‚เบปเป‰เบฒเป€เบšเบดเปˆเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒเป€เบžเบทเปˆเบญเป€เบšเบดเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบซเบกเปˆเบเปˆเบฝเบงเบเบฑเบšเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡.

sudo ausearch -m AVC -c gunicorn

เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™เบซเบผเบฒเบเบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบกเบต 'comm="gunicorn"' เบ—เบตเปˆเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ•เปˆเบฒเบ‡เป†เปƒเบ™เป„เบŸเบฅเปŒเบ•เปˆเบฒเบ‡เป†เปƒเบ™ /srv/djangoapp, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปเบ™เปˆเบ™เบญเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเบกเบตเบกเบนเบ™เบ„เปˆเบฒเบเบฒเบ™เบฅเบฒเบเบ‡เบฒเบ™.

เปเบ•เปˆเบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เปเป‰เบ„เบงเบฒเบกเป€เบŠเบฑเปˆเบ™เบ™เบตเป‰เบ›เบฐเบเบปเบ”เบงเปˆเบฒ:

type=AVC msg=audit(1545320700.070:1542): avc:  denied { execute } for pid=20704 comm="(gunicorn)" name="python3.6" dev="vda3" ino=8515706 scontext=system_u:system_r:init_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file permissive=0

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบšเบดเปˆเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ gunicorn เบซเบผเบทเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡ ps, เบ—เปˆเบฒเบ™เบˆเบฐเบšเปเปˆเป€เบซเบฑเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบฅเปˆเบ™เปƒเบ”เป†. เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒ gunicorn เบเปเบฒเบฅเบฑเบ‡เบžเบฐเบเบฒเบเบฒเบกเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ•เบปเบงเปเบ›เบžเบฒเบชเบฒ Python เปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก virtualenv เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบญเบฒเบ”เบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบชเบฐเบ„เบดเบšเบ‚เบญเบ‡เบžเบฐเบ™เบฑเบเบ‡เบฒเบ™. เบชเบฐเบ™เบฑเป‰เบ™เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เป€เบ„เบทเปˆเบญเบ‡เบซเบกเบฒเบเบ—เบฑเบ‡เบชเบญเบ‡เป„เบŸเบฅเปŒเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เปเบฅเบฐเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบ›เบตเบ”เบซเบ™เป‰เบฒเบ—เบปเบ”เบชเบญเบš Django เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบšเป.

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

เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ gunicorn เบˆเบฐเบ•เป‰เบญเบ‡เบ–เบทเบเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบซเบกเปˆเบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบชเบฒเบกเบฒเบ”เป€เบฅเบทเบญเบเปเบ—เบฑเบเปƒเบซเบกเปˆเป„เบ”เป‰. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ” restart เบกเบฑเบ™เบ—เบฑเบ™เบ—เบตเบซเบผเบทเบขเบธเบ”เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบฅเบฐเปƒเบซเป‰ socket เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบกเบฑเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เป€เบ›เบตเบ”เป€เบงเบฑเบšเป„เบŠเบ—เปŒเปƒเบ™เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš. เบเบงเบ”เบชเบญเบšเบงเปˆเบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบ›เป‰เบฒเบเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เป‚เบ”เบเปƒเบŠเป‰ ps.

ps -efZ | grep gunicorn

เบขเปˆเบฒเบฅเบทเบกเบชเป‰เบฒเบ‡เบ™เบฐเป‚เบเบšเบฒเบ SELinux เบ›เบปเบเบเบฐเบ•เบดเปƒเบ™เบžเบฒเบเบซเบผเบฑเบ‡!

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบšเบดเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก AVC เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เบ‚เปเป‰เบ„เบงเบฒเบกเบชเบธเบ”เบ—เป‰เบฒเบเบ›เบฐเบเบญเบšเบ”เป‰เบงเบ permissive=1 เบชเปเบฒเบฅเบฑเบšเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เปเบฅเบฐ permissive=0 เบชเปเบฒเบฅเบฑเบšเบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบ‚เบญเบ‡เบฅเบฐเบšเบปเบš. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบขเปˆเบฒเบ‡เป„เบงเบงเบฒ. เปเบ•เปˆเบˆเบปเบ™เบเปˆเบงเบฒเบ™เบฑเป‰เบ™, เบกเบฑเบ™เบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเบฎเบฑเบเบชเบฒเบฅเบฐเบšเบปเบšเปƒเบซเป‰เบ›เบญเบ”เป„เบžเปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เปเบฅเบฐเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™ Django.

sudo ausearch -m AVC

เป€เบเบตเบ”เบ‚เบถเป‰เบ™!

เป‚เบ„เบ‡เบเบฒเบ™ Django เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เบ›เบฒเบเบปเบ”เบขเบนเปˆเบเบฑเบšเบซเบ™เป‰เบฒเบ”เป‰เบฒเบ™เบซเบ™เป‰เบฒเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ Nginx เปเบฅเบฐ Gunicorn WSGI. เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Python 3 เปเบฅเบฐ PostgreSQL 10 เบˆเบฒเบ RHEL 8 Beta repositories. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเป‰เบฒเบงเป„เบ›เบ‚เป‰เบฒเบ‡เบซเบ™เป‰เบฒเปเบฅเบฐเบชเป‰เบฒเบ‡ (เบซเบผเบทเบžเบฝเบ‡เปเบ•เปˆเบ™เปเบฒเปƒเบŠเป‰) เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ Django เบซเบผเบทเบ„เบปเป‰เบ™เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบญเบทเปˆเบ™เป†เบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™ RHEL 8 Beta เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”, เบ›เบฑเบšเบ›เบธเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เบซเบผเบทเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡เบšเบฑเบ™เบˆเบธเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ™เบตเป‰.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™