CentOS 6.6 com Nginx 1.6.2 - Repentinamente não pode reiniciar nginx - nginx: [emerg] open () “/ usr / share / nginx / on” falhou (13: Permissão negada)

2

Esta é uma nova instalação na qual o nginx foi iniciado e interrompido normalmente. Eu acredito que este erro surgiu depois de habilitar os blocos de servidor que testaram (nginx -t) com sucesso. Eu tentei reiniciar o nginx e recebi este erro:

nginx: [emerg] open() "/usr/share/nginx/on" failed (13: Permission denied)

O arquivo "on" não existia antes da tentativa de reinicialização. Foi criado e está vazio. Quando eu reinicio o php-fmp (com sucesso) e então tento reiniciar o nginx novamente, o erro muda para:

nginx: [emerg] open() "/var/run/nginx.pid" failed (13: Permission denied)
nginx: configuration file /etc/nginx/nginx.conf test failed

Mas, novamente, quando executo nginx -t, o teste é bem-sucedido:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Eu pensei que poderia ser um problema do usuário, mas tudo parece bem:

# ps -elf | grep nginx
5 S nginx     2774  2773  0  80   0 - 234152 skb_re 22:07 ?       00:00:00 php-fpm: pool www
5 S nginx     2775  2773  0  80   0 - 234152 skb_re 22:07 ?       00:00:00 php-fpm: pool www
5 S nginx     2776  2773  0  80   0 - 234152 skb_re 22:07 ?       00:00:00 php-fpm: pool www
5 S nginx     2777  2773  0  80   0 - 234152 skb_re 22:07 ?       00:00:00 php-fpm: pool www
5 S nginx     2778  2773  0  80   0 - 234152 skb_re 22:07 ?       00:00:00 php-fpm: pool www
0 R root      2940  2472  0  80   0 - 25811 -      22:18 pts/0    00:00:00 grep nginx

Mesmo que o Nginx não esteja em execução, o arquivo nginx.pid permaneceu e eu o excluí. Ao fazer isso, basta alterar a mensagem de erro de volta para:

nginx: [emerg] open() "/usr/share/nginx/on" failed (13: Permission denied) nginx: configuration file /etc/nginx/nginx.conf test failed.

Esse erro foi recebido, independentemente de como tentei reiniciar o sistema, incluindo $ sudo /etc/init.d/nginx restart e $ sudo /etc/init.d/nginx reload . Eu removi o arquivo "on" vazio que também não fez diferença. Quando eu uso $ getenforce , ele retorna Enforcing .

Em resposta a @ ǝɲǝɲbρɯͽ:

sudo grep -vR '^$\|^\s*\#' /etc/nginx/conf.d/* | grep -v ";" e sudo grep -vR '^$\|^\s*\#' /etc/nginx/nginx.conf* | grep -v ";" não produziram ponto e vírgula faltando.

O comando sudo grep -ER "on|/usr/share" /etc/nginx/* imprimiu quase todas as linhas de todos os arquivos no nginx, então não tenho certeza do que aprenderia com essas informações. Incidentalmente, /usr/shar/nginx contém apenas esse arquivo on vazio, nada mais.

sudo ausearch -m avc -ts recent -c nginx retornou <no matches>

Escusado será dizer que sou novato em relação a problemas de servidor, mas achei que o comando service --status-all (abaixo) pode produzir informações úteis. Claro, nós já sabemos que existe um arquivo pid mesmo que o nginx esteja morto, mas qual é o master (pid 1924) is running ? Além disso, existe alguma coisa no iptables que possa ser responsável por impedir o reinício do nginx?

atd (pid  1995) is running...
auditd (pid  1405) is running...
crond (pid  1982) is running...
htcacheclean is stopped

Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all      ::/0                 ::/0                state RELATED,ESTABLISHED
2    ACCEPT     icmpv6    ::/0                 ::/0
3    ACCEPT     all      ::/0                 ::/0
4    ACCEPT     udp      ::/0                 fe80::/64           state NEW udp dpt:546
5    ACCEPT     tcp      ::/0                 ::/0                state NEW tcp dpt:22
6    REJECT     all      ::/0                 ::/0                reject-with icmp6-adm-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all      ::/0                 ::/0                reject-with icmp6-adm-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
6    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3306
8    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

iscsi is stopped
iscsid is stopped
lvmetad is stopped
mdmonitor (pid  1445) is running...
multipathd is stopped
mysqld is stopped
netconsole module not loaded

Configured devices:
lo bond0 em1 em2

Currently active devices:
lo em1 em2 bond0

nginx dead but pid file exists
php-fpm is stopped
master (pid  1924) is running...
rdisc is stopped
restorecond is stopped
rsyslogd (pid  1425) is running...
sandbox is stopped
saslauthd is stopped
snmpd is stopped
snmptrapd is stopped
openssh-daemon (pid  1486) is running...
svnserve is stopped
    
por John Andersen 22.03.2015 / 04:01

2 respostas

5

/ usr / share / nginx / ... é onde está a webroot padrão; você pode ter definido algo para estar "ligado" e acidentalmente tocou esse arquivo. Como o seu teste funciona, ele também pode ter sido resolvido, mas quando o nginx falha (ou coisas como kill -9) ele não se livra do arquivo pid.

Eu não tenho experiência com o php-fpm, mas parece que o seu processo mestre nginx não está sendo executado. Você pode verificar com certeza por:

$ ps axu | grep 'cat /var/run/nginx.pid'

Esses são backticks (') e não apóstrofos ('). Se não estiver em execução, remova o arquivo pid:

$ sudo rm /var/run/nginx.pid

e reinicie o nginx. Em muitos sistemas, isso é:

$ sudo /etc/init.d/nginx restart

Você não quer fazer isso em circunstâncias normais em um site ativo. Existem maneiras melhores, incluindo:

Depois de reiniciar o nginx, você verá algo assim:

$ ps axu | grep nginx

... worker threads
... 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf

Você também pode:

$ /etc/init.d/nginx status

nginx (pid  1111) is running...

** Editar: diagnóstico dos comentários **

1. Configuração

  • Observe com muito cuidado suas alterações. O nginx é frágil quando se trata de perder ponto e vírgula. Quase toda linha deve terminar com;
    • Se você perdeu algum, o nginx processará linhas adicionais como se fossem parte da mesma diretiva. Por exemplo (e pode ser pior que isso) essas duas linhas são processadas como a mesma diretiva: %código%
    • Não é responsabilidade do nginx ser um verificador de sintaxe muito bom para você, portanto não há garantia de que o nginx detectará esse erro antes de tentar iniciar os trabalhadores, onde o SELinux (corretamente) pisa na ação anômala do processo.

Para facilitar a localização dessas linhas¹:

$ sudo grep -vR '^$\|^\s*\#' /etc/nginx/conf.d/* | grep -v ";"

Ou linhas com "on" ou "/ usr / share":

$ sudo grep -ER "on|/usr/share" /etc/nginx/conf.d/*

Você provavelmente precisará consertar um desses (não adicione ponto-e-vírgulas a {} linhas) e, em seguida:

$ sudo rm /usr/share/nginx/on /var/run/nginx.pid
$ sudo /etc/init.d/nginx restart

2. Metadados: Comprove o envolvimento do SELinux (ou não)

Isto é apenas para informação. Ela surge o tempo todo em edições e é um ponto de partida para nós / futuros visitantes. Assumindo que o nginx ainda está quebrado (você não corrigiu a configuração):

$ sudo /etc/init.d/nginx start
$ sudo ausearch -m avc -ts recent -c nginx

Apesar de estarmos filtrando o nginx (pode haver outras negações), o SELinux provavelmente não é indicado se você vir:

<no matches>

SELinux é indicado com AVCs semelhantes a:

type=AVC msg=audit(timestamp:123): avc:  denied  { getattr } for  pid=1234 comm="nginx" path="/usr/share/nginx/on" dev=sda ino=123456 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file

O problema é que, em algum momento durante a inicialização, um arquivo é criado em um contexto diferente do nginx ou seus trabalhadores (que alternam contextos de segurança) não têm permissão para tocar. Quando pretendido, os contextos são visíveis adicionando -Z a muitos comandos, fixados com chcon (contexto de alteração) e as questões em torno disso são facilmente encontradas .

¹ crédito do grep

    
por 22.03.2015 / 06:29
3

Você tem uma propriedade que está esperando um caminho, mas recebe um valor booleano, por exemplo,

access_log on;

access_log está esperando um caminho, mas é fornecido um valor booleano on . Você pode confirmar isso lendo atentamente o erro:

nginx: [emerg] open() "/usr/share/nginx/on" failed (13: Permission denied)

Observe o on relativo ao seu caminho base do nginx.

    
por 06.05.2016 / 15:16