แžŸแžทแž€แŸ’แžแžถแžŸแžถแž›แžถ RHEL 8 BetaแŸ– แž€แžถแžšแž€แžŸแžถแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžš

RHEL 8 Beta แž•แŸ’แžแž›แŸ‹แž‡แžผแž“แžขแŸ’แž“แž€แžขแž—แžทแžœแžŒแŸ’แžแž“แŸแž“แžผแžœแž˜แžปแžแž„แžถแžšแžแŸ’แž˜แžธแŸ—แž‡แžถแž…แŸ’แžšแžพแž“ แž€แžถแžšแž…แžปแŸ‡แž”แž‰แŸ’แž‡แžธแžŠแŸ‚แž›แžขแžถแž…แž™แž€แž‘แŸ†แž–แŸแžšแž”แžถแž“ แž‘แŸ„แŸ‡แž‡แžถแž™แŸ‰แžถแž„แžŽแžถแž€แŸแžŠแŸ„แž™ แž€แžถแžšแžšแŸ€แž“แžขแŸ’แžœแžธแžŠแŸ‚แž›แžแŸ’แž˜แžธแž‚แžบแžแŸ‚แž„แžแŸ‚แž”แŸ’แžšแžŸแžพแžšแž‡แžถแž„แž€แŸ’แž“แžปแž„แž€แžถแžšแžขแž“แžปแžœแžแŸ’แž แžŠแžผแž…แŸ’แž“แŸแŸ‡แžแžถแž„แž€แŸ’แžšแŸ„แž˜แž“แŸแŸ‡ แž™แžพแž„แž•แŸ’แžแž›แŸ‹แž‡แžผแž“แž“แžผแžœแžŸแžทแž€แŸ’แžแžถแžŸแžถแž›แžถแžŸแŸ’แžแžธแž–แžธแž€แžถแžšแž”แž„แŸ’แž€แžพแžแž แŸแžŠแŸ’แž‹แžถแžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŠแŸ„แž™แž•แŸ’แžขแŸ‚แž€แž›แžพ Red Hat Enterprise Linux 8 Beta แŸ”

แžŸแžทแž€แŸ’แžแžถแžŸแžถแž›แžถ RHEL 8 BetaแŸ– แž€แžถแžšแž€แžŸแžถแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžš

แž…แžผแžšแž™แž€ Python แžŠแŸ‚แž›แž‡แžถแž—แžถแžŸแžถแžŸแžšแžŸแŸแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŠแŸแž–แŸแž‰แž“แžทแž™แž˜แž€แŸ’แž“แžปแž„แž…แŸ†แžŽแŸ„แž˜แžขแŸ’แž“แž€แžขแž—แžทแžœแžŒแŸ’แžแž“แŸ แž‡แžถแž˜แžผแž›แžŠแŸ’แž‹แžถแž“ แž€แžถแžšแžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž›แž‚แŸ’แž“แžถแž“แŸƒ Django แž“แžทแž„ PostgreSQL แžŠแŸ‚แž›แž‡แžถแž€แžถแžšแžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž›แž‚แŸ’แž“แžถแžŠแŸแžŸแžถแž˜แž‰แŸ’แž‰แž˜แžฝแž™แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž”แž„แŸ’แž€แžพแžแž€แž˜แŸ’แž˜แžœแžทแž’แžธ แž“แžทแž„แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ RHEL 8 Beta แžŠแžพแž˜แŸ’แž”แžธแž’แŸ’แžœแžพแž€แžถแžšแž‡แžถแž˜แžฝแž™แž–แžฝแž€แž‚แŸแŸ” แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€ แž™แžพแž„โ€‹แž“แžนแž„โ€‹แž”แž“แŸ’แžแŸ‚แž˜โ€‹แž‚แŸ’แžšแžฟแž„แž•แŸ’แžŸแŸ†โ€‹แž–แžธแžšโ€‹แž”แžธโ€‹แž‘แŸ€แž (แž˜แžทแž“โ€‹แž”แžถแž“โ€‹แž…แžถแžแŸ‹แžแŸ’แž“แžถแž€แŸ‹)แŸ”

แž”แžšแžทแž™แžถแž€แžถแžŸแžŸแžถแž€แž›แŸ’แž”แž„แž“แžนแž„แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžš แž–แŸ’แžšแŸ„แŸ‡แžœแžถแž‚แžฝแžšแžฑแŸ’แž™แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแž€แŸ’แž“แžปแž„แž€แžถแžšแžŸแŸ’แžœแŸ‚แž„แž™แž›แŸ‹แž–แžธแž›แž‘แŸ’แž’แž—แžถแž–แž“แŸƒแžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžทแž€แž˜แŸ’แž˜ แž’แŸ’แžœแžพแž€แžถแžšแž‡แžถแž˜แžฝแž™แž€แžปแž„แžแžบแž“แŸแžš แž“แžทแž„แžŸแžถแž€แž›แŸ’แž”แž„แž”แžšแžทแžŸแŸ’แžแžถแž“แž‡แžถแž˜แžฝแž™แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแž…แŸ’แžšแžพแž“แŸ” แžŠแžพแž˜แŸ’แž”แžธแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž‡แžถแž˜แžฝแž™แž‚แž˜แŸ’แžšแŸ„แž„แžแŸ’แž˜แžธ แžขแŸ’แž“แž€แžขแžถแž…แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžŠแŸ„แž™แž”แž„แŸ’แž€แžพแžแž‚แŸ†แžšแžผแžแžผแž…แž˜แžฝแž™แžŠแŸ„แž™แžŠแŸƒแž•แŸ’แž‘แžถแž›แŸ‹ แžŠแžผแž…แŸ’แž“แŸแŸ‡แžขแŸ’แž“แž€แžขแžถแž…แžƒแžพแž‰แž…แŸ’แž”แžถแžŸแŸ‹แž“แžผแžœแžขแŸ’แžœแžธแžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž€แžพแžแžกแžพแž„ แž“แžทแž„แžšแž”แŸ€แž”แžŠแŸ‚แž›แžœแžถแž˜แžถแž“แžขแž“แŸ’แžแžšแž€แž˜แŸ’แž˜ แž แžพแž™แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แž”แž“แŸ’แžแž‘แŸ…แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžท แž“แžทแž„แž”แž„แŸ’แž€แžพแžแž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžŸแŸ’แž˜แžปแž‚แžŸแŸ’แž˜แžถแž‰แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ€แžแŸ” แžŸแž–แŸ’แžœแžแŸ’แž„แŸƒแž“แŸแŸ‡แž™แžพแž„แž€แŸ†แž–แžปแž„แž“แžทแž™แžถแž™แžขแŸ†แž–แžธแž€แžถแžšแž”แž„แŸ’แž€แžพแžแž‚แŸ†แžšแžผแž”แŸ‚แž”แž“แŸแŸ‡แŸ”

แž…แžผแžšแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžŠแŸ„แž™แž€แžถแžšแžŠแžถแž€แŸ‹แžฑแŸ’แž™แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžšแžผแž”แž—แžถแž– RHEL 8 Beta VM แŸ” แžขแŸ’แž“แž€แžขแžถแž…แžŠแŸ†แžกแžพแž„แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž“แžทแž˜แŸ’แž˜แžทแžแž–แžธแž‘แž‘แŸ แžฌแž”แŸ’แžšแžพแžšแžผแž”แž—แžถแž–แž—แŸ’แž‰แŸ€แžœ KVM แžŠแŸ‚แž›แž˜แžถแž“แž‡แžถแž˜แžฝแž™แž€แžถแžšแž‡แžถแžœแž”แŸแžแžถแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แŸ” แž“แŸ…แž–แŸแž›แž”แŸ’แžšแžพแžšแžผแž”แž—แžถแž–แž—แŸ’แž‰แŸ€แžœ แžขแŸ’แž“แž€แž“แžนแž„แžแŸ’แžšแžผแžœแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžŸแŸŠแžธแžŒแžธแž“แžทแž˜แŸ’แž˜แžทแžแžŠแŸ‚แž›แž“แžนแž„แž˜แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™แž˜แŸแžแžถ แž“แžทแž„แž‘แžทแž“แŸ’แž“แž“แŸแž™แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž–แž–แž€ (cloud-init) แŸ” แžขแŸ’แž“แž€แž˜แžทแž“แž…แžถแŸ†แž”แžถแž…แŸ‹แž’แŸ’แžœแžพแžขแŸ’แžœแžธแž–แžทแžŸแŸแžŸแž‡แžถแž˜แžฝแž™แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžแžถแžŸ แžฌแž€แž‰แŸ’แž…แž”แŸ‹แžŠแŸ‚แž›แž˜แžถแž“แž‘แŸ แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžŽแžถแž˜แžฝแž™แž“แžนแž„แž’แŸ’แžœแžพแŸ”

แž…แžผแžšแž™แžพแž„แž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž›แž€แžถแž“แŸ‹แžแŸ‚แžŠแžทแžแžŠแž›แŸ‹แž“แžผแžœแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‘แžถแŸ†แž„แž˜แžผแž›แŸ”

แž€แžถแžšแžŠแŸ†แžกแžพแž„ Django

แž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แŸ†แžŽแŸ‚แžแŸ’แž˜แžธแž”แŸ†แž•แžปแžแžšแž”แžŸแŸ‹ Django แžขแŸ’แž“แž€แž“แžนแž„แžแŸ’แžšแžผแžœแž€แžถแžšแž”แžšแžทแž™แžถแž€แžถแžŸแž“แžทแž˜แŸ’แž˜แžทแž (virtualenv) แž‡แžถแž˜แžฝแž™ Python 3.5 แžฌแžแŸ’แž–แžŸแŸ‹แž‡แžถแž„แž“แŸแŸ‡แŸ” แž“แŸ…แž€แŸ’แž“แžปแž„แž€แŸ†แžŽแžแŸ‹แž…แŸ†แžŽแžถแŸ†แž”แŸแžแžถ แžขแŸ’แž“แž€แžขแžถแž…แž˜แžพแž›แžƒแžพแž‰แžแžถ Python 3.6 แžขแžถแž…แž”แŸ’แžšแžพแž”แžถแž“ แžŸแžผแž˜แž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž›แžแžถแžแžพแž“แŸแŸ‡แž–แžทแžแž‡แžถแž€แžšแžŽแžธแŸ–

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

Red Hat แž”แŸ’แžšแžพ Python แž™แŸ‰แžถแž„แžŸแž€แž˜แŸ’แž˜แž‡แžถแžงแž”แž€แžšแžŽแŸแž”แŸ’แžšแž–แŸแž“แŸ’แž’แž“แŸ…แž€แŸ’แž“แžปแž„ RHEL แžŠแžผแž…แŸ’แž“แŸแŸ‡แž แŸแžแžปแžขแŸ’แžœแžธแž”แžถแž“แž‡แžถแž›แž‘แŸ’แž’แž•แž›แž“แŸแŸ‡?

แž€แžถแžšแž–แžทแžแž‚แžบแžแžถแžขแŸ’แž“แž€แžขแž—แžทแžœแžŒแŸ’แžแž“แŸ Python แž‡แžถแž…แŸ’แžšแžพแž“แž“แŸ…แžแŸ‚แžŸแž‰แŸ’แž‡แžนแž„แž‚แžทแžแžขแŸ†แž–แžธแž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž–แžธ Python 2 แž‘แŸ… Python 2 แžแžŽแŸˆแž–แŸแž›แžŠแŸ‚แž› Python 3 แžแŸ’แž›แžฝแž“แžœแžถแžŸแŸ’แžแžทแžแž“แŸ…แž€แŸ’แžšแŸ„แž˜แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸแž™แŸ‰แžถแž„แžŸแž€แž˜แŸ’แž˜ แž แžพแž™แž€แŸ†แžŽแŸ‚แžแŸ’แž˜แžธแž€แžถแž“แŸ‹แžแŸ‚แž…แŸ’แžšแžพแž“แž€แŸ†แž–แžปแž„แž›แŸแž…แžกแžพแž„แžฅแžแžˆแž”แŸ‹แžˆแžšแŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡ แžŠแžพแž˜แŸ’แž”แžธแž”แŸ†แž–แŸแž‰แžแž˜แŸ’แžšแžผแžœแž€แžถแžšแžงแž”แž€แžšแžŽแŸแž”แŸ’แžšแž–แŸแž“แŸ’แž’แžŠแŸ‚แž›แž˜แžถแž“แžŸแŸ’แžแŸแžšแž—แžถแž– แžแžŽแŸˆแž–แŸแž›แžŠแŸ‚แž›แž•แŸ’แžแž›แŸ‹แž‡แžผแž“แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž…แžผแž›แž‘แŸ…แž€แžถแž“แŸ‹แž€แŸ†แžŽแŸ‚แžแŸ’แž˜แžธแžšแž”แžŸแŸ‹ Python แž”แŸ’แžšแž–แŸแž“แŸ’แž’ Python แžแŸ’แžšแžผแžœแž”แžถแž“แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž‘แŸ…แž€แŸ’แž“แžปแž„แž€แž‰แŸ’แž…แž”แŸ‹แžแŸ’แž˜แžธ แž“แžทแž„แž•แŸ’แžแž›แŸ‹แž›แž‘แŸ’แž’แž—แžถแž–แž€แŸ’แž“แžปแž„แž€แžถแžšแžŠแŸ†แžกแžพแž„แž‘แžถแŸ†แž„ Python 2.7 แž“แžทแž„ 3.6 แŸ” แž–แŸแžแŸŒแž˜แžถแž“โ€‹แž”แž“แŸ’แžแŸ‚แž˜โ€‹แžขแŸ†แž–แžธโ€‹แž€แžถแžšโ€‹แž•แŸ’แž›แžถแžŸแŸ‹โ€‹แž”แŸ’แžแžผแžš แž“แžทแž„โ€‹แž˜แžผแž›โ€‹แž แŸแžแžปโ€‹แžŠแŸ‚แž›โ€‹แž–แžฝแž€โ€‹แž‚แŸโ€‹แžแŸ’แžšแžผแžœโ€‹แž”แžถแž“โ€‹แž‚แŸโ€‹แž’แŸ’แžœแžพโ€‹แžกแžพแž„โ€‹แžขแžถแž…โ€‹แžšแž€โ€‹แžƒแžพแž‰โ€‹แž“แŸ…โ€‹แž€แŸ’แž“แžปแž„โ€‹แž€แžถแžšโ€‹แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–โ€‹แž•แŸ’แžŸแžถแž™โ€‹แž“แŸ…โ€‹แž€แŸ’แž“แžปแž„ แž”แŸ’แž›แžปแž€แžšแž”แžŸแŸ‹ Langdon White (Langdon White) แŸ”

แžŠแžผแž…แŸ’แž“แŸแŸ‡ แžŠแžพแž˜แŸ’แž”แžธแž‘แž‘แžฝแž›แž”แžถแž“ Python แžŠแŸ†แžŽแžพแžšแž€แžถแžš แžขแŸ’แž“แž€แž‚แŸ’แžšแžถแž“แŸ‹แžแŸ‚แžŠแŸ†แžกแžพแž„แž€แž‰แŸ’แž…แž”แŸ‹แž–แžธแžšแž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡ แžŠแŸ„แž™แžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž› python3-pip แž‡แžถแž€แžถแžšแž–แžนแž„แž•แŸ’แžขแŸ‚แž€แŸ”

sudo yum install python36 python3-virtualenv

แž แŸแžแžปแžขแŸ’แžœแžธแž˜แžทแž“แž”แŸ’แžšแžพแž€แžถแžšแž แŸ…แž˜แŸ‰แžผแžŒแžปแž›แžŠแŸ„แž™แž•แŸ’แž‘แžถแž›แŸ‹แžŠแžผแž…แžŠแŸ‚แž› Langdon แžŽแŸ‚แž“แžถแŸ† แž“แžทแž„แžŠแŸ†แžกแžพแž„ pip3? แžŠแŸ„แž™แž…แž„แž…แžถแŸ†แžขแŸ†แž–แžธแžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžทแž€แž˜แŸ’แž˜แž“แžถแž–แŸแž›แžแžถแž„แž˜แžปแž แžœแžถแžแŸ’แžšแžผแžœแž”แžถแž“แž‚แŸแžŠแžนแž„แžแžถ Ansible แž“แžนแž„แžแž˜แŸ’แžšแžผแžœแžฑแŸ’แž™แžŠแŸ†แžกแžพแž„ pip แžŠแžพแž˜แŸ’แž”แžธแžŠแŸ†แžŽแžพแžšแž€แžถแžš แž…แžถแž”แŸ‹แžแžถแŸ†แž„แž–แžธแž˜แŸ‰แžผแžŒแžปแž› pip แž˜แžทแž“แž‚แžถแŸ†แž‘แŸ’แžš virtualenvs แž‡แžถแž˜แžฝแž™แž“แžนแž„ pip แž•แŸ’แž‘แžถแž›แŸ‹แžแŸ’แž›แžฝแž“แžŠแŸ‚แž›แžขแžถแž…แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž”แžถแž“แŸ”

แž‡แžถแž˜แžฝแž™แž“แžนแž„แžขแŸ’แž“แž€แž”แž€แž”แŸ’แžšแŸ‚ python3 แžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แž’แŸ’แžœแžพแž€แžถแžšแž“แŸ…แž€แžถแžšแž…แŸ„แž›แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€ แžขแŸ’แž“แž€แžขแžถแž…แž”แž“แŸ’แžแž‡แžถแž˜แžฝแž™แž“แžนแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแŸ†แžกแžพแž„ Django แž“แžทแž„แž˜แžถแž“แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž€แžถแžšแž„แžถแžšแžšแžฝแž˜แž‡แžถแž˜แžฝแž™แž“แžนแž„แžŸแž˜แžถแžŸแž’แžถแžแžปแž•แŸ’แžŸแŸแž„แž‘แŸ€แžแžšแž”แžŸแŸ‹แž™แžพแž„แŸ” แž˜แžถแž“แž‡แž˜แŸ’แžšแžพแžŸแžขแž“แžปแžœแžแŸ’แžแž‡แžถแž…แŸ’แžšแžพแž“แžŠแŸ‚แž›แž˜แžถแž“แž“แŸ…แž›แžพแžขแŸŠแžธแž“แž’แžบแžŽแžทแžแŸ” แž˜แžถแž“แž€แŸ†แžŽแŸ‚แž˜แžฝแž™แž”แž„แŸ’แž แžถแž‰แž“แŸ…แž‘แžธแž“แŸแŸ‡ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžขแžถแž…แž”แŸ’แžšแžพแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž•แŸ’แž‘แžถแž›แŸ‹แžแŸ’แž›แžฝแž“แžšแž”แžŸแŸ‹แž–แžฝแž€แž‚แŸแŸ”

แž™แžพแž„แž“แžนแž„แžŠแŸ†แžกแžพแž„แž€แŸ†แžŽแŸ‚ PostgreSQL แž“แžทแž„ Nginx แžŠแŸ‚แž›แž˜แžถแž“แž“แŸ…แž€แŸ’แž“แžปแž„ RHEL 8 แžแžถแž˜แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แžŠแŸ„แž™แž”แŸ’แžšแžพ Yum แŸ”

sudo yum install nginx postgresql-server

PostgreSQL แž“แžนแž„แžแž˜แŸ’แžšแžผแžœแžฑแŸ’แž™แž˜แžถแž“ psycopg2 แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžœแžถแžแŸ’แžšแžผแžœแžแŸ‚แž˜แžถแž“แž“แŸ…แž€แŸ’แž“แžปแž„แž”แžšแžทแžŸแŸ’แžแžถแž“แž“แžทแž˜แŸ’แž˜แžทแžแžแŸ‚แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡ แžŠแžผแž…แŸ’แž“แŸแŸ‡แž™แžพแž„แž“แžนแž„แžŠแŸ†แžกแžพแž„แžœแžถแžŠแŸ„แž™แž”แŸ’แžšแžพ pip3 แžšแžฝแž˜แž‡แžถแž˜แžฝแž™ Django แž“แžทแž„ Gunicorn แŸ” แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžŠแŸ†แž”แžผแž„แž™แžพแž„แžแŸ’แžšแžผแžœแžšแŸ€แž”แž…แŸ† virtualenv แŸ”

แžœแžถแžแŸ‚แž„แžแŸ‚แž˜แžถแž“แž€แžถแžšแž‡แž‡แŸ‚แž€แžœแŸ‚แž€แž‰แŸ‚แž€แž‡แžถแž…แŸ’แžšแžพแž“แž›แžพแž”แŸ’แžšแž’แžถแž“แž”แž‘แž“แŸƒแž€แžถแžšแž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž€แž“แŸ’แž›แŸ‚แž„แžŠแŸ‚แž›แžแŸ’แžšแžนแž˜แžแŸ’แžšแžผแžœแž€แŸ’แž“แžปแž„แž€แžถแžšแžŠแŸ†แžกแžพแž„แž‚แž˜แŸ’แžšแŸ„แž„ Django แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž“แŸ…แž–แŸแž›แž˜แžถแž“แž€แžถแžšแžŸแž„แŸ’แžŸแŸแž™ แžขแŸ’แž“แž€แžขแžถแž…แž„แžถแž€แž‘แŸ…แžšแž€แžŸแŸ’แžแž„แŸ‹แžŠแžถแžšแž‹แžถแž“แžถแž“แžปแž€แŸ’แžšแž˜แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžฏแž€แžŸแžถแžšแž›แžธแž“แžปแž…แŸ” แž‡แžถแž–แžทแžŸแŸแžŸ FHS แž“แžทแž™แžถแž™แžแžถ /srv แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžพแžŠแžพแž˜แŸ’แž”แžธแŸ– "แžšแž€แŸ’แžŸแžถแž‘แžปแž€แž‘แžทแž“แŸ’แž“แž“แŸแž™แž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แžšแž”แžŸแŸ‹แž˜แŸ‰แžถแžŸแŸŠแžธแž“-แž‘แžทแž“แŸ’แž“แž“แŸแž™แžŠแŸ‚แž›แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž•แž›แžทแž แžŠแžผแž…แž‡แžถแž‘แžทแž“แŸ’แž“แž“แŸแž™แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแž‚แŸแž แž‘แŸ†แž–แŸแžš แž“แžทแž„แžŸแŸ’แž‚แŸ’แžšแžธแž” แž‘แžทแž“แŸ’แž“แž“แŸแž™แžšแž€แŸ’แžŸแžถแž‘แžปแž€แž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ FTP แž“แžทแž„แž€แžถแžšแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แžƒแŸ’แž›แžถแŸ†แž„แž”แŸ’แžšแž–แŸแž“แŸ’แž’แŸ”" แž€แŸ†แžŽแŸ‚ (แž”แž„แŸ’แž แžถแž‰แž“แŸ…แž€แŸ’แž“แžปแž„ FHS -2.3 แž€แŸ’แž“แžปแž„แž†แŸ’แž“แžถแŸ† 2004) แŸ”

แž“แŸแŸ‡แž–แžทแžแž‡แžถแž€แžšแžŽแžธแžšแž”แžŸแŸ‹แž™แžพแž„ แžŠแžผแž…แŸ’แž“แŸแŸ‡แž™แžพแž„แžŠแžถแž€แŸ‹แžขแŸ’แžœแžธแž‚แŸ’แžšแž”แŸ‹แž™แŸ‰แžถแž„แžŠแŸ‚แž›แž™แžพแž„แžแŸ’แžšแžผแžœแž€แžถแžšแž‘แŸ…แž€แŸ’แž“แžปแž„ /srv แžŠแŸ‚แž›แž‡แžถแž€แž˜แŸ’แž˜แžŸแžทแž‘แŸ’แž’แžทแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžšแž”แžŸแŸ‹แž™แžพแž„ (cloud-user)แŸ”

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

แž€แžถแžšแžŠแŸ†แžกแžพแž„ PostgreSQL แž“แžทแž„ Django แž‚แžบแž„แžถแž™แžŸแŸ’แžšแžฝแž›แŸ– แž”แž„แŸ’แž€แžพแžแž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™ แž”แž„แŸ’แž€แžพแžแžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ แž€แŸ†แžŽแžแŸ‹แž€แžถแžšแžขแž“แžปแž‰แŸ’แž‰แžถแžแŸ” แžšแžฟแž„แž˜แžฝแž™แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž…แž„แž…แžถแŸ†แž“แŸ…แž–แŸแž›แžŠแŸ†แžกแžพแž„ PostgreSQL แžŠแŸ†แž”แžผแž„แž‚แžบแžŸแŸ’แž‚แŸ’แžšแžธแž” postgresql-setup แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แžŠแŸ†แžกแžพแž„แž‡แžถแž˜แžฝแž™แž€แž‰แŸ’แž…แž”แŸ‹ postgresql-server แŸ” แžŸแŸ’แž‚แŸ’แžšแžธแž”แž“แŸแŸ‡แž‡แžฝแž™แžขแŸ’แž“แž€แž’แŸ’แžœแžพแž€แžทแž…แŸ’แž…แž€แžถแžšแž˜แžผแž›แžŠแŸ’แž‹แžถแž“แžŠแŸ‚แž›แž‘แžถแž€แŸ‹แž‘แž„แž“แžนแž„แž€แžถแžšแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž…แž„แŸ’แž€แŸ„แž˜แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™ แžŠแžผแž…แž‡แžถแž€แžถแžšแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž…แž„แŸ’แž€แŸ„แž˜ แžฌแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž’แŸ’แžœแžพแžฑแŸ’แž™แž”แŸ’แžšแžŸแžพแžšแžกแžพแž„แŸ” แžŠแžพแž˜แŸ’แž”แžธแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ PostgreSQL แžแŸ’แž˜แžธแž“แŸ…แž›แžพแž”แŸ’แžšแž–แŸแž“แŸ’แž’ RHEL แž™แžพแž„แžแŸ’แžšแžผแžœแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž–แžถแž€แŸ’แž™แž”แž‰แŸ’แž‡แžถแŸ–

sudo /usr/bin/postgresql-setup -initdb

แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แžขแŸ’แž“แž€แžขแžถแž…แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜ PostgreSQL แžŠแŸ„แž™แž”แŸ’แžšแžพ systemd แž”แž„แŸ’แž€แžพแžแž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™ แž“แžทแž„แžšแŸ€แž”แž…แŸ†แž‚แž˜แŸ’แžšแŸ„แž„แž“แŸ…แž€แŸ’แž“แžปแž„ Django แŸ” แžŸแžผแž˜แž…แžถแŸ†แžแžถแžแŸ’แžšแžผแžœแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜ PostgreSQL แžกแžพแž„แžœแžทแž‰แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž’แŸ’แžœแžพแž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแžฏแž€แžŸแžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž€แžถแžšแž•แŸ’แž‘แŸ€แž„แž•แŸ’แž‘แžถแžแŸ‹แžขแžแžทแžแžทแž‡แž“ (แž‡แžถแž’แž˜แŸ’แž˜แžแžถ pg_hba.conf) แžŠแžพแž˜แŸ’แž”แžธแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž€แžถแžšแž•แŸ’แž‘แžปแž€แž–แžถแž€แŸ’แž™แžŸแž˜แŸ’แž„แžถแžแŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž€แž˜แŸ’แž˜แžœแžทแž’แžธแŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž‡แžฝแž”แž”แŸ’แžšแž‘แŸ‡แž€แžถแžšแž›แŸ†แž”แžถแž€แž•แŸ’แžŸแŸแž„แž‘แŸ€แž แžแŸ’แžšแžผแžœแž”แŸ’แžšแžถแž€แžŠแžแžถแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž€แžถแžšแž€แŸ†แžŽแžแŸ‹ IPv4 แž“แžทแž„ IPv6 แž“แŸ…แž€แŸ’แž“แžปแž„แžฏแž€แžŸแžถแžš pg_hba.conf แŸ”

systemctl enable -now postgresql

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

แž“แŸ…แž€แŸ’แž“แžปแž„แžฏแž€แžŸแžถแžš /var/lib/pgsql/data/pg_hba.conf:

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

แž“แŸ…แž€แŸ’แž“แžปแž„แžฏแž€แžŸแžถแžš /srv/djangoapp/settings.py:

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

แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžฏแž€แžŸแžถแžš settings.py แž€แŸ’แž“แžปแž„แž‚แž˜แŸ’แžšแŸ„แž„ แž“แžทแž„แžšแŸ€แž”แž…แŸ†แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™ แžขแŸ’แž“แž€แžขแžถแž…แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแžขแž—แžทแžœแžŒแŸ’แžแž“แŸ แžŠแžพแž˜แŸ’แž”แžธแž”แŸ’แžšแžถแž€แžŠแžแžถแžขแŸ’แžœแžธแŸ—แžŠแŸ†แžŽแžพแžšแž€แžถแžšแŸ” แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแžขแž—แžทแžœแžŒแŸ’แžแž“แŸ แžœแžถแž‡แžถแž‚แŸ†แž“แžทแžแž›แŸ’แžขแž€แŸ’แž“แžปแž„แž€แžถแžšแž”แž„แŸ’แž€แžพแžแžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„ แžŠแžพแž˜แŸ’แž”แžธแžŸแžถแž€แž›แŸ’แž”แž„แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แž‘แŸ…แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™แŸ”

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

WSGI? แžœแŸ‰แŸƒ?

แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแžขแž—แžทแžœแžŒแŸ’แžแž“แŸแž˜แžถแž“แž”แŸ’แžšแž™แŸ„แž‡แž“แŸแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž’แŸ’แžœแžพแžแŸแžŸแŸ’แž แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžŠแžพแž˜แŸ’แž”แžธแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธ แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแžแŸ‚แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ แž“แžทแž„แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŸแž˜แžšแž˜แŸ’แž™แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž…แŸ†แžŽแžปแž…แž”แŸ’แžšแž‘แžถแž€แŸ‹ Web Server Gateway Interface (WSGI) แŸ” แž˜แžถแž“แž”แž“แŸ’แžŸแŸ†แž‘แžผแž‘แŸ…แž‡แžถแž…แŸ’แžšแžพแž“แžงแž‘แžถแž แžšแžŽแŸ Apache HTTPD แž‡แžถแž˜แžฝแž™ uWSGI แžฌ Nginx แž‡แžถแž˜แžฝแž™ Gunicorn แŸ”

แž€แžถแžšแž„แžถแžšแžšแž”แžŸแŸ‹ Web Server Gateway Interface แž‚แžบแž”แž‰แŸ’แž‡แžผแž“แžŸแŸ†แžŽแžพแž–แžธ web server แž‘แŸ…แž€แžถแž“แŸ‹ web framework PythonแŸ” WSGI แž‚แžบแž‡แžถแžœแžแŸ’แžแžปแž”แžปแžšแžถแžŽแž“แŸƒแžขแžแžธแžแž€แžถแž›แžŠแŸแžขแžถแž€แŸ’แžšแž€แŸ‹แž“แŸ…แž–แŸแž›แžŠแŸ‚แž›แž˜แŸ‰แžถแžŸแŸŠแžธแž“ CGI แž“แŸ…แž‡แžปแŸ†แžœแžทแž‰ แž แžพแž™แžŸแž–แŸ’แžœแžแŸ’แž„แŸƒแž“แŸแŸ‡ WSGI แž‚แžบแž‡แžถแžŸแŸ’แžแž„แŸ‹แžŠแžถแžšแž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„ แžŠแŸ„แž™แž˜แžทแž“แž‚แžทแžแž–แžธ web server แžฌ Python framework แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แŸ” แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž‘แŸ„แŸ‡แž”แžธแž‡แžถแž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž™แŸ‰แžถแž„แž‘แžผแž›แŸ†แž‘แžผแž›แžถแž™แž€แŸแžŠแŸ„แž™ แž€แŸแž“แŸ…แžแŸ‚แž˜แžถแž“แž—แžถแž–แžแžปแžŸแž”แŸ’แž›แŸ‚แž€แž‚แŸ’แž“แžถแž‡แžถแž…แŸ’แžšแžพแž“แž“แŸ…แž–แŸแž›แž’แŸ’แžœแžพแž€แžถแžšแž‡แžถแž˜แžฝแž™แž€แŸ’แžšแž”แžแŸแžŽแŸ’แžŒแž‘แžถแŸ†แž„แž“แŸแŸ‡ แž“แžทแž„แž˜แžถแž“แž‡แž˜แŸ’แžšแžพแžŸแž‡แžถแž…แŸ’แžšแžพแž“แŸ” แž€แŸ’แž“แžปแž„แž€แžšแžŽแžธแž“แŸแŸ‡ แž™แžพแž„แž“แžนแž„แž–แŸ’แž™แžถแž™แžถแž˜แž”แž„แŸ’แž€แžพแžแžขแž“แŸ’แžแžšแž€แž˜แŸ’แž˜แžšแžœแžถแž„ Gunicorn แž“แžทแž„ Nginx แžแžถแž˜แžšแž™แŸˆแžšแž“แŸ’แž’แž˜แžฝแž™แŸ”

แžŠแŸ„แž™แžŸแžถแžšแžŸแž˜แžถแžŸแž’แžถแžแžปแž‘แžถแŸ†แž„แž–แžธแžšแž“แŸแŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แžŠแŸ†แžกแžพแž„แž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแžแŸ‚แž˜แžฝแž™ แžŸแžผแž˜แžŸแžถแž€แž›แŸ’แž”แž„แž”แŸ’แžšแžพแžšแž“แŸ’แž’ UNIX แž‡แŸ†แž“แžฝแžŸแžฑแŸ’แž™แžšแž“แŸ’แž’แž”แžŽแŸ’แžแžถแž‰แŸ” แžŠแŸ„แž™แžŸแžถแžšแž€แžถแžšแž”แŸ’แžšแžถแžŸแŸ’แžšแŸแž™แž‘แžถแž€แŸ‹แž‘แž„แž‚แŸ’แž“แžถแž‘แžถแž˜แž‘แžถแžšแžšแž“แŸ’แž’แž€แŸ’แž“แžปแž„แž€แžšแžŽแžธแžŽแžถแž€แŸแžŠแŸ„แž™ แžแŸ„แŸ‡แž–แŸ’แž™แžถแž™แžถแž˜แž”แŸ„แŸ‡แž‡แŸ†แž แžถแž“แž˜แžฝแž™แž‡แŸ†แž แžถแž“แž‘แŸ€แž แž แžพแž™แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž€แžถแžšแž’แŸ’แžœแžพแžฑแŸ’แž™แžŸแž€แž˜แŸ’แž˜แžšแž“แŸ’แž’แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Gunicorn แžแžถแž˜แžšแž™แŸˆแž”แŸ’แžšแž–แŸแž“แŸ’แž’แŸ”

แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž“แŸƒแž€แžถแžšแž”แž„แŸ’แž€แžพแž socket activated services แž‚แžบแžŸแžถแž˜แž‰แŸ’แž‰แžŽแžถแžŸแŸ‹แŸ” แžŠแŸ†แž”แžผแž„ แžฏแž€แžŸแžถแžšแžฏแž€แžแžถแžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแžŠแŸ‚แž›แž˜แžถแž“แž€แžถแžšแžŽแŸ‚แž“แžถแŸ† ListenStream แž…แž„แŸ’แžขแžปแž›แž‘แŸ…แž…แŸ†แžŽแžปแž…แžŠแŸ‚แž›แžšแž“แŸ’แž’ UNIX แž“แžนแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแž แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แžฏแž€แžŸแžถแžšแžฏแž€แžแžถแžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŸแŸแžœแžถแž€แž˜แŸ’แž˜แžŠแŸ‚แž›แžŸแŸแž…แž€แŸ’แžแžธแžŽแŸ‚แž“แžถแŸ†แžแž˜แŸ’แžšแžผแžœแž“แžนแž„แž…แž„แŸ’แžขแžปแž›แž‘แŸ…แžฏแž€แžŸแžถแžšแžฏแž€แžแžถแžšแž“แŸ’แž’แŸ” แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€ แž“แŸ…แž€แŸ’แž“แžปแž„แžฏแž€แžŸแžถแžšแžฏแž€แžแžถแžŸแŸแžœแžถแž€แž˜แŸ’แž˜ แžขแŸ’แžœแžธแžŠแŸ‚แž›แž“แŸ…แžŸแŸแžŸแžŸแž›แŸ‹แž‚แžบแžแŸ’แžšแžผแžœแž แŸ… Gunicorn แž–แžธแž”แžšแžทแž™แžถแž€แžถแžŸแž“แžทแž˜แŸ’แž˜แžทแž แž แžพแž™แž”แž„แŸ’แž€แžพแžแž€แžถแžšแž…แž„ WSGI แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžšแž“แŸ’แž’ UNIX แž“แžทแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธ Django แŸ”

แž“แŸแŸ‡แž‚แžบแž‡แžถแžงแž‘แžถแž แžšแžŽแŸแž˜แžฝแž™แž…แŸ†แž“แžฝแž“แž“แŸƒแžฏแž€แžแžถแžฏแž€แžŸแžถแžšแžŠแŸ‚แž›แžขแŸ’แž“แž€แžขแžถแž…แž”แŸ’แžšแžพแž‡แžถแž˜แžผแž›แžŠแŸ’แž‹แžถแž“แŸ” แžŠแŸ†แž”แžผแž„แž™แžพแž„แžแŸ†แžกแžพแž„แžšแž“แŸ’แž’แŸ”

[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;
   }
}

แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžšแž“แŸ’แž’ Gunicorn แž“แžทแž„ Nginx แžŠแŸ„แž™แž”แŸ’แžšแžพ systemd แž แžพแž™แžขแŸ’แž“แž€แžšแžฝแž…แžšแžถแž›แŸ‹แžŠแžพแž˜แŸ’แž”แžธแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžŸแžถแž€แž›แŸ’แž”แž„แŸ”

แž€แŸ†แž แžปแžŸแž…แŸ’แžšแž€แž•แŸ’แž›แžผแžœแž˜แžทแž“แž›แŸ’แžข?

แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž”แž‰แŸ’แž…แžผแž›แžขแžถแžŸแž™แžŠแŸ’แž‹แžถแž“แž‘แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžšแžปแž€แžšแž€แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€ แžขแŸ’แž“แž€แž‘แŸ†แž“แž„แž‡แžถแž“แžนแž„แž‘แž‘แžฝแž›แž”แžถแž“แž€แŸ†แž แžปแžŸ 502 Bad Gateway แŸ” แžœแžถแžขแžถแž…แž”แžŽแŸ’แžแžถแž›แž˜แž€แž–แžธแž€แžถแžšแžขแž“แžปแž‰แŸ’แž‰แžถแžแžšแž“แŸ’แž’แž™แžผแž“แžธแž€แžŠแŸ‚แž›แž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž˜แžทแž“แžแŸ’แžšแžนแž˜แžแŸ’แžšแžผแžœ แžฌแžœแžถแžขแžถแž…แž”แžŽแŸ’แžแžถแž›แž˜แž€แž–แžธแž”แž‰แŸ’แž แžถแžŸแŸ’แž˜แžปแž‚แžŸแŸ’แž˜แžถแž‰แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ€แžแž‘แžถแž€แŸ‹แž‘แž„แž“แžนแž„แž€แžถแžšแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž€แžถแžšแž…แžผแž›แž”แŸ’แžšแžพแž“แŸ…แž€แŸ’แž“แžปแž„ 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 แž“แŸ…แž‘แžธแž“แŸแŸ‡แž‘แŸ แžŠแŸ„แž™แžŸแžถแžšแž˜แžทแž“แž˜แžถแž“แž€แž˜แŸ’แž˜แžœแžทแž’แžธ Django แž–แžทแžแž”แŸ’แžšแžถแž€แžŠแž“แŸ…แž–แŸแž›แž“แŸแŸ‡ แžŠแžผแž…แŸ’แž“แŸแŸ‡แž˜แžทแž“แž˜แžถแž“แž•แŸ‚แž“แž‘แžธแž–แŸแž‰แž›แŸแž‰แž“แŸƒแžขแŸ’แžœแžธแžŠแŸ‚แž› Gunicorn แžขแžถแž…แž…แž„แŸ‹แž…แžผแž›แž”แŸ’แžšแžพ แž“แžทแž„แžขแŸ’แžœแžธแžŠแŸ‚แž›แžœแžถแž‚แžฝแžšแžแŸ‚แž”แžŠแžทแžŸแŸแž’แž€แžถแžšแž…แžผแž›แž”แŸ’แžšแžพแŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡แž แžพแž™ แžœแžถแž…แžถแŸ†แž”แžถแž…แŸ‹แž€แŸ’แž“แžปแž„แž€แžถแžšแž”แž“แŸ’แžแžŠแŸ†แžŽแžพแžšแž€แžถแžš SELinux แžŠแžพแž˜แŸ’แž”แžธแž€แžถแžšแž–แžถแžšแž”แŸ’แžšแž–แŸแž“แŸ’แž’ แžแžŽแŸˆแž–แŸแž›แžŠแŸ‚แž›แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŠแŸ†แžŽแžพแžšแž€แžถแžš แž“แžทแž„แž‘แžปแž€แžŸแžถแžšแž“แŸ…แž€แŸ’แž“แžปแž„แž€แŸ†แžŽแžแŸ‹แž แŸแžแžปแžŸแžœแž“แž€แž˜แŸ’แž˜ แžŠแžผแž…แŸ’แž“แŸแŸ‡แž‚แŸ„แž›แž€แžถแžšแžŽแŸแž–แžทแžแž”แŸ’แžšแžถแž€แžŠแžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแž–แžธแž–แžฝแž€แž‚แŸแŸ”

แž€แžถแžšแž”แž‰แŸ’แž‡แžถแž€แŸ‹แžŠแŸ‚แž“แžขแž“แžปแž‰แŸ’แž‰แžถแž

แž˜แžทแž“แž˜แŸ‚แž“แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แž“แžถแžŸแžปแž‘แŸ’แž’แžแŸ‚แž’แŸ’แž›แžถแž”แŸ‹แžฎแžขแŸ†แž–แžธแžŠแŸ‚แž“แžŠแŸ‚แž›แž”แžถแž“แžขแž“แžปแž‰แŸ’แž‰แžถแžแž“แŸ…แž€แŸ’แž“แžปแž„ SELinux แž“แŸ„แŸ‡แž‘แŸ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž–แžฝแž€แž‚แŸแž˜แžทแž“แž˜แžถแž“แžขแŸ’แžœแžธแžแŸ’แž˜แžธแž“แŸ„แŸ‡แž‘แŸแŸ” แž˜แž“แžปแžŸแŸ’แžŸแž‡แžถแž…แŸ’แžšแžพแž“แžแŸ‚แž˜แž‘แžถแŸ†แž„แž”แžถแž“แž’แŸ’แžœแžพแž€แžถแžšแž‡แžถแž˜แžฝแž™แž–แžฝแž€แž‚แŸแžŠแŸ„แž™แž˜แžทแž“แžŠแžนแž„แžแŸ’แž›แžฝแž“แŸ” แž“แŸ…แž–แŸแž›แžŠแŸ‚แž›แž‚แŸ„แž›แž€แžถแžšแžŽแŸแžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแžŠแŸ„แž™แž•แŸ’แžขแŸ‚แž€แž›แžพแžŸแžถแžšแžŸแžœแž“แž€แž˜แŸ’แž˜ แž‚แŸ„แž›แž€แžถแžšแžŽแŸแžŠแŸ‚แž›แž”แžถแž“แž”แž„แŸ’แž€แžพแžแžแŸ†แžŽแžถแž„แžฑแŸ’แž™แžŠแŸ‚แž“แžŠแŸ‚แž›แž”แžถแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แŸ” แž…แžผแžšแž™แžพแž„แž–แŸ’แž™แžถแž™แžถแž˜แž”แž„แŸ’แž€แžพแžแž‚แŸ„แž›แž€แžถแžšแžŽแŸแžขแž“แžปแž‰แŸ’แž‰แžถแžแžŠแŸแžŸแžถแž˜แž‰แŸ’แž‰แž˜แžฝแž™แŸ”

แžŠแžพแž˜แŸ’แž”แžธแž”แž„แŸ’แž€แžพแžแžŠแŸ‚แž“แžŠแŸ‚แž›แž”แžถแž“แžขแž“แžปแž‰แŸ’แž‰แžถแžแž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž แŸ’แž‚แžธแž“แžแž“ แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแž€แžถแžšแž‚แŸ„แž›แž€แžถแžšแžŽแŸแž˜แžฝแž™แž…แŸ†แž“แžฝแž“ แž แžพแž™แžขแŸ’แž“แž€แž€แŸแžแŸ’แžšแžผแžœแžŸแž˜แŸ’แž‚แžถแž›แŸ‹แžฏแž€แžŸแžถแžšแžŠแŸ‚แž›แžŸแž˜แžšแž˜แŸ’แž™แž•แž„แžŠแŸ‚แžšแŸ” แž›แžพแžŸแž–แžธแž“แŸแŸ‡ แžงแž”แž€แžšแžŽแŸแž‚แžบแžแŸ’แžšแžผแžœแž€แžถแžšแž‡แžถแž…แžถแŸ†แž”แžถแž…แŸ‹แžŠแžพแž˜แŸ’แž”แžธแž”แŸ’แžšแž˜แžผแž›แž•แŸ’แžแžปแŸ†แž‚แŸ„แž›แž“แž™แŸ„แž”แžถแž™แžแŸ’แž˜แžธแŸ”

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 แž–แžธแž€แžถแžšแžŸแžšแžŸแŸแžšแž‘แžทแž“แŸ’แž“แž“แŸแž™แž‘แŸ…แž€แžถแž“แŸ‹แžšแž“แŸ’แž’ UNIX แžŠแŸ‚แž›แž”แŸ’แžšแžพแžŠแŸ„แž™ Gunicorn แŸ” แž‡แžถแž’แž˜แŸ’แž˜แžแžถ แž€แŸ’แž“แžปแž„แž€แžšแžŽแžธแž”แŸ‚แž”แž“แŸแŸ‡ แž‚แŸ„แž›แž“แž™แŸ„แž”แžถแž™แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžš แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž˜แžถแž“แž”แž‰แŸ’แž แžถแž”แŸ’แžšแžˆแž˜แž•แŸ’แžŸแŸแž„แž‘แŸ€แžแž“แŸ…แžแžถแž„แž˜แžปแžแŸ” แžขแŸ’แž“แž€แž€แŸแžขแžถแž…แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžŠแŸ‚แž“แž–แžธแžŠแŸ‚แž“แžŠแžถแž€แŸ‹แž€แž˜แŸ’แžšแžทแžแž‘แŸ…แž‡แžถแžŠแŸ‚แž“แžขแž“แžปแž‰แŸ’แž‰แžถแžแŸ” แžฅแžกแžผแžœแžŸแžผแž˜แž•แŸ’แž›แžถแžŸแŸ‹แž‘แžธ httpd_t แž‘แŸ…แžŠแŸ‚แž“แžขแž“แžปแž‰แŸ’แž‰แžถแžแŸ” แžœแžถแž“แžนแž„แž•แŸ’แžแž›แŸ‹แžฑแŸ’แž™ Nginx แž“แžผแžœแž€แžถแžšแž…แžผแž›แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž…แžถแŸ†แž”แžถแž…แŸ‹ แž แžพแž™แž™แžพแž„แžขแžถแž…แž”แž“แŸ’แžแž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แžถแžšแž„แžถแžšแž”แŸ†แž”แžถแžแŸ‹แž€แŸ†แž แžปแžŸแž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ€แžแŸ”

sudo semanage permissive -a httpd_t

แžŠแžผแž…แŸ’แž“แŸแŸ‡แž“แŸ…แž–แŸแž›แžŠแŸ‚แž›แžขแŸ’แž“แž€แž”แžถแž“แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แžŠแžพแž˜แŸ’แž”แžธแžšแž€แŸ’แžŸแžถ SELinux แž€แžถแžšแž–แžถแžš (แžขแŸ’แž“แž€แž–แžทแžแž‡แžถแž˜แžทแž“แž‚แžฝแžšแž…แžถแž€แž…แŸแž‰แž–แžธแž‚แž˜แŸ’แžšแŸ„แž„ SELinux แž“แŸ…แž€แŸ’แž“แžปแž„แžšแž”แŸ€แž”แžŠแžถแž€แŸ‹แž€แž˜แŸ’แžšแžทแž) แž แžพแž™แžŠแŸ‚แž“แžขแž“แžปแž‰แŸ’แž‰แžถแžแžแŸ’แžšแžผแžœแž”แžถแž“แž•แŸ’แž‘แžปแž€ แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแžŸแŸ’แžœแŸ‚แž„แž™แž›แŸ‹แžแžถแžแžพแžขแŸ’แžœแžธแžŠแŸ‚แž›แžแŸ’แžšแžผแžœแžŸแž˜แŸ’แž‚แžถแž›แŸ‹แž‡แžถ gunicorn_exec_t แžŠแžพแž˜แŸ’แž”แžธแžฑแŸ’แž™แžขแŸ’แžœแžธแŸ—แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž”แžถแž“แžแŸ’แžšแžนแž˜แžแŸ’แžšแžผแžœแŸ” แž˜แŸ’แžแž„แž‘แŸ€แžแŸ” แžแŸ„แŸ‡แžŸแžถแž€แž›แŸ’แž”แž„แž…แžผแž›แž˜แžพแž›แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแžพแž˜แŸ’แž”แžธแž˜แžพแž›แžŸแžถแžšแžแŸ’แž˜แžธแžขแŸ†แž–แžธแž€แžถแžšแžšแžนแžแž”แž“แŸ’แžแžนแž„แž€แžถแžšแž…แžผแž›แž”แŸ’แžšแžพแŸ”

sudo ausearch -m AVC -c gunicorn

แžขแŸ’แž“แž€แž“แžนแž„แžƒแžพแž‰แžŸแžถแžšแž‡แžถแž…แŸ’แžšแžพแž“แžŠแŸ‚แž›แž˜แžถแž“ 'comm="gunicorn"' แžŠแŸ‚แž›แž’แŸ’แžœแžพแž€แžทแž…แŸ’แž…แž€แžถแžšแž•แŸ’แžŸแŸแž„แŸ—แž›แžพแžฏแž€แžŸแžถแžšแž€แŸ’แž“แžปแž„ /srv/djangoapp แžŠแžผแž…แŸ’แž“แŸแŸ‡แž…แŸ’แž”แžถแžŸแŸ‹แžŽแžถแžŸแŸ‹แž“แŸแŸ‡แž‚แžบแž‡แžถแž–แžถแž€แŸ’แž™แž”แž‰แŸ’แž‡แžถแž˜แžฝแž™แž€แŸ’แž“แžปแž„แž…แŸ†แžŽแŸ„แž˜แž–แžถแž€แŸ’แž™แž”แž‰แŸ’แž‡แžถแžŠแŸ‚แž›แž˜แžถแž“แžแž˜แŸ’แž›แŸƒแžŠแžถแž€แŸ‹แž‘แž„แŸ‹แŸ”

แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž›แžพแžŸแž–แžธแž“แŸแŸ‡ แžŸแžถแžšแž”แŸ‚แž”แž“แŸแŸ‡แž›แŸแž…แžกแžพแž„แŸ–

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

แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž€แŸ’แžšแžกแŸแž€แž˜แžพแž›แžŸแŸ’แžแžถแž“แž—แžถแž–แž“แŸƒแžŸแŸแžœแžถแž€แž˜แŸ’แž˜ gunicorn แžฌแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž–แžถแž€แŸ’แž™แž”แž‰แŸ’แž‡แžถ ps แžขแŸ’แž“แž€แž“แžนแž„แž˜แžทแž“แžƒแžพแž‰แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‘แŸแŸ” แžœแžถแž แžถแž€แŸ‹แžŠแžผแž…แž‡แžถ gunicorn แž€แŸ†แž–แžปแž„แž–แŸ’แž™แžถแž™แžถแž˜แž…แžผแž›แž”แŸ’แžšแžพแž€แž˜แŸ’แž˜แžœแžทแž’แžธแž”แž€แž”แŸ’แžšแŸ‚ Python แž“แŸ…แž€แŸ’แž“แžปแž„แž”แžšแžทแžŸแŸ’แžแžถแž“ virtualenv แžšแž”แžŸแŸ‹แž™แžพแž„ แžŠแŸ‚แž›แžขแžถแž…แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŸแŸ’แž‚แŸ’แžšแžธแž”แž€แž˜แŸ’แž˜แž€แžšแŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡แžฅแžกแžผแžœแž“แŸแŸ‡ แž…แžผแžšแž™แžพแž„แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แžฏแž€แžŸแžถแžšแžŠแŸ‚แž›แžขแžถแž…แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž”แžถแž“แž‘แžถแŸ†แž„แž–แžธแžšแž“แŸแŸ‡แž แžพแž™แž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž›แžแžถแžแžพแž™แžพแž„แžขแžถแž…แž”แžพแž€แž‘แŸ†แž–แŸแžšแžŸแžถแž€แž›แŸ’แž”แž„ Django แžšแž”แžŸแŸ‹แž™แžพแž„แžŠแŸ‚แžšแžฌแž‘แŸแŸ”

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

แžŸแŸแžœแžถแž€แž˜แŸ’แž˜แž€แžถแŸ†แž—แŸ’แž›แžพแž„แž“แžนแž„แžแŸ’แžšแžผแžœแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžกแžพแž„แžœแžทแž‰ แž˜แžปแž“แž–แŸแž›แžŸแŸ’แž›แžถแž€แžแŸ’แž˜แžธแžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแŸ” แžขแŸ’แž“แž€แžขแžถแž…แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžœแžถแžกแžพแž„แžœแžทแž‰แž—แŸ’แž›แžถแž˜แŸ— แžฌแž”แž‰แŸ’แžˆแž”แŸ‹แžŸแŸแžœแžถแž€แž˜แŸ’แž˜ แž แžพแž™แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แžšแž“แŸ’แž’แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžœแžถแž“แŸ…แž–แŸแž›แžขแŸ’แž“แž€แž”แžพแž€แž‚แŸแž แž‘แŸ†แž–แŸแžšแž“แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžšแžปแž€แžšแž€แŸ” แž•แŸ’แž‘แŸ€แž„แž•แŸ’แž‘แžถแžแŸ‹แžแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž”แžถแž“แž‘แž‘แžฝแž›แžŸแŸ’แž›แžถแž€แžแŸ’แžšแžนแž˜แžแŸ’แžšแžผแžœแžŠแŸ„แž™แž”แŸ’แžšแžพ ps แŸ”

ps -efZ | grep gunicorn

แž€แžปแŸ†แž—แŸ’แž›แŸแž…แž”แž„แŸ’แž€แžพแžแž‚แŸ„แž›แž€แžถแžšแžŽแŸ SELinux แž’แž˜แŸ’แž˜แžแžถแž“แŸ…แž–แŸแž›แž€แŸ’แžšแŸ„แž™!

แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž€แŸ’แžšแžกแŸแž€แž˜แžพแž›แžŸแžถแžš AVC แžฅแžกแžผแžœแž“แŸแŸ‡ แžŸแžถแžšแž…แžปแž„แž€แŸ’แžšแŸ„แž™แž˜แžถแž“ permissive=1 แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แžœแžธแž‚แŸ’แžšแž”แŸ‹แž™แŸ‰แžถแž„แžŠแŸ‚แž›แž‘แžถแž€แŸ‹แž‘แž„แž“แžนแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธ แž“แžทแž„ permissive=0 แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžŠแŸ‚แž›แž“แŸ…แžŸแž›แŸ‹แŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž™แž›แŸ‹แžแžถแž”แŸ’แžšแž—แŸแž‘แž“แŸƒแž€แžถแžšแž…แžผแž›แž”แŸ’แžšแžพแž€แž˜แŸ’แž˜แžœแžทแž’แžธแž–แžทแžแž”แŸ’แžšแžถแž€แžŠแžแŸ’แžšแžผแžœแž€แžถแžš แžขแŸ’แž“แž€แžขแžถแž…แžŸแŸ’แžœแŸ‚แž„แžšแž€แžœแžทแž’แžธแž›แŸ’แžขแž”แŸ†แž•แžปแžแžŠแžพแž˜แŸ’แž”แžธแžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž”แž‰แŸ’แž แžถแž”แŸ‚แž”แž“แŸแŸ‡แž”แžถแž“แž™แŸ‰แžถแž„แž†แžถแž”แŸ‹แžšแž แŸแžŸแŸ” แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžšแž แžผแžแžŠแž›แŸ‹แž–แŸแž›แž“แŸ„แŸ‡ แžœแžถแž‡แžถแž€แžถแžšแž›แŸ’แžขแž”แŸ†แž•แžปแžแž€แŸ’แž“แžปแž„แž€แžถแžšแžšแž€แŸ’แžŸแžถแž”แŸ’แžšแž–แŸแž“แŸ’แž’แžฑแŸ’แž™แž˜แžถแž“แžŸแžปแžœแžแŸ’แžแžทแž—แžถแž– แž“แžทแž„แž‘แž‘แžฝแž›แž”แžถแž“แžŸแžœแž“แž€แž˜แŸ’แž˜แž…แŸ’แž”แžถแžŸแŸ‹แž›แžถแžŸแŸ‹ แž“แžทแž„แžขแžถแž…แž”แŸ’แžšแžพแž”แžถแž“แž“แŸƒแž‚แž˜แŸ’แžšแŸ„แž„ Django แŸ”

sudo ausearch -m AVC

แž”แžถแž“แž€แžพแžแžกแžพแž„!

แž‚แž˜แŸ’แžšแŸ„แž„ Django แžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž”แžถแž“แž”แž„แŸ’แž แžถแž‰แžแŸ’แž›แžฝแž“แž‡แžถแž˜แžฝแž™แž“แžนแž„แž•แŸ’แž“แŸ‚แž€แžแžถแž„แž˜แžปแžแžŠแŸ„แž™แž•แŸ’แžขแŸ‚แž€แž›แžพ Nginx แž“แžทแž„ Gunicorn WSGI แŸ” แž™แžพแž„แž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ Python 3 แž“แžทแž„ PostgreSQL 10 แž–แžธแžƒแŸ’แž›แžถแŸ†แž„ RHEL 8 Beta แŸ” แžฅแžกแžผแžœแž“แŸแŸ‡ แžขแŸ’แž“แž€แžขแžถแž…แž†แŸ’แž–แŸ„แŸ‡แž‘แŸ…แž˜แžปแž แž“แžทแž„แž”แž„แŸ’แž€แžพแž (แžฌแž‚แŸ’แžšแžถแž“แŸ‹แžแŸ‚แžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™) แž€แž˜แŸ’แž˜แžœแžทแž’แžธ Django แžฌแžŸแŸ’แžœแŸ‚แž„แžšแž€แžงแž”แž€แžšแžŽแŸแžŠแŸ‚แž›แž˜แžถแž“แž•แŸ’แžŸแŸแž„แž‘แŸ€แžแž“แŸ…แž€แŸ’แž“แžปแž„ RHEL 8 Beta แžŠแžพแž˜แŸ’แž”แžธแž’แŸ’แžœแžพแžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžทแž€แž˜แŸ’แž˜แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ แž€แŸ‚แž›แž˜แŸ’แžขแž€แžถแžšแžขแž“แžปแžœแžแŸ’แž แžฌแžŸแžผแž˜แŸ’แž”แžธแžแŸ‚แž•แŸ’แž‘แžปแž€แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž“แŸแŸ‡แŸ”

แž”แŸ’แžšแž—แž–: www.habr.com

แž”แž“แŸ’แžแŸ‚แž˜แž˜แžแžทแž™แŸ„แž”แž›แŸ‹