เดตเตผเด•เตเด•เตเดทเต‹เดชเตเดชเต RHEL 8 เดฌเต€เดฑเตเดฑ: เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เดตเต†เดฌเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเต

RHEL 8 เดฌเต€เดฑเตเดฑ เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผเด•เตเด•เต เดจเดฟเดฐเดตเดงเดฟ เดชเตเดคเดฟเดฏ เดซเต€เดšเตเดšเดฑเตเด•เตพ เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด‡เดตเดฏเตเดŸเต† เดฒเดฟเดธเตเดฑเตเดฑเดฟเด‚เด—เต เดชเต‡เดœเตเด•เตพ เดŽเดŸเตเด•เตเด•เดพเด‚, เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดชเตเดคเดฟเดฏ เด•เดพเดฐเตเดฏเด™เตเด™เตพ เดชเด เดฟเด•เตเด•เตเดจเตเดจเดคเต เดชเตเดฐเดพเดฏเต‹เด—เดฟเด•เดฎเดพเดฏเดฟ เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เดฎเดฟเด•เดšเตเดšเดคเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ Red Hat Enterprise Linux 8 เดฌเต€เดฑเตเดฑเดฏเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเตผ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดตเตผเด•เตเด•เตเดทเต‹เดชเตเดชเต เดžเด™เตเด™เตพ เดšเตเดตเดŸเต† เดจเตฝเด•เตเดจเตเดจเต.

เดตเตผเด•เตเด•เตเดทเต‹เดชเตเดชเต RHEL 8 เดฌเต€เดฑเตเดฑ: เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เดตเต†เดฌเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเต

เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผเด•เตเด•เดฟเดŸเดฏเดฟเตฝ เด’เดฐเต เดœเดจเดชเตเดฐเดฟเดฏ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดญเดพเดทเดฏเดพเดฏ เดชเตˆเดคเตเดคเตบ เด’เดฐเต เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเดฏเดฟ เดŽเดŸเตเด•เตเด•เดพเด‚, เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดตเดณเดฐเต† เดธเดพเดงเดพเดฐเดฃเดฎเดพเดฏ เดธเด‚เดฏเต‹เดœเดจเดฎเดพเดฏ เดœเดพเด™เตเด•เต‹เดฏเตเดŸเต†เดฏเตเด‚ PostgreSQL-เดจเตเดฑเต†เดฏเตเด‚ เดธเด‚เดฏเต‹เดœเดจเด‚, เด•เต‚เดŸเดพเดคเต† เด…เดตเดฐเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป RHEL 8 เดฌเต€เดฑเตเดฑ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเด•. เดคเตเดŸเตผเดจเตเดจเต เดžเด™เตเด™เตพ เด•เตเดฑเดšเตเดšเต เด•เต‚เดŸเดฟ (เดตเตผเด—เตเด—เต€เด•เดฐเดฟเด•เตเด•เดพเดคเตเดค) เดšเต‡เดฐเตเดตเด•เตพ เดšเต‡เตผเด•เตเด•เตเด‚.

เดŸเต†เดธเตเดฑเตเดฑเต เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟ เดฎเดพเดฑเตเด‚, เด•เดพเดฐเดฃเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดทเดจเตเดฑเต† เดธเดพเดงเตเดฏเดคเด•เตพ เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เดฐเดธเด•เดฐเดฎเดพเดฃเต, เด•เดฃเตเดŸเต†เดฏเตเดจเดฑเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด•, เด’เดจเตเดจเดฟเดฒเดงเดฟเด•เด‚ เดธเต†เตผเดตเดฑเตเด•เดณเตเดณเตเดณ เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเด•. เด’เดฐเต เดชเตเดคเดฟเดฏ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เตˆเด•เตŠเดฃเตเดŸเต เดšเต†เดฑเตเดคเตเด‚ เดฒเดณเดฟเดคเดตเตเดฎเดพเดฏ เด’เดฐเต เดชเตเดฐเต‹เดŸเตเดŸเต‹เดŸเตˆเดชเตเดชเต เดธเตƒเดทเตเดŸเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเต เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเด‚, เด…เดคเดฟเดฒเต‚เดŸเต† เดŽเดจเตเดคเดพเดฃเต เดธเด‚เดญเดตเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเต†เดจเตเดจเตเด‚ เด…เดคเต เดŽเด™เตเด™เดจเต† เด‡เดŸเดชเต†เดŸเตเดจเตเดจเตเดตเต†เดจเตเดจเตเด‚ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เด•เดพเดฃเดพเดจเดพเด•เตเด‚, เดคเตเดŸเตผเดจเตเดจเต เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เด•เต‚เดŸเตเดคเตฝ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚. เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เดชเตเดฐเต‹เดŸเตเดŸเต‹เดŸเตˆเดชเตเดชเดฟเดจเตเดฑเต† เดธเตƒเดทเตเดŸเดฟเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเดพเดฃเต เด‡เดจเตเดจเต เดจเดฎเตเดฎเตพ เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต.

RHEL 8 เดฌเต€เดฑเตเดฑ VM เด‡เดฎเต‡เดœเต เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเต เดจเดฎเตเด•เตเด•เต เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเด‚. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด†เดฆเตเดฏเด‚ เดฎเตเดคเตฝ เด’เดฐเต เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เตป เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเด‚, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฌเต€เดฑเตเดฑ เดธเดฌเตโ€Œเดธเตโ€Œเด•เตเดฐเดฟเดชเตโ€Œเดทเดจเดฟเตฝ เดฒเดญเตเดฏเดฎเดพเดฏ เด•เต†เดตเดฟเดŽเด‚ เด—เดธเตเดฑเตเดฑเต เด‡เดฎเต‡เดœเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•. เด’เดฐเต เด—เดธเตเดฑเตเดฑเต เด‡เดฎเต‡เดœเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด•เตเดฒเต—เดกเต เด‡เดจเต€เดทเตเดฏเดฒเตˆเดธเต‡เดทเดจเดพเดฏเดฟ (Cloud-init) เดฎเต†เดฑเตเดฑเดพเดกเดพเดฑเตเดฑเดฏเตเด‚ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดกเดพเดฑเตเดฑเดฏเตเด‚ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดตเต†เตผเดšเตเดตเตฝ เดธเดฟเดกเดฟ เดจเดฟเด™เตเด™เตพ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดกเดฟเดธเตเด•เต เด˜เดŸเดจเดฏเต‹ เดฒเดญเตเดฏเดฎเดพเดฏ เดชเดพเด•เตเด•เต‡เดœเตเด•เดณเต‹ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพ เดชเตเดฐเดคเตเดฏเต‡เด•เดฎเดพเดฏเดฟ เด’เดจเตเดจเตเด‚ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒ; เดเดคเต เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเด‚ เดšเต†เดฏเตเดฏเตเด‚.

เดฎเตเดดเตเดตเตป เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเตเด‚ เดจเดฎเตเด•เตเด•เต เดธเต‚เด•เตเดทเตเดฎเดฎเดพเดฏเดฟ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚.

เดœเดพเด™เตเด•เต‹ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดœเดพเด‚เด—เต‹เดฏเตเดŸเต† เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตˆเดคเตเดคเตบ 3.5 เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด…เดคเดฟเดจเต เดถเต‡เดทเดฎเตเดณเตเดณ เด’เดฐเต เดตเต†เตผเดšเตเดตเตฝ เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต (virtualenv) เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เดฌเต€เดฑเตเดฑ เด•เตเดฑเดฟเดชเตเดชเตเด•เดณเดฟเตฝ, เดชเตˆเดคเตเดคเตบ 3.6 เดฒเดญเตเดฏเดฎเดพเดฃเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเตป เด•เดดเดฟเดฏเตเด‚, เด‡เดคเต เดถเดฐเดฟเด•เตเด•เตเด‚ เด…เด™เตเด™เดจเต†เดฏเดพเดฃเต‹ เดŽเดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚:

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

RHEL-เตฝ เด’เดฐเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เดŸเต‚เตพเด•เดฟเดฑเตเดฑเดพเดฏเดฟ Red Hat เดชเตˆเดคเตเดคเตบ เดธเดœเต€เดตเดฎเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เด‡เดคเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต?

เดชเดฒ เดชเตˆเดคเตเดคเตบ เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเดฐเตเด‚ เด‡เดชเตเดชเต‹เดดเตเด‚ เดชเตˆเดคเตเดคเตบ 2 เตฝ เดจเดฟเดจเตเดจเต เดชเตˆเดคเตเดคเตบ 2 เดฒเต‡เด•เตเด•เต เดฎเดพเดฑเตเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด†เดฒเต‹เดšเดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต เดŽเดจเตเดจเดคเดพเดฃเต เดตเดธเตเดคเตเดค, เด…เดคเต‡เดธเดฎเดฏเด‚ เดชเตˆเดคเตเดคเตบ 3 เดคเดจเตเดจเต† เดธเดœเต€เดตเดฎเดพเดฏ เดตเดฟเด•เดธเดจเดคเตเดคเดฟเดฒเดพเดฃเต, เด•เต‚เดŸเดพเดคเต† เด•เต‚เดŸเตเดคเตฝ เด•เต‚เดŸเตเดคเตฝ เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเตเด•เตพ เดจเดฟเดฐเดจเตเดคเดฐเด‚ เดชเตเดฐเดคเตเดฏเด•เตเดทเดชเตเดชเต†เดŸเตเดจเตเดจเต. เด…เดคเดฟเดจเดพเตฝ, เดชเตˆเดคเตเดคเดฃเดฟเดจเตเดฑเต† เดตเดฟเดตเดฟเดง เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพเด•เตเด•เต เด†เด•เตเดธเดธเต เดจเตฝเด•เตเดฎเตเดชเต‹เตพ เดธเตเดฅเดฟเดฐเดคเดฏเตเดณเตเดณ เดธเดฟเดธเตเดฑเตเดฑเด‚ เดŸเต‚เดณเตเด•เดณเตเดŸเต† เด†เดตเดถเตเดฏเด•เดค เดจเดฟเดฑเดตเต‡เดฑเตเดฑเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ, เดธเดฟเดธเตเดฑเตเดฑเด‚ เดชเตˆเดคเตเดคเตบ เด’เดฐเต เดชเตเดคเดฟเดฏ เดชเดพเด•เตเด•เต‡เดœเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดฑเตเดฑเตเด•เดฏเตเด‚ เดชเตˆเดคเตเดคเตบ 2.7, 3.6 เดŽเดจเตเดจเดฟเดต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเต เดจเตฝเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดคเต. เดฎเดพเดฑเตเดฑเด™เตเด™เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเด‚ เด…เดต เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เดตเดฐเตเดคเตเดคเดฟเดฏเดคเต†เดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเด‚ เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฃเดคเตเดคเดฟเตฝ เด•เดพเดฃเดพเด‚ เดฒเดพเด‚เด—เตเดกเตบ เดตเตˆเดฑเตเดฑเดฟเดจเตเดฑเต† เดฌเตเดฒเต‹เด—เต (เดฒเดพเด™เตเดกเตบ เดตเตˆเดฑเตเดฑเต).

เด…เดคเดฟเดจเดพเตฝ, เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เดชเตˆเดคเตเดคเตบ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเด™เตเด™เตพ เดฐเดฃเตเดŸเต เดชเดพเด•เตเด•เต‡เดœเตเด•เตพ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดคเดพเตฝ เดฎเดคเดฟ, เดชเตˆเดคเตเดคเตบ3-เดชเดฟเดชเตเดชเต เด’เดฐเต เดกเดฟเดชเตปเดกเตปเดธเดฟเดฏเดพเดฏเดฟ เด‰เตพเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต.

sudo yum install python36 python3-virtualenv

เดฒเดพเด‚เด—เตโ€Œเดกเตบ เดจเดฟเตผเดฆเตเดฆเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต† เดจเต‡เดฐเดฟเดŸเตเดŸเตเดณเตเดณ เดฎเตŠเดกเตเดฏเต‚เตพ เด•เต‹เดณเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•เดฏเตเด‚ pip3 เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเต เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเต? เดตเดฐเดพเดจเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด“เดŸเตเดŸเต‹เดฎเต‡เดทเตป เดฎเดจเดธเตเดธเดฟเตฝ เดตเต†เดšเตเดšเตเด•เตŠเดฃเตเดŸเต, เด’เดฐเต เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เดชเตˆเดชเตเดชเต เดŽเด•เตโ€Œเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเดฌเดฟเตพ เด‰เดณเตเดณ virtualenvs-เดจเต† เดชเดฟเดชเตเดชเต เดฎเตŠเดกเตเดฏเต‚เตพ เดชเดฟเดจเตเดคเตเดฃเดฏเตโ€Œเด•เตเด•เดพเดคเตเดคเดคเดฟเดจเดพเตฝ, เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด…เตปเดธเดฟเดฌเดฟเดณเดฟเดจเต เดชเตˆเดชเตเดชเต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเดพเดฏเดฟ เดตเดฐเตเดฎเต†เดจเตเดจเต เด…เดฑเดฟเดฏเดพเด‚.

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเด•เตเด•เดฒเตเดณเตเดณ เด’เดฐเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ python3 เดตเตเดฏเดพเด–เตเดฏเดพเดคเดพเดตเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดœเดพเด™เตเด•เต‹ เด‡เตปเดธเตเดฑเตเดฑเดพเดณเต‡เดทเตป เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเดฟเตฝ เดคเตเดŸเดฐเดพเดจเตเด‚ เดžเด™เตเด™เดณเตเดŸเต† เดฎเดฑเตเดฑเต เด˜เดŸเด•เด™เตเด™เตพเด•เตเด•เตŠเดชเตเดชเด‚ เด’เดฐเต เดตเตผเด•เตเด•เดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚. เด‡เดจเตเดฑเตผเดจเต†เดฑเตเดฑเดฟเตฝ เดจเดฟเดฐเดตเดงเดฟ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ เด“เดชเตเดทเดจเตเด•เตพ เดฒเดญเตเดฏเดฎเดพเดฃเต. เด‡เดตเดฟเดŸเต† เด’เดฐเต เดชเดคเดฟเดชเตเดชเต เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต, เดŽเดจเตเดจเดพเตฝ เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพเด•เตเด•เต เด…เดตเดฐเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดชเตเดฐเต‹เดธเดธเตเดธเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚.

Yum เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ RHEL 8-เตฝ เดฒเดญเตเดฏเดฎเดพเดฏ PostgreSQL, Nginx เดชเดคเดฟเดชเตเดชเตเด•เตพ เดžเด™เตเด™เตพ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด‚.

sudo yum install nginx postgresql-server

PostgreSQL-เดจเต psycopg2 เด†เดตเดถเตเดฏเดฎเดพเดฏเดฟ เดตเดฐเตเด‚, เดชเด•เตเดทเต‡ เด‡เดคเต เด’เดฐเต virtualenv เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดฏเดฟเตฝ เดฎเดพเดคเตเดฐเดฎเต‡ เดฒเดญเตเดฏเดฎเดพเด•เต‚, เด…เดคเดฟเดจเดพเตฝ Django, Gunicorn เดŽเดจเตเดจเดฟเดตเดฏเตโ€Œเด•เตเด•เตŠเดชเตเดชเด‚ pip3 เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเด™เตเด™เตพ เด‡เดคเต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด‚. เดŽเดจเตเดจเดพเตฝ เด†เดฆเตเดฏเด‚ เดจเดฎเตเดฎเตพ virtualenv เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

เดœเดพเด‚เด—เต‹ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เตพ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดถเดฐเดฟเดฏเดพเดฏ เดธเตเดฅเดฒเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเดจเตเดจ เดตเดฟเดทเดฏเดคเตเดคเดฟเตฝ เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เดงเดพเดฐเดพเดณเด‚ เดšเตผเดšเตเดšเด•เตพ เดจเดŸเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต, เดŽเดจเตเดจเดพเตฝ เดธเด‚เดถเดฏเดฎเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ Linux เดซเดฏเตฝเดธเดฟเดธเตเดฑเตเดฑเด‚ เดนเตˆเดฐเดพเตผเด•เตเด•เดฟ เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเดฟเดฒเต‡เด•เตเด•เต เดคเดฟเดฐเดฟเดฏเดพเด‚. เดชเตเดฐเดคเตเดฏเต‡เด•เดฎเดพเดฏเดฟ, FHS เดชเดฑเดฏเตเดจเตเดจเต: "เดนเต‹เดธเตเดฑเตเดฑเต-เดจเดฟเตผเดฆเตเดฆเดฟเดทเตโ€ŒเดŸ เดกเดพเดฑเตเดฑ เดธเด‚เดญเดฐเดฟเด•เตเด•เดพเตป-เดธเดฟเดธเตเดฑเตเดฑเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจ เดกเดพเดฑเตเดฑ, เดตเต†เดฌเต เดธเต†เตผเดตเตผ เดกเดพเดฑเตเดฑ, เดธเตโ€Œเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ, 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-เดธเต†เตผเดตเตผ เดชเดพเด•เตเด•เต‡เดœเดฟเดจเตŠเดชเตเดชเด‚ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดค postgresql-เดธเต†เดฑเตเดฑเดชเตเดชเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดพเดฃเต. เด•เตเดฒเดธเตเดฑเตเดฑเตผ เด‡เดจเต€เดทเตเดฏเดฒเตˆเดธเต‡เดทเตป เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด…เดชเตโ€Œเด—เตเดฐเต‡เดกเต เดชเตเดฐเต‹เดธเดธเตเดธเต เดชเต‹เดฒเตเดณเตเดณ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด•เตเดฒเดธเตเดฑเตเดฑเตผ เด…เดกเตเดฎเดฟเดจเดฟเดธเตเดŸเตเดฐเต‡เดทเดจเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸ เด…เดŸเดฟเดธเตเดฅเดพเดจ เดœเต‹เดฒเดฟเด•เตพ เดšเต†เดฏเตเดฏเดพเตป เดˆ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดจเดฟเด™เตเด™เดณเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต. เด’เดฐเต RHEL เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เด’เดฐเต เดชเตเดคเดฟเดฏ PostgreSQL เด‡เตปเดธเตเดฑเตเดฑเตปเดธเต เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดžเด™เตเด™เตพ เด•เดฎเดพเตปเดกเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต:

sudo /usr/bin/postgresql-setup -initdb

เดจเดฟเด™เตเด™เตพเด•เตเด•เต systemd เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต PostgreSQL เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเดจเตเด‚ เด’เดฐเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเดจเตเด‚ เดœเดพเด™เตเด•เต‹เดฏเดฟเตฝ เด’เดฐเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚. เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเดพเดฏเดฟ เดชเดพเดธเตโ€Œเดตเต‡เดกเต เดธเด‚เดญเดฐเดฃเด‚ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เด•เตเดฒเดฏเดจเตเดฑเต เด†เดงเดฟเด•เดพเดฐเดฟเด•เดค เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเดฒเดฟเตฝ (เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ 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.

เดตเต†เดฌเต เดธเต†เตผเดตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เดชเตˆเดคเตเดคเตบ เดตเต†เดฌเต เดซเตเดฐเต†เดฏเดฟเด‚เดตเตผเด•เตเด•เดฟเดฒเต‡เด•เตเด•เต เด•เตˆเดฎเดพเดฑเตเด• เดŽเดจเตเดจเดคเดพเดฃเต เดตเต†เดฌเต เดธเต†เตผเดตเตผ เด—เต‡เดฑเตเดฑเตโ€Œเดตเต‡ เด‡เดจเตเดฑเตผเดซเต‡เดธเดฟเดจเตเดฑเต† เดœเต‹เดฒเดฟ. CGI เดŽเดžเตเดšเดฟเดจเตเด•เตพ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจ เด•เดพเดฒเดคเตเดคเต† เดญเดฏเดพเดจเด•เดฎเดพเดฏ เดญเต‚เดคเด•เดพเดฒเดคเตเดคเดฟเดจเตเดฑเต† เด…เดตเดถเดฟเดทเตเดŸเดฎเดพเดฃเต WSGI, เดตเต†เดฌเต เดธเต†เตผเดตเดฑเต‹ เดชเตˆเดคเตเดคเตบ เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเต‹ เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เดพเดคเต† เดคเดจเตเดจเต† เด‡เดจเตเดจเต WSGI เดฏเดฅเดพเตผเดคเตเดฅ เดจเดฟเดฒเดตเดพเดฐเดฎเดพเดฃเต. เดŽเดจเตเดจเดพเตฝ เดตเตเดฏเดพเดชเด•เดฎเดพเดฏ เด‰เดชเดฏเต‹เด—เด‚ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเดฟเดŸเตเดŸเตเด‚, เดˆ เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเตเด•เตพเด•เตเด•เตŠเดชเตเดชเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดจเดฟเดฐเดตเดงเดฟ เดธเต‚เด•เตเดทเตเดฎเดคเด•เดณเตเด‚ เดจเดฟเดฐเดตเดงเดฟ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดชเตเดชเตเด•เดณเตเด‚ เด‰เดฃเตเดŸเต. เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด’เดฐเต เดธเต‹เด•เตเด•เดฑเตเดฑเต เดตเดดเดฟ Gunicorn เด‰เด‚ Nginx เด‰เด‚ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเด‚ เดธเตเดฅเดพเดชเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพ เดถเตเดฐเดฎเดฟเด•เตเด•เตเด‚.

เดˆ เดฐเดฃเตเดŸเต เด˜เดŸเด•เด™เตเด™เดณเตเด‚ เด’เดฐเต‡ เดธเต†เตผเดตเดฑเดฟเตฝ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ, เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เดธเต‹เด•เตเด•เดฑเตเดฑเดฟเดจเต เดชเด•เดฐเด‚ UNIX เดธเต‹เด•เตเด•เดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดพเด‚. เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเดคเตเดคเดฟเดจเต เด’เดฐเต เดธเต‹เด•เตเด•เดฑเตเดฑเต เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเดคเดฟเดจเดพเตฝ, เดจเดฎเตเด•เตเด•เต เด’เดฐเต เด˜เดŸเตเดŸเด‚ เด•เต‚เดŸเดฟ เดŽเดŸเตเดคเตเดคเต systemd เดตเดดเดฟ Gunicorn-เดจเดพเดฏเดฟ เดธเต‹เด•เตเด•เดฑเตเดฑเต เด†เด•เตเดฑเตเดฑเดฟเดตเต‡เดทเตป เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดพเด‚.

เดธเต‹เด•เตเด•เดฑเตเดฑเต เดธเดœเต€เดตเดฎเดพเด•เตเด•เดฟเดฏ เดธเต‡เดตเดจเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเด•เตเดฐเดฟเดฏ เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฃเต. เด†เดฆเตเดฏเด‚, UNIX เดธเต‹เด•เตเด•เดฑเตเดฑเต เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจ เดชเต‹เดฏเดฟเดจเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดšเต‚เดฃเตเดŸเดฟเด•เตเด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต ListenStream เดกเดฏเดฑเด•เตโ€ŒเดŸเต€เดตเต เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดฏเต‚เดฃเดฟเดฑเตเดฑเต เดซเดฏเตฝ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเต, เดคเตเดŸเตผเดจเตเดจเต เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด‚ เดธเต‹เด•เตเด•เดฑเตเดฑเต เดฏเต‚เดฃเดฟเดฑเตเดฑเต เดซเดฏเดฒเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟเดจเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เดธเต‡เดตเดจเดคเตเดคเดฟเดจเตเดณเตเดณ เดฏเต‚เดฃเดฟเดฑเตเดฑเต เดซเดฏเตฝ. เดคเตเดŸเตผเดจเตเดจเต, เดธเตผเดตเต€เดธเต เดฏเต‚เดฃเดฟเดฑเตเดฑเต เดซเดฏเดฒเดฟเตฝ, เดตเต†เตผเดšเตเดตเตฝ เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต Gunicorn-เดจเต† เดตเดฟเดณเดฟเดšเตเดšเต UNIX เดธเต‹เด•เตเด•เดฑเตเดฑเดฟเดจเตเด‚ Django เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด‚ เด’เดฐเต WSGI เดฌเตˆเตปเดกเดฟเด‚เด—เต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด• เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เด…เดตเดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเดคเต.

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดตเตเดจเตเดจ เดฏเต‚เดฃเดฟเดฑเตเดฑเต เดซเดฏเดฒเตเด•เดณเตเดŸเต† เดšเดฟเดฒ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ เด‡เดคเดพ. เด†เดฆเตเดฏเด‚ เดžเด™เตเด™เตพ เดธเต‹เด•เตเด•เดฑเตเดฑเต เดธเดœเตเดœเดฎเดพเด•เตเด•เดฟ.

[Unit]
Description=Gunicorn WSGI socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

เด‡เดชเตเดชเต‹เตพ เดจเดฟเด™เตเด™เตพ Gunicorn เดกเต†เดฎเตบ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

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

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

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

[Install]
WantedBy=multi-user.target

Nginx-เดจเต† เดธเด‚เดฌเดจเตเดงเดฟเดšเตเดšเดฟเดŸเดคเตเดคเต‹เดณเด‚, เดชเตเดฐเต‹เด•เตโ€Œเดธเดฟ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเดฒเตเด•เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดจเดฟเด™เตเด™เตพ เด’เดฐเต†เดฃเตเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เด‰เดณเตเดณเดŸเด•เตเด•เด‚ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด’เดฐเต เดกเดฏเดฑเด•เตโ€ŒเดŸเดฑเดฟ เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด• เดŽเดจเตเดจเดคเต เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เด•เดพเดฐเตเดฏเดฎเดพเดฃเต. RHEL-เตฝ, Nginx เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเดฒเตเด•เตพ /etc/nginx/conf.d-เตฝ เดธเตเดฅเดฟเดคเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เด‰เดฆเดพเดนเดฐเดฃเด‚ /etc/nginx/conf.d/default.conf เดซเดฏเดฒเดฟเดฒเต‡เด•เตเด•เต เดชเด•เตผเดคเตเดคเดฟ เดธเต‡เดตเดจเด‚ เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเด‚. เดจเดฟเด™เตเด™เดณเตเดŸเต† เดนเต‹เดธเตเดฑเตเดฑเต เดจเดพเดฎเดตเตเดฎเดพเดฏเดฟ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเดคเดฟเดจเต server_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;
   }
}

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"

Gunicorn เดจเต† เดจเต‡เดฐเดฟเดŸเตเดŸเต เดŸเต†เดธเตเดฑเตเดฑเต เดšเต†เดฏเตเดคเดพเตฝ เด’เดฐเต เดชเตŠเดณเตเดณเดคเตเดคเดฐเด‚ เด•เดฟเดŸเตเดŸเตเด‚.

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

เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เด‡เดคเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต†เดจเตเดจเต เดจเดฎเตเด•เตเด•เต เด•เดฃเตเดŸเต†เดคเตเดคเดพเด‚. เดจเดฟเด™เตเด™เตพ เดฒเต‹เด—เต เดคเตเดฑเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดชเตเดฐเดถเตเดจเด‚ SELinux-เดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸเดคเดพเดฃเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพ เด•เดพเดฃเตเด‚. เดจเดฏเด™เตเด™เดณเตŠเดจเตเดจเตเด‚ เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒเดพเดคเตเดค เด’เดฐเต เดกเต†เดฎเตบ เดžเด™เตเด™เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ, เด…เดคเต init_t เดŽเดจเตเดจเต เด…เดŸเดฏเดพเดณเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดˆ เดธเดฟเดฆเตเดงเดพเดจเตเดคเด‚ เดชเตเดฐเดพเดฏเต‹เด—เดฟเด•เดฎเดพเดฏเดฟ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚.

sudo setenforce 0

เด‡เดคเต†เดฒเตเดฒเดพเด‚ เดตเดฟเดฎเตผเดถเดจเดคเตเดคเดฟเดจเตเด‚ เดฐเด•เตเดคเด•เตเด•เดฃเตเดฃเต€เตผเด•เตเด•เตเด‚ เด•เดพเดฐเดฃเดฎเดพเดฏเต‡เด•เตเด•เดพเด‚, เดชเด•เตเดทเต‡ เด‡เดคเต เดชเตเดฐเต‹เดŸเตเดŸเต‹เดŸเตˆเดชเตเดชเต เดกเต€เดฌเด—เตเด—เดฟเด‚เด—เต เดฎเดพเดคเตเดฐเดฎเดพเดฃเต. เด‡เดคเดพเดฃเต เดชเตเดฐเดถเตโ€Œเดจเด‚ เดŽเดจเตเดจเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เดพเตป เดจเดฎเตเด•เตเด•เต เดชเดฐเดฟเดถเต‹เดงเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เตเด•เดพเด‚, เด…เดคเดฟเดจเตเดถเต‡เดทเด‚ เดžเด™เตเด™เตพ เดŽเดฒเตเดฒเดพเด‚ เด…เดคเดฟเดจเตเดฑเต† เดธเตเดฅเดพเดจเดคเตเดคเต‡เด•เตเด•เต เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเด‚.

เดฌเตเดฐเต—เดธเดฑเดฟเตฝ เดชเต‡เดœเต เดชเตเดคเตเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†เดฏเต‹ เดžเด™เตเด™เดณเตเดŸเต† curl เด•เดฎเดพเตปเดกเต เดตเต€เดฃเตเดŸเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†เดฏเต‹ เดจเดฟเด™เตเด™เตพเด•เตเด•เต Django เดŸเต†เดธเตเดฑเตเดฑเต เดชเต‡เดœเต เด•เดพเดฃเดพเตป เด•เดดเดฟเดฏเตเด‚.

เด…เดคเดฟเดจเดพเตฝ, เดŽเดฒเตเดฒเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต†เดจเตเดจเตเด‚ เด•เต‚เดŸเตเดคเตฝ เด…เดจเตเดฎเดคเดฟ เดชเตเดฐเดถเตโ€Œเดจเด™เตเด™เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒเต†เดจเตเดจเตเด‚ เด‰เดฑเดชเตเดชเตเดตเดฐเตเดคเตเดคเดฟเดฏ เดถเต‡เดทเด‚, เดžเด™เตเด™เตพ SELinux เดตเต€เดฃเตเดŸเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เตเดจเตเดจเต.

sudo setenforce 1

audit2allow เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ sepolgen เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดฒเต‡เตผเดŸเตเดŸเต เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เดจเดฏเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต† เด•เตเดฑเดฟเดšเตเดšเต เดžเดพเตป เด‡เดตเดฟเดŸเต† เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เดฟเดฒเตเดฒ, เด•เดพเดฐเดฃเด‚ เด‡เดชเตเดชเต‹เตพ เดฏเดฅเดพเตผเดคเตเดฅ เดœเดพเด‚เด—เต‹ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด’เดจเตเดจเตเดฎเดฟเดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ 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

Gunicorn เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ UNIX เดธเต‹เด•เตเด•เดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดกเดพเดฑเตเดฑ เดŽเดดเตเดคเตเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต Nginx-เดจเต† SELinux เดคเดŸเดฏเตเดจเตเดจเต. เดธเดพเดงเดพเดฐเดฃเด—เดคเดฟเดฏเดฟเตฝ, เด…เดคเตเดคเดฐเด‚ เดธเดจเตเดฆเตผเดญเด™เตเด™เดณเดฟเตฝ, เดจเดฏเด™เตเด™เตพ เดฎเดพเดฑเดพเตป เดคเตเดŸเด™เตเด™เตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เดฎเดฑเตเดฑเต เดตเต†เดฒเตเดฒเตเดตเดฟเดณเดฟเด•เตพ เดฎเตเดจเตเดจเดฟเดฒเตเดฃเตเดŸเต. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฃ เดกเตŠเดฎเต†เดฏเตโ€Œเดจเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เด…เดจเตเดฎเดคเดฟ เดกเตŠเดฎเต†เดฏเตโ€Œเดจเดฟเดฒเต‡เด•เตเด•เต เดกเตŠเดฎเต†เดฏเตโ€Œเตป เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เดฎเดพเดฑเตเดฑเดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚. เด‡เดจเดฟ เดจเดฎเตเด•เตเด•เต httpd_t เด…เดจเตเดฎเดคเดฟ เดกเตŠเดฎเต†เดฏเตโ€Œเดจเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดฑเตเดฑเดพเด‚. เด‡เดคเต Nginx-เดจเต เด†เดตเดถเตเดฏเดฎเดพเดฏ เด†เด•เตโ€Œเดธเดธเต เดจเตฝเด•เตเด‚, เดžเด™เตเด™เตพเด•เตเด•เต เด•เต‚เดŸเตเดคเตฝ เดกเต€เดฌเด—เตเด—เดฟเด‚เด—เต เดœเต‹เดฒเดฟเด•เตพ เดคเตเดŸเดฐเดพเด‚.

sudo semanage permissive -a httpd_t

เด…เดคเดฟเดจเดพเตฝ, เดจเดฟเด™เตเด™เตพ SELinux เดชเดฐเดฟเดฐเด•เตเดทเดฟเดคเดฎเดพเดฏเดฟ เดจเดฟเดฒเดจเดฟเตผเดคเตเดคเดพเตป เด•เดดเดฟเดžเตเดžเดพเตฝ (เดจเดฟเด™เตเด™เตพ เด’เดฐเต SELinux เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดค เดฎเต‹เดกเดฟเตฝ เด‰เดชเต‡เด•เตเดทเดฟเด•เตเด•เดฐเตเดคเต) เด…เดจเตเดฎเดคเดฟ เดกเตŠเดฎเต†เดฏเตโ€Œเดจเตเด•เตพ เดฒเต‹เดกเตเดšเต†เดฏเตโ€Œเดคเตเด•เดดเดฟเดžเตเดžเดพเตฝ, เดŽเดฒเตเดฒเดพเด‚ เดถเดฐเดฟเดฏเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต gunicorn_exec_t เดŽเดจเตเดจเต เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เด…เดŸเดฏเดพเดณเดชเตเดชเต†เดŸเตเดคเตเดคเต‡เดฃเตเดŸเดคเต เดŽเดจเตเดคเดพเดฃเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดตเต€เดฃเตเดŸเตเด‚. เด†เด•เตเดธเดธเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด™เตเด™เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดชเตเดคเดฟเดฏ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เด•เดพเดฃเตเดจเตเดจเดคเดฟเดจเต เดตเต†เดฌเตเดธเตˆเดฑเตเดฑเต เดธเดจเตเดฆเตผเดถเดฟเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดพเด‚.

sudo ausearch -m AVC -c gunicorn

/srv/djangoapp-เดฒเต† เดซเดฏเดฒเตเด•เดณเดฟเตฝ เดตเดฟเดตเดฟเดง เด•เดพเดฐเตเดฏเด™เตเด™เตพ เดšเต†เดฏเตเดฏเตเดจเตเดจ 'comm="gunicorn" เด…เดŸเด™เตเด™เดฟเดฏ เดงเดพเดฐเดพเดณเด‚ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เดจเดฟเด™เตเด™เตพ เด•เดพเดฃเตเด‚, เด…เดคเดฟเดจเดพเตฝ เด‡เดคเต เดตเตเดฏเด•เตเดคเดฎเดพเดฏเตเด‚ เดซเตเดฒเดพเด—เตเดšเต†เดฏเตเดฏเต‡เดฃเตเดŸ เด•เดฎเดพเตปเดกเตเด•เดณเดฟเตฝ เด’เดจเตเดจเดพเดฃเต.

เดŽเดจเตเดจเดพเตฝ เด‡เดคเตเด•เต‚เดŸเดพเดคเต†, เด‡เดคเตเดชเต‹เดฒเตเดณเตเดณ เด’เดฐเต เดธเดจเตเดฆเต‡เดถเด‚ เดฆเตƒเดถเตเดฏเดฎเดพเด•เตเดจเตเดจเต:

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 เด•เดฎเดพเตปเดกเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเต‹ เดšเต†เดฏเตเดคเดพเตฝ, เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เดณเตŠเดจเตเดจเตเด‚ เดจเดฟเด™เตเด™เตพ เด•เดพเดฃเดฟเดฒเตเดฒ. เดžเด™เตเด™เดณเตเดŸเต† virtualenv เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดฏเดฟเตฝ Gunicorn เดชเตˆเดคเตเดคเตบ เด‡เดจเตเดฑเตผเดชเตเดฐเต†เดฑเตเดฑเตผ เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดพเดฏเดฟ เดคเต‹เดจเตเดจเตเดจเตเดจเต, เด’เดฐเตเดชเด•เตเดทเต‡ เดตเตผเด•เตเด•เตผ เดธเตโ€Œเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต. เด…เดคเดฟเดจเดพเตฝ เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเด•เตเด•เต เดˆ เดฐเดฃเตเดŸเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเดฌเดฟเตพ เดซเดฏเดฒเตเด•เตพ เด…เดŸเดฏเดพเดณเดชเตเดชเต†เดŸเตเดคเตเดคเตเด•เดฏเตเด‚ เดžเด™เตเด™เดณเตเดŸเต† เดœเดพเด™เตเด•เต‹ เดŸเต†เดธเตเดฑเตเดฑเต เดชเต‡เดœเต เดคเตเดฑเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเดฎเต‹ เดŽเดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเดพเด‚.

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

เดชเตเดคเดฟเดฏ เดŸเดพเด—เต เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต เด—เดฃเดฟเด•เต‹เตบ เดธเต‡เดตเดจเด‚ เดชเตเดจเดฐเดพเดฐเด‚เดญเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เด‰เดŸเดจเดŸเดฟ เดชเตเดจเดฐเดพเดฐเด‚เดญเดฟเด•เตเด•เดพเด‚ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดธเต‡เดตเดจเด‚ เดจเดฟเตผเดคเตเดคเดฟ เดฌเตเดฐเต—เดธเดฑเดฟเตฝ เดธเตˆเดฑเตเดฑเต เดคเตเดฑเด•เตเด•เตเดฎเตเดชเต‹เตพ เดธเต‹เด•เตเด•เดฑเตเดฑเต เด…เดคเต เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเด•. ps เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเต‹เดธเดธเตเดธเตเด•เตพเด•เตเด•เต เดถเดฐเดฟเดฏเดพเดฏ เดฒเต‡เดฌเดฒเตเด•เตพ เดฒเดญเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต‹เดฏเต†เดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด•.

ps -efZ | grep gunicorn

เดชเดฟเดจเตเดจเต€เดŸเต เด’เดฐเต เดธเดพเดงเดพเดฐเดฃ SELinux เดจเดฏเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เดฎเดฑเด•เตเด•เดฐเตเดคเต!

เดจเดฟเด™เตเด™เตพ เด‡เดชเตเดชเต‹เตพ เดŽเดตเดฟเดธเดฟ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เดจเต‹เด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด…เดตเดธเดพเดจ เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเตฝ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸ เดŽเดฒเตเดฒเดพเดคเตเดคเดฟเดจเตเด‚ เดชเต†เตผเดฎเดฟเดธเดฟเดตเต=1, เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต† เดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเดตเดฏเตเด•เตเด•เต เดชเต†เตผเดฎเดฟเดธเดฟเดตเต=0 เดŽเดจเตเดจเดฟเดต เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด’เดฐเต เดฏเดฅเดพเตผเดคเตเดฅ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเต เดเดคเต เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เด†เด•เตโ€Œเดธเดธเดพเดฃเต เด†เดตเดถเตเดฏเดฎเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดฟเดฏเดพเตฝ, เด…เดคเตเดคเดฐเด‚ เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฑเตเดฑเดตเตเด‚ เดจเดฒเตเดฒ เดฎเดพเตผเด—เด‚ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเต‡เด—เดคเตเดคเดฟเตฝ เด•เดฃเตเดŸเต†เดคเตเดคเดพเดจเดพเด•เตเด‚. เดŽเดจเตเดจเดพเตฝ เด…เดคเตเดตเดฐเต†, เดธเดฟเดธเตเดฑเตเดฑเด‚ เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดพเดฏเดฟ เดธเต‚เด•เตเดทเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดœเดพเด‚เด—เต‹ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเตเดฑเต† เดตเตเดฏเด•เตเดคเดฎเดพเดฏ เด‰เดชเดฏเต‹เด—เดฏเต‹เด—เตเดฏเดฎเดพเดฏ เด“เดกเดฟเดฑเตเดฑเต เดจเต‡เดŸเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดพเดฃเต เดจเดฒเตเดฒเดคเต.

sudo ausearch -m AVC

เดธเด‚เดญเดตเดฟเดšเตเดšเต!

Nginx, Gunicorn WSGI เดŽเดจเตเดจเดฟเดตเดฏเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เด’เดฐเต เดซเตเดฐเดฃเตเดŸเตโ€ŒเดŽเตปเดกเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดœเดพเด™เตเด•เต‹ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดชเตเดฐเดคเตเดฏเด•เตเดทเดชเตเดชเต†เดŸเตเดŸเต. RHEL 3 เดฌเต€เดฑเตเดฑ เดถเต‡เด–เดฐเดฃเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดžเด™เตเด™เตพ Python 10, PostgreSQL 8 เดŽเดจเตเดจเดฟเดต เด•เตเดฐเดฎเต€เด•เดฐเดฟเดšเตเดšเต. เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดชเตเดฐเด•เตเดฐเดฟเดฏ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เดชเตเดฐเด•เดŸเดจเด‚ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเตเด‚ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดˆ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตˆเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เด‡เดชเตเดชเต‹เตพ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเตเดจเตเดจเต‹เดŸเตเดŸเต เดชเต‹เด•เดพเดจเตเด‚ เดœเดพเด‚เด—เต‹ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเดจเตเด‚ (เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดพเดจเตเด‚) เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ RHEL 8 เดฌเต€เดฑเตเดฑเดฏเดฟเตฝ เดฒเดญเตเดฏเดฎเดพเดฏ เดฎเดฑเตเดฑเต เดŸเต‚เดณเตเด•เตพ เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเดพเด‚.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•