เจตเจฐเจ•เจธเจผเจพเจช RHEL 8 เจฌเฉ€เจŸเจพ: เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจตเฉˆเฉฑเจฌ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃเจพ

RHEL 8 เจฌเฉ€เจŸเจพ เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจจเจตเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจฆเฉ€ เจชเฉ‡เจธเจผเจ•เจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเจฟเจจเฉเจนเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจชเฉฐเจจเฉ‡ เจฒเฉˆ เจธเจ•เจฆเฉ€ เจนเฉˆ, เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจจเจตเฉ€เจ†เจ‚ เจšเฉ€เจœเจผเจพเจ‚ เจธเจฟเฉฑเจ–เจฃเจพ เจนเจฎเฉ‡เจธเจผเจพ เจ…เจญเจฟเจ†เจธ เจตเจฟเฉฑเจš เจฌเจฟเจนเจคเจฐ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจนเฉ‡เจ เจพเจ‚ เจ…เจธเฉ€เจ‚ Red Hat Enterprise Linux 8 เจฌเฉ€เจŸเจพ 'เจคเฉ‡ เจ…เจงเจพเจฐเจค เจ‡เฉฑเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเจพ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจตเจฐเจ•เจธเจผเจพเจช เจชเฉ‡เจธเจผ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค

เจตเจฐเจ•เจธเจผเจพเจช RHEL 8 เจฌเฉ€เจŸเจพ: เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจตเฉˆเฉฑเจฌ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃเจพ

เจšเจฒเฉ‹ เจชเจพเจ‡เจฅเจจ, เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจชเฉเจฐเจธเจฟเฉฑเจง เจชเฉเจฐเฉ‹เจ—เฉเจฐเจพเจฎเจฟเฉฐเจ— เจญเจพเจธเจผเจพ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ…เจงเจพเจฐ เจฆเฉ‡ เจคเฉŒเจฐ เจคเฉ‡, Django เจ…เจคเฉ‡ PostgreSQL เจฆเจพ เจธเฉเจฎเฉ‡เจฒ, เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจ•เจพเจซเจผเฉ€ เจ†เจฎ เจธเฉเจฎเฉ‡เจฒ, เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ RHEL 8 เจฌเฉ€เจŸเจพ เจจเฉ‚เฉฐ เจธเฉฐเจฐเจšเจฟเจค เจ•เจฐเฉ€เจเฅค เจซเจฟเจฐ เจ…เจธเฉ€เจ‚ เจ•เฉเจ เจนเฉ‹เจฐ (เจ…เจตเจฐเจ—เฉ€เจ•เฉเจฐเจฟเจค) เจธเจฎเฉฑเจ—เจฐเฉ€ เจธเจผเจพเจฎเจฒ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจŸเฉˆเจธเจŸ เจตเจพเจคเจพเจตเจฐเจฃ เจฌเจฆเจฒ เจœเจพเจตเฉ‡เจ—เจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจ†เจŸเฉ‹เจฎเฉ‡เจธเจผเจจ เจฆเฉ€เจ†เจ‚ เจธเฉฐเจญเจพเจตเจจเจพเจตเจพเจ‚ เจฆเฉ€ เจชเฉœเจšเฉ‹เจฒ เจ•เจฐเจจเจพ, เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจฎเจฒเจŸเฉ€เจชเจฒ เจธเจฐเจตเจฐเจพเจ‚ เจจเจพเจฒ เจตเจพเจคเจพเจตเจฐเจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจจเจพ เจฆเจฟเจฒเจšเจธเจช เจนเฉˆเฅค เจ‡เฉฑเจ• เจจเจตเฉ‡เจ‚ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚เจ†เจค เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจธเฉ€เจ‚ เจนเฉฑเจฅเจพเจ‚ เจจเจพเจฒ เจ‡เฉฑเจ• เจ›เฉ‹เจŸเจพ, เจธเจงเจพเจฐเจจ เจชเฉเจฐเฉ‹เจŸเฉ‹เจŸเจพเจˆเจช เจฌเจฃเจพ เจ•เฉ‡ เจธเจผเฉเจฐเฉ‚เจ†เจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจคเจพเจ‚ เจœเฉ‹ เจคเฉเจธเฉ€เจ‚ เจ‡เจน เจฆเฉ‡เจ– เจธเจ•เฉ‹ เจ•เจฟ เจ•เฉ€ เจนเฉ‹เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจ‡เฉฐเจŸเจฐเฉˆเจ•เจŸ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจซเจฟเจฐ เจธเจตเฉˆเจšเจฒเจฟเจค เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจธเฉฐเจฐเจšเจจเจพเจตเจพเจ‚ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ…เฉฑเจ—เฉ‡ เจตเจงเฉ‹เฅค เจ…เฉฑเจœ เจ…เจธเฉ€เจ‚ เจ…เจœเจฟเจนเฉ‡ เจชเฉเจฐเฉ‹เจŸเฉ‹เจŸเจพเจˆเจช เจฌเจฃเจพเจ‰เจฃ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚เฅค

เจ†เจ‰ RHEL 8 เจฌเฉ€เจŸเจพ VM เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจ•เฉ‡ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ€เจเฅค เจคเฉเจธเฉ€เจ‚ เจธเจ•เฉเจฐเฉˆเจš เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเจพเจ‚ เจ†เจชเจฃเฉ€ เจฌเฉ€เจŸเจพ เจ—เจพเจนเจ•เฉ€ เจจเจพเจฒ เจ‰เจชเจฒเจฌเจง 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 เจ†เจชเจฃเฉ‡ เจ†เจช เจตเจฟเฉฑเจš เจธเจฐเจ—เจฐเจฎ เจตเจฟเจ•เจพเจธ เจ…เจงเฉ€เจจ เจนเฉˆ, เจ…เจคเฉ‡ เจตเฉฑเจง เจคเฉ‹เจ‚ เจตเฉฑเจง เจจเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจฒเจ—เจพเจคเจพเจฐ เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡ เจฐเจนเฉ‡ เจนเจจเฅค เจ‡เจธ เจฒเจˆ, เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจชเจพเจˆเจฅเจจ เจฆเฉ‡ เจตเฉฑเจ–-เจตเฉฑเจ– เจจเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจธเจฅเจฟเจฐ เจธเจฟเจธเจŸเจฎ เจŸเฉ‚เจฒเจธ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเจจ เจฒเจˆ, เจธเจฟเจธเจŸเจฎ เจชเจพเจˆเจฅเจจ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจจเจตเฉ‡เจ‚ เจชเฉˆเจ•เฉ‡เจœ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€ เจ…เจคเฉ‡ เจชเจพเจˆเจฅเจจ 2.7 เจ…เจคเฉ‡ 3.6 เจฆเฉ‹เจตเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจธเฉ€เฅค เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจ‰เจน เจ•เจฟเจ‰เจ‚ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจธเจจ, เจ‡เจธ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจตเจฟเฉฑเจš เจชเฉเจฐเจ•เจพเจธเจผเจจ เจตเจฟเฉฑเจš เจฒเฉฑเจญเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆ เจฒเฉˆเจ‚เจ—เจกเจจ เจตเฉเจนเจพเจˆเจŸ เจฆเจพ เจฌเจฒเฉŒเจ— (เจฒเฉˆเจ‚เจ—เจกเจจ เจตเฉเจนเจพเจˆเจŸ)เฅค

เจ‡เจธ เจฒเจˆ, เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจชเจพเจˆเจฅเจจ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจฟเจฐเจซเจผ เจฆเฉ‹ เจชเฉˆเจ•เฉ‡เจœ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจœเจฟเจธ เจตเจฟเฉฑเจš python3-pip เจ‡เฉฑเจ• เจจเจฟเจฐเจญเจฐเจคเจพ เจตเจœเฉ‹เจ‚ เจธเจผเจพเจฎเจฒ เจนเฉˆเฅค

sudo yum install python36 python3-virtualenv

เจ•เจฟเจ‰เจ‚ เจจเจพ เจธเจฟเฉฑเจงเฉ‡ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจ•เจพเจฒเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจฒเฉˆเจ‚เจ—เจกเจจ เจจเฉ‡ เจธเฉเจเจพเจ… เจฆเจฟเฉฑเจคเจพ เจนเฉˆ เจ…เจคเฉ‡ เจชเจพเจˆเจช3 เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเฉ‹? เจ†เจ—เจพเจฎเฉ€ เจ†เจŸเฉ‹เจฎเฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจงเจฟเจ†เจจ เจตเจฟเฉฑเจš เจฐเฉฑเจ–เจฆเฉ‡ เจนเฉ‹เจ, เจ‡เจน เจœเจพเจฃเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ Ansible เจจเฉ‚เฉฐ เจšเฉฑเจฒเจฃ เจฒเจˆ เจชเจพเจˆเจช เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡เจ—เฉ€, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจชเจพเจˆเจช เจฎเฉ‹เจกเฉ€เจŠเจฒ เจ‡เฉฑเจ• เจ•เจธเจŸเจฎ เจชเจพเจˆเจช เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจŸเฉ‡เจฌเจฒ เจจเจพเจฒ เจตเจฐเจšเฉเจ…เจฒเฉ‡เจจเจต เจฆเจพ เจธเจฎเจฐเจฅเจจ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจคเฉเจนเจพเจกเฉ‡ เจจเจฟเจชเจŸเจพเจฐเฉ‡ 'เจคเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ python3 เจฆเฉเจญเจพเจธเจผเฉ€เจ เจฆเฉ‡ เจจเจพเจฒ, เจคเฉเจธเฉ€เจ‚ Django เจ‡เฉฐเจธเจŸเจพเจฒเฉ‡เจธเจผเจจ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจœเจพเจฐเฉ€ เจฐเฉฑเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจธเจพเจกเฉ‡ เจฆเฉ‚เจœเฉ‡ เจญเจพเจ—เจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจ•เจพเจฐเจœ เจชเฉเจฐเจฃเจพเจฒเฉ€ เจตเฉ€ เจฐเฉฑเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ‡เฉฐเจŸเจฐเจจเฉˆเฉฑเจŸ 'เจคเฉ‡ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ‡ เจตเจฟเจ•เจฒเจช เจ‰เจชเจฒเจฌเจง เจนเจจเฅค เจ‡เฉฑเจฅเฉ‡ เจ‡เฉฑเจ• เจธเฉฐเจธเจ•เจฐเจฃ เจชเฉ‡เจธเจผ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจชเจฐ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ†เจชเจฃเฉ€เจ†เจ‚ เจ–เฉเจฆ เจฆเฉ€เจ†เจ‚ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจจเฅค

เจ…เจธเฉ€เจ‚ เจฏเฉ‚เจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจกเจฟเจซเฉŒเจฒเจŸ เจฐเฉ‚เจช เจตเจฟเฉฑเจš RHEL 8 เจตเจฟเฉฑเจš เจ‰เจชเจฒเจฌเจง PostgreSQL เจ…เจคเฉ‡ Nginx เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

sudo yum install nginx postgresql-server

PostgreSQL เจจเฉ‚เฉฐ psycopg2 เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡เจ—เฉ€, เจชเจฐ เจ‡เจน เจ•เฉ‡เจตเจฒ เจ‡เฉฑเจ• เจตเจฐเจšเฉเจ…เจฒเฉ‡เจจเจต เจตเจพเจคเจพเจตเจฐเจจ เจตเจฟเฉฑเจš เจ‰เจชเจฒเจฌเจง เจนเฉ‹เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจ‡เจธเจฒเจˆ เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ Django เจ…เจคเฉ‡ Gunicorn เจฆเฉ‡ เจจเจพเจฒ pip3 เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค เจชเจฐ เจชเจนเจฟเจฒเจพเจ‚ เจธเจพเจจเฉ‚เฉฐ virtualenv เจธเฉˆเจŸ เจ…เจช เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค

Django เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจธเจนเฉ€ เจœเจ—เฉเจนเจพ เจฆเฉ€ เจšเฉ‹เจฃ เจ•เจฐเจจ เจฆเฉ‡ เจตเจฟเจธเจผเฉ‡ 'เจคเฉ‡ เจนเจฎเฉ‡เจธเจผเจพเจ‚ เจฌเจนเฉเจค เจฌเจนเจฟเจธ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจชเจฐ เจœเจฆเฉ‹เจ‚ เจธเจผเฉฑเจ• เจนเฉ‹เจตเฉ‡, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจนเจฎเฉ‡เจธเจผเจพเจ‚ เจฒเฉ€เจจเจ•เจธ เจซเจพเจˆเจฒเจธเจฟเจธเจŸเจฎ เจฒเฉœเฉ€เจตเจพเจฐ เจธเจŸเฉˆเจ‚เจกเจฐเจก เจตเฉฑเจฒ เจฎเฉเฉœ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡, FHS เจ•เจนเจฟเฉฐเจฆเจพ เจนเฉˆ เจ•เจฟ /srv เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ‡เจธ เจฒเจˆ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ: "เจนเฉ‹เจธเจŸ-เจตเจฟเจธเจผเฉ‡เจธเจผ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจธเจŸเฉ‹เจฐ เจ•เจฐเจจ เจฒเจˆโ€”เจธเจฟเจธเจŸเจฎ เจฆเฉเจ†เจฐเจพ เจชเฉˆเจฆเจพ เจ•เฉ€เจคเฉ‡ เจœเจพเจฃ เจตเจพเจฒเฉ‡ เจกเฉ‡เจŸเจพ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจตเฉˆเฉฑเจฌ เจธเจฐเจตเจฐ เจกเฉ‡เจŸเจพ เจ…เจคเฉ‡ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚, 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 เจจเจพเจฒ เจ…เจชเจพเจšเฉ‡ HTTPD เจœเจพเจ‚ Gunicorn เจฆเฉ‡ เจจเจพเจฒ Nginxเฅค

เจตเฉˆเฉฑเจฌ เจธเจฐเจตเจฐ เจ—เฉ‡เจŸเจตเฉ‡ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจฆเจพ เจ•เฉฐเจฎ เจตเฉˆเจฌ เจธเจฐเจตเจฐ เจคเฉ‹เจ‚ เจชเจพเจˆเจฅเจจ เจตเฉˆเฉฑเจฌ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ…เฉฑเจ—เฉ‡ เจญเฉ‡เจœเจฃเจพ เจนเฉˆเฅค WSGI เจญเจฟเจ†เจจเจ• เจ…เจคเฉ€เจค เจฆเฉ€ เจ‡เฉฑเจ• เจฏเจพเจฆ เจนเฉˆ เจœเจฆเฉ‹เจ‚ CGI เจ‡เฉฐเจœเจฃ เจ†เจฒเฉ‡-เจฆเฉเจ†เจฒเฉ‡ เจธเจจ, เจ…เจคเฉ‡ เจ…เฉฑเจœ WSGI เจ…เจธเจฒ เจฎเจฟเจ†เจฐเฉ€ เจนเฉˆ, เจตเฉˆเฉฑเจฌ เจธเจฐเจตเจฐ เจœเจพเจ‚ เจชเจพเจˆเจฅเจจ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจฆเฉ€ เจชเจฐเจตเจพเจน เจ•เฉ€เจคเฉ‡ เจฌเจฟเจจเจพเจ‚เฅค เจชเจฐ เจ‡เจธเจฆเฉ€ เจตเจฟเจ†เจชเจ• เจตเจฐเจคเฉ‹เจ‚ เจฆเฉ‡ เจฌเจพเจตเจœเฉ‚เจฆ, เจ‡เจนเจจเจพเจ‚ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจฆเฉ‡ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจ…เจœเฉ‡ เจตเฉ€ เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจธเฉ‚เจ–เจฎเจคเจพเจตเจพเจ‚ เจ…เจคเฉ‡ เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจšเฉ‹เจฃเจพเจ‚ เจนเจจ. เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจธเจพเจ•เจŸ เจฆเฉเจ†เจฐเจพ เจ—เฉเจจเฉ€เจ•เฉ‹เจฐเจจ เจ…เจคเฉ‡ เจเจจเจœเฉ€เจจเฉˆเจ•เจธ เจตเจฟเจšเจ•เจพเจฐ เจชเจฐเจธเจชเจฐ เจชเฉเจฐเจญเจพเจต เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจฆเฉ‹เจตเฉ‡เจ‚ เจญเจพเจ— เจ‡เฉฑเจ•เฉ‹ เจธเจฐเจตเจฐ 'เจคเฉ‡ เจธเจฅเจพเจชเจฟเจค เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจ, เจ†เจ“ เจ‡เฉฑเจ• เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจธเจพเจ•เจŸ เจฆเฉ€ เจฌเจœเจพเจ เจ‡เฉฑเจ• UNIX เจธเจพเจ•เจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจเฅค เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเฉฐเจšเจพเจฐ เจฒเจˆ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจพเจ•เจŸ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจ†เจ“ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจ•เจฆเจฎ เจšเฉเฉฑเจ•เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจ เจ…เจคเฉ‡ เจธเจฟเจธเจŸเจฎเจก เจฆเฉเจ†เจฐเจพ เจ—เฉเจจเฉ€เจ•เฉ‹เจฐเจจ เจฒเจˆ เจธเจพเจ•เจŸ เจเจ•เจŸเฉ€เจตเฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเฉ€เจเฅค

เจธเจพเจ•เจŸ เจเจ•เจŸเฉ€เจตเฉ‡เจŸเจฟเจก เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เจพเจซเจผเฉ€ เจธเจงเจพเจฐเจจ เจนเฉˆ. เจชเจนเจฟเจฒเจพเจ‚, เจ‡เฉฑเจ• เจฏเฉ‚เจจเจฟเจŸ เจซเจพเจˆเจฒ เจฌเจฃเจพเจˆ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• ListenStream เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฟเจต เจธเจผเจพเจฎเจฒ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเฉ‹ เจ‰เจธ เจฌเจฟเฉฐเจฆเฉ‚ เจตเฉฑเจฒ เจ‡เจธเจผเจพเจฐเจพ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฟเจธ 'เจคเฉ‡ 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

เจ‡เจน เจธเจญ เจ†เจฒเฉ‹เจšเจจเจพ เจ…เจคเฉ‡ เจ–เฉ‚เจจ เจฆเฉ‡ เจนเฉฐเจเฉ‚เจ†เจ‚ เจฆเจพ เจ•เจพเจฐเจจ เจฌเจฃ เจธเจ•เจฆเจพ เจนเฉˆ, เจชเจฐ เจ‡เจน เจธเจฟเจฐเจซ เจชเฉเจฐเฉ‹เจŸเฉ‹เจŸเจพเจˆเจช เจจเฉ‚เฉฐ เจกเฉ€เจฌเฉฑเจ— เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ. เจ†เจ“ เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจœเจพเจ‚เจš เจจเฉ‚เฉฐ เจ…เจธเจฎเจฐเฉฑเจฅ เจ•เจฐเฉ€เจ เจ•เจฟ เจ‡เจน เจธเจฎเฉฑเจธเจฟเจ† เจนเฉˆ, เจœเจฟเจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ…เจธเฉ€เจ‚ เจนเจฐ เจšเฉ€เจœเจผ เจจเฉ‚เฉฐ เจ‡เจธเจฆเฉ‡ เจธเจฅเจพเจจ 'เจคเฉ‡ เจตเจพเจชเจธ เจ•เจฐ เจฆเฉ‡เจตเจพเจ‚เจ—เฉ‡เฅค

เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจตเจฟเฉฑเจš เจชเฉฐเจจเฉ‡ เจจเฉ‚เฉฐ เจคเจพเจœเจผเจพ เจ•เจฐเจ•เฉ‡ เจœเจพเจ‚ เจธเจพเจกเฉ€ curl เจ•เจฎเจพเจ‚เจก เจจเฉ‚เฉฐ เจฎเฉเฉœ-เจšเจพเจฒเฉ‚ เจ•เจฐเจ•เฉ‡, เจคเฉเจธเฉ€เจ‚ Django เจŸเฉˆเจธเจŸ เจชเฉฐเจจเจพ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจ‡เจธ เจฒเจˆ, เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ•เจฟ เจธเจญ เจ•เฉเจ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ•เฉ‹เจˆ เจนเฉ‹เจฐ เจ…เจจเฉเจฎเจคเฉ€ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจจเจนเฉ€เจ‚ เจนเจจ, เจ…เจธเฉ€เจ‚ SELinux เจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจšเจพเจฒเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค

sudo setenforce 1

เจฎเฉˆเจ‚ เจ‡เฉฑเจฅเฉ‡ sepolgen เจจเจพเจฒ audit2allow เจœเจพเจ‚ เจšเฉ‡เจคเจพเจตเจจเฉ€-เจ…เจงเจพเจฐเจฟเจค เจจเฉ€เจคเฉ€เจ†เจ‚ เจฌเจฃเจพเจ‰เจฃ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจจเจนเฉ€เจ‚ เจ•เจฐเจพเจ‚เจ—เจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจธ เจธเจฎเฉ‡เจ‚ เจ•เฉ‹เจˆ เจ…เจธเจฒ Django เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจ‡เฉฑเจฅเฉ‡ เจ•เฉ‹เจˆ เจชเฉ‚เจฐเจพ เจจเจ•เจธเจผเจพ เจจเจนเฉ€เจ‚ เจนเฉˆ เจ•เจฟ เจ—เฉเจจเฉ€เจ•เฉ‹เจฐเจจ เจ•เจฟเจธ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฟเจธ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจคเฉ‹เจ‚ เจ‡เจจเจ•เจพเจฐ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจฒเจˆ, เจธเจฟเจธเจŸเจฎ เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจฐเฉฑเจ–เจฃ เจฒเจˆ 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 เจจเฉ‚เฉฐ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เฉ€เจคเจพ เจนเฉˆเฅค เจนเฉเจฃ เจคเฉเจธเฉ€เจ‚ เจธเฉฐเจฐเจšเจจเจพ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ, เจ•เจพเจฐเจ—เฉเจœเจผเจพเจฐเฉ€ เจตเจฟเฉฑเจš เจธเฉเจงเจพเจฐ เจ•เจฐเจจ, เจœเจพเจ‚ เจ‡เจธ เจธเฉฐเจฐเจšเจจเจพ เจจเฉ‚เฉฐ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจˆเจœเจผ เจ•เจฐเจจ เจฒเจˆ RHEL 8 เจฌเฉ€เจŸเจพ เจตเจฟเฉฑเจš เจนเฉ‹เจฐ เจ‰เจชเจฒเจฌเจง เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจชเฉœเจšเฉ‹เจฒ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ Django เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹