Apache vs Nginx

29

J'ai récemment enquêté sur les différences entre Apache et Nginx et je suis confus quant à ce que je devrais choisir.

J'ai fait quelques recherches mais il n'y a pas de comparaison définitive entre les deux et je me demandais si quelqu'un ici pourrait donner leur avis sur les différences entre les deux.

Mes connaissances actuelles me permettent de comprendre que mod_php est plus rapide et plus sécurisé que fastcgi mais Apache est bien pire quand il s'agit de connexions simultanées et de consommation de mémoire.

Mon site utilise beaucoup de longs sondages mais a une base Web non AJAX (c'est-à-dire Apache avec de longs sondages par-dessus).

Ma solution originale aux problèmes de mémoire d'Apaches consistait à envoyer l'interrogation longue via node.js, puis à obtenir que node.js accède à Apache toutes les 2 secondes, auquel cas Apache n'aurait pas de connexion ouverte, mais plutôt node.js. Je me suis rendu compte que ce n'était peut-être pas assez bon et j'envisage différentes solutions. Je suis toujours intéressé à savoir si mon idée originale aurait fonctionné.

Alors, quel est le meilleur pour le web moderne? Apache ou Nginx?

Mise à jour: Toutes les suggestions données étaient bonnes et valables. Je suis allé avec la deuxième idée originale qui est d'utiliser un serveur Nginx complet. Je suis convaincu qu'étant un serveur dédié, je ne pourrais pas souffrir de problèmes de sécurité de fastcgi et comme mes longs scripts d'interrogation doivent être écrits en PHP, j'ai besoin d'un serveur capable de gérer des connexions simultanées à forte charge et Apache ne peut tout simplement pas le faire, peu importe combien Je change la structure, il aura toujours faim de mémoire.

J'ai marqué la réponse de Martin F depuis qu'il a donné une réponse si claire et complète à mes questions que je pense qu'il mérite la note, cependant, les trois réponses étaient bonnes et valides et examineront très certainement l'utilisation du proxy inverse pour un autre site que je possède puisque je viens de trouver quelque chose de très très très kool que Nginx peut faire en tant que mandataire.

Merci,

Sammaye
la source

Réponses:

28

Vous semblez avoir quelques idées fausses auxquelles je pense qu'il faut remédier.

Tout d'abord, mod_php n'est que légèrement plus rapide, tous mes tests ont montré que la différence est si minuscule qu'elle ne vaut pas la peine d'être prise en compte. Je doute également que l'aspect sécurité vous concerne car vous semblez regarder un serveur dédié et mod_php n'a vraiment qu'un avantage dans un environnement partagé - en fait, dans un environnement dédié, php-fpm aura l'avantage car PHP et votre serveur web fonctionnent désormais comme des processus différents, et cela ne tient même pas compte des options de journalisation impressionnantes de php- fpm tel que le journal lent.

Si le monde était en noir et blanc, je dirais opter pour une configuration pure nginx et compiler php avec php-fpm. Plus réaliste, si Apache fonctionne déjà, faites de nginx un proxy inverse pour apache et vous pourriez économiser quelques heures de configuration et la différence de performances sera minime.

Mais supposons que le monde soit en noir et blanc pendant une seconde, car cela rend les configurations beaucoup plus impressionnantes. Vous faites nginx + php-fpm pour votre serveur web. Pour résoudre les téléchargements, vous utilisez le module de téléchargement et le module de progression du téléchargement pour nginx. Cela signifie que votre serveur Web accepte le téléchargement et transmet le chemin du fichier à PHP lorsqu'il est terminé, de sorte que le fichier n'a pas besoin d'être diffusé entre nginx et PHP via le protocole fastcgi, sweet. (Je l'ai dans une configuration en direct et cela fonctionne très bien, btw!)

Pour le téléchargement des utilisateurs, vous utilisez la fonction de type x-send-file de nginxs appelée x-accel-redirect, essentiellement vous faites votre authentification en PHP et définissez un en-tête que nginx récupère et commence à transférer ce fichier. PHP met fin à l'exécution et votre serveur Web gère le transfert, mon chou! (Encore une fois, je l'ai dans une configuration en direct et cela fonctionne très bien)

Pour la distribution de fichiers sur des serveurs ou d'autres opérations de longue durée, nous réalisons que PHP n'est pas vraiment le mieux adapté pour cela, nous installons donc gearman, qui est un serveur de travaux qui peut répartir les travaux entre les travailleurs sur différents serveurs, ces travailleurs peuvent être écrits dans n'importe quel la langue. Par conséquent, vous pouvez créer un travailleur de distribution et générer 5 d'entre eux en utilisant un total de 200 Ko de mémoire au lieu des 100 Mo que PHP utiliserait. Doux. (J'ai également ce fonctionnement en direct, donc tout est réellement possible)

Au cas où vous ne l'auriez pas encore compris, je pense que beaucoup de vos problèmes ne sont pas du tout liés à votre serveur Web, vous pensez simplement de cette façon parce qu'Apache le force à être lié à votre serveur Web en raison de sa structure, souvent, il existe de bien meilleurs outils pour le travail que PHP et PHP est un langage qui le sait et offre d'excellentes options pour décharger le travail sans jamais quitter PHP.

Je recommanderais fortement nginx, mais je pense également que vous devriez examiner d'autres options pour vos autres problèmes.Si vous avez un problème de mise à l'échelle ou de performances, n'hésitez pas à m'écrire. Je ne sais pas si vous pouvez envoyer des messages par ici, mais sinon écrivez-moi à [email protected] car je ne traque pas la faute du serveur pour tout ce qui n'est pas étiqueté avec nginx. :)

Martin Fjordvald
la source
1
Merde, ça a vraiment éclairci les choses :) merci, c'était l'explication que je cherchais. Je pense que je suis assez vendu sur l'apprentissage de Nginx maintenant, car Apache s'étoufferait et mourrait en utilisant mon site. Heureusement, il semble vraiment assez facile de le déplacer. Je veux dire que les gens sur node.js ont dit d'écrire la plupart des choses à ce sujet et d'interroger votre classe de session php uniquement si vous en avez vraiment besoin (ce que je fais sauf s'il existe un moyen de détecter le moment où les utilisateurs ferment leurs fenêtres: P). Oui, je cours sur une ferme de serveurs massive, donc savoir qu'il n'y a pas de menace pour la sécurité aide des tonnes, merci pour la grande explication :)
Sammaye
J'ai regardé ceci: joeandmotorboat.com/2008/02/28/… et ceci: blog.webfaction.com/a-little-holiday-present et cela m'a vraiment fait rire à l'idée de pouvoir durer longtemps sondage au contenu de mon cœur vraiment. Pas un seul problème de mémoire contrairement à Apache :)
Sammaye
Attendez donc que vous disiez que je pourrais faire un travailleur multithread en java et php peut fonctionner parfaitement? Je veux dire que le plus gros problème que je vois est le serveur car j'obtiens d'énormes problèmes de mémoire avec Apache en utilisant une longue interrogation, ce qui est commun ... souvent corrigé par Nginx.
Sammaye
1
Essentiellement oui, j'ai des travailleurs de distribution de fichiers écrits en C, en utilisant l'extension gearman pour PHP J'envoie un travail de distribution au serveur de travaux gearman et il l'envoie à un travailleur, qui peut être écrit dans n'importe quelle langue; PHP, Java, C, etc. Ce travailleur fait ensuite son travail et rend compte de l'état à Gearman, qui rend compte à PHP. (sauf si un job d'arrière-plan a été choisi, auquel cas PHP se termine sans l'attendre)
Martin Fjordvald
2
Je sais que c'est une ancienne publication mais je dois dire que c'est l'une des publications les plus informatives que j'ai trouvées sur le sujet de nginx vs apache. Thans Martin, +1.
Akoi Meexx
5

Je suggère d'exécuter nginx comme proxy inverse. Il gérera tous vos fichiers statiques et mis en cache (où c'est considérablement plus rapide que Apache / moins de surcharge de mémoire), puis transmettra toutes les demandes de contenu dynamique à Apache.

Greg Annandale
la source
Oui, c'est ce que la plupart des gens semblent faire, je vais certainement devoir y
réfléchir
1
N'oubliez pas d'installer mod_rpaf pour Apache afin de pouvoir passer par les adresses IP des clients à des fins de journalisation (sinon les journaux Apache afficheront toutes les demandes comme provenant de 127.0.0.1), ajoutez ce qui suit dans la configuration nginx: proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
Greg Annandale
Je me demande une chose avant d'essayer ce soir. Si j'achemine via Nginx vers Apache qui sert mon PHP, cela signifie-t-il que l'interrogation longue aurait toujours les mêmes problèmes qu'Apache ou l'appeler en proxy inverse fait-il qu'Apache agisse différemment d'une manière ou d'une autre?
Sammaye
1

Je ne suis pas sûr que mod_php soit plus rapide que ses alternatives, où avez-vous lu ceci? J'ai fait des tests en laboratoire avec nginx + php-fpm, et d'après ce que j'ai mesuré, il bat toutes les autres configurations.

Jetez un œil à cette configuration: http://interfacelab.com/nginx-php-fpm-apc-awesome/

Je l'ai configuré presque de la même manière, sauf que j'utilise des packages PHP à partir de http://www.dotdeb.org/ - qui inclut un package php-fpm et un script init prêt à l'emploi. Je n'utilise ni memecache ni syck.

pauska
la source
stackoverflow.com/questions/78108/… l'a obtenu d'ici et j'ai vérifié le manuel php et il est dit que php_mod fournit un avantage significatif sur les versions cgi. Votre configuration semble bonne. Cela semble très facile aussi. Je vais y jeter un œil :)
Sammaye
2
Il indique que CGI est beaucoup plus lent qu'un module intégré - pas FastCGI :)
pauska
1
Eh bien - si vous vous inquiétez de la disparition (ou de la temporisation) des processus PHP, FastCGI (ou PHP-FPM) est la solution. Il peut tuer les enfants morts sans interrompre d'autres activités.
pauska
1
Oui. Ou bien, cela dépend. Combien (maximum) de requêtes lentes allez-vous traiter en même temps? Définissez le nombre maximal de threads PHP FPM sur celui-ci, plus le nombre de cgi "rapides" que vous souhaitez avoir. J'ai entendu parler de personnes exécutant 200 enfants PHP-FPM sur un serveur avec 4 Go de RAM, donc je ne m'inquiéterais pas trop à ce sujet si j'étais vous. La prochaine version de PHP (5.3.3) inclura PHP-FPM par défaut, où un moteur adpatif est également inclus - il évoluera en fonction du nombre de demandes en attente.
pauska
1
Je serais facilement en cours d'exécution sur plusieurs serveurs (peut-être jusqu'à 10), mais si je peux répondre à 200 demandes pouvant être interrogées longtemps sur un serveur de 4 Go, cela devrait presque la moitié du serveur 20, j'aurais besoin d'exécuter Apache. hmmmm ... Je vais devoir tester ça ce soir
Sammaye