'gateway' má da nginx 502
Tenho um 502 mau Gateway com nginx quando uso spawn fcgi para spawn php5-cgi.
Uso isto para passar uma instância no início do servidor, usando a seguinte linha em rc.local
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid
{[[2]}presumivelmente estou a receber o erro porque o spawn-fcgi / php5-cgi morre e não há mais nada a ouvir lá para processar o php.
Não tenho nada nos registos que possa ver em lado nenhum, estou sem ideias (e novo nesta configuração com a nginx)
13 answers
Executei o meu {[[0]} e a página mostrou a mensagem 502 bad gateway
. Isto ajudou-me.
- Editar
/etc/php5/fpm/pool.d/www.conf
- Alteração
listen = /var/run/php5-fpm.sock
paralisten = 127.0.0.1:9000
- Certifique-se que a localização é correctamente colocada em nginx.conf
- corre
sudo service php5-fpm restart
Fonte: http://wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm
O erro 502 aparece porque o nginx não pode entregar o php5-cgi. Você pode tentar reconfigurar o php5-cgi para usar sockets unix em oposição ao tcp .. em seguida, ajustar a configuração do servidor para apontar para o socket em vez do tcp ...
ps auxww | grep php5-cgi #-- is the process running?
netstat -an | grep 9000 # is the port open?
Vá para /etc/php5/fpm/pool.d/www.conf
e se estiver a usar 'sockets' ou se esta linha não estiver correcta
listen = /var/run/php5-fpm.sock
Defina também alguns outros valores: -
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
Não se esqueça de reiniciar php-fpm e nginx. Certifique-se de que está a usar o mesmo proprietário da nginx e nome do grupo.
Tem de corresponder às configurações do PHP-FPM e do Nginx para comunicar através de 'sockets' ou TCP.
Então vai a/etc/php5/fpm/pool.d/www.conf
e procura esta linha:
listen = /var/run/php5-fpm.sock
Então vá para /etc/nginx/nginx.conf
Procura isto:
upstream php {
server unix:/var/run/php5-fpm.socket;
}
Iguala esses valores e deves estar pronto.
Porto, tive de executar este comando (assumindo que o meu servidor de fcgi está a correr no Porto 4567):
sudo iptables -I INPUT 1 -p tcp --dport 4567 -j ACCEPT
Aviso: isto abrirá o porto 4567 para todo o mundo.
Então talvez seja melhor fazer algo assim:
sudo iptables-save >> backup.iptables
sudo iptables -D INPUT 1 #Delete the previously entered rule
sudo iptables -I INPUT 1 -p tcp --dport 8080 -s localhost -j ACCEPT # Add new rule
Fazer isto removeu o erro 502 para mim.
Alteração
fastcgi_pass unix:/var/run/php-fpm.sock;
A
fastcgi_pass unix:/var/run/php5-fpm.sock;
Quando o fiz {[1] } tive o seguinte erro:
Starting php-fpm: [28-Mar-2013 16:18:16] ERROR: [pool www] cannot get uid for user 'apache'
Acho que /etc/php-fpm.d/www.conf
precisa de saber ao utilizador que o servidor web está a correr como e assume que é apache quando, para nginx, é realmente nginx, e precisa de ser alterado.
Pode fazer com que a nginx ignore as interrupções do cliente usando:
location / {
proxy_ignore_client_abort on;
}
Se você está tendo o problema devido a um problema de permissão, você pode descomentar as seguintes linhas a partir de: /etc/php5/fpm/pool.d / www.conf
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
Alternativamente, embora eu não recomendasse, você pode dar permissões de leitura e escrita para todos os grupos usando o seguinte comando.
sudo chmod go+rw /var/run/php5-fpm.sock
sudo htop
Ou
sudo free -m
...juntamente com a execução de Pedidos problemáticos no servidor para ver se a sua memória não se esgota. E se ele gosta no meu caso, você precisa criar um arquivo de troca (a menos que você já tem um).
Segui este tutorial para criar um ficheiro swap no Ubuntu Servidor 14.04 e funcionou muito bem.: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/
Resumindo:
vi /etc/apparmor.d/nginx
Ou
sudo aa-complain nginx
sudo service nginx restart
Vê Tudo a funcionar bem... então
sudo aa-logprof
Ainda tinha problemas com a Nginx não ser capaz de ler erros.log, apesar de ter todo o permissões possíveis, incluindo no Apparomor. Acho que tem algo a ver com a ordem das entradas, ou alguma interacção com o passageiro ou o PHP-Fpm... Fiquei sem tempo para resolver isto e voltei para Apache por agora. (Apache executa muito melhor também FYI.)
O AppArmor deixa a Nginx fazer o que quiser se remover o perfil:
rm /etc/apparmor.d/nginx
service apparmor reload
Surpreendentemente, mas não é surpreendente, muitos posts sobre corrigir erros de Nginx recorrem a incapacitar completamente SELinux ou a remover o AppArmor. É uma má ideia, porque perdes a protecção de um monte de software. Apenas remover o perfil Nginx é uma maneira melhor de resolver o problema de seus arquivos de configuração. Uma vez que você sabe que o problema não está em seus arquivos de configuração Nginx, você pode tomar o tempo para criar um perfil AppArmor adequado.
Sem um perfil AppArmor, especialmente se você executar algo como passageiro também, eu dou ao seu servidor cerca de um mês para se recuperar.
echo '<html>test</html>'; exit();
No meu caso, o problema era uma variável não inicializada que só falhou em circunstâncias peculiares.