원본 파일 컨텍스트는 /run/unicorn.sock
tcontext=system_u:object_r:var_run_t:s0 입니다.
파일 컨텍스트를 자동으로 system_u:object_r로 만드는 방법:httpd_var_run_t:s0 nginx 서버가 SELinux에 의해 거부되지 않고 소켓 파일에 연결하고 쓸 수 있도록 소켓 장치를 시작할 때.
이것은 내가 만든 소켓 데몬입니다./usr/lib/systemd/system/unicorn.socket
[Unit]
Description=unicorn socket
[Socket]
ListenStream=/run/unicorn.sock
[Install]
WantedBy=sockets.target
그리고 그에 상응하는/usr/lib/systemd/system/unicorn.service
[Unit]
Description=unicorn daemon
Requires=unicorn.socket
After=network.target
[Service]
User=ec2-user
Group=ec2-user
WorkingDirectory=/home/ec2-user/product-catalog
ExecStart=/home/ec2-user/product-catalog/venv/bin/gunicorn \
--access-logfile - \
-k uvicorn.workers.UvicornWorker \
--workers 3 \
--bind unix:/run/unicorn.sock \
app:app
[Install]
WantedBy=multi-user.target
php-fpm의 소켓 파일이 /run/php-fpm에 있다는 것을 알았습니다.
답변1
systemd가 파일과 디렉터리를 생성할 때 selinux 정책을 사용하여 레이블을 할당합니다. 즉, 첫 번째 단계는 소켓에 대한 정보로 selinux 정책 데이터베이스를 업데이트하는 것입니다.
semanage fcontext -a -t httpd_var_run_t /var/run/unicorn.sock
다음과 같은 소켓 유닛이 주어지면:
[Unit]
Description=unicorn socket
[Socket]
ListenStream=/run/unicorn.sock
SocketUser=nginx
SocketGroup=nginx
SocketMode=0660
[Install]
WantedBy=sockets.target
다음과 같은 서비스 단위도 있습니다.
[Service]
Type=exec
User=nginx
Group=nginx
WorkingDirectory=/srv/app
ExecStart=gunicorn --bind unix:/run/unicorn/unicorn.sock app:app
이로 인해 우리는 다음과 같은 결과를 얻게 됩니다.
[root@localhost system]# ls -lZ /run/unicorn.sock
srw-rw----. 1 nginx nginx system_u:object_r:httpd_var_run_t:s0 0 Mar 20 21:49 /run/unicorn.sock
또한 다음 selinux 정책 모듈을 설치해야 했습니다.
module nginx_unix_socket 1.0;
require {
type httpd_t;
type unconfined_service_t;
class unix_stream_socket connectto;
}
#============= httpd_t ==============
allow httpd_t unconfined_service_t:unix_stream_socket connectto;
모듈을 설치하려면(에 저장되어 있다고 가정 nginx_unix_socket.te
):
checkmodule -M -m -o nginx_unix_socket.mod nginx_unix_socket.te
semodule_package -o nginx_unix_socket.pp -m nginx_unix_socket.mod
semodule -i nginx_unix_socket.pp
이것이 필요한 전부입니다. 내 nginx 구성에는 다음이 포함됩니다.
location / {
proxy_pass http://unix:/run/unicorn.sock;
}
완료되면 curl localhost
바인딩된 gunicorn 서비스에 성공적으로 연결됩니다 /run/unicorn.sock
.