RHEL 8 Beta แกแแแแแแแแก แแแแแแแแแ แแแก แแแแ แแฎแแ แคแฃแแฅแชแแแก, แ แแแแแแ แฉแแแแแแแแแแก แจแแแซแแแแ แแแกแญแแ แแแก แแแแ แแแแ, แแฃแแชแ แแฎแแแก แกแฌแแแแ แงแแแแแแแแก แฃแแแแแกแแ แแ แแฅแขแแแแจแ, แแแแขแแ แฅแแแแแ แแแแแแแแแ แกแแแแแแ แก Red Hat Enterprise Linux 8 Beta-แแ แแแคแฃแซแแแแฃแแ แแแแแแแชแแแก แแแคแ แแกแขแ แฃแฅแขแฃแ แแก แ แแแแฃแ แแ แจแแฅแแแแก แจแแกแแฎแแ.
แแแแแ แแแแฆแแ Python, แแแแฃแแแ แฃแแ แแ แแแ แแแแ แแแแก แแแ แแแแแแแแแ แแแก แจแแ แแก, แ แแแแ แช แกแแคแฃแซแแแแ, Django-แกแ แแ PostgreSQL-แแก แแแแแแแแชแแ, แกแแแแแแ แแแแ แชแแแแแฃแแ แแแแแแแแชแแ แแแแแแแชแแแแแก แจแแกแแฅแแแแแแ, แแ แแแแแแแแคแแแฃแ แแ แแ RHEL 8 Beta แแแแแแ แแฃแจแแแแแกแแแแก. แจแแแแแ แฉแแแ แแแแแแแขแแแ แแแแแ แ แแแแแแแแ (แแ แแแแแกแแคแแชแแ แแแฃแ) แแแแ แแแแแแขแก.
แกแแขแแกแขแ แแแ แแแ แจแแแชแแแแแ, แ แแแแแ แกแแแแขแแ แแกแแ แแแขแแแแขแแแแชแแแก แจแแกแแซแแแแแแแแแแก แจแแกแฌแแแแ, แแแแขแแแแแ แแแแแ แแฃแจแแแแแกแ แแ แแ แแแแแ แกแแ แแแ แแก แแฅแแแ แแแ แแแแก แชแแแก แจแแกแแฎแแ. แแฎแแแ แแ แแแฅแขแแก แแแกแแฌแงแแแแ, แจแแแแซแแแแ แแแแฌแงแแ แแแขแแ แ, แแแ แขแแแ แแ แแขแแขแแแแก แฎแแแแ แจแแฅแแแแ, แ แแแ แแแฎแแ แแฃแกแขแแ แ แ แฃแแแ แแแฎแแแก แแ แ แแแแ แฃแ แแแแ แแฅแแแแแแก แแก, แจแแแแแ แแ แแแแแฎแแแแแ แแแขแแแแขแแแแชแแแแ แแ แจแแฅแแแแ แฃแคแ แ แ แแฃแแ แแแแคแแแฃแ แแชแแแแ. แแฆแแก แฉแแแ แแกแแฃแแ แแแ แแกแแแ แแ แแขแแขแแแแก แจแแฅแแแแแ.
แแแแแฌแงแแ RHEL 8 Beta VM แกแฃแ แแแแก แแแแแแแแแแ. แแฅแแแ แจแแแแซแแแแ แแแแแแกแขแแแแ แแ แแแ แขแฃแแแฃแ แ แแแแฅแแแ แแฃแแแแแ, แแ แแแแแแงแแแแ KVM แกแขแฃแแ แแก แกแฃแ แแแ, แ แแแแแแช แฎแแแแแกแแฌแแแแแแ แแฅแแแแ Beta แแแแแฌแแ แแ. แกแขแฃแแ แแก แแแแแกแแฎแฃแแแแแก แแแแแงแแแแแแกแแก, แแฅแแแ แฃแแแ แแแแแแแคแแแฃแ แแ แแ แแแ แขแฃแแแฃแ แ CD, แ แแแแแแช แจแแแชแแแก แแแขแแแแแแชแแแแแก แแ แแแแฎแแแ แแแแแก แแแแแชแแแแแก แฆแ แฃแแแแก แแแแชแแแแแแแชแแแกแแแแก (cloud-init). แแฅแแแ แแ แแญแแ แแแแแ แ แแแแ แแแแกแแแฃแแ แแแฃแแแก แแแแแแแแ แแแกแแแก แกแขแ แฃแฅแขแฃแ แแกแแแ แแ แฎแแแแแกแแฌแแแแ แแแแแขแแแแแ; แแแแแกแแแแ แ แแแแคแแแฃแ แแชแแ แแกแ แแฅแแแแ.
แแแแแ แฃแคแ แ แแฎแแแก แแแแฎแแแแ แแแแ แแ แแชแแกแก.
แฏแแแแแก แแแกแขแแแแชแแ
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 แกแแกแขแแแ แแแแแแแแ แแฎแแ แแแแแขแจแ แแ แฃแแ แฃแแแแแงแ แแแแแแแก 2.7 แแ 3.6 แแแกแขแแแแชแแแก แจแแกแแซแแแแแแแ. แแแแแขแแแแแ แแแคแแ แแแชแแ แชแแแแแแแแแแกแ แแ แแแแ แแแแฎแแ แชแแแแแแแก แแแแแแแแแก แจแแกแแฎแแ แจแแแแซแแแแ แแฎแแแแ แแฃแแแแแแชแแแจแ
แแกแ แ แแ, แกแแแฃแจแแ Python-แแก แแแกแแฆแแแแ แกแแญแแ แแ แแฎแแแแ แแ แ แแแแแขแแก แแแกแขแแแแชแแ, python3-pip-แแ แแแแแแแแแแฃแแแแแก แกแแฎแแ.
sudo yum install python36 python3-virtualenv
แ แแขแแ แแ แแแแแแงแแแแ แแแ แแแแแ แ แแแแฃแแแก แแแ แแแ, แ แแแแ แช แแแแแแแแ แแแแแแแแแแก แแ แแแแแแกแขแแแแ แแ pip3? แแแแแแแแ แแแขแแแแขแแแแชแแแก แแแแแแแแกแฌแแแแแแ, แชแแแแแแแ, แ แแ Ansible-แก แแแกแญแแ แแแแ แแแแแก แแแงแแแแแ แแแกแแจแแแแแ, แ แแแแแ แแแ แแแแฃแแ แแ แฃแญแแ แก แแฎแแ แก virtualenv-แแแก แแแ แกแแแแแฃแ แ แแแ-แจแแแกแ แฃแแแแแแ แคแแแแแ.
แแฅแแแแก แแแแแแ แแฃแแแแแจแ แแแฅแแแแ python3 แแแ แฏแแแแแแ, แจแแแแซแแแแ แแแแแ แซแแแแ Django-แก แแแกแขแแแแชแแแก แแ แแชแแกแ แแ แแฅแแแแแ แกแแแฃแจแแ แกแแกแขแแแ แฉแแแแก แกแฎแแ แแแแแแแแแขแแแแแ แแ แแแ. แแแแฎแแ แชแแแแแแแก แแ แแแแแ แแแ แแแแขแ แแ แกแแแแแก แแแขแแ แแแขแจแ. แแฅ แแ แแก แแ แแ แแแ แกแแ แฌแแ แแแแแแแแแ, แแแแ แแ แแแแฎแแแ แแแแแแก แจแแฃแซแแแแ แแแแแแงแแแแ แกแแแฃแแแ แ แแ แแชแแกแแแ.
แฉแแแ แแแแแแแกแขแแแแ แแแ PostgreSQL แแ Nginx แแแ แกแแแแก, แ แแแแแแแช แฎแแแแแกแแฌแแแแแแ RHEL 8-แจแ แแแแฃแแแกแฎแแแแแ Yum-แแก แแแแแงแแแแแแ.
sudo yum install nginx postgresql-server
PostgreSQL แแแกแญแแ แแแแ psycopg2, แแแแ แแ แแก แฎแแแแแกแแฌแแแแแ แฃแแแ แแงแแก แแฎแแแแ virtualenv แแแ แแแแจแ, แแแแขแแ แฉแแแ แแแแแแแกแขแแแแ แแแ pip3-แแก แแแแแงแแแแแแ Django-แกแ แแ Gunicorn-แแแ แแ แแแ. แแแแ แแ แฏแแ แฉแแแ แฃแแแ แแแแแงแแแแ virtualenv.
แงแแแแแแแแก แแ แแก แแแแ แ แแแแแแ Django แแ แแแฅแขแแแแก แแแกแแงแแแแแแแ แจแแกแแคแแ แแกแ แแแแแแแก แแ แฉแแแแก แแแแแแ, แแแแ แแ แ แแแแกแแช แแญแแ แแแแแ แแแแ, แงแแแแแแแแก แจแแแแซแแแแ แแแแแ แแแ Linux แคแแแแฃแ แ แกแแกแขแแแแก แแแ แแ แฅแแแก แกแขแแแแแ แขแก. แแแแแ แแขแฃแแแ, 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-แกแแ แแแ แแก แแแแแขแแแ แแ แแแ. แแก แกแแ แแแขแ แแแแแฎแแแ แแแแ แจแแแกแ แฃแแแ แซแแ แแแแแ แแแแชแแแแแ, แ แแแแแแแช แแแแแแจแแ แแแฃแแแ แแแแแชแแแแ แแแแแก แแแแกแขแแ แแก แแแแแแแกแขแ แแ แแแแกแแแ, แ แแแแ แแชแแ แแแแกแขแแ แแก แแแแชแแแแแแแชแแ แแ แแแแแฎแแแแแก แแ แแชแแกแ. แแฎแแแ 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? แแแ?
แแแแแแแแ แแแแก แกแแ แแแ แ แกแแกแแ แแแแแแ แขแแกแขแแ แแแแกแแแแก, แแแแ แแ แแแแแแแชแแแก แแแกแแจแแแแแ แแฅแแแ แฃแแแ แแแแแแแคแแแฃแ แแ แแ แจแแกแแแแแแกแ แกแแ แแแ แ แแ แแ แแฅแกแ แแแ แกแแ แแแ แแก แแแ แแแญแแก แแแขแแ แคแแแกแแกแแแแก (WSGI). แแ แกแแแแแก แ แแแแแแแแ แกแแแ แแ แแแแแแแแชแแ, แแแแแแแแแ, Apache HTTPD uWSGI-แแ แแ Nginx Gunicorn-แแ.
แแแ แกแแ แแแ แแก แแแ แแแญแแก แแแขแแ แคแแแกแแก แแแแชแแแแ แแแ แกแแ แแแ แแแแ แแแแฎแแแแแแแก แแแแแแแแแแ Python แแแ แฉแแ แฉแแจแ. WSGI แแ แแก แกแแจแแแแแ แฌแแ แกแฃแแแก แ แแแแฅแแแ, แ แแแแกแแช CGI แซแ แแแแแ แแ แกแแแแแแ แแ แแฆแแก WSGI แแ แแก แแ แคแแฅแขแ แกแขแแแแแ แขแ, แแแฃแฎแแแแแแ แแแแแงแแแแแฃแแ แแแ แกแแ แแแ แแกแ แแฃ Python แฉแแ แฉแแกแ. แแแแ แแ แแแฃแฎแแแแแแ แแแกแ แคแแ แแ แแแแแงแแแแแแกแ, แฏแแ แแแแแ แแแแ แ แแแฃแแแกแแ แแ แฉแแ แฉแแแแแแ แแฃแจแแแแแกแแก แแ แแแแ แ แแ แฉแแแแแ. แแ แจแแแแฎแแแแแจแ, แฉแแแ แจแแแแชแแแแแ แแแแแแงแแ แแ แฃแ แแแแ แแฅแแแแแแ Gunicorn-แกแ แแ Nginx-แก แจแแ แแก แกแแแแขแแก แกแแจแฃแแแแแแ.
แแแแแแแแ แแ แแแ แแแแแแแแแขแ แแแแแกแขแแแแ แแแฃแแแ แแ แ แกแแ แแแ แแ, แแแแแ แแชแแแแ UNIX แกแแแแขแแก แแแแแงแแแแแ แฅแกแแแแก แกแแแแขแแก แแแชแแแแ. แแแแแแแแ แแแแฃแแแแแชแแ แแแแแกแแแแ แจแแแแฎแแแแแจแ แแแแแฎแแแก แกแแแแขแก, แแแแแ แแชแแแแ แแแแแ แแ แแ แแแแแฏแแก แแแแแแแแ แแ Gunicorn-แแกแแแแก แกแแแแขแแก แแฅแขแแแแชแแแก แแแแคแแแฃแ แแชแแ systemd-แแก แกแแจแฃแแแแแแ.
แกแแแแขแแก แแแแฅแขแแฃแ แแแฃแแ แกแแ แแแกแแแแก แจแแฅแแแแก แแ แแชแแกแ แกแแแแแแ แแแ แขแแแแ. แฏแแ แแฅแแแแแ แแ แแแฃแแ แคแแแแ, แ แแแแแแช แจแแแชแแแก ListenStream แแแ แแฅแขแแแแก, แ แแแแแแช แแแฃแแแแแแก แแ แฌแแ แขแแแแ, แกแแแแช แจแแแฅแแแแแ UNIX แกแแแแขแ, แจแแแแแ แแ แแแฃแแ แคแแแแ แกแแ แแแกแแกแแแแก, แ แแแแแจแแช Requires แแแ แแฅแขแแแ แแแฃแแแแแแก แกแแแแขแแก แแ แแแฃแแแก แคแแแแแ. แจแแแแแ, แกแแ แแแกแแก แแ แแแฃแแแก แคแแแแจแ, แ แฉแแแ แแฎแแแแ 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 แจแแชแแแแแก. แแก แจแแแซแแแแ แแแแแฌแแแฃแแ แแงแแก แแ แแกแฌแแ แแ แแแแคแแแฃแ แแ แแแฃแแ 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-แแ, แ แแแแแ แแ แแแแแแขแจแ แแ แแ แกแแแแแก 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-แก แแแแแชแแแแแแก แฉแแฌแแ แแจแ 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 แแ แซแแแแแ, แแแ แแแฎแแแ แ แแแแ แแแจแแแแฃแ แแ แแชแแกแก. แ แแแแ แช แฉแแแก, แแฃแแแแแ แแ แชแแแแแแก แแแแแแแก แแแ แฏแแแแแแ แฌแแแแแแก แฉแแแแก virtualenv แแแ แแแแจแ, แจแแกแแซแแแ แแฃแจแ แกแแ แแแขแแแแก แแแกแแจแแแแแ. แแฎแแ แแแแแ แแฆแแแแจแแแ แแก แแ แ แจแแกแ แฃแแแแแแ แคแแแแ แแ แจแแแแแแฌแแแ, แจแแแแแซแแแ แแฃ แแ แ แฉแแแแ Django แขแแกแขแแก แแแแ แแแก แแแฎแกแแ.
chcon -t gunicorn_exec_t /srv/djangoapp/django/bin/gunicorn /srv/djangoapp/django/bin/python3.6
Gunicorn แกแแ แแแกแแก แแแแแขแแแ แแแ แกแแญแแ แ แแฅแแแแ แแฎแแแ แขแแแแก แแ แฉแแแแแแ. แจแแแแซแแแแ แแแฃแงแแแแแแแแ แแแแแขแแแ แแแ แแแ แแ แจแแฌแงแแแขแแ แกแแ แแแกแ แแ แแแกแชแแ แกแแแแขแก แแแกแ แแแจแแแแ, แ แแแแกแแช แกแแแขแก แแ แแฃแแแ แจแ แแแฎแกแแแ. แจแแแแแฌแแแ, แ แแ แแ แแชแแกแแแแ แแแแฆแ แกแฌแแ แ แแขแแแแขแแแ 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 แแแขแ แกแแชแแแแแแแแ. แแฎแแ แแฅแแแ แจแแแแซแแแแ แฌแแ แฌแแฎแแแแแ แแ แจแแฅแแแแ (แแ แฃแแ แแแแ แแแแแแแแกแแ) Django แแแแแแแชแแแแ แแ แจแแแกแฌแแแแแ แกแฎแแ แฎแแแแแกแแฌแแแแแ แแแกแขแ แฃแแแแขแแแ RHEL 8 Beta-แจแ แแแแคแแแฃแ แแชแแแก แแ แแชแแกแแก แแแขแแแแขแแแแชแแแกแแแแก, แแฃแจแแแแแก แแแกแแฃแแฏแแแแกแแแแแ แแ แแฃแแแแช แแ แแแแคแแแฃแ แแชแแแก แแแแขแแแแแ แแ.
แฌแงแแ แ: www.habr.com