
Estoy depurando un problema dondeMoinMoin
en CentOS arroja un error de permisos, pero no puedo localizar dónde está el archivo/directorio problemático.
Corrí strace -vp <pid>
con el pid de Apache; cuando tengo el problema veo esto:
epoll_wait(10, {{EPOLLIN, {u32=3487534344, u64=140367313734920}}}, 2, 10000) = 1
accept4(6, {sa_family=AF_INET6, sin6_port=htons(52621), inet_pton
(AF_INET6, "::ffff:105.193.30.91", &sin6_addr), sin6_flowinfo=0,
sin6_scope_id=0}, [28], SOCK_CLOEXEC) = 11
## Later on...
read(7, 0x7fffa658ad7f, 1) = -1 EAGAIN (Resource temporarily
unavailable)
Sin embargo, dado que Apache ya se está ejecutando, no veo ninguna correspondencia open()
en el archivo denominado 7
; entonces veo el problema de permisos, pero todavía no lo sécualEl archivo es el problema.
Sé que podría intentar capturar todos los archivos abiertos cuando reaparezco Apache, pero espero que haya una manera de asignar el archivo 7
a un nombre de archivo real... ¿hay alguna manera de hacer esto?
EDITAR 1:
Usando la guía de @lain, ejecuté lsof | grep 266474069
, pero los resultados no están claros...
[root@lnxlmf moin]# ls -la /proc/9707/fd/7
lr-x------. 1 root root 64 Aug 28 15:39 /proc/9707/fd/7 -> pipe:[266474069]
[root@lnxlmf moin]#
[root@lnxlmf moin]# lsof | grep 266474069
httpd 9703 root 7r FIFO 0,8 0t0 266474069 pipe
httpd 9703 root 8w FIFO 0,8 0t0 266474069 pipe
httpd 9705 apache 7r FIFO 0,8 0t0 266474069 pipe
httpd 9705 apache 8w FIFO 0,8 0t0 266474069 pipe
httpd 9706 apache 7r FIFO 0,8 0t0 266474069 pipe
httpd 9706 apache 8w FIFO 0,8 0t0 266474069 pipe
httpd 9707 apache 7r FIFO 0,8 0t0 266474069 pipe
httpd 9707 apache 8w FIFO 0,8 0t0 266474069 pipe
httpd 9733 apache 7r FIFO 0,8 0t0 266474069 pipe
httpd 9733 apache 8w FIFO 0,8 0t0 266474069 pipe
[root@lnxlmf moin]#
Veo que se trata de una tubería FIFO, pero ¿qué significa esto para la configuración de mi sistema? ¿Cómo puedo rastrear la causa raíz del EAGAIN
problema?
EDITAR 2:
Gracias a @Alan Curry, correr strace -fp <pid_of_wsgi_proc>
parece llevarme un poco más lejos...
[pid 9731] stat("/opt/moin/share/moin/wikiconfig.py", {st_mode=S_IFREG|0770, st_size=6463, ...}) = 0
[pid 9731] stat("/opt/moin/share/moin/data/pages", {st_mode=S_IFDIR|0770, st_size=4096, ...}) = 0
[pid 9731] access("/opt/moin/share/moin/data/pages", R_OK|W_OK|X_OK) = -1 EACCES (Permission denied)
Sin embargo, tanto Apache como wsgi
ejecutarse como apache
usuario...
[root@lnxlmf moin]# ps auxw | grep -E "apache|wsgi"
apache 10187 0.0 0.1 373488 5884 ? Sl 17:18 0:00 moin_http_wsgi
apache 10188 0.0 0.1 373488 5884 ? Sl 17:18 0:00 moin_https_wsgi
apache 10189 0.0 0.1 185096 5824 ? S 17:18 0:00 /usr/sbin/httpd
root 10243 0.0 0.0 103240 848 pts/1 S+ 17:21 0:00 grep -E apache|wsgi
[root@lnxlmf moin]#
Sin embargo, cuando ejecuto los siguientes comandos y reinicio Apache, todavía no puedo solucionar el problema...
[root@lnxlmf moin]# pwd
/opt/moin/share/moin
[root@lnxlmf moin]# chown -R apache:apache data/
[root@lnxlmf moin]# sudo chmod -R ug+rwx data/
[root@lnxlmf moin]# sudo chmod -R o-rwx data/
Estoy usando esto en mi configuración http de wiki:
<VirtualHost *:443>
ServerName netwiki.foo.com
DocumentRoot /opt/moin/share/moin
WSGIScriptAlias / /opt/moin/share/moin/server/moin.wsgi
WSGIDaemonProcess moin_https display-name=moin_https_wsgi \
user=apache group=apache \
processes=1 threads=10 maximum-requests=1000 umask=0007
WSGIProcessGroup moin_https
WSGIApplicationGroup %{GLOBAL}
# Generate with...
# openssl req -new -x509 -days 365 -nodes -out netwiki.pem -keyout netwiki.key
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/netwiki.pem
SSLCertificateKeyFile /etc/httpd/ssl/netwiki.key
</VirtualHost>
Respuesta1
Eche un vistazo a /proc/<PID>/fd
lo que debería enumerar todos los archivos abiertos que PID
se han abierto.
En mi sistema CentOS, fd 7 es
lrwx------. 1 root root 64 Aug 28 22:01 7 -> socket:[1872522]
Luego puedo usar netstat -ane | grep 1872522
para obtener
tcp 0 0 :::443 :::* LISTEN 0 1872522
Puedes usar
lsof | grep 266474069
para obtener información sobre la tubería.
Respuesta2
Mirando mi pequeño VPS, puedo determinar el número fd de la siguiente manera:
ll /proc/17684/fd/ |colrm 1 46
0 -> /dev/null
1 -> /dev/null
10 -> /var/www/vhosts/censored.xenuser.org/statistics/logs/error_log
11 -> /var/www/vhosts/censored.de/statistics/logs/error_log
12 -> /var/www/vhosts/censored.org/statistics/logs/error_log
13 -> /var/www/vhosts/xenuser.org/statistics/logs/error_log
14 -> /var/log/apache2/access.log
[y así sucesivamente, donde 17684 es el PID del proceso que rastreé anteriormente]
Respuesta3
El problema era que tenía SELINUX=enforcing
en /etc/selinux/config
.
Después de configurar SELINUX=permissive
, SELINUXTYPE=targeted
y reiniciar wsgi
puedo acceder a todos los archivos correctamente.