Ko te RHEL 8 Beta he maha nga waahanga hou e tuku ana ki nga kaiwhakawhanake, ko te raarangi ka taea te tango i nga wharangi, heoi, he pai ake te ako i nga mea hou i roto i nga mahi, na kei raro nei ka tukuna he awheawhe mo te hanga i tetahi hanganga tono i runga i te Red Hat Enterprise Linux 8 Beta.
Me tango e tatou a Python, he reo whakahiato rongonui i waenga i nga kaiwhakawhanake, hei turanga, he huinga o Django me PostgreSQL, he huinga tino noa mo te hanga tono, me te whirihora i te RHEL 8 Beta hei mahi tahi me ratou. Na ka taapirihia e matou etahi atu kai (kaore ano kia wehewehea).
Ka huri te taiao whakamatautau, na te mea he pai ki te torotoro i nga huarahi o te mahi aunoa, te mahi me nga ipu me nga taiao whakamatautau me nga kaitoro maha. Hei timata i tetahi kaupapa hou, ka taea e koe te timata ma te hanga i tetahi tauira iti, ngawari ma te ringaringa kia kite koe i nga mea e tika ana kia tupu me te pehea o te taunekeneke, katahi ka neke ki te mahi aunoa me te hanga whirihoranga uaua ake. I tenei ra e korero ana matou mo te hanganga o taua tauira.
Me timata ma te tuku i te ahua RHEL 8 Beta VM. Ka taea e koe te whakauru i tetahi miihini mariko mai i te wahanga, te whakamahi ranei i te ahua manuhiri KVM e waatea ana me to ohaurunga Beta. Ina whakamahi pikitia manuhiri, me whirihora e koe he CD mariko ka mau metadata me nga raraunga kaiwhakamahi mo te arawhitinga kapua (cloud-init). Kare koe e hiahia ki te mahi i tetahi mea motuhake ki te hanganga kōpae me nga kohinga e waatea ana; ka taea e koe te whirihoranga.
Kia ata titiro tatou ki te mahi katoa.
Tāuta Django
Ma te putanga hou o Django, ka hiahia koe ki te taiao mariko (virtualenv) me te Python 3.5 ranei i muri mai. I roto i nga tuhipoka Beta ka kite koe kei te waatea a Python 3.6, me tirotiro mena koinei te take:
[cloud-user@8beta1 ~]$ python
-bash: python: command not found
[cloud-user@8beta1 ~]$ python3
-bash: python3: command not found
Kei te kaha te whakamahi a Red Hat i te Python hei kete taputapu i roto i te RHEL, na te aha i puta ai tenei?
Ko te meka he maha nga kaiwhakawhanake Python e whakaaro tonu ana ki te whakawhiti mai i te Python 2 ki te Python 2, ko te Python 3 ano kei raro i te whakawhanaketanga kaha, me te maha atu o nga putanga hou kei te puta tonu. Na reira, ki te whakatutuki i te hiahia mo nga taputapu punaha pumau i te wa e tuku ana nga kaiwhakamahi ki te uru ki nga momo momo putanga hou o Python, i nukuhia te punaha Python ki roto i tetahi kete hou me te whai waahi ki te whakauru i te Python 2.7 me te 3.6. Ka kitea etahi atu korero mo nga huringa me te take i mahia ai i roto i te whakaputanga i
Na, ki te mahi Python, me whakauru noa e koe nga kete e rua, me te python3-pip kua whakauruhia hei whakawhirinakitanga.
sudo yum install python36 python3-virtualenv
He aha te take e kore ai e whakamahi i nga waea waea tika i te whakaaro a Langdon me te whakauru i te pip3? Ma te maumahara ki te mahi aunoatanga e haere ake nei, e mohio ana ka hiahia a Ansible ki te whakauru i te pip ki te whakahaere, na te mea kaore te pip e tautoko i nga virtualenvs me te pip ritenga ka taea te whakahaere.
Ma te kaiwhakamaori python3 kei a koe, ka taea e koe te haere tonu ki te whakaurunga Django me te whai punaha mahi me etahi atu waahanga. He maha nga waahanga whakatinanatanga kei runga i te Ipurangi. Kotahi te putanga kua whakaatuhia ki konei, engari ka taea e nga kaiwhakamahi te whakamahi i a raatau ake mahi.
Ka whakauruhia e matou nga putanga PostgreSQL me Nginx e waatea ana i RHEL 8 ma te taunoa ma te whakamahi i te Yum.
sudo yum install nginx postgresql-server
Ka hiahiatia e PostgreSQL te psycopg2, engari me waatea noa i roto i te taiao mariko, no reira ka whakauruhia e matou ma te whakamahi i te pip3 me Django me Gunicorn. Engari ko te tuatahi me whakarite maatau virtualenv.
He maha tonu nga tautohetohe mo te kaupapa mo te whiriwhiri i te waahi tika ki te whakauru i nga kaupapa Django, engari i te wa e ruarua ana, ka taea e koe te huri ki te Linux Filesystem Hierarchy Standard. E ai ki te FHS, ka whakamahia te /srv ki: "whakaahua i nga raraunga kaihautu-motuhake - nga raraunga ka whakaputahia e te punaha, penei i nga raraunga tūmau tukutuku me nga tuhinga tuhi, nga raraunga kei runga i nga tūmau FTP, me te whakahaere i nga putunga punaha." putanga (ka puta i te FHS -2.3 i te tau 2004).
Koinei tonu ta matou keehi, no reira ka tukuna e matou nga mea katoa e hiahiatia ana e matou ki roto / srv, na ta matou kaiwhakamahi tono (kaiwhakamahi kapua).
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
He ngawari te whakatu i te PostgreSQL me te Django: hanga he papaa raraunga, hanga he kaiwhakamahi, whirihora whakaaetanga. Ko tetahi mea hei maumahara i te wa e whakauru ana i te PostgreSQL i te tuatahi ko te tuhinga whakatuu-postgresql kua whakauruhia ki te kete pou-tūmau-postgresql. Ka awhina tenei hōtuhi ki a koe ki te mahi i nga mahi taketake e pa ana ki te whakahaerenga huinga huinga raraunga, penei i te arawhiti huinga, te tukanga whakamohoatanga ranei. Hei whirihora i tetahi tauira PostgreSQL hou i runga i te punaha RHEL, me whakahaere te whakahau:
sudo /usr/bin/postgresql-setup -initdb
Ka taea e koe te tiimata i te PostgreSQL ma te whakamahi i te systemd, te hanga i tetahi papaa raraunga, ka whakarite kaupapa ki Django. Kia mahara ki te whakaara ano i te PostgreSQL i muri i te whakarereketanga i te konae whirihoranga motuhēhēnga a te kiritaki (te nuinga o pg_hba.conf) hei whirihora i te rokiroki kupuhipa mo te kaiwhakamahi tono. Mena ka pa ki etahi atu uauatanga, me whakarereke i nga tautuhinga IPv4 me IPv6 i te pg_hba.conf kōnae.
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
I roto i te konae /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
I roto i te konae /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 }}',
}
}
I muri i te whirihora i te kōnae settings.py i roto i te kaupapa me te whakarite i te whirihoranga raraunga, ka taea e koe te timata i te tūmau whanaketanga kia mohio kei te mahi nga mea katoa. I muri i te tiimata i te tūmau whanaketanga, he pai te whakaaro ki te hanga i tetahi kaiwhakamahi kaiwhakahaere hei whakamatautau i te hononga ki te papaarangi.
./manage.py runserver 0.0.0.0:8000
./manage.py createsuperuser
WSGI? Wai?
He pai te tūmau whanaketanga mo te whakamatautau, engari hei whakahaere i te tono me whirihora e koe te tūmau me te takawaenga e tika ana mo te Atanga Waarangi Tukutuku Tukutuku (WSGI). He maha nga huinga noa, hei tauira, Apache HTTPD me uWSGI, Nginx ranei me Gunicorn.
Ko te mahi a te Atanga Waahi Tukutuku Tukutuku he tuku tono mai i te tūmau tukutuku ki te angamahi tukutuku Python. Ko te WSGI he relic o nga wa o mua i te wa e noho ana nga miihini CGI, a i tenei ra ko WSGI te paerewa pono, ahakoa he aha te tuunga paetukutuku me te anga Python i whakamahia. Engari ahakoa te whanuitanga o tana whakamahinga, he maha tonu nga ahuatanga i te wa e mahi ana me enei anga, me te maha o nga whiringa. I tenei keehi, ka ngana taatau ki te whakarite i te taunekeneke i waenga i a Gunicorn me Nginx ma te turanga.
I te mea kua whakauruhia enei waahanga e rua ki runga i te tūmau kotahi, me ngana ki te whakamahi i te turanga UNIX hei utu mo te turanga whatunga. I te mea ka hiahia te whakawhitiwhiti korero mo tetahi take, me ngana ki te mahi i tetahi atu taahiraa me te whirihora i te whakahohenga turanga mo Gunicorn ma te punaha.
He tino ngawari te tukanga o te hanga i nga ratonga kua whakahohehia. Tuatahi, ka hangaia he konae waeine kei roto he tohutohu ListenStream e tohu ana ki te waahi ka hangaia te turanga UNIX, katahi he konae wae mo te ratonga ka tohu te tohutohu Titau ki te konae waeine turanga. Na, i roto i te konae waahanga ratonga, ko nga mea katoa e toe ana ko te waea atu ki a Gunicorn mai i te taiao mariko me te hanga i tetahi herenga WSGI mo te turanga UNIX me te tono Django.
Anei etahi tauira o nga konae waeine ka taea e koe te whakamahi hei turanga. Tuatahi ka whakaturia e matou te turanga.
[Unit]
Description=Gunicorn WSGI socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
Inaianei me whirihora e koe te daemon 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
Mo Nginx, he mea ngawari ki te hanga i nga konae whirihoranga takawaenga me te whakatu i tetahi raarangi hei penapena ihirangi pateko mena kei te whakamahi koe i tetahi. I roto i te RHEL, kei roto nga konae whirihoranga Nginx i /etc/nginx/conf.d. Ka taea e koe te kape i te tauira e whai ake nei ki te konae /etc/nginx/conf.d/default.conf ka tiimata te ratonga. Me whakarite te ingoa_server kia rite ki to ingoa kaihautu.
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;
}
}
Tīmatahia te turanga Gunicorn me te Nginx ma te whakamahi i te systemd ka rite koe ki te timata ki te whakamatautau.
Hapa Gateway kino?
Mena ka whakauru koe i te wahitau ki to kaitirotiro, ka whiwhi koe i te hapa 502 Bad Gateway. Na te he o te whirihora i nga whakaaetanga turanga UNIX, na nga take uaua ake e pa ana ki te mana uru ki SELinux.
I roto i te raarangi hapa nginx ka kite koe i tetahi raina penei:
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"
Mena ka whakamatau tika tatou i a Gunicorn, ka whiwhi tatou i te whakautu kore.
curl —unix-socket /run/gunicorn.sock 8beta1.example.com
Kia mohio tatou he aha i puta ai tenei. Mena ka whakatuwherahia e koe te raarangi, ka kite pea koe ko te raru e pa ana ki a SELinux. I te mea kei te whakahaere tatou i te daemon karekau he kaupapa here i hanga, kua tohua hei init_t. Kia whakamatauria tenei ariā i roto i te mahi.
sudo setenforce 0
Ko enei mea katoa ka puta te whakahee me te roimata o te toto, engari kei te tarai noa tenei i te tauira. Me whakakorehia te haki kia mohio ai koinei te raru, ka mutu ka whakahokia nga mea katoa ki tona waahi.
Ma te whakamau i te wharangi i roto i te kaitirotiro me te whakahoki ano i ta maatau whakahau curl, ka kite koe i te whaarangi whakamatautau Django.
Na, i te mohio kei te mahi nga mea katoa kaore he raruraru whakaaetanga, ka taea ano e matou a SELinux.
sudo setenforce 1
E kore ahau e korero mo te audit2allow me te hanga kaupapa-a-mataara me te sepolgen i konei, na te mea kaore he tono a Django i tenei wa, na reira kaore he mapi katoa o nga mea e hiahia ana a Gunicorn ki te uru atu me te aha e kore e uru atu. Na reira, he mea tika kia haere tonu a SELinux ki te tiaki i te punaha, i te wa ano ka tuku i te tono ki te whakahaere me te waiho i nga karere i roto i te raarangi arotake kia taea ai te hanga kaupapa here tuturu mai i a raatau.
Te tautuhi i nga rohe whakaae
Kaore nga tangata katoa i rongo mo nga waahi kua whakaaetia i SELinux, engari ehara i te mea hou. He tokomaha i mahi tahi me ratou me te kore e mohio. Ina hangaia he kaupapa here i runga i nga karere arotake, ko te kaupapa here i hangaia hei tohu mo te rohe kua whakatauhia. Me ngana ki te hanga kaupapa here tuku ngawari.
Hei waihanga i tetahi rohe motuhake mo Gunicorn, me hiahia koe ki etahi momo kaupapa here, me tohu ano koe i nga konae e tika ana. I tua atu, ka hiahiatia nga taputapu ki te kohikohi kaupapa here hou.
sudo yum install selinux-policy-devel
Ko te tikanga o nga rohe e whakaaetia ana he taputapu pai mo te tautuhi i nga raru, ina koa ka tae mai ki te tono ritenga, ki nga tono ranei ka tukuna kaore he kaupapa here kua hangaia. I tenei keehi, he maamaa noa te kaupapa here rohe mo Gunicorn - whakapuakihia he momo matua (gunicorn_t), whakapuakihia he momo ka whakamahia e matou hei tohu i te maha o nga whakahaere (gunicorn_exec_t), katahi ka whakarite i te whakawhiti mo te punaha ki te tohu tika. whakahaere tukanga. Ko te rarangi whakamutunga ka tautuhi i te kaupapa here kia taea ai te taunoa i te wa e utaina ana.
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;
Ka taea e koe te whakahiato i tenei konae kaupapa here me te taapiri atu ki to punaha.
make -f /usr/share/selinux/devel/Makefile
sudo semodule -i gunicorn.pp
sudo semanage permissive -a gunicorn_t
sudo semodule -l | grep permissive
Kia tirohia mena kei te aukati a SELinux i tetahi atu mea ke atu i ta taatau daemon e kore e mohiotia e uru ana.
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
Ka aukati a SELinux i a Nginx ki te tuhi raraunga ki te turanga UNIX i whakamahia e Gunicorn. Ko te tikanga, i roto i nga ahuatanga penei, ka timata nga kaupapa here ki te huri, engari tera ano etahi atu wero kei mua. Ka taea hoki te huri i nga tautuhinga rohe mai i te rohe here ki te rohe whakaaetanga. Inaianei me neke te httpd_t ki te rohe whakaaetanga. Ma tenei ka hoatu ki a Nginx te urunga e tika ana ka taea e taatau te haere tonu ki te mahi patuiro.
sudo semanage permissive -a httpd_t
Na, ka taea e koe te tiaki i a SELinux (kaore koe e waiho he kaupapa SELinux i roto i te aratau aukati) ka utaina nga rohe whakaaetanga, me whakaaro koe he aha nga mea e tika ana kia tohua hei gunicorn_exec_t kia pai ai te mahi o nga mea katoa. ano. Me ngana ki te toro ki te paetukutuku ki te kite i nga karere hou mo te aukati uru.
sudo ausearch -m AVC -c gunicorn
Ka kite koe i te maha o nga panui kei roto 'comm="gunicorn"' e mahi ana i nga momo mahi i runga i nga konae kei / srv/djangoapp, no reira koinei tetahi o nga whakahau e tika ana kia haki.
Engari i tua atu, ka puta he karere penei:
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
Mena ka titiro koe ki te mana o te ratonga gunicorn, ki te whakahaere ranei i te whakahau ps, kaore koe e kite i nga tikanga whakahaere. Te ahua nei kei te ngana a gunicorn ki te uru atu ki te kaiwhakamaori Python i roto i to maatau taiao mariko, tera pea ki te whakahaere i nga tuhinga a nga kaimahi. Na, me tohu enei konae e rua ka taea te whakahaere me te tirotiro mena ka taea e taatau te whakatuwhera i ta maatau wharangi whakamatautau Django.
chcon -t gunicorn_exec_t /srv/djangoapp/django/bin/gunicorn /srv/djangoapp/django/bin/python3.6
Me whakaara ano te ratonga gunicorn i mua i te kowhiri i te tohu tohu hou. Ka taea e koe te whakaara ano, ka mutu ranei te ratonga ka waiho te turanga kia timata ina whakatuwhera koe i te pae i roto i te tirotiro. Manatokohia kua whiwhi nga tukanga i nga tapanga tika ma te whakamahi i te ps.
ps -efZ | grep gunicorn
Kaua e wareware ki te hanga kaupapa here SELinux noa i muri mai!
Mena ka titiro koe ki nga karere AVC inaianei, kei roto i te karere whakamutunga he whakaaetanga=1 mo nga mea katoa e pa ana ki te tono, me te whakaaetanga=0 mo te toenga o te punaha. Mena ka mohio koe he aha te ahua o te urunga e hiahiatia ana e te tono pono, ka taea e koe te rapu tere i te huarahi pai ki te whakaoti rapanga penei. Engari tae noa ki tera wa, he pai ki te pupuri i te punaha me te whiwhi i te arotakenga marama me te whakamahi mo te kaupapa Django.
sudo ausearch -m AVC
Kua tupu!
Kua puta mai he kaupapa mahi Django me te taha o mua i runga i te Nginx me te Gunicorn WSGI. I whirihorahia e matou te Python 3 me te PostgreSQL 10 mai i nga putunga RHEL 8 Beta. Inaianei ka taea e koe te anga whakamua me te hanga (ka toha noa ranei) nga tono Django, te torotoro ranei i etahi atu taputapu e waatea ana i roto i te RHEL 8 Beta ki te whakaaunoa i te tukanga whirihoranga, ki te whakapai ake i nga mahi, ki te whakakii ranei i tenei whirihoranga.
Source: will.com