RHEL 8 Beta ืึธืคืคืขืจืก ืืขืืืขืืึธืคึผืขืจืก ืคืืืข ื ืืึทืข ืคึฟืขืึดืงืืืื, ืื ืืืกืืื ื ืคืื ืืืึธืก ืงืขื ื ืขืืขื ืืืขืืขืจ, ืึธืืขืจ, ืืขืจื ืขื ื ืืึทืข ืืื ืื ืืื ืฉืืขื ืืืง ืืขืกืขืจ ืืื ืคืืจ, ืึทืืื ืืื ืื ืืืจ ืคืึธืจืฉืืึธืื ืึท ืืืึทืจืฉืืึทื ืืืืฃ ืึทืงืืฉืึทืืืึทืื ืงืจืืืืืื ื ืึท ืึทืคึผืืึทืงืืืฉืึทื ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ ืืืืืจื ืืืืฃ Red Hat Enterprise Linux 8 Beta.
ืืึธืืืจ ื ืขืืขื Python, ืึท ืคืึธืืงืก ืคึผืจืึธืืจืึทืืืื ื ืฉืคึผืจืึทื ืฆืืืืฉื ืืขืืืขืืึธืคึผืขืจืก, ืืื ืึท ืืงืขืจ, ืึท ืงืึธืืืื ืึทืฆืืข ืคืื โโโโDjango ืืื PostgreSQL, ืึท ืคืขืจืื ืคึผืจืึธืกื ืงืึธืืืื ืึทืฆืืข ืคึฟืึทืจ ืงืจืืืืืื ื ืึทืคึผืืึทืงืืืฉืึทื ื, ืืื ืงืึทื ืคืืืืขืจ RHEL 8 Beta ืฆื ืึทืจืืขืื ืืื ืืื. ืืขืจื ืึธื ืืืจ ืืืืื ืึท ืคึผืึธืจ ืืขืจ (ืึทื ืงืืึทืกืกืืคืืขื) ืื ืืจืืืืึทื ืฅ.
ืื ืคึผืจืึธืืข ืกืืืืืืข ืืืขื ืืืืฉื, ืืืืึทื ืขืก ืืื ืืฉืืงืึทืืืข ืฆื ืืืกืคืึธืจืฉื ืื ืคึผืึทืกืึทืืืืึทืืื ืคืื ืึธืืึทืืืืฉืึทื, ืืจืืขืื ืืื ืงืึทื ืืืื ืขืจื ืืื ืืจืืื ื ืื ืืืืืจืึทื ืืึทื ืฅ ืืื ืงืืืคื ืกืขืจืืืขืจืก. ืฆื ืึธื ืืืืื ืืื ืึท ื ืืึทืข ืคึผืจืืืขืงื, ืืืจ ืงืขื ืขื ืึธื ืืืืื ืฆื ืฉืึทืคึฟื ืึท ืงืืืื ืคึผืฉืื ืคึผืจืึธืืืึทืืืืคึผ ืืื ืืึทื ื, ืึทืืื ืืืจ ืงืขื ืขื ืืขื ืคึผืื ืงื ืืืึธืก ืืึทืจืฃ ืคึผืึทืกืืจื ืืื ืืื ืขืก ืื ืืขืจืึทืงืฅ, ืืื ืืึทื ืืึทื ืืืืฃ ืฆื ืึธืืึทืืืื ืืื ืฉืึทืคึฟื ืืขืจ ืงืึธืืคึผืืืฆืืจื ืงืึทื ืคืืืืขืจืืืฉืึทื ื. ืืืึทื ื ืืืจ ืืขื ืขื ืืขืจืขืื ืืืขืื ืืขืจ ืฉืึทืคืื ื ืคืื ืึทืืึท ืึท ืคึผืจืึธืืืึทืืืืคึผ.
ืืึธืืืจ ืึธื ืืืืื ืืื ืืืคึผืืืืื ื ืื RHEL 8 Beta VM ืืืื. ืืืจ ืงืขื ืขื ืื ืกืืึทืืืจื ืึท ืืืืจืืืึทื ืืึทืฉืื ืคึฟืื ืงืจืึทืฆื, ืึธืืขืจ ื ืืฆื ืื KVM ืืึทืกื ืืืื ืื ืืืฆื ืืื ืืืื ืืืชื ืึทืืึธื ืขืืขื ื. ืืืขื ืืืจ ื ืืฆื ืึท ืืึทืกื ืืืื, ืืืจ ืืึทืจืคึฟื ืฆื ืงืึทื ืคืืืืขืจ ืึท ืืืืจืืืึทื ืงืึธืืคึผืึทืงืืืืกืง ืืืึธืก ืืืขื ืึทื ืืืึทืืื ืืขืืึทืืึทืืึท ืืื ืืึทื ืืฆืขืจ ืืึทืื ืคึฟืึทืจ ืืืึธืืงื ืื ืืืืึทืืืืึทืืืึธื (ืืืึธืืงื-ืื ืื). ืืืจ ืืึธื ื ืื ืืึทืจืคึฟื ืฆื ืืึธื ืขืคึผืขืก ืกืคึผืขืฆืืขื ืืื ืื ืืืกืง ืกืืจืืงืืืจ ืึธืืขืจ ืื ืืืฆื ืคึผืึทืงืึทืืืฉืึทื; ืงืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืขื ืืึธื.
ืืื ืก ื ืขืืขื ืึท ื ืขืขื ืืขืจ ืงืืง ืืืึท ืื ืืื ืฆืข ืคึผืจืึธืฆืขืก.
ืื ืกืืึธืืื ื Django
ืืื ืื ื ืืึทืกื ืืืขืจืกืืข ืคืื โโโโDjango, ืืืจ ืืืขื ืืึทืจืคึฟื ืึท ืืืืจืืืึทื ืกืืืืืืข (ืืืืจืืืึทืืขื ืื) ืืื 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 2 ืฆื Python 2, ืืฉืขืช Python 3 ืืื ืืื ืืื ืืขืจ ืึทืงืืืื ืึทื ืืืืืงืืื ื, ืืื ืืขืจ ืืื ืืขืจ ื ืืึทืข ืืืขืจืกืืขืก ืืขื ืขื ืงืขืกืืืืขืจ ืืจืืืก. ืืขืจืืืขืจ, ืฆื ืืจืขืคื ืื ื ืืื ืคึฟืึทืจ ืกืืึทืืื ืกืืกืืขื ืืืฉืืจืื ืืื ืคืึธืจืฉืืึธืื ื ืืฆืขืจืก ืึทืงืกืขืก ืฆื ืคืึทืจืฉืืื ื ืืึทืข ืืืขืจืกืืขืก ืคืื ืคึผืืืืึธื, ืกืืกืืขื ืคึผืืืืึธื ืืื ืืจืืืขืจืืขืคืืจื ืืื ืึท ื ืืึทืข ืคึผืขืงื ืืื ืฆืืืขืฉืืขืื ืื ืคืืืืงืืื ืฆื ืื ืกืืึทืืืจื ืืืืืข Python 2.7 ืืื 3.6. ืืขืจ ืืื ืคึฟืึธืจืืึทืฆืืข ืืืขืื ืื ืขื ืืขืจืื ืืขื ืืื ืืืึธืก ืืื ืืขื ืขื ืืขืืืื ืงืขื ืขื ืืืื ืืขืคึฟืื ืขื ืืื ืื ืืืกืืึทืืข ืืื
ืึทืืื, ืฆื ืืึทืงืืืขื ืืจืืขืื ืคึผืืืืึธื, ืืืจ ื ืึธืจ ืืึทืจืคึฟื ืฆื ืื ืกืืึทืืืจื ืฆืืืื ืคึผืึทืงืึทืืืฉืึทื, ืืื ืคึผืืืืึธื3-ืคึผืืคึผ ืึทืจืืึทื ืืขืจืขืื ื ืืื ืึท ืืขืคึผืขื ืืขื ืกื.
sudo yum install python36 python3-virtualenv
ืคืืจืืืืก ืืึธื ื ืื ื ืืฆื ืืืจืขืงื ืืึธืืืืข ืงืึทืืืก ืืื Langdon ืกืึทืืืืฉืขืกืฅ ืืื ืื ืกืืึทืืืจื pip3? ืืื ืืื ืขื ืื ืึทืคึผืงืึทืืื ื ืึธืืึทืืืืฉืึทื, ืขืก ืืื ืืึทืืืืกื ืึทื Ansible ืืืขื ืืึทืจืคื ืคึผืืคึผ ืืื ืกืืึทืืืจื ืฆื ืืืืคื, ืืืืึทื ืื ืคึผืืคึผ ืืึธืืืืข ืฉืืืฆื ื ืืฉื ืืืืจืืืขืืขืืืก ืืื ืึท ืื ืื ืคึผืืคึผ ืขืงืกืขืงืืืึทืืืข.
ืืื ืึท ืืจืืขืื ืคึผืืืืึธื 3 ืืืขืจืืขืฆืขืจ ืฆื ืืืื ืืึทืืืึทืืืงืื ื, ืืืจ ืงืขื ืขื ืคืึธืจืืขืฆื ืืื ืื Django ืืึทื ืืึธื ืืืจืื ื ืคึผืจืึธืฆืขืก ืืื ืืึธืื ืึท ืืจืืขืื ืกืืกืืขื ืฆืืืึทืืขื ืืื ืืื ืืืขืจ ืื ืืขืจืข ืงืึทืืคึผืึธืื ืึทื ืฅ. ืขืก ืืขื ืขื ืคืืืข ืืืคึผืืึทืืขื ืืืืฉืึทื ืึธืคึผืฆืืขืก ืื ืืืฆื ืืืืฃ ืืขืจ ืืื ืืขืจื ืขืฅ. ืขืก ืืื ืืืื ืืืขืจืกืืข ืืขืจืืื ืื ืืึธ, ืึธืืขืจ ืืืืขืจื ืงืขื ืขื ื ืืฆื ืืืืขืจ ืืืืืขื ืข ืคึผืจืึทืกืขืกืึทื.
ืืืจ ืืืขืื ืื ืกืืึทืืืจื ืื PostgreSQL ืืื Nginx ืืืขืจืกืืขืก ืื ืืืฆื ืืื RHEL 8 ืืืจื ืคืขืืืงืืึทื ื ืืฆื Yum.
sudo yum install nginx postgresql-server
PostgreSQL ืืืขื ืืึทืจืคื psycopg2, ืึธืืขืจ ืขืก ืืึทืจืฃ ืืืื ืืืจืขืืืืื ืืืืื ืืื ืึท ืืืืจืืืึทื ืื ืืืืืจืึทื ืืขื ืึทื ืกืืืืืืข, ืึทืืื ืืืจ ืืืขืื ืื ืกืืึทืืืจื ืขืก ืืื pip3 ืฆืืืึทืืขื ืืื Django ืืื Gunicorn. ืืืขืจ ืขืจืฉืืขืจ ืืืจ ืืึทืจืคึฟื ืฆื ืฉืืขืื ืืืืจืืืขืืขื ืื.
ืขืก ืืื ืฉืืขื ืืืง ืึท ืคึผืืึทืฅ ืคืื ืืขืืึทืืข ืืืืฃ ืื ืืขืืข ืคืื โโืืฉืืืื ื ืื ืจืขืื ืึธืจื ืฆื ืื ืกืืึทืืืจื Django ืคึผืจืึทืืืฉืขืงืก, ืึธืืขืจ ืืืื ืืืจ ืืขื ื ืืื ืฆืืืืืคื, ืืืจ ืงืขื ื ืฉืืขื ืืืง ืืืขื ืื ืฆื ืื Linux Filesystem Hierarchy Standard. ืกืคึผืึทืกืืคืืงืื, ืื FHS ืืืื ืึทื / srv ืืื ืืขื ืืฆื ืฆื: "ืกืืึธืจ ืืึธืกื-ืกืคึผืขืฆืืคืืฉ ืืึทืื - ืืึทืื ืืืึธืก ืื ืกืืกืืขื ืืจืืื, ืึทืืึท ืืื ืืืขื ืกืขืจืืืขืจ ืืึทืื ืืื ืกืงืจืืคึผืก, ืืึทืื ืกืืึธืจื ืืืืฃ ืคืืคึผ ืกืขืจืืืขืจืก ืืื ืงืึธื ืืจืึธื ืกืืกืืขื ืจืืคึผืึทืืึทืืึธืจืื." ืืืขืจืกืืขืก (ืืขืจืฉืืื ืื ื ืืื 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-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 }}',
}
}
ื ืึธื ืงืึทื ืคืืืืขืจืื ื ืื ืกืขืืืื ืืก.py ืืขืงืข ืืื ืื ืคึผืจืืืขืงื ืืื ืืึทืฉืืขืืืงื ืื ืืึทืืึทืืืืก ืงืึทื ืคืืืืขืจืืืฉืึทื, ืืืจ ืงืขื ืขื ืึธื ืืืืื ืื ืึทื ืืืืืงืืื ื ืกืขืจืืืขืจ ืฆื ืืึทืื ืืืืขืจ ืึทื ืึทืืฅ ืึทืจืืขื. ื ืึธื ืกืืึทืจืืื ื ืื ืึทื ืืืืืงืืื ื ืกืขืจืืืขืจ, ืขืก ืืื ืึท ืืืืข ืืขืืึทื ืง ืฆื ืฉืึทืคึฟื ืึท ืึทืืืื ืืกืืจืึทืืึธืจ ืืึทื ืืฆืขืจ ืฆื ืคึผืจืืืืจื ืื ืงืฉืจ ืฆื ืื ืืึทืืึทืืืืก.
./manage.py runserver 0.0.0.0:8000
./manage.py createsuperuser
ืืืกืื? ืืืื?
ืืขืจ ืึทื ืืืืืงืืื ื ืกืขืจืืืขืจ ืืื ื ืืฆืืง ืคึฟืึทืจ ืืขืกืืื ื, ืึธืืขืจ ืฆื ืืืืคื ืื ืึทืคึผืืึทืงืืืฉืึทื ืืืจ ืืืื ืงืึทื ืคืืืืขืจ ืื ืฆืื ืขืืขื ืกืขืจืืืขืจ ืืื ืคึผืจืึทืงืกื ืคึฟืึทืจ ืื ืืืขื ืกืขืจืืืืจืขืจ ืืึทืืขืืืืึท ืฆืืืื ื (WSGI). ืขืก ืืขื ืขื ืขืืืขืืข ืคึผืจืึธืกื ืงืึทืืืึทื ืืืฉืึทื ื, ืืืฉื, Apache HTTPD ืืื uWSGI ืึธืืขืจ Nginx ืืื Gunicorn.
ืื ืึทืจืืขื ืคืื ืื ืืืขื ืกืขืจืืืขืจ ืืึทืืขืืืืึท ืฆืืืื ื ืืื ืฆื ืคืึธืจืืืก ืจืืงืืืขืก ืคืื ืื ืืืขื ืกืขืจืืืขืจ ืฆื ืื ืคึผืืืืึธื ืืืขื ืคืจืืืืืืขืจืง. WSGI ืืื ืึท ืจืขืืืง ืคืื ืื ืฉืจืขืงืืขื ืคืึทืจืืึทื ืืขื ืืืื ืืืขื CGI ืขื ืืืฉืึทื ื ืืขื ืขื ืึทืจืื, ืืื ืืืึทื ื WSGI ืืื ืื ืืข ืคืึทืงืืึธ ื ืึธืจืืึทื, ืจืึทืืึทืจืืืึทืก ืคืื ืื ืืืขื ืกืขืจืืืขืจ ืึธืืขืจ ืคึผืืืืึธื ืคืจืืืืืืขืจืง ืืขืืืืื ื. ืึธืืขืจ ืืจืึธืฅ ืืืึทื ืืืืืืกืคึผืจืขื ื ืืฆื, ืขืก ืืขื ืขื ื ืึธื ืคืืืข ื ืืึทื ืกืื ืืืขื ืืจืืขืื ืืื ืื ืคืจืึทืืขืืืึธืจืงืก, ืืื ืคืืืข ืืจืืจืืช. ืืื ืืขื ืคืึทื, ืืืจ ืืืขืื ืคึผืจืืืืจื ืฆื ืคืึทืจืืืืื ืื ืืขืจืึทืงืฉืึทื ืฆืืืืฉื Gunicorn ืืื Nginx ืืืจื ืึท ืืึธืืขื.
ืืื ื ืืืืืข ืงืึทืืคึผืึธืื ืึทื ืฅ ืืขื ืขื ืืื ืกืืึทืืืจื ืืืืฃ ืื ืืขืืืข ืกืขืจืืืขืจ, ืืึธืื ืืื ืื ืคึผืจืืืืจื ืฆื ื ืืฆื ืึท UNIX ืืึธืืขื ืึทื ืฉืืึธื ืคืื ืึท ื ืขืฅ ืืึธืืขื. ืืื ื ืงืึธืืื ืืงืึทืฆืืข ืจืืงืืืืืขืจื ืึท ืืึธืืขื ืืื ืงืืื ืคืึทื, ืืึธืื ืืื ืื ืคึผืจืืืืจื ืฆื ื ืขืืขื ื ืึธื ืึท ืฉืจืื ืืื ืงืึทื ืคืืืืขืจ ืืึธืืขื ืึทืงืืึทืืืืืฉืึทื ืคึฟืึทืจ ืืื ืืงืึธืจื ืืืจื ืกืืกืืขื.
ืืขืจ ืคึผืจืึธืฆืขืก ืคืื ืงืจืืืืืื ื ืืึธืืขื ืึทืงืืืืืืืืื ืืึทืืื ืื ืืก ืืื ืืึทื ืฅ ืคึผืฉืื. ืขืจืฉืืขืจ, ืึท ืึทืคึผืึทืจืึทื ืืขืงืข ืืื ืืืฉืืคื ืืืึธืก ืึผืืื ืึท ListenStream ืืืจืขืงืืืื ืืืืืื ืฆื ืื ืคืื ื ืืื ืืืึธืก ืื UNIX ืืึธืืขื ืืืขื ืืืื ืืืฉืืคื, ืืขืจื ืึธื ืึท ืึทืคึผืึทืจืึทื ืืขืงืข ืคึฟืึทืจ ืื ืกืขืจืืืืก ืืื ืืืึธืก ืื ืจืขืงืืืืจืขืก ืืืจืขืงืืืื ืืืขื ืคืื ื ืฆื ืื ืืึธืืขื ืึทืคึผืึทืจืึทื ืืขืงืข. ืืขืจื ืึธื, ืืื ืื ืกืขืจืืืืก ืึทืคึผืึทืจืึทื ืืขืงืข, ืึทืืข ืืืึธืก ืืืืืื ืืื ืฆื ืจืืคื Gunicorn ืคึฟืื ืื ืืืืจืืืึทื ืกืืืืืืข ืืื ืฉืึทืคึฟื ืึท WSGI ืืืื ืืื ื ืคึฟืึทืจ ืื UNIX ืืึธืืขื ืืื ืื Django ืึทืคึผืืึทืงืืืฉืึทื.
ืืึธ ืืขื ืขื ืขืืืขืืข ืืืืฉืคืืื ืคืื ืึทืคึผืึทืจืึทื ืืขืงืขืก ืึทื ืืืจ ืงืขื ืขื ื ืืฆื ืืื ืึท ืืงืขืจ. ืขืจืฉืืขืจ ืืืจ ืฉืืขืื ืึทืจืืืฃ ืื ืืึธืืขื.
[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_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 ื ืืฆื ืกืืกืืขื ืืื ืืืจ ืืขื ื ืืจืืื ืฆื ืึธื ืืืืื ืืขืกืืื ื.
ืฉืืขืื ืืืืืืืื ืืขืืช?
ืืืื ืืืจ ืึทืจืืึทื ืื ืึทืืจืขืก ืืื ืืืื ืืืขืืขืจืขืจ, โโืืืจ ืืืขื ืืืกืืึธืืข ืืึทืงืืืขื ืึท 502 Bad Gateway ืืขืืช. ืขืก ืงืขื ืืืื ืืขืคึฟืืจื ืืืจื ืื ืงืขืจืขืงืืื ืงืึทื ืคืืืืขืจื UNIX ืืึธืืขื ืคึผืขืจืืืฉืึทื ื, ืึธืืขืจ ืขืก ืงืขื ืืืื ืจืขืื ืฆื ืืขืจ ืงืึธืืคึผืืืฆืืจื ืืฉืื ืฉืืึทืืืช ืฆื ืึทืงืกืขืก ืงืึธื ืืจืึธื ืืื SELinux.
ืืื ืื nginx ืืขืืช ืงืืึธืฅ ืืืจ ืงืขื ืขื ืืขื ืึท ืฉืืจื ืืื ืืึธืก:
2018/12/18 15:38:03 [crit] 12734#0: *3 connect() to unix:/run/gunicorn.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.122.1, server: 8beta1.example.com, request: "GET / HTTP/1.1", upstream: "http://unix:/run/gunicorn.sock:/", host: "8beta1.example.com"
ืืืื ืืืจ ืคึผืจืืืืจื ืืื ืืงืึธืจื ืืืืึทื, ืืืจ ืืืขืื ืืึทืงืืืขื ืึท ืืืืืืง ืขื ืืคืขืจ.
curl โunix-socket /run/gunicorn.sock 8beta1.example.com
ืืื ืก ืจืขืืขื ืขื ืืืืก ืืืึธืก ืืึธืก ืืึทืคึผืึทื ื. ืืืื ืืืจ ืขืคึฟืขื ืขื ืืขื ืงืืึธืฅ, ืืืจ ืืืขื ืจืืึฟ ืืกืชึผืื ืืขื ืึทื ืื ืคึผืจืึธืืืขื ืืื ืฉืืึทืืืช ืฆื SELinux. ืืื ื ืืืจ ืืืืคื ืึท ืืืืืึทื ืคึฟืึทืจ ืืืึธืก ืงืืื ืคึผืึธืืืืืง ืืื ืืืฉืืคื, ืขืก ืืื ืื ืืขืฆืืืื ื ืืื init_t. ืืื ืก ืคึผืจืืืืจื ืืขื ืืขืึธืจืืข ืืื ืคืืจ.
sudo setenforce 0
ืึทืืข ืืขื ืงืขื ืคืึทืจืฉืึทืคื ืงืจืืืืง ืืื ืืจืขืจื ืคืื ืืืื, ืึธืืขืจ ืืึธืก ืืื ื ืึธืจ ืืืืึทืืื ื ืื ืคึผืจืึธืืืึทืืืืคึผ. ืืึธืืืจ ืืืกืืืืึทื ืื ืืฉืขืง ื ืึธืจ ืฆื ืืึทืื ืืืืขืจ ืึทื ืืึธืก ืืื ืืขืจ ืคึผืจืึธืืืขื, ื ืึธื ืืืึธืก ืืืจ ืืืขืื ืฆืืจืืงืงืืืขื ืึทืืฅ ืฆืืจืืง ืฆื ืืืื ืึธืจื.
ืืืจื ืจืขืคืจืขืฉืื ื ืืขื ืืืึทื ืืื ืืขื ืืืขืืขืจืขืจ ืึธืืขืจ ืจืืจืึทื ืื ื ืืื ืืืขืจ ืงืขืจื ืืึทืคึฟืขื, ืืืจ ืงืขื ืขื ืืขื ืื Django ืคึผืจืืืืจื ืืืึทื.
ืึทืืื, ืืืจ ืืึทืื ืืืืขืจ ืึทื ืึทืืฅ ืึทืจืืขื ืืื ืขืก ืืขื ืขื ืงืืื ืืขืจืืืืืขื ืืฉ ืคึผืจืึธืืืขืืก, ืืืจ ืืขืื SELinux ืืืืืขืจ.
sudo setenforce 1
ืืื ืืืขื ื ืืฉื ืจืขืื ืืืขืื Audit2allow ืึธืืขืจ ืงืจืืืืืื ื ืคืืื ืง-ืืืืืจื ืคึผืึทืืึทืกืื ืืื ืกืขืคึผืึธืืืขื ืืึธ, ืืืืึทื ืขืก ืืื ืงืืื ืคืึทืงืืืฉ Django ืึทืคึผืืึทืงืืืฉืึทื ืืื ืืขื ืืึธืืขื ื, ืึทืืื ืขืก ืืื ืงืืื ืืึทื ืฅ ืืึทืคึผืข ืคืื โโืืืึธืก Gunicorn ืืื ืืืขืื ืฆื ืึทืงืกืขืก ืืื ืืืึธืก ืขืก ืืึธื ืืืืงืขื ืขื ืึทืงืกืขืก ืฆื. ืืขืจืืืขืจ, ืขืก ืืื ื ืืืืืง ืฆื ืืึทืืื SELinux ืคืืืกื ืืืง ืฆื ืืึทืฉืืฆื ืื ืกืืกืืขื, ืืื ืืื ืืขืจ ืืขืืืืงืขืจ ืฆืืื ืืึธืื ืื ืึทืคึผืืึทืงืืืฉืึทื ืืืืคื ืืื ืืึธืื ืึทืจืืืงืืขื ืืื ืื ืงืึธื ืืจืึธืืืจื ืงืืึธืฅ ืึทืืื ืึทื ืื ืคืึทืงืืืฉ ืคึผืึธืืืืืง ืงืขื ืขื ืืืื ืืืฉืืคื ืคึฟืื ืืื.
ืกืคึผืขืฆืืคืืฆืืจื ืคึผืขืจืืืกืืื ืืึธืืืืื ื
ื ืื ืึทืืขืืขื ืืื ืืขืืขืจื ืคืื ืขืจืืืืื ืืึธืืืืื ื ืืื SELinux, ืึธืืขืจ ืืื ืืขื ืขื ืืึธืจื ืืฉื ื ืืึท. ืคืืืข ืืคืืื ืืขืืจืืขื ืืื ืืื ืึธื ืืคืืื ืจืืึทืืืืืื ื ืขืก. ืืืขื ืึท ืคึผืึธืืืืืง ืืื ืืืฉืืคื ืืืืืจื ืืืืฃ ืงืึธื ืืจืึธืืืจื ืึทืจืืืงืืขื, ืื ืืืฉืืคื ืคึผืึธืืืืืง ืจืขืคึผืจืึทืืขื ืฅ ืื ืจืืืึทืืืื ืคืขืื. ืืื ืก ืคึผืจืืืืจื ืฆื ืฉืึทืคึฟื ืึท ืคึผืฉืื ืคึผืขืจืืืืื ื ืคึผืึธืืืืืง.
ืฆื ืฉืึทืคึฟื ืึท ืกืคึผืขืฆืืคืืฉ ืขืจืืืืื ืคืขืื ืคึฟืึทืจ ืืื ืืงืึธืจื, ืืืจ ืืึทืจืคึฟื ืึท ืืื ืคืื ืคึผืึธืืืืืง, ืืื ืืืจ ืืืื ืืึทืจืคึฟื ืฆื ืฆืืืื ืื ืฆืื ืขืืขื ืืขืงืขืก. ืืื ืืขืจืฆื, ืืืฉืืจืื ืืขื ืขื ืืืจืฃ ืฆื ืึทืกืขืืืึทื ื ืืึทืข ืคึผืึทืืึทืกืื.
sudo yum install selinux-policy-devel
ืืขืจ ืืขืจืืืืื ืืึธืืืืื ื ืืขืงืึทื ืืืึทื ืืื ืึท ืืจืืืก ืืขืฆืืึทื ืฆื ืืืขื ืืืคืืฆืืจื ืคึผืจืึธืืืขืืก, ืกืคึผืขืฆืืขื ืืืขื ืขืก ืงืืื ืฆื ืึท ืื ืื ืึทืคึผืืึทืงืืืฉืึทื ืึธืืขืจ ืึทืคึผืืึทืงืืืฉืึทื ื ืืืึธืก ืฉืืงื ืึธื ืคึผืึทืืึทืกืื ืฉืืื ืืืฉืืคื. ืืื ืืขื ืคืึทื, ืื ืขืจืืืืื ืคืขืื ืคึผืึธืืืืืง ืคึฟืึทืจ ืืื ืืงืึธืจื ืืืขื ืืืื ืืื ืคึผืฉืื ืืื ืืขืืืขื - ืืขืจืงืืขืจื ืึท ืืืืคึผื ืืืคึผ (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
ืืืื ืืืจ ืงืืง ืืื ืื ืกืืึทืืืก ืคืื ืื ืืื ืืงืึธืจื ืกืขืจืืืืก ืึธืืขืจ ืืืืคื ืื ps ืืึทืคึฟืขื, ืืืจ ืืืขื ื ืืฉื ืืขื ืงืืื ืคืืืกื ืืืง ืคึผืจืึทืกืขืกืึทื. ืขืก ืงืืงื ืืื ืืื ืืงืึธืจื ืืื ืืจืืื ื ืฆื ืึทืงืกืขืก ืื ืคึผืืืืึธื ืืืขืจืืขืฆืขืจ ืืื ืืื ืืืขืจ ืืืืจืืืึทื ืื ืืืืืจืึทื ืืขื ืึทื ืกืืืืืืข, ืขืคืฉืขืจ ืฆื ืืืืคื ืึทืจืืขื ืกืงืจืืคึผืก. ืืืฆื ืืึธืื ืืื ืื ืฆืืืื ืื ืฆืืืื ืขืงืกืขืงืืืึทืืืข ืืขืงืขืก ืืื ืืฉืขืง ืืืื ืืืจ ืงืขื ืขื ืขืคึฟืขื ืขื ืืื ืืืขืจ Django ืคึผืจืืืืจื ืืืึทื.
chcon -t gunicorn_exec_t /srv/djangoapp/django/bin/gunicorn /srv/djangoapp/django/bin/python3.6
ืื ืืื ืืงืึธืจื ืืื ืกื ืืืขื ืืืื ืจืืกืืึทืจืืื ืืืืืขืจ ืื ื ืืึทืข ืงืืืืื ืงืขื ืขื ืืืื ืืืืกืืขืงืืืื. ืืืจ ืงืขื ืขื ืจืืกืืึทืจื ืขืก ืืื ืึธืืขืจ ืืึทืืื ืื ืืื ืกื ืืื ืืึธืื ืื ืืึธืืขื ืึธื ืืืืื ืขืก ืืืขื ืืืจ ืขืคึฟืขื ืขื ืืขื ืคึผืืึทืฅ ืืื ืืขื ืืืขืืขืจืขืจ. ืืึทืฉืืขืืืงื ืึทื ืคึผืจืึทืกืขืกืึทื ืืึธืื ืืืงืืืขื ืื ืจืืืืืง ืืึทืืขืืก ื ืืฆื ืคึผืก.
ps -efZ | grep gunicorn
ืื ืืืืกื ื ืืฉื ืคืึทืจืืขืกื ืฆื ืฉืึทืคึฟื ืึท ื ืึธืจืืึทื SELinux ืคึผืึธืืืืืง ืฉืคึผืขืืขืจ!
ืืืื ืืืจ ืงืืง ืืื ืื AVC ืึทืจืืืงืืขื ืืืฆื, ืื ืืขืฆืืข ืึธื ืืึธื ืึผืืื ืคึผืขืจืืืกืืื=1 ืคึฟืึทืจ ืึทืืฅ ืฉืืึทืืืช ืฆื ืื ืึทืคึผืืึทืงืืืฉืึทื, ืืื ืคึผืขืจืืืกืืื=0 ืคึฟืึทืจ ืื ืจืขืฉื ืคืื ืื ืกืืกืืขื. ืืืื ืืืจ ืคึฟืึทืจืฉืืืื ืืืึธืก ืืื ืคืื ืึทืงืกืขืก ืึท ืคืึทืงืืืฉ ืึทืคึผืืึทืงืืืฉืึทื ืืึทืจืฃ, ืืืจ ืงืขื ืขื ืืขืฉืืืื ื ืืขืคึฟืื ืขื ืื ืืขืกืืขืจ ืืืขื ืฆื ืกืึธืืืืข ืึทืืึท ืคึผืจืึธืืืขืืก. ืึธืืขืจ ืืื ืืขืืึธืื, ืขืก ืืื ืืขืกืืขืจ ืฆื ืืึทืืื ืื ืกืืกืืขื ืืืืขืจ ืืื ืืึทืงืืืขื ืึท ืงืืึธืจ, ื ืืฆืืขื ืงืึธื ืืจืึธืืืจื ืคืื ืื Django ืคึผืจืืืขืงื.
sudo ausearch -m AVC
ืืขืืจืืคื!
ื ืืจืืขืื Django ืคึผืจืืืขืงื ืืื ืืจืืืก ืืื ืึท ืคืจืึธื ืืขื ื ืืืืืจื ืืืืฃ Nginx ืืื Gunicorn WSGI. ืืืจ ืงืึทื ืคืืืืขืจื Python 3 ืืื PostgreSQL 10 ืคึฟืื ืื RHEL 8 ืืืชื ืจืืคึผืึทืืึทืืึธืจืื. ืืืฆื ืืืจ ืงืขื ืขื ืคืึธืจืืืก ืืื ืฉืึทืคึฟื (ืึธืืขืจ ืคืฉืื ืฆืขืืืืงืืขื) Django ืึทืคึผืืึทืงืืืฉืึทื ื ืึธืืขืจ ืืืกืคืึธืจืฉื ืื ืืขืจืข ืื ืืืฆื ืืืฉืืจืื ืืื RHEL 8 ืืืชื ืฆื ืึธืืึทืืืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืคึผืจืึธืฆืขืก, ืคึฟืึทืจืืขืกืขืจื ืคืึธืจืฉืืขืืื ื ืึธืืขืจ ืืคืืื ืงืึทื ืืึทืืึทื ืืื ืืขื ืงืึทื ืคืืืืขืจืืืฉืึทื.
ืืงืืจ: www.habr.com