RHEL 8 เชฌเซเชเชพ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเชเชจเซ เชเชฃเซ เชจเชตเซ เชธเซเชตเชฟเชงเชพเช เชชเซเชฐเชฆเชพเชจ เชเชฐเซ เชเซ, เชเซเชจเซ เชธเซเชเชฟ เชชเซเชทเซเช เซ เชฒเช เชถเชเซ เชเซ, เชเซ เชเซ, เชจเชตเซ เชตเชธเซเชคเซเช เชถเซเชเชตเซ เชนเชเชฎเซเชถเชพ เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช เชตเชงเซ เชธเชพเชฐเซ เชเซ, เชคเซเชฅเซ เชจเซเชเซ เช เชฎเซ เชเชฐเซเชเชฐ Red Hat Enterprise Linux 8 เชฌเซเชเชพ เชชเชฐ เชเชงเชพเชฐเชฟเชค เชเชชเซเชฒเชฟเชเซเชถเชจ เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐ เชฌเชจเชพเชตเชตเชพ เชชเชฐ เชตเชฐเซเชเชถเซเชช เชเชซเชฐ เชเชฐเซเช เชเซเช.
เชเชพเชฒเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเชเชฎเชพเช เชฒเซเชเชชเซเชฐเชฟเชฏ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฟเชเช เชฒเซเชเชเซเชตเซเช เชชเชพเชฏเชฅเซเชจเชจเซ เชเชงเชพเชฐ เชคเชฐเซเชเซ เชฒเชเช, Django เช
เชจเซ PostgreSQL, เชเชชเซเชฒเซเชเซเชถเชจ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ เชเชเชฆเชฎ เชธเชพเชฎเชพเชจเซเชฏ เชธเชเชฏเซเชเชจ, เช
เชจเซ เชคเซเชฎเชจเซ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ RHEL 8 Beta เชจเซ เชเซเช เชตเซเช. เชชเชเซ เช
เชฎเซ เชฅเซเชกเชพ เชตเชงเซ (เช
เชตเชฐเซเชเซเชเซเชค) เชเชเชเซ เชเชฎเซเชฐเซเชถเซเช.
เชชเชฐเซเชเซเชทเชฃ เชตเชพเชคเชพเชตเชฐเชฃ เชฌเชฆเชฒเชพเชถเซ, เชเชพเชฐเชฃ เชเซ เชเชเซเชฎเซเชถเชจเชจเซ เชถเชเซเชฏเชคเชพเชเชจเซเช เช
เชจเซเชตเซเชทเชฃ เชเชฐเชตเซเช, เชเชจเซเชเซเชจเชฐ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเซเช เช
เชจเซ เชฌเชนเซเชตเชฟเชง เชธเชฐเซเชตเชฐเซเชธ เชธเชพเชฅเซ เชชเชฐเซเชฏเชพเชตเชฐเชฃเชจเซ เช
เชเชฎเชพเชตเชตเชพเชจเซเช เชฐเชธเชชเซเชฐเชฆ เชเซ. เชจเชตเชพ เชชเซเชฐเซเชเซเชเซเช เชธเชพเชฅเซ เชชเซเชฐเชพเชฐเชเชญ เชเชฐเชตเชพ เชฎเชพเชเซ, เชคเชฎเซ เชนเชพเชฅเชฅเซ เชเช เชจเชพเชจเซ, เชธเชฐเชณ เชชเซเชฐเซเชเซเชเชพเชเชช เชฌเชจเชพเชตเซเชจเซ เชชเซเชฐเชพเชฐเชเชญ เชเชฐเซ เชถเชเซ เชเซ เชเซเชฅเซ เชคเชฎเซ เชฌเชฐเชพเชฌเชฐ เชเซเช เชถเชเซ เชเซ เชถเซเช เชฅเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เช
เชจเซ เชคเซ เชเซเชตเซ เชฐเซเชคเซ เชเซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพ เชเชฐเซ เชเซ, เช
เชจเซ เชชเชเซ เชธเซเชตเชเชพเชฒเชฟเชค เชเชฐเชตเชพ เช
เชจเซ เชตเชงเซ เชเชเชฟเชฒ เชเซเช เชตเชฃเซเช เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ เชเชเชณ เชตเชงเซ. เชเชเซ เชเชชเชฃเซ เชเชตเชพ เชชเซเชฐเซเชเซเชเชพเชเชชเชจเซ เชฐเชเชจเชพ เชตเชฟเชถเซ เชตเชพเชค เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช.
เชเชพเชฒเซ เชเชฐเชเชเชเชเชฒ 8 เชฌเซเชเชพ เชตเซเชเชฎ เชเชฎเซเช เชเชฎเชพเชตเซเชจเซ เชถเชฐเซเชเชค เชเชฐเซเช. เชคเชฎเซ เชถเชฐเซเชเชคเชฅเซ เชตเชฐเซเชเซเชฏเซเช เชฒ เชฎเชถเซเชจ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ เชถเชเซ เชเซ, เช เชฅเชตเชพ เชคเชฎเชพเชฐเชพ เชฌเซเชเชพ เชธเชฌเซเชธเซเชเซเชฐเชฟเชชเซเชถเชจ เชธเชพเชฅเซ เชเชชเชฒเชฌเซเชง KVM เชเซเชธเซเช เชเชฎเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ. เชฎเชนเซเชฎเชพเชจ เชเชฎเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเชคเซ เชตเชเชคเซ, เชคเชฎเชพเชฐเซ เชตเชฐเซเชเซเชฏเซเช เชฒ เชธเซเชกเซเชจเซ เชฐเซเชชเชฐเซเชเชพเชเชเชฟเชค เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ เชเซ เชเซเชฎเชพเช เชฎเซเชเชพเชกเซเชเชพ เช เชจเซ เชฎเซเชเชพเชกเซเชเชพเชจเซ เชธเชฎเชพเชตเซเชถ เชฅเชถเซ (เชเซเชฒเชพเชเชก-เชเชจเชฟเช). เชคเชฎเชพเชฐเซ เชกเชฟเชธเซเช เชธเซเชเซเชฐเชเซเชเชฐ เช เชฅเชตเชพ เชเชชเชฒเชฌเซเชง เชชเซเชเซเชเซ เชธเชพเชฅเซ เชเชเช เชเชพเชธ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชจเชฅเซ; เชเซเชเชชเชฃ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชเชฐเชถเซ.
เชเชพเชฒเซ เชธเชฎเชเซเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชชเชฐ เชจเชเซเชเชฅเซ เชจเชเชฐ เชเชฐเซเช.
Django เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ
Django เชจเชพ เชจเชตเซเชจเชคเชฎ เชธเชเชธเซเชเชฐเชฃ เชธเชพเชฅเซ, เชคเชฎเชพเชฐเซ Python 3.5 เช เชฅเชตเชพ เชชเชเซเชจเชพ เชตเชฐเซเชเซเชฏเซเช เชฒ เชชเชฐเซเชฏเชพเชตเชฐเชฃ (virtualenv) เชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ. เชฌเซเชเชพ เชจเซเชเชงเซเชฎเชพเช เชคเชฎเซ เชเซเช เชถเชเซ เชเซ เชเซ เชชเชพเชฏเชฅเซเชจ 3.6 เชเชชเชฒเชฌเซเชง เชเซ, เชเชพเชฒเซ เชคเชชเชพเชธเซเช เชเซ เช เชเชฐเซเชเชฐ เชเซเชธ เชเซ เชเซ เชเซเชฎ:
[cloud-user@8beta1 ~]$ python
-bash: python: command not found
[cloud-user@8beta1 ~]$ python3
-bash: python3: command not found
Red Hat เชธเชเซเชฐเชฟเชฏเชชเชฃเซ RHEL เชฎเชพเช เชธเชฟเชธเซเชเชฎ เชเซเชฒเชเซเช เชคเชฐเซเชเซ เชชเชพเชฏเชฅเซเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ, เชคเซ เชถเชพ เชฎเชพเชเซ เช เชชเชฐเชฟเชฃเชพเชฎ เชเชตเซ เชเซ?
เชนเชเซเชเชค เช เชเซ เชเซ เชเชฃเชพ เชชเชพเชฏเชฅเซเชจ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช เชนเชเซ เชชเชฃ เชชเชพเชฏเชฅเซเชจ 2 เชฅเซ เชชเชพเชฏเชฅเซเชจ 2 เชฎเชพเช เชธเชเชเซเชฐเชฎเชฃ เชตเชฟเชถเซ เชตเชฟเชเชพเชฐเซ เชฐเชนเซเชฏเชพ เชเซ, เชเซเชฏเชพเชฐเซ เชชเชพเชฏเชฅเซเชจ 3 เชชเซเชคเซ เชธเชเซเชฐเชฟเชฏ เชตเชฟเชเชพเชธ เชนเซเช เชณ เชเซ, เช
เชจเซ เชตเชงเซ เช
เชจเซ เชตเชงเซ เชจเชตเชพ เชธเชเชธเซเชเชฐเชฃเซ เชธเชคเชค เชฆเซเชเชพเช เชฐเชนเซเชฏเชพ เชเซ. เชคเซเชฅเซ, Python เชจเซ เชตเชฟเชตเชฟเชง เชจเชตเซ เชเชตเซเชคเซเชคเชฟเช เชฎเชพเชเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชเชจเซ เชเชเซเชธเซเชธ เชชเซเชฐเชฆเชพเชจ เชเชฐเชคเซ เชตเชเชคเซ เชธเซเชฅเชฟเชฐ เชธเชฟเชธเซเชเชฎ เชเซเชฒเซเชธเชจเซ เชเชฐเซเชฐเชฟเชฏเชพเชคเชจเซ เชชเชนเซเชเชเซ เชตเชณเชตเชพ เชฎเชพเชเซ, เชธเชฟเชธเซเชเชฎ Python เชจเซ เชจเชตเชพ เชชเซเชเซเชเชฎเชพเช เชเชธเซเชกเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ เช
เชจเซ Python 2.7 เช
เชจเซ 3.6 เชฌเชเชจเซเชจเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพเชจเซ เชเซเชทเชฎเชคเชพ เชชเซเชฐเซ เชชเชพเชกเซ เชนเชคเซ. เชซเซเชฐเชซเชพเชฐเซ เช
เชจเซ เชคเซ เชถเชพ เชฎเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชนเชคเชพ เชคเซ เชตเชฟเชถเซ เชตเชงเซ เชฎเชพเชนเชฟเชคเซ เชเชฎเชพเชเชจเชพ เชชเซเชฐเชเชพเชถเชจเชฎเชพเช เชฎเชณเซ เชถเชเซ เชเซ
เชคเซเชฅเซ, เชเชพเชฐเซเชฏเชเชพเชฐเซ Python เชฎเซเชณเชตเชตเชพ เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ เชซเชเซเชค เชฌเซ เชชเซเชเซเชเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ, เชเซเชฎเชพเช python3-pip เชจเซ เชจเชฟเชฐเซเชญเชฐเชคเชพ เชคเชฐเซเชเซ เชถเชพเชฎเซเชฒ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
sudo yum install python36 python3-virtualenv
เชถเชพ เชฎเชพเชเซ เชฒเซเชเชเชกเซเชจเชจเชพ เชธเซเชเชจ เชฎเซเชเชฌ เชกเชพเชฏเชฐเซเชเซเช เชฎเซเชกเซเชฏเซเชฒ เชเซเชฒเชจเซ เชเชชเชฏเซเช เชจ เชเชฐเชตเซ เช เชจเซ pip3 เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเซเช? เชเชเชพเชฎเซ เชเชเซเชฎเซเชถเชจเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฐเชพเชเซเชจเซ, เชคเซ เชเชพเชฃเซเชคเซเช เชเซ เชเซ Ansible เชจเซ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ pip เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ, เชเชพเชฐเชฃ เชเซ pip เชฎเซเชกเซเชฏเซเชฒ เชตเซเชตเชฟเชงเซเชฏเชชเซเชฐเซเชฃ เชชเชพเชเชช เชเชเซเชเชฟเชเซเชฏเซเชเซเชฌเชฒ เชธเชพเชฅเซ เชตเชฐเซเชเซเชฏเซเช เชฒเซเชจเชตเซเชธเชจเซ เชธเชชเซเชฐเซเช เชเชฐเชคเซเช เชจเชฅเซ.
เชคเชฎเชพเชฐเชพ เชจเชฟเชเชพเชฒ เชชเชฐ เชเชพเชฐเซเชฏเชฐเชค python3 เชฆเซเชญเชพเชทเชฟเชฏเชพ เชธเชพเชฅเซ, เชคเชฎเซ Django เชเชจเซเชธเซเชเซเชฒเซเชถเชจ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชธเชพเชฅเซ เชเชพเชฒเซ เชฐเชพเชเซ เชถเชเซ เชเซ เช เชจเซ เช เชฎเชพเชฐเชพ เช เชจเซเชฏ เชเชเชเซ เชธเชพเชฅเซ เชเชพเชฐเซเชฏเชเชพเชฐเซ เชธเชฟเชธเซเชเชฎ เชงเชฐเชพเชตเซ เชถเชเซ เชเซ. เชเชจเซเชเชฐเชจเซเช เชชเชฐ เชเชฃเชพ เช เชฎเชฒเซเชเชฐเชฃ เชตเชฟเชเชฒเซเชชเซ เชเชชเชฒเชฌเซเชง เชเซ. เช เชนเซเช เชเช เชธเชเชธเซเชเชฐเชฃ เชชเซเชฐเชธเซเชคเซเชค เชเซ, เชชเชฐเชเชคเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเช เชคเซเชฎเชจเซ เชชเซเชคเชพเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ.
เช เชฎเซ Yum เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชกเชฟเชซเซเชฒเซเช เชฐเซเชชเซ RHEL 8 เชฎเชพเช เชเชชเชฒเชฌเซเชง PostgreSQL เช เชจเซ Nginx เชตเชฐเซเชเชจ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซเชถเซเช.
sudo yum install nginx postgresql-server
PostgreSQL เชจเซ psycopg2 เชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ, เชชเชฐเชเชคเซ เชคเซ เชซเชเซเชค เชตเชฐเซเชเซเชฏเซเช เชฒเซเชจเชต เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช เช เชเชชเชฒเชฌเซเชง เชนเซเชตเซเช เชเชฐเซเชฐเซ เชเซ, เชคเซเชฅเซ เช เชฎเซ เชคเซเชจเซ Django เช เชจเซ Gunicorn เชธเชพเชฅเซ pip3 เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซเชถเซเช. เชชเชฐเชเชคเซ เชชเชนเซเชฒเชพ เชเชชเชฃเซ เชตเชฐเซเชเซเชฏเซเช เชฒเซเชจเชต เชธเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
Django เชชเซเชฐเซเชเซเชเซเชเซเชธ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพ เชฎเชพเชเซ เชฏเซเชเซเชฏ เชธเซเชฅเชพเชจ เชชเชธเชเชฆ เชเชฐเชตเชพเชจเชพ เชตเชฟเชทเชฏ เชชเชฐ เชนเชเชฎเซเชถเชพ เชเชฃเซ เชเชฐเซเชเชพ เชฅเชพเชฏ เชเซ, เชชเชฐเชเชคเซ เชเซเชฏเชพเชฐเซ เชถเชเชเชพ เชนเซเชฏ, เชคเซเชฏเชพเชฐเซ เชคเชฎเซ เชนเชเชฎเซเชถเชพ Linux เชซเชพเชเชฒเชธเชฟเชธเซเชเชฎ เชนเชพเชฏเชฐเชพเชฐเซเชเซ เชธเซเชเชพเชจเซเชกเชฐเซเชก เชคเชฐเชซ เชตเชณเซ เชถเชเซ เชเซ. เชเชพเชธ เชเชฐเซเชจเซ, เชเชซเชเชเชเชธ เชเชนเซ เชเซ เชเซ /เชเชธเชเชฐเชตเซเชจเซ เชเชชเชฏเซเช เช เชฎเชพเชเซ เชฅเชพเชฏ เชเซ: "เชนเซเชธเซเช-เชตเชฟเชถเชฟเชทเซเช เชกเซเชเชพ เชธเซเชเซเชฐ เชเชฐเชตเชพ - เชกเซเชเชพ เชเซ เชเซ เชธเชฟเชธเซเชเชฎ เชเชคเซเชชเชจเซเชจ เชเชฐเซ เชเซ, เชเซเชฎ เชเซ เชตเซเชฌ เชธเชฐเซเชตเชฐ เชกเซเชเชพ เช เชจเซ เชธเซเชเซเชฐเชฟเชชเซเชเซเชธ, FTP เชธเชฐเซเชตเชฐเซเชธ เชชเชฐ เชธเชเชเซเชฐเชนเชฟเชค เชกเซเชเชพ เช เชจเซ เชธเชฟเชธเซเชเชฎ เชฐเซเชชเซเชเซเชเชฐเซเชเชจเซ เชจเชฟเชฏเชเชคเซเชฐเชฟเชค เชเชฐเชตเชพ." เชธเชเชธเซเชเชฐเชฃเซ (FHS เชฎเชพเช เชฆเซเชเชพเชฏ เชเซ. -2.3 2004เชฎเชพเช)."
เช เชฌเชฐเชพเชฌเชฐ เช เชฎเชพเชฐเซ เชเซเชธ เชเซ, เชคเซเชฅเซ เช เชฎเซ /srv เชฎเชพเช เช เชฎเชจเซ เชเซเชเชคเซ เชฆเชฐเซเช เชตเชธเซเชคเซ เชฎเซเชเซเช เชเซเช, เชเซ เช เชฎเชพเชฐเชพ เชเชชเซเชฒเชฟเชเซเชถเชจ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ (เชเซเชฒเชพเชเชก-เชฏเซเชเชฐ) เชจเซ เชฎเชพเชฒเชฟเชเซเชจเซ เชเซ.
sudo mkdir /srv/djangoapp
sudo chown cloud-user:cloud-user /srv/djangoapp
cd /srv/djangoapp
virtualenv django
source django/bin/activate
pip3 install django gunicorn psycopg2
./django-admin startproject djangoapp /srv/djangoapp
PostgreSQL เช เชจเซ Django เชธเซเช เชเชฐเชตเซเช เชธเชฐเชณ เชเซ: เชกเซเชเชพเชฌเซเช เชฌเชจเชพเชตเซ, เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชฌเชจเชพเชตเซ, เชชเชฐเชตเชพเชจเชเซเช เชเซเช เชตเซ. เชถเชฐเซเชเชคเชฎเชพเช PostgreSQL เชเชจเซเชธเซเชเซเชฒ เชเชฐเชคเซ เชตเชเชคเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฐเชพเชเชตเชพเชจเซ เชเช เชฌเชพเชฌเชค เช postgresql-setup เชธเซเชเซเชฐเชฟเชชเซเช เชเซ เชเซ postgresql-server เชชเซเชเซเช เชธเชพเชฅเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซเชฒ เชเซ. เช เชธเซเชเซเชฐเชฟเชชเซเช เชคเชฎเชจเซ เชกเซเชเชพเชฌเซเช เชเซเชฒเชธเซเชเชฐ เชเชกเชฎเชฟเชจเชฟเชธเซเชเซเชฐเซเชถเชจ เชธเชพเชฅเซ เชธเชเชเชณเชพเชฏเซเชฒ เชฎเซเชณเชญเซเชค เชเชพเชฐเซเชฏเซ เชเชฐเชตเชพ เชฎเชพเชเซ เชฎเชฆเชฆ เชเชฐเซ เชเซ, เชเซเชฎ เชเซ เชเซเชฒเชธเซเชเชฐ เชชเซเชฐเชพเชฐเชเชญ เช เชฅเชตเชพ เช เชชเชเซเชฐเซเชก เชชเซเชฐเชเซเชฐเชฟเชฏเชพ. RHEL เชธเชฟเชธเซเชเชฎ เชชเชฐ เชจเชตเชพ PostgreSQL เชฆเชพเชเชฒเชพเชจเซ เชเซเช เชตเชตเชพ เชฎเชพเชเซ, เช เชฎเชพเชฐเซ เชเชฆเซเชถ เชเชฒเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:
sudo /usr/bin/postgresql-setup -initdb
เชชเชเซ เชคเชฎเซ systemd เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ PostgreSQL เชถเชฐเซ เชเชฐเซ เชถเชเซ เชเซ, เชกเซเชเชพเชฌเซเช เชฌเชจเชพเชตเซ เชถเชเซ เชเซ เช เชจเซ Django เชฎเชพเช เชชเซเชฐเซเชเซเชเซเช เชธเซเช เชเชฐเซ เชถเชเซ เชเซ. เชเชชเซเชฒเชฟเชเซเชถเชจ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชฎเชพเชเซ เชชเชพเชธเชตเชฐเซเชก เชธเซเชเซเชฐเซเช เชเซเช เชตเชตเชพ เชฎเชพเชเซ เชเซเชฒเชพเชฏเชเช เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชซเชพเชเชฒ (เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ pg_hba.conf) เชฎเชพเช เชซเซเชฐเชซเชพเชฐเซ เชเชฐเซเชฏเชพ เชชเชเซ PostgreSQL เชจเซ เชชเซเชจเชเชชเซเชฐเชพเชฐเชเชญ เชเชฐเชตเชพเชจเซเช เชฏเชพเชฆ เชฐเชพเชเซ. เชเซ เชคเชฎเซ เช เชจเซเชฏ เชฎเซเชถเซเชเซเชฒเซเชเชจเซ เชธเชพเชฎเชจเซ เชเชฐเซ เชเซ, เชคเซ pg_hba.conf เชซเชพเชเชฒเชฎเชพเช IPv4 เช เชจเซ IPv6 เชธเซเชฏเซเชเชจเซ เชฌเชฆเชฒเชตเชพเชจเซ เชเชพเชคเชฐเซ เชเชฐเซ.
systemctl enable -now postgresql
sudo -u postgres psql
postgres=# create database djangoapp;
postgres=# create user djangouser with password 'qwer4321';
postgres=# alter role djangouser set client_encoding to 'utf8';
postgres=# alter role djangouser set default_transaction_isolation to 'read committed';
postgres=# alter role djangouser set timezone to 'utc';
postgres=# grant all on DATABASE djangoapp to djangouser;
postgres=# q
เชซเชพเชเชฒ /var/lib/pgsql/data/pg_hba.conf เชฎเชพเช:
# IPv4 local connections:
host all all 0.0.0.0/0 md5
# IPv6 local connections:
host all all ::1/128 md5
เชซเชพเชเชฒ /srv/djangoapp/settings.py เชฎเชพเช:
# Database
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': '{{ db_name }}',
'USER': '{{ db_user }}',
'PASSWORD': '{{ db_password }}',
'HOST': '{{ db_host }}',
}
}
เชชเซเชฐเซเชเซเชเซเชเชฎเชพเช settings.py เชซเชพเชเชฒเชจเซ เชเซเช เชตเซเชฏเชพ เชชเชเซ เช เชจเซ เชกเซเชเชพเชฌเซเช เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชธเซเช เชเชฐเซเชฏเชพ เชชเชเซ, เชฌเชงเซเช เชเชพเชฎ เชเชฐเซ เชเซ เชคเซเชจเซ เชเชพเชคเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเซ เชคเชฎเซ เชตเชฟเชเชพเชธ เชธเชฐเซเชตเชฐ เชถเชฐเซ เชเชฐเซ เชถเชเซ เชเซ. เชกเซเชตเชฒเชชเชฎเซเชจเซเช เชธเชฐเซเชตเชฐ เชถเชฐเซ เชเชฐเซเชฏเชพ เชชเชเซ, เชกเซเชเชพเชฌเซเช เชธเชพเชฅเซ เชเชจเซเชเซเชถเชจเชจเซ เชเชเชพเชธเชตเชพ เชฎเชพเชเซ เชเชกเชฎเชฟเชจ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชฌเชจเชพเชตเชตเชพเชจเซ เชธเชพเชฐเซ เชตเชฟเชเชพเชฐ เชเซ.
./manage.py runserver 0.0.0.0:8000
./manage.py createsuperuser
WSGI? เชตเชพเช?
เชกเซเชตเชฒเชชเชฎเซเชจเซเช เชธเชฐเซเชตเชฐ เชชเชฐเซเชเซเชทเชฃ เชฎเชพเชเซ เชเชชเชฏเซเชเซ เชเซ, เชชเชฐเชเชคเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ เชคเชฎเชพเชฐเซ เชตเซเชฌ เชธเชฐเซเชตเชฐ เชเซเชเชตเซ เชเชจเซเชเชฐเชซเซเชธ (WSGI) เชฎเชพเชเซ เชฏเซเชเซเชฏ เชธเชฐเซเชตเชฐ เช เชจเซ เชชเซเชฐเซเชเซเชธเซ เชเซเช เชตเชตเซ เชชเชกเชถเซ. เชเชฃเชพ เชธเชพเชฎเชพเชจเซเชฏ เชธเชเชฏเซเชเชจเซ เชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, uWSGI เชธเชพเชฅเซ Apache HTTPD เช เชฅเชตเชพ Gunicorn เชธเชพเชฅเซ Nginx.
เชตเซเชฌ เชธเชฐเซเชตเชฐ เชเซเชเชตเซ เชเชจเซเชเชฐเชซเซเชธเชจเซเช เชเชพเชฎ เชตเซเชฌ เชธเชฐเซเชตเชฐเชฎเชพเชเชฅเซ เชตเชฟเชจเชเชคเซเชเชจเซ เชชเชพเชฏเชฅเซเชจ เชตเซเชฌ เชซเซเชฐเซเชฎเชตเชฐเซเช เชชเชฐ เชซเซเชฐเชตเชฐเซเชก เชเชฐเชตเชพเชจเซเช เชเซ. WSGI เช เชญเชฏเชเชเชฐ เชญเซเชคเชเชพเชณเชจเซ เช เชตเชถเซเชท เชเซ เชเซเชฏเชพเชฐเซ CGI เชเชจเซเชเชฟเชจ เชเชธเชชเชพเชธ เชนเชคเชพ, เช เชจเซ เชเชเซ WSGI เช เชกเซ เชซเซเชเซเชเซ เชธเซเชเชพเชจเซเชกเชฐเซเชก เชเซ, เชตเซเชฌ เชธเชฐเซเชตเชฐ เช เชฅเชตเชพ เชชเชพเชฏเชฅเซเชจ เชซเซเชฐเซเชฎเชตเชฐเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเซเชฏ. เชชเชฐเชเชคเซ เชคเซเชจเชพ เชตเซเชฏเชพเชชเช เชเชชเชฏเซเช เชนเซเชตเชพ เชเชคเชพเช, เช เชซเซเชฐเซเชฎเชตเชฐเซเช เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชคเซ เชตเชเชคเซ เชนเชเซ เชชเชฃ เชเชฃเซ เชเซเชเชเชพเช เชเซ เช เชจเซ เชเชฃเซ เชชเชธเชเชฆเชเซเช เชเซ. เช เชเชฟเชธเซเชธเชพเชฎเชพเช, เช เชฎเซ เชเซเชจเชฟเชเซเชฐเซเชจ เช เชจเซ Nginx เชตเชเซเชเซ เชธเซเชเซเช เชฆเซเชตเชพเชฐเชพ เชเซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพ เชธเซเชฅเชพเชชเชฟเชค เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเชถเซเช.
เช เชฌเชเชจเซ เชเชเชเซ เชเช เช เชธเชฐเซเชตเชฐ เชชเชฐ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซเชฒเชพ เชนเซเชตเชพเชฅเซ, เชเชพเชฒเซ เชจเซเชเชตเชฐเซเช เชธเซเชเซเชเชจเซ เชฌเชฆเชฒเซ เชฏเซเชจเชฟเชเซเชธ เชธเซเชเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเช. เชเซเชเชชเชฃ เชธเชเชเซเชเซเชฎเชพเช เชเซเชฎเซเชฏเซเชจเชฟเชเซเชถเชจ เชฎเชพเชเซ เชธเซเชเซเชเชจเซ เชเชตเชถเซเชฏเชเชคเชพ เชนเซเชตเชพเชฅเซ, เชเชพเชฒเซ เชเช เชตเชงเซ เชชเชเชฒเซเช เชฒเซเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเช เช เชจเซ เชธเชฟเชธเซเชเชฎเชกเซ เชฆเซเชตเชพเชฐเชพ เชเซเชจเชฟเชเซเชฐเซเชจ เชฎเชพเชเซ เชธเซเชเซเช เชธเชเซเชฐเชฟเชฏเชเชฐเชฃเชจเซ เชเซเช เชตเซเช.
เชธเซเชเซเช เชธเชเซเชฐเชฟเชฏ เชธเซเชตเชพเช เชฌเชจเชพเชตเชตเชพเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชเชฆเชฎ เชธเชฐเชณ เชเซ. เชชเซเชฐเชฅเชฎ, เชเช เชฏเซเชจเชฟเช เชซเชพเชเชฒ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชเซเชฎเชพเช เชฒเชฟเชธเชจเชธเซเชเซเชฐเซเชฎ เชกเชพเชฏเชฐเซเชเซเชเซเชต เชนเซเชฏ เชเซ เชเซ เชฌเชฟเชเชฆเซ เชชเชฐ เชจเชฟเชฐเซเชฆเซเชถ เชเชฐเซ เชเซ เชเซ เชเซเชฏเชพเช UNIX เชธเซเชเซเช เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเชถเซ, เชชเชเซ เชธเซเชตเชพ เชฎเชพเชเซ เชเช เชฏเซเชจเชฟเช เชซเชพเชเชฒ เชเซเชฎเชพเช เชเชฐเซเชฐเซ เชจเชฟเชฐเซเชฆเซเชถ เชธเซเชเซเช เชฏเซเชจเชฟเช เชซเชพเชเชฒ เชคเชฐเชซ เชจเชฟเชฐเซเชฆเซเชถ เชเชฐเชถเซ. เชชเชเซ, เชธเซเชตเชพ เชเชเชฎ เชซเชพเชเชฒเชฎเชพเช, เชเซ เชฌเชพเชเซ เชฐเชนเซ เชเซ เชคเซ เชตเชฐเซเชเซเชฏเซเช เชฒ เชชเชฐเซเชฏเชพเชตเชฐเชฃเชฎเชพเชเชฅเซ เชเซเชจเชฟเชเซเชฐเซเชจเชจเซ เชเซเชฒ เชเชฐเชตเชพเชจเซเช เชเซ เช เชจเซ UNIX เชธเซเชเซเช เช เชจเซ Django เชเชชเซเชฒเชฟเชเซเชถเชจ เชฎเชพเชเซ WSGI เชฌเชเชงเชจเชเชฐเซเชคเชพ เชฌเชจเชพเชตเชตเชพเชจเซเช เชเซ.
เช เชนเซเช เชเชเชฎ เชซเชพเชเชฒเซเชจเชพ เชเซเชเชฒเชพเช เชเชฆเชพเชนเชฐเชฃเซ เชเซ เชเซเชจเซ เชคเชฎเซ เชเชงเชพเชฐ เชคเชฐเซเชเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ. เชชเซเชฐเชฅเชฎ เชเชชเชฃเซ เชธเซเชเซเช เชธเซเช เชเชฐเซเช เชเซเช.
[Unit]
Description=Gunicorn WSGI socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
เชนเชตเซ เชคเชฎเชพเชฐเซ เชเซเชจเชฟเชเซเชฐเซเชจ เชกเชฟเชฎเชจเชจเซ เชเซเช เชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
[Unit]
Description=Gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=cloud-user
Group=cloud-user
WorkingDirectory=/srv/djangoapp
ExecStart=/srv/djangoapp/django/bin/gunicorn
โaccess-logfile -
โworkers 3
โbind unix:gunicorn.sock djangoapp.wsgi
[Install]
WantedBy=multi-user.target
Nginx เชฎเชพเชเซ, เชชเซเชฐเซเชเซเชธเซ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชซเชพเชเชฒเซ เชฌเชจเชพเชตเชตเชพเชจเซ เช เชจเซ เชเซ เชคเชฎเซ เชคเซเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชฐเชนเซเชฏเชพเช เชนเซเชต เชคเซ เชธเซเชฅเชฟเชฐ เชธเชพเชฎเชเซเชฐเซเชจเซ เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชกเชฟเชฐเซเชเซเชเชฐเซ เชธเซเช เชเชฐเชตเซ เช เชเช เชธเชฐเชณ เชฌเชพเชฌเชค เชเซ. RHEL เชฎเชพเช, Nginx เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชซเชพเชเชฒเซ /etc/nginx/conf.d เชฎเชพเช เชธเซเชฅเชฟเชค เชเซ. เชคเชฎเซ เชจเซเชเซเชจเชพ เชเชฆเชพเชนเชฐเชฃเชจเซ /etc/nginx/conf.d/default.conf เชซเชพเชเชฒเชฎเชพเช เชเซเชชเชฟ เชเชฐเซ เชถเชเซ เชเซ เช เชจเซ เชธเซเชตเชพ เชถเชฐเซ เชเชฐเซ เชถเชเซ เชเซ. เชคเชฎเชพเชฐเชพ เชนเซเชธเซเชเชจเชพ เชจเชพเชฎ เชธเชพเชฅเซ เชฎเซเชณ เชเชฐเชตเชพ เชฎเชพเชเซ เชธเชฐเซเชตเชฐ_เชจเชพเชฎ เชธเซเช เชเชฐเชตเชพเชจเซ เชเชพเชคเชฐเซ เชเชฐเซ.
server {
listen 80;
server_name 8beta1.example.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /srv/djangoapp;
}
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
Systemd เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ Gunicorn เชธเซเชเซเช เช เชจเซ Nginx เชถเชฐเซ เชเชฐเซ เช เชจเซ เชคเชฎเซ เชชเชฐเซเชเซเชทเชฃ เชถเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเซ เชคเซเชฏเชพเชฐ เชเซ.
เชเชฐเชพเชฌ เชเซเชเชตเซ เชญเซเชฒ?
เชเซ เชคเชฎเซ เชคเชฎเชพเชฐเชพ เชฌเซเชฐเชพเชเชเชฐเชฎเชพเช เชธเชฐเชจเชพเชฎเซเช เชฆเชพเชเชฒ เชเชฐเซ เชเซ, เชคเซ เชคเชฎเชจเซ เชฎเซเชเซ เชญเชพเชเซ 502 เชเชฐเชพเชฌ เชเซเชเชตเซ เชญเซเชฒ เชชเซเชฐเชพเชชเซเชค เชฅเชถเซ. เชคเซ เชเซเชเซ เชฐเซเชคเซ เชฐเซเชชเชฐเซเชเชพเชเชเชฟเชค UNIX เชธเซเชเซเช เชชเชฐเชตเชพเชจเชเซเชเชจเซ เชเชพเชฐเชฃเซ เชฅเช เชถเชเซ เชเซ, เช เชฅเชตเชพ เชคเซ SELinux เชฎเชพเช เชเชเซเชธเซเชธ เชเชเชเซเชฐเซเชฒเชจเซ เชฒเชเชคเซ เชตเชงเซ เชเชเชฟเชฒ เชธเชฎเชธเซเชฏเชพเชเชจเซ เชเชพเชฐเชฃเซ เชนเซเช เชถเชเซ เชเซ.
nginx เชญเซเชฒ เชฒเซเชเชฎเชพเช เชคเชฎเซ เชเชจเชพ เชเซเชตเซ เชฒเชพเชเชจ เชเซเช เชถเชเซ เชเซ:
2018/12/18 15:38:03 [crit] 12734#0: *3 connect() to unix:/run/gunicorn.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.122.1, server: 8beta1.example.com, request: "GET / HTTP/1.1", upstream: "http://unix:/run/gunicorn.sock:/", host: "8beta1.example.com"
เชเซ เชเชชเชฃเซ เชเซเชจเชฟเชเซเชฐเซเชจเชจเซเช เชธเซเชงเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเซเชถเซเช, เชคเซ เช เชฎเชจเซ เชเชพเชฒเซ เชเชตเชพเชฌ เชฎเชณเชถเซ.
curl โunix-socket /run/gunicorn.sock 8beta1.example.com
เชเชพเชฒเซ เชเชพเชฃเซเช เชเซ เชเชตเซเช เชถเชพ เชฎเชพเชเซ เชฅเชพเชฏ เชเซ. เชเซ เชคเชฎเซ เชฒเซเช เชเซเชฒเซ เชเซ, เชคเซ เชคเชฎเซ เชฎเซเชเซ เชญเชพเชเซ เชเซเชถเซ เชเซ เชธเชฎเชธเซเชฏเชพ SELinux เชธเชพเชฅเซ เชธเชเชฌเชเชงเชฟเชค เชเซ. เช เชฎเซ เชเช เชกเชฟเชฎเชจ เชเชฒเชพเชตเซ เชฐเชนเซเชฏเชพ เชเซเช เชเซเชจเชพ เชฎเชพเชเซ เชเซเช เชจเซเชคเชฟ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชจเชฅเซ, เชคเซ init_t เชคเชฐเซเชเซ เชเชฟเชนเซเชจเชฟเชค เชฅเชฏเซเชฒ เชเซ. เชเชพเชฒเซ เช เชธเชฟเชฆเซเชงเชพเชเชคเชจเซ เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช เชเชเชพเชธเซเช.
sudo setenforce 0
เช เชฌเชงเซเช เชเซเชเชพ เช เชจเซ เชฒเซเชนเซเชจเชพ เชเชเชธเซเชจเซเช เชเชพเชฐเชฃ เชฌเชจเซ เชถเชเซ เชเซ, เชชเชฐเชเชคเซ เช เชซเชเซเชค เชชเซเชฐเซเชเซเชเชพเชเชชเชจเซ เชกเซเชฌเช เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ. เชเชพเชฒเซ เชซเชเซเชค เชเชพเชคเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเซ เชเซ เช เชธเชฎเชธเซเชฏเชพ เชเซ เชคเซเชจเซ เชเชพเชคเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเซ เชเซเชเชจเซ เช เชเซเชทเชฎ เชเชฐเซเช, เชเซเชจเชพ เชชเชเซ เช เชฎเซ เชฌเชงเซเช เชคเซเชจเชพ เชธเซเชฅเชพเชจเซ เชชเชพเชเซเช เชเชชเซเชถเซเช.
เชฌเซเชฐเชพเชเชเชฐเชฎเชพเช เชชเซเชทเซเช เชจเซ เชคเชพเชเซเช เชเชฐเซเชจเซ เช เชฅเชตเชพ เช เชฎเชพเชฐเชพ curl เชเชฆเซเชถเชจเซ เชซเชฐเซเชฅเซ เชเชฒเชพเชตเซเชจเซ, เชคเชฎเซ Django เชชเชฐเซเชเซเชทเชฃ เชชเซเชทเซเช เชเซเช เชถเชเซ เชเซ.
เชคเซเชฅเซ, เชฌเชงเซเช เชเชพเชฎ เชเชฐเซ เชเซ เช เชจเซ เชชเชฐเชตเชพเชจเชเซเชจเซ เชเซเช เชธเชฎเชธเซเชฏเชพ เชจเชฅเซ เชคเซเชจเซ เชเชพเชคเชฐเซ เชเชฐเซเชฏเชพ เชชเชเซ, เช เชฎเซ SELinux เชซเชฐเซเชฅเซ เชธเชเซเชทเชฎ เชเชฐเซเช เชเซเช.
sudo setenforce 1
เชนเซเช เช เชนเซเช เชธเซเชชเซเชฒเชเซเชจ เชธเชพเชฅเซ audit2allow เช เชฅเชตเชพ เชเซเชคเชตเชฃเซ-เชเชงเชพเชฐเชฟเชค เชจเซเชคเชฟเช เชฌเชจเชพเชตเชตเชพ เชตเชฟเชถเซ เชตเชพเชค เชเชฐเซเชถ เชจเชนเซเช, เชเชพเชฐเชฃ เชเซ เช เชเซเชทเชฃเซ เชคเซเชฏเชพเช เชเซเช เชตเชพเชธเซเชคเชตเชฟเช Django เชเชชเซเชฒเชฟเชเซเชถเชจ เชจเชฅเซ, เชคเซเชฅเซ Gunicorn เชถเซเช เชเชเซเชธเซเชธ เชเชฐเชตเชพ เชฎเชพเชเชเซ เชเซ เช เชจเซ เชคเซเชจเซ เชถเซเช เชเชเซเชธเซเชธ เชจเชเชพเชฐเชตเซ เชเซเชเช เชคเซเชจเซ เชเซเช เชธเชเชชเซเชฐเซเชฃ เชจเชเชถเซ เชจเชฅเซ. เชคเซเชฅเซ, เชธเชฟเชธเซเชเชฎเชจเซ เชธเซเชฐเชเซเชทเชฟเชค เชฐเชพเชเชตเชพ เชฎเชพเชเซ SELinux เชจเซ เชเชพเชฒเซ เชฐเชพเชเชตเซเช เชเชฐเซเชฐเซ เชเซ, เชเซเชฏเชพเชฐเซ เชคเซ เช เชธเชฎเชฏเซ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชเชฒเชพเชตเชตเชพเชจเซ เช เชจเซ เชเชกเชฟเช เชฒเซเชเชฎเชพเช เชธเชเชฆเซเชถเชพเช เชเซเชกเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ เชเซเชฅเซ เชคเซเชฎเชพเชเชฅเซ เชตเชพเชธเซเชคเชตเชฟเช เชจเซเชคเชฟ เชฌเชจเชพเชตเซ เชถเชเชพเชฏ.
เชชเชฐเชตเชพเชจเชเซ เชเชชเชจเชพเชฐ เชกเซเชฎเซเชจเซเชธเชจเซ เชเชฒเซเชฒเซเช เชเชฐเชตเซ
เชฆเชฐเซเช เชตเซเชฏเชเซเชคเชฟเช SELinux เชฎเชพเช เชฎเชพเชจเซเชฏ เชกเซเชฎเซเชจเซเชธ เชตเชฟเชถเซ เชธเชพเชเชญเชณเซเชฏเซเช เชจเชฅเซ, เชชเชฐเชเชคเซ เชคเซ เชเชเช เชจเชตเซเช เชจเชฅเซ. เชเชฃเชพเช เชคเซ เชเชพเชฃเซเชฏเชพ เชตเชฟเชจเชพ เชชเชฃ เชคเซเชฎเชจเซ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเซเชฏเซเช. เชเซเชฏเชพเชฐเซ เชเชกเชฟเช เชธเชเชฆเซเชถเชพเชเชจเชพ เชเชงเชพเชฐเซ เชจเซเชคเชฟ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชฌเชจเชพเชตเซเชฒ เชจเซเชคเชฟ เชเชเซเชฒเชพเชฏเซเชฒเชพ เชกเซเชฎเซเชจเชจเซ เชฐเชเซ เชเชฐเซ เชเซ. เชเชพเชฒเซ เชเช เชธเชฐเชณ เชชเชฐเชตเชพเชจเชเซ เชจเซเชคเชฟ เชฌเชจเชพเชตเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเช.
Gunicorn เชฎเชพเชเซ เชเซเชเซเชเชธ เชฎเชเชเซเชฐ เชกเซเชฎเซเชจ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ เช เชฎเซเช เชชเซเชฐเชเชพเชฐเชจเซ เชจเซเชคเชฟเชจเซ เชเชฐเซเชฐ เชเซ, เช เชจเซ เชคเชฎเชพเชฐเซ เชฏเซเชเซเชฏ เชซเชพเชเชฒเซเชจเซ เชฎเชพเชฐเซเช เชเชฐเชตเชพเชจเซ เชชเชฃ เชเชฐเซเชฐ เชเซ. เชตเชงเซเชฎเชพเช, เชจเชตเซ เชจเซเชคเชฟเช เชเชธเซเชฎเซเชฌเชฒ เชเชฐเชตเชพ เชฎเชพเชเซ เชธเชพเชงเชจเซเชจเซ เชเชฐเซเชฐ เชเซ.
sudo yum install selinux-policy-devel
เชฎเชเชเซเชฐ เชกเซเชฎเซเชจเซเชธ เชฎเชฟเชเซเชจเชฟเชเชฎ เช เชธเชฎเชธเซเชฏเชพเชเชจเซ เชเชณเชเชตเชพ เชฎเชพเชเซเชจเซเช เชเช เชถเซเชฐเซเชทเซเช เชธเชพเชงเชจ เชเซ, เชเชพเชธ เชเชฐเซเชจเซ เชเซเชฏเชพเชฐเซ เชคเซ เชเชธเซเชเชฎ เชเชชเซเชฒเชฟเชเซเชถเชจ เช เชฅเชตเชพ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชตเชพเชค เชเชตเซ เชเซ เชเซ เชชเชนเซเชฒเซเชฅเซ เชฌเชจเชพเชตเซเชฒเซ เชจเซเชคเชฟเช เชตเชฟเชจเชพ เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เช เชเชฟเชธเซเชธเชพเชฎเชพเช, Gunicorn เชฎเชพเชเซ เชฎเชเชเซเชฐ เชกเซเชฎเซเชจ เชจเซเชคเชฟ เชถเชเซเชฏ เชคเซเชเชฒเซ เชธเชฐเชณ เชนเชถเซ - เชฎเซเชเซเชฏ เชชเซเชฐเชเชพเชฐ (gunicorn_t) เชเชพเชนเซเชฐ เชเชฐเซ, เชเช เชชเซเชฐเชเชพเชฐ เชเชพเชนเซเชฐ เชเชฐเซ เชเซเชจเซ เชเชชเชฏเซเช เช เชฎเซ เชฌเชนเซเชตเชฟเชง เชเชเซเชเชฟเชเซเชฏเซเชเซเชฌเชฒเซเชธเชจเซ เชเชฟเชนเซเชจเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชเชฐเซเชถเซเช (gunicorn_exec_t), เช เชจเซ เชชเชเซ เชธเชฟเชธเซเชเชฎเชจเซ เชฏเซเชเซเชฏ เชฐเซเชคเซ เชเชฟเชนเซเชจเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชธเชเชเซเชฐเชฎเชฃ เชธเซเช เชเชฐเซ. เชเชพเชฒเซ เชฐเชนเซเชฒ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช. เชเซเชฒเซเชฒเซ เชฒเชพเชเชจ เชจเซเชคเชฟเชจเซ เชฒเซเชก เชฅเชพเชฏ เชคเซเชฏเชพเชฐเซ เชกเชฟเชซเซเชฒเซเช เชฐเซเชชเซ เชธเชเซเชทเชฎ เชคเชฐเซเชเซ เชธเซเช เชเชฐเซ เชเซ.
gunicorn.te:
policy_module(gunicorn, 1.0)
type gunicorn_t;
type gunicorn_exec_t;
init_daemon_domain(gunicorn_t, gunicorn_exec_t)
permissive gunicorn_t;
เชคเชฎเซ เช เชชเซเชฒเชฟเชธเซ เชซเชพเชเชฒเชจเซ เชเชฎเซเชชเชพเชเชฒ เชเชฐเซ เชถเชเซ เชเซ เช เชจเซ เชคเซเชจเซ เชคเชฎเชพเชฐเซ เชธเชฟเชธเซเชเชฎเชฎเชพเช เชเชฎเซเชฐเซ เชถเชเซ เชเซ.
make -f /usr/share/selinux/devel/Makefile
sudo semodule -i gunicorn.pp
sudo semanage permissive -a gunicorn_t
sudo semodule -l | grep permissive
เชเชพเชฒเซ เช เชเซเชตเชพ เชฎเชพเชเซ เชคเชชเชพเชธ เชเชฐเซเช เชเซ เชถเซเช SELinux เชเชชเชฃเซเช เช เชเซเชเชพเชค เชกเชฟเชฎเชจ เชเชเซเชธเซเชธ เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ เชคเซ เชธเชฟเชตเชพเชฏ เชฌเซเชเซเช เชเชเชเช เชฌเซเชฒเซเช เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ.
sudo ausearch -m AVC
type=AVC msg=audit(1545315977.237:1273): avc: denied { write } for pid=19400 comm="nginx" name="gunicorn.sock" dev="tmpfs" ino=52977 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:var_run_t:s0 tclass=sock_file permissive=0
SELinux Nginx เชจเซ Gunicorn เชฆเซเชตเชพเชฐเชพ เชเชชเชฏเซเชเชฎเชพเช เชฒเซเชตเชพเชคเชพ UNIX เชธเซเชเซเชเชฎเชพเช เชกเซเชเชพ เชฒเชเชตเชพเชฅเซ เช เชเชเชพเชตเซ เชเซ. เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ, เชเชตเชพ เชเชฟเชธเซเชธเชพเชเชฎเชพเช, เชจเซเชคเชฟเช เชฌเชฆเชฒเชตเชพเชจเซเช เชถเชฐเซ เชฅเชพเชฏ เชเซ, เชชเชฐเชเชคเซ เชเชเชณ เช เชจเซเชฏ เชชเชกเชเชพเชฐเซ เชเซ. เชคเชฎเซ เชกเซเชฎเซเชจ เชธเซเชเชฟเชเชเซเชธเชจเซ เชชเซเชฐเชคเชฟเชฌเชเชง เชกเซเชฎเซเชจเชฎเชพเชเชฅเซ เชชเชฐเชตเชพเชจเชเซ เชกเซเชฎเซเชจเชฎเชพเช เชชเชฃ เชฌเชฆเชฒเซ เชถเชเซ เชเซ. เชนเชตเซ เชเชพเชฒเซ httpd_t เชจเซ เชชเชฐเชตเชพเชจเชเซ เชกเซเชฎเซเชจ เชชเชฐ เชเชธเซเชกเซเช. เช Nginx เชจเซ เชเชฐเซเชฐเซ เชเชเซเชธเซเชธ เชเชชเชถเซ เช เชจเซ เช เชฎเซ เชเชเชณ เชกเซเชฌเชเซเชเช เชเชพเชฎ เชเชพเชฒเซ เชฐเชพเชเซ เชถเชเซเช เชเซเช.
sudo semanage permissive -a httpd_t
เชคเซเชฅเซ, เชเชเชตเชพเชฐ เชคเชฎเซ SELinux เชจเซ เชธเซเชฐเชเซเชทเชฟเชค เชฐเชพเชเชตเชพเชฎเชพเช เชตเซเชฏเชตเชธเซเชฅเชพเชชเชฟเชค เชเชฐเซ เชฒเซ (เชคเชฎเชพเชฐเซ เชเชฐเซเชเชฐ SELinux เชชเซเชฐเซเชเซเชเซเชเชจเซ เชชเซเชฐเชคเชฟเชฌเชเชงเชฟเชค เชฎเซเชกเชฎเชพเช เชเซเชกเชตเซ เชจ เชเซเชเช) เช เชจเซ เชชเชฐเชตเชพเชจเชเซ เชกเซเชฎเซเชจเซเชธ เชฒเซเชก เชฅเช เชเชพเชฏ, เชคเซ เชคเชฎเชพเชฐเซ เชฌเชงเซเช เชฏเซเชเซเชฏ เชฐเซเชคเซ เชเชพเชฐเซเชฏ เชเชฐเชตเชพ เชฎเชพเชเซ gunicorn_exec_t เชคเชฐเซเชเซ เชเชฟเชนเซเชจเชฟเชค เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชคเซ เชธเชฎเชเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชซเชฐเซ. เชเชพเชฒเซ เชเชเซเชธเซเชธ เชชเซเชฐเชคเชฟเชฌเชเชงเซ เชตเชฟเชถเซ เชจเชตเชพ เชธเชเชฆเซเชถเชพเช เชเซเชตเชพ เชฎเชพเชเซ เชตเซเชฌเชธเชพเชเชเชจเซ เชฎเซเชฒเชพเชเชพเชค เชฒเซเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเช.
sudo ausearch -m AVC -c gunicorn
เชคเชฎเซ 'comm="gunicorn"' เชงเชฐเชพเชตเชคเชพ เชเชฃเชพ เชฌเชงเชพ เชธเชเชฆเซเชถเชพเช เชเซเชถเซ เชเซ /srv/djangoapp เชฎเชพเช เชซเชพเชเชฒเซ เชชเชฐ เชตเชฟเชตเชฟเชง เชตเชธเซเชคเซเช เชเชฐเซ เชเซ, เชคเซเชฅเซ เช เชธเซเชชเชทเซเชเชชเชฃเซ เชซเซเชฒเซเช เชเชฐเชตเชพ เชฏเซเชเซเชฏ เชเชฆเซเชถเซเชฎเชพเชเชฅเซ เชเช เชเซ.
เชชเชฐเชเชคเซ เชตเชงเซเชฎเชพเช, เชเชจเชพ เชเซเชตเซ เชธเชเชฆเซเชถ เชฆเซเชเชพเชฏ เชเซ:
type=AVC msg=audit(1545320700.070:1542): avc: denied { execute } for pid=20704 comm="(gunicorn)" name="python3.6" dev="vda3" ino=8515706 scontext=system_u:system_r:init_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file permissive=0
เชเซ เชคเชฎเซ เชเซเชฏเซเชจเชฟเชเซเชฐเซเชจ เชธเซเชตเชพเชจเซ เชธเซเชฅเชฟเชคเชฟ เชเซเชถเซ เช เชฅเชตเชพ ps เชเชฎเชพเชจเซเชก เชเชฒเชพเชตเซ เชเซ, เชคเซ เชคเชฎเซ เชเซเชเชชเชฃ เชเชพเชฒเซ เชฐเชนเซเชฒ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช เชเซเชถเซ เชจเชนเซเช. เชเชตเซเช เชฒเชพเชเซ เชเซ เชเซ เชเซเชจเชฟเชเซเชฐเซเชจ เช เชฎเชพเชฐเชพ เชตเชฐเซเชเซเชฏเซเช เชฒเซเชจเชต เชชเชฐเซเชฏเชพเชตเชฐเชฃเชฎเชพเช เชชเชพเชฏเชฅเซเชจ เชฆเซเชญเชพเชทเชฟเชฏเชพเชจเซ เชเชเซเชธเซเชธ เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ, เชธเชเชญเชตเชคเช เชตเชฐเซเชเชฐ เชธเซเชเซเชฐเชฟเชชเซเชเซเชธ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ. เชคเซ เชนเชตเซ เชเชพเชฒเซ เช เชฌเซ เชเชเซเชเชฟเชเซเชฏเซเชเซเชฌเชฒ เชซเชพเชเชฒเซเชจเซ เชฎเชพเชฐเซเช เชเชฐเซเช เช เชจเซ เชคเชชเชพเชธ เชเชฐเซเช เชเซ เชถเซเช เชเชชเชฃเซ เชเชชเชฃเซเช Django เชเซเชธเซเช เชชเซเช เชเซเชฒเซ เชถเชเซเช เชเซเช.
chcon -t gunicorn_exec_t /srv/djangoapp/django/bin/gunicorn /srv/djangoapp/django/bin/python3.6
เชจเชตเชพ เชเซ เชเชจเซ เชชเชธเชเชฆ เชเชฐเซ เชถเชเชพเชฏ เชคเซ เชชเชนเซเชฒเชพเช เชเซเชฏเซเชจเชฟเชเซเชฐเซเชจ เชธเซเชตเชพเชจเซ เชซเชฐเซเชฅเซ เชถเชฐเซ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ. เชคเชฎเซ เชคเซเชจเซ เชคเชฐเชค เช เชชเซเชจเชเชชเซเชฐเชพเชฐเชเชญ เชเชฐเซ เชถเชเซ เชเซ เช เชฅเชตเชพ เชธเซเชตเชพ เชฌเชเชง เชเชฐเซ เชถเชเซ เชเซ เช เชจเซ เชเซเชฏเชพเชฐเซ เชคเชฎเซ เชฌเซเชฐเชพเชเชเชฐเชฎเชพเช เชธเชพเชเช เชเซเชฒเซ เชเซ เชคเซเชฏเชพเชฐเซ เชธเซเชเซเชเชจเซ เชคเซเชจเซ เชถเชฐเซ เชเชฐเชตเชพ เชฆเซ. เชเชเชพเชธเซ เชเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชเช ps เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชฏเซเชเซเชฏ เชฒเซเชฌเชฒเซเชธ เชชเซเชฐเชพเชชเซเชค เชเชฐเซเชฏเชพ เชเซ.
ps -efZ | grep gunicorn
เชชเชเซเชฅเซ เชธเชพเชฎเชพเชจเซเชฏ SELinux เชชเซเชฒเชฟเชธเซ เชฌเชจเชพเชตเชตเชพเชจเซเช เชญเซเชฒเชถเซ เชจเชนเซเช!
เชเซ เชคเชฎเซ เช เชคเซเชฏเชพเชฐเซ AVC เชธเชเชฆเซเชถเชพเช เชเซเช เชเซ, เชคเซ เชเซเชฒเซเชฒเชพ เชธเชเชฆเซเชถเชฎเชพเช เชเชชเซเชฒเชฟเชเซเชถเชจ เชธเชพเชฅเซ เชธเชเชฌเชเชงเชฟเชค เชฆเชฐเซเช เชตเชธเซเชคเซ เชฎเชพเชเซ permissive=1 เช เชจเซ เชฌเชพเชเซเชจเซ เชธเชฟเชธเซเชเชฎ เชฎเชพเชเซ permissive=0 เชเซ. เชเซ เชคเชฎเซ เชธเชฎเชเซ เชเซ เชเซ เชตเชพเชธเซเชคเชตเชฟเช เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชเชฏเชพ เชชเซเชฐเชเชพเชฐเชจเซ เชเชเซเชธเซเชธเชจเซ เชเชฐเซเชฐ เชเซ, เชคเซ เชคเชฎเซ เชเชตเซ เชธเชฎเชธเซเชฏเชพเชเชจเซ เชนเชฒ เชเชฐเชตเชพเชจเซ เชถเซเชฐเซเชทเซเช เชฎเชพเชฐเซเช เชเชกเชชเชฅเซ เชถเซเชงเซ เชถเชเซ เชเซ. เชชเชฐเชเชคเซ เชคเซเชฏเชพเช เชธเซเชงเซ, เชธเชฟเชธเซเชเชฎเชจเซ เชธเซเชฐเชเซเชทเชฟเชค เชฐเชพเชเชตเซ เช เชจเซ Django เชชเซเชฐเซเชเซเชเซเชเชจเซเช เชธเซเชชเชทเซเช, เชเชชเชฏเซเชเซ เชเชกเชฟเช เชฎเซเชณเชตเชตเซเช เชถเซเชฐเซเชทเซเช เชเซ.
sudo ausearch -m AVC
เชฅเชฏเซเช!
Nginx เช
เชจเซ Gunicorn WSGI เชชเชฐ เชเชงเชพเชฐเชฟเชค เชซเซเชฐเชจเซเชเชเชจเซเชก เชธเชพเชฅเซ เชเชพเชฐเซเชฏเชฐเชค Django เชชเซเชฐเซเชเซเชเซเช เชฆเซเชเชพเชฏเซ เชเซ. เช
เชฎเซ RHEL 3 เชฌเซเชเชพ เชฐเชฟเชชเซเชเซเชเชฐเซเชเชฎเชพเชเชฅเซ Python 10 เช
เชจเซ PostgreSQL 8 เชจเซ เชเซเช เชตเซเชฏเซเช เชเซ. เชนเชตเซ เชคเชฎเซ เชเชเชณ เชตเชงเซ เชถเชเซ เชเซ เช
เชจเซ Django เชเชชเซเชฒเซเชเซเชถเชจ เชฌเชจเชพเชตเซ เชถเชเซ เชเซ (เช
เชฅเชตเชพ เชซเชเซเชค เชเชฎเชพเชตเช เชเชฐเซ เชถเชเซ เชเซ) เช
เชฅเชตเชพ RHEL 8 เชฌเซเชเชพเชฎเชพเช เช
เชจเซเชฏ เชเชชเชฒเชฌเซเชง เชเซเชฒเซเชธเชจเซเช เช
เชจเซเชตเซเชทเชฃ เชเชฐเซ เชถเชเซ เชเซ เชเซเชฅเซ เชเซเช เชตเชฃเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชธเซเชตเชเชพเชฒเชฟเชค เชเชฐเซ เชถเชเชพเชฏ, เชเชพเชฎเชเซเชฐเซ เชฌเชนเซเชคเชฐ เชฌเชจเชพเชตเซ เชถเชเชพเชฏ เช
เชฅเชตเชพ เช เชเซเช เชตเชฃเซเชจเซ เชเชจเซเชเซเชจเชฐเชพเชเช เชเชฐเซ เชถเชเชพเชฏ.
เชธเซเชฐเซเชธ: www.habr.com