it-swarm.com.de

Optimieren Sie Nginx + PHP-FPM für schnellere Antwortzeiten (für Openx Adserving)

Zurzeit betreibe ich Nginx + PHP-FPM für die Schaltung von Anzeigen unter OpenX. Derzeit sind meine Antwortzeiten auch in Zeiten niedriger Last schrecklich. Meine CPU- und Arbeitsspeicherressourcen sind jedoch in Ordnung, so dass ich den Flaschenhals nicht herausfinden kann.

Meine aktuelle Konfiguration für Nginx und PHP-Fpm ist:

worker_processes 20;
worker_rlimit_nofile 50000;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  15000;
    multi_accept off;
    use epoll;
}

http {
    include       /etc/nginx/mime.types;

    access_log  /var/log/nginx/access.log;

    sendfile        on;
    tcp_nopush     off;

    keepalive_timeout  0;
    #keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    gzip_comp_level 2;
    gzip_proxied    any;
    gzip_types    text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

server {
    listen   80;
    server_name  localhost;
    access_log  /var/log/nginx/localhost.access.log;

# Default location
    location / {
        root   /var/www;
        index  index.php;
    }

## Parse all .php file in the /var/www directory
    location ~ .php$ {
        fastcgi_pass   localhost:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_param  QUERY_STRING     $query_string;
        fastcgi_param  REQUEST_METHOD   $request_method;
        fastcgi_param  CONTENT_TYPE     $content_type;
        fastcgi_param  CONTENT_LENGTH   $content_length;
        fastcgi_ignore_client_abort     off;
    }

PHP-FPM:
rlimit_files = 50000
max_children = 500

Ich habe nur die PHP-FPM-Parameter aufgenommen, die ich für PHP-FPM geändert habe.

Hat jemand Tipps, wie ich ihn optimieren kann, um weitere Anfragen bearbeiten zu können? Ich sehe jetzt schreckliche Reaktionszeiten.

20
Fariz

Zunächst einmal sind viel zu viele Arbeiter und Grenzen zu hoch eingestellt. Allein die maximale Anzahl der Worker für PHP-Fpm würde Ihren Server stark beeinträchtigen. Das Aufdecken der Grenzwerte auf einem Server beschleunigt dies nicht notwendigerweise, kann jedoch den gegenteiligen Effekt haben.

  1. Worker Count: 20 macht wenig Sinn, wenn Sie nicht über eine 20-Prozessor/Core-Maschine verfügen. Sie verursachen tatsächlich einen negativen Effekt, da die Worker übermäßig viele Inhalte austauschen. Wenn Sie einen Dual-Core-Prozessor betreiben, sollten 2 Arbeiter ausreichen. 

  2. Worker Connections: Auch wenn Sie ein Limit in den Himmel werfen, werden Ihre Probleme nicht gelöst. Wenn Ihre Ausgabe von ulimit -n in etwa 1024 ist, müssen Ihre Worker-Verbindungen auf 1024 oder weniger (möglicherweise sogar 768) eingestellt werden. Es ist unwahrscheinlich, dass Sie 2 x 1024 gleichzeitige Verbindungen haben, insbesondere mit PHP. 

  3. Root-Speicherort und PHP -Einstellungen finden Sie unter http://wiki.nginx.org/Pitfalls . Dies funktioniert am besten, wenn Sie Ihre Root-Direktive auf die Ebene des Servers {} setzen, nicht auf die Standortebene. Sobald Sie dies getan haben, können Sie $ document_root $ fastcgi_script_name als SCRIPT_FILENAME-Wert verwenden, da $ document_root automatisch in darunterliegende Positionsblöcke weitergegeben wird. 

  4. Sie möchten statische Dateien direkt behandeln, mit anderen Worten:

    location ~* \.(ico|css|js|gif|jpe?g|png)$ {
        expires max;
        add_header Pragma public;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    }
    
  5. Verwenden Sie einen PHP - Accelerator, nämlich APC (mit apc.enabled = 1 in php.ini) oder XCache, und achten Sie auf Ihre PHP-Einstellungen, z. B. memory_limit. Wenn Sie beispielsweise nur über ein System mit 2 GB RAM verfügen, ist es wenig sinnvoll, 500 Arbeiter mit einem Limit von jeweils 128 MB zuzulassen. Dies gilt insbesondere, wenn Sie auch andere Dienste auf Ihrem Server ausführen. 

70
KBeezie

Wäre auch nützlich zu setzen:

access_log off;

Wie ich vermute, kümmert es Sie nicht wirklich um die Protokollierung dieser Anfragen.

6
zmf

Sie sollten auf jeden Fall die Anzahl der Arbeiter reduzieren, da ich bezweifle, dass Sie über 20 Kerne/Prozessoren verfügen. Außerdem würde ich in Ihren Datenbankserver schauen. Es besteht die Möglichkeit, dass das Problem vorliegt.

Außerdem haben Sie worker_rlimit_nofile auf 50000 gesetzt. Ich hoffe, Sie wissen, dass das Betriebssystem normalerweise den Grenzwert auf 1024 (Standard) setzt. Sie können versuchen, den aktuellen Grenzwert abzufragen, indem Sie ulimit -n eingeben.

Sie können den Grenzwert für NOFILE (Anzahl offener Dateien) erhöhen, indem Sie diesen Befehl ulimit -n 50000 in init.d ausführen oder diese andere Frage zu stackoverflow aufrufen, um zu erfahren, wie Sie limits.conf verwenden, um systemweit Grenzwerte dauerhaft festzulegen.

4
user145633

Mit nginx und php5-fpm die Leistung zu maximieren, ist eine Kunst. Es braucht wirklich ein Verständnis der Inhalte, die Sie anbieten.

Beispielsweise sehe ich keine try_files-Verwendung oder irgendeine Art von Zwischenspeicherung in Ihrer Konfiguration. Wissen Sie, dass Nginx über eine integrierte Memcache-Unterstützung verfügt? Sie können Bilder und html/css sowie PHP-Seiten zwischenspeichern. Wenn Sie hauptsächlich für Klicks sorgen, werden diese Klicks auch dann gezählt, wenn dies nicht der Fall ist.

Setzen Sie Ihre Banner in ein tmpfs-Mount, protokollieren Sie nicht access_log oder error_log, deaktivieren Sie nicht benötigte Module in php, verwenden Sie eine aktuelle Version von mysql, verwenden Sie innodb, um die Tabellensperre zu reduzieren, spielen Sie mit der Spülmethode von innodb, um die Festplatte zu reduzieren Schreibt die maximalen Speichertabellen in mysql, um die Erstellung temporärer Dateien auf der Festplatte zu reduzieren, wenn Joins über SQL usw. angefordert werden.

Nginx ist nur ein Teil einer sehr großen und komplexen Formel. Ich habe nicht einmal Kernel-Parameter erwähnt, um die TCP - Stack- und Netzwerkkarten-Performance, die Swap-Nutzung, die Speicherauslastung oder die gzip-Komprimierung von HTML/CSS zu optimieren, die Sie über OpenX bereitstellen können (falls vorhanden).

Und ja, wie auch die anderen, die ich oben erwähnt habe, sehen Ihre Einstellungen zu übertrieben aus und zeigen, dass grundlegende Optimierungskonzepte nicht verstanden werden. Mit anderen Worten, einen Profi einstellen :-)

3
Skaag Argonius

haben Sie 20 Prozessoren oder Kerne auf Ihrer Maschine? Vielleicht probieren Sie auch Events mit dem Standard für Ihr Betriebssystem ... vielleicht mehr Fcgi-Prozesse statt mehr Nginx ... Wahrscheinlich reicht es aus, mit 2 - 4 Nginx-Workern zu beginnen ...

1
Todd

Auf jeden Fall können Arbeiter, wie die Leute erwähnt haben. Ich persönlich bevorzuge XCache gegenüber APC für das Zwischenspeichern von PHP-Code. Sie sollten sich die Konfiguration im modifizierten centmin auto bash Shell nginx/php-fpm Installationsskript http://vbtechsupport.com/796/ ansehen.

0
p4guru