web-dev-qa-db-fra.com

nginx 502 mauvaise passerelle

Je reçois une mauvaise passerelle 502 avec nginx lors de l'utilisation de spawn fcgi pour générer php5-cgi.

J'utilise cela pour étendre une instance sur le serveur démarrer en utilisant la ligne suivante dans 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

vraisemblablement, j'obtiens l'erreur car le spawn-fcgi/php5-cgi meurt et il n'y a plus rien qui écoute pour analyser php.

Je n'ai rien dans les journaux que je puisse voir n'importe où, je suis à court d'idées (et nouveau dans cette configuration avec nginx)

57
Joel Wickard

J'ai exécuté ma localhost et la page affichait le message 502 bad gateway. Cela m'a aidé:

  1. Éditer /etc/php5/fpm/pool.d/www.conf
  2. Remplacez listen = /var/run/php5-fpm.sock par listen = 127.0.0.1:9000
  3. Assurez-vous que l'emplacement est défini correctement dans nginx.conf .
  4. Exécuter Sudo service php5-fpm restart

Cela vous aidera peut-être.

Source de: http://wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm

49
fadil

L'erreur 502 apparaît car nginx ne peut pas transférer à php5-cgi. Vous pouvez essayer de reconfigurer php5-cgi pour utiliser des sockets unix plutôt que tcp .. 

ps auxww | grep php5-cgi #-- is the process running?  
netstat -an | grep 9000 # is the port open? 
9
sdolgy

Allez à /etc/php5/fpm/pool.d/www.conf et si vous utilisez des sockets ou si cette ligne n'est pas commentée 

listen = /var/run/php5-fpm.sock

Définissez quelques autres valeurs aussi: -

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

N'oubliez pas de redémarrer php-fpm et nginx. Assurez-vous que vous utilisez le même propriétaire et le même nom de groupe nginx.

8
techvineet

Vous devez faire correspondre les paramètres de PHP-FPM et Nginx pour communiquer via sockets ou TCP. 

Alors allez à /etc/php5/fpm/pool.d/www.conf et cherchez cette ligne:

listen = /var/run/php5-fpm.sock

Ensuite, allez à /etc/nginx/nginx.conf

Cherchez ceci: 

upstream php {
    server unix:/var/run/php5-fpm.socket;
}

Faites correspondre ces valeurs et vous devriez être tous ensemble. 

7
KJ Prince

Si vous utilisez un serveur linux, assurez-vous que votre configuration IPTABLES est correcte.

Exécutez Sudo iptables -L -n, vous recevrez une liste de vos ports ouverts. S'il n'y a pas de règle Iptables pour ouvrir le port servant le script fcgi, vous recevrez une erreur 502. La règle Iptables qui ouvre le port correct doit être listée avant toute règle qui rejette catégoriquement tous les paquets (c'est-à-dire une règle de la forme "REJECT ALL -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable ou similaire)

Sur ma configuration, pour ouvrir correctement le port, j'ai dû exécuter cette commande (en supposant que mon serveur fcgi fonctionne sur le port 4567):

Sudo iptables -I INPUT 1 -p tcp --dport 4567 -j ACCEPT

AVERTISSEMENT: cela ouvrira le port 4567 au monde entier.

Il serait donc préférable de faire quelque chose comme ceci:

   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

Faire cela a supprimé l'erreur 502 pour moi.

5
tjb

changement

fastcgi_pass    unix:/var/run/php-fpm.sock;

à

fastcgi_pass    unix:/var/run/php5-fpm.sock;
4
user2816137

Vous pouvez faire en sorte que nginx ignore les abandons de client en utilisant:

location / {
  proxy_ignore_client_abort on;
}
2
Meekohi

Quand j'ai fait Sudo /etc/init.d/php-fpm start j'ai eu l'erreur suivante:

Starting php-fpm: [28-Mar-2013 16:18:16] ERROR: [pool www] cannot get uid for user 'Apache'

Je suppose que /etc/php-fpm.d/www.conf doit connaître l'utilisateur sur lequel le serveur Web est exécuté et suppose qu'il s'agit d'Apache lorsque, pour nginx, il s'agit en réalité de nginx et doit être modifié.

2
neubert

J'ai eu le même problème lors de la configuration d'un serveur Ubuntu. Il se trouve que je rencontrais le problème en raison d'autorisations incorrectes sur le fichier de socket.

Si vous rencontrez le problème en raison d'un problème d'autorisation, vous pouvez supprimer les commentaires des lignes suivantes: /etc/php5/fpm/pool.d/www.conf

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

Sinon, bien que je ne le recommande pas, vous pouvez accorder des autorisations de lecture et d'écriture à tous les groupes à l'aide de la commande suivante.

Sudo chmod go+rw /var/run/php5-fpm.sock
2
Ali Haris

Essayez de désactiver les modules xcache ou apc. Semble causer un problème avec certaines versions enregistrer des objets dans une variable de session.

1
h0tw1r3

Si vous êtes sur Ubuntu et que tout ce qui précède vous a fait défaut, AppArmor est le plus susceptible d’en vouloir. 

Voici un bon guide pour y remédier: https://www.digitalocean.com/community/tutorials/how-to-create-an-apparmor-profile-for-nginx-on-ubuntu-14-04

Longue histoire courte: 

vi /etc/apparmor.d/nginx

Ou 

Sudo aa-complain nginx
Sudo service nginx restart

Voir tout fonctionne bien ... alors

Sudo aa-logprof

J'ai toujours eu des problèmes avec le fait que Nginx ne puisse pas lire error.log, alors qu'il disposait de toutes les autorisations possibles, y compris dans Apparomor. Je suppose que cela a quelque chose à voir avec l'ordre des entrées, ou une interaction avec Passenger ou PHP-Fpm ... Je n'ai plus beaucoup de temps pour résoudre ce problème et je suis retourné à Apache pour l'instant. (Apache fonctionne beaucoup mieux aussi pour votre information.) 

AppArmor laisse simplement Nginx faire ce qu'il veut si vous supprimez simplement le profil:

 rm /etc/apparmor.d/nginx
 service apparmor reload

Chose choquante, mais peu surprenante, de nombreux articles sur la correction des erreurs Nginx ont pour but de désactiver complètement SELinux ou de supprimer AppArmor. C'est une mauvaise idée car vous perdez la protection de nombreux logiciels. Il suffit de supprimer le profil Nginx pour résoudre les fichiers de configuration. Une fois que vous savez que le problème ne réside pas dans vos fichiers de configuration Nginx, vous pouvez prendre le temps de créer un profil AppArmor approprié. 

Sans profil AppArmor, en particulier si vous exécutez aussi quelque chose comme Passenger, je laisse à votre serveur environ un mois pour obtenir la porte dérobée. 

1
dagelf

Configuration similaire ici et on dirait qu’il s’agit d’un bogue dans mon code. Au début de mon application, j'ai cherché l'URL incriminée et cela a fonctionné: echo '<html>test</html>'; exit(); 

Dans mon cas, il s'avère que le problème était une variable non initialisée qui n'a échoué que dans des circonstances particulières. 

0
PJ Brunet