Können Sie sich auf Nginx als Ihren einzigen Webserver für PHP / MySQL verlassen?

7

Können Sie sich darauf verlassen, dass Nginx Ihr einziger Webserver ist? Ich weiß, dass es in Bezug auf die Leistung gut funktioniert, aber wie funktioniert es in Bezug auf die Sicherheit? Ich weiß, dass Apache stabil ist und ModSecurity hat. Dies ist bei Nginx nicht der Fall.

Ich werde Nginx nur als Webserver und nur für dynamische Inhalte verwenden. Alle meine statischen Inhalte werden von einem CDN geliefert.

Saif Bechan
quelle
Ihre Frage ist zu allgemein. Ich denke, es wäre sinnvoller, wenn Sie hinzufügen würden, was Sie von Nginx in Bezug auf Sicherheit / Stabilität erwarten.
Alexander Azarov
Ich weiß nicht wirklich, wie ich genauer sein soll. Ich werde eine PHP / MySQL-Website auf dem Server betreiben. Gibt es einige schwerwiegende Nachteile bei der Verwendung von nur Nginx?
Saif Bechan
Was würden Sie von einem guten Webserver erwarten?
Saif Bechan
Ich habe Nginx (nur) auf meiner ziemlich geschäftigen Website und bin absolut zufrieden damit.
Alexander Azarov

Antworten:

11

nginx führt dynamischen Inhalt durch 'Reverse Proxy' zu einem FastCGI-Server aus. Das PHP-CGI-Paket in den meisten Distributionen enthält den Fast-CGI-Modus, in dem PHP einen kleinen FCGI-Server startet, mit dem Sie auch Nginx verbinden können.

Mit dieser Trennung können Sie clevere Dinge tun:

  1. Die meisten dynamischen Sprachen (PHP, Perl, Ruby, Python) bieten die Möglichkeit, fcgi-Anwendungen auszuführen
  2. Sie können dynamische Inhalte als verschiedene Konten ausführen. Oder sogar unter verschlungenen Pfaden. Auf einem VPS, den ich für ein paar Freunde verwalte, hat jeder Benutzer seinen eigenen FCGI-Server, auf dem seine eigenen Konten ausgeführt werden. Wenn ihre Software komprimiert ist, kann der Angreifer nur bis zu diesem Benutzerkonto gelangen.
  3. Es unterstützt einen einfachen Scale-Out-Pfad für die meisten Anwendungen. nginx auf einem bestimmten Server kann wahrscheinlich mehr statische als dynamische Belastungen verarbeiten. Sie können einem Upstream-Abschnitt auf nginx mehrere Hosts hinzufügen und nach Bedarf weitere Backends hinzufügen (die Skalierung Ihrer Datenbank und Ihres Dateisystems bleibt jedoch Ihnen überlassen).
  4. Wenn Sie mehrere Ports mit einem Upstream-Abschnitt und einem einzelnen Host verwenden, können Sie die Wep-App ohne Ausfallzeiten neu starten: (1) Starten Sie php-fcgi an einem anderen Port. (2) Beenden Sie php-fcgi am ursprünglichen Port. nginx leitet Anforderungen automatisch von einem Port zum anderen um
  5. Bessere Speichernutzung. Mit Apache / Mod_Security / Mod_php hat jeder Apache-Prozess alle diese Module im Speicher geladen. Während zwischen Prozessen ein Copy-on-Write-Speicher vorhanden ist, wird diese Speicherseite kopiert, sobald jeder Prozess eine Seite ändert. Durch die Trennung dieser Aufgaben kann nginx einen relativ kleinen Speicherbedarf beanspruchen, eine dedizierte Webanwendungs-Firewall (ips / ids-Gerät, dedizierter Reverse-Proxy-Server) einrichten und die Speicherrichtlinie in Ihrer PHP-Anwendung separat verwalten.

Aktualisiert: Per Kommentar unten, hier sind einige Links:

fastcgi_pass param - Auf diese Weise weisen Sie nginx an, eine Anforderung an einen fastcgi-Server zu übergeben. FastCGI übergibt Variablen (die absichtlich wie CGI-Umgebungsvariablen aussehen), ermöglicht Ihnen jedoch die Übertragung beliebiger Daten vom Front-End zum Back-End. In der Debian-Distribution (und auch in der Quelldistribution, iirc) gibt es eine fastcgi.conf-Datei, die alle Standardparameter enthält, die die meisten Toolkits benötigen, um auf den Markt zu kommen

Upstream-Modul - Mit dem Upstream-Modul können Sie mehrere Upstream-Server definieren, die andere Webserver, Fastcgi-Server oder andere sein können. Das fastcgi_pass-Modul enthält ein kurzes Beispiel, das Upstream verwendet. Beachten Sie, dass Sie auf einem Single-Host-System sogar Unix-Domain-Sockets verwenden können und keinen TCP / IP-Overhead verursachen!

PHPFCGI-Beispiel - Hier wird eine vollständige Beispielkonfiguration beschrieben. Ich persönlich bin ein Fan von Daemontools (oder Runit, wenn Sie kein DJB-Fan sind) und habe sehr einfache Wrapper geschrieben, um php-fcgi unter Prozessüberwachung auszuführen (die neu gestartet werden, wenn es abnormal beendet wird), aber das auf dieser Seite bereitgestellte Skript ist ein Skript im SysV-Stil, das Sie in /etc/init.d/ werfen und die entsprechenden Links in /etc/rcX.d/ hinzufügen können. Im Skript auf dieser Seite gibt es einige Variablen, die Sie anpassen können, um die Umgebung anzupassen, in der Ihre fcgi-Anwendung ausgeführt wird.

Virtuelles Hosting wird durch "Server" -Abschnitte erleichtert:

server { 
     server_name www.host.com host.com other_aliases;
     ... 
}
server { 
     server_name www.host2.com host2.com other_aliases;
     ...
}

Weitere Informationen finden Sie im Abschnitt zu Servername . Auf der restlichen Seite finden Sie zahlreiche Informationen zur Konfiguration des Corehttp-Moduls.

In Bezug auf die Sicherheit nimmt Igor (Hauptentwickler) die Sicherheit ernst und nimmt häufig an ihrer sehr aktiven Mailingliste teil. Hier ist eine Liste der anerkannten Sicherheitsprobleme und hier eine Liste des Mailinglistenarchivs

Jason
quelle
Das ist interessant. Können Sie auf eine Dokumentation verweisen, die uns zeigt, wie Sie nginx für diese Aufgaben konfigurieren können?
Matt Simmons
+1 Schöne Punkte hier gemacht. Auch ich interessiere mich für einige Konfigurationsdokumente zu diesem Thema. Besonders die Erstellung des virtuellen Hosts ist etwas, das ich definitiv brauche.
Saif Bechan
Ihr solltet euch unbedingt das Wiki ansehen, das auf der Nginx-Seite selbst verlinkt ist. Es hat alles, was Sie wissen müssen.
Martin Fjordvald
3

Ich führe nginx mit php-fcgi auf einem hoch geladenen Server aus, es funktioniert total erstaunlich.

Sicherheit ist eine Sache, die Sie selbst erstellen. Immer. Bitte machen Sie keinen Fehler, indem Sie sich auf eine Software verlassen, die Sie auf magische Weise schützt, wenn es um echte Probleme geht. Es wird nicht. Gute Codierung und Verwaltung wird.

edk
quelle
+1 Vielen Dank für diesen Einblick. Ich werde diese Methode ausprobieren und Apache alle zusammen überspringen. Können Sie mir einige Links empfehlen, um sicherzustellen, dass ich über einige Sicherheitsprobleme des Bürgermeisters informiert bin?
Saif Bechan
Ich bin mir nicht sicher, ob es eine vollständige Anleitung gibt, aber ich habe hier einige häufige Fehler bei der PHP-Codierung gezeigt, die zu Sicherheitsproblemen führen: linuxquestions.org/linux/answers/security/… Und es gibt viele andere detailliertere Handbücher über das Internet . Was ist mit Nginx & Apache? Ja, ich denke, es ist meine Fehlkonfiguration (ich musste die System- und Nginx-Konfigurationen optimieren, damit es so schnell funktioniert), aber Apache httpd frisst viel mehr Ressourcen, das ist offensichtlich, deshalb verwenden wir Nginx.
Edk
1
Die folgende Anleitung hat mir geholfen, von Apache + mod_php zu einem vollständigen Setup von nginx + php-fpm (fastcgi) überzugehen und den über 30 Sites, die ich auf meinem Server ausführe, enorme Leistungssteigerungen zu bieten. In diesem Handbuch wird nicht die Standard-PHP-CGI-Binärdatei verwendet, sondern es wird erläutert, warum und der PHP-FPM-Code, den es in die PHP-Quelle patcht, in Zukunft tatsächlich Teil des offiziellen PHP-Kerns sein wird. Es braucht etwas Geduld und Zeit, um zum Laufen zu kommen, läuft aber trotzdem sehr gut, für mich trotzdem. Wird sehr von Ihren Anwendungen und dem Server abhängen. Der Leitfaden: interfacelab.com/nginx-php-fpm-apc-awesome
Brian Cline
Vielen Dank an beide, die diese Informationen geteilt haben. Dies ist ein ziemlich großer Schritt in einer Produktionsumgebung. Ich muss das mit großer Vorsicht angehen.
Saif Bechan
-4

Ich hatte den Eindruck, dass Nginx nur statische Inhalte bereitstellen kann? Dies macht PHP zu einer "Mission unmöglich"

Solefald
quelle
3
Nein, es ist möglich, wiki.nginx.org/NginxConfiguration#PHP_via_FastCGI
Saif Bechan
Nginx ist ein Reverse-Proxy, der so ziemlich alles bedienen kann, was Sie wollen, nicht nur FastCGI.
Martin Fjordvald