2017-02-10 7 views
4

Ich versuche, eine Website mit einer Synology mit PHP 5.6 und Nginx einzurichten. Die Website ist WordPress und ein Thema. Bei der Verarbeitung eines Demo-Imports haben wir einen NGINX-Fehler 405 (nicht erlaubt).Nginx - 405 NICHT ERLAUBT - FastCgi Timeout

Es ist irgendwie frustrierend, weil ich mag, wenn die Dinge richtig gemacht werden.

Ich habe in der php.ini-Datei und der nginx.conf-Datei gesucht.

# Copyright (c) 2000-2016 Synology Inc. All rights reserved. 

worker_processes  auto; 
#worker_cpu_affinity auto; 
worker_rlimit_nofile 65535; 

include conf.d/main.conf; 

events { 
    use    epoll; 
    multi_accept on; 
    worker_connections 1024; 

    include conf.d/events.conf; 
} 

http { 
    include   mime.types; 
    default_type application/octet-stream; 

    log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
     '$status $body_bytes_sent "$http_referer" ' 
     '"$http_user_agent" "$http_x_forwarded_for"'; 

    access_log off; 
    #access_log syslog:server=unix:/dev/log,facility=local7,tag=nginx_access,nohostname main; 
    error_log syslog:server=unix:/dev/log,facility=local7,tag=nginx_error,nohostname error; 

    sendfile  on; 
    server_tokens off; 

    proxy_request_buffering  off; 
    fastcgi_request_buffering off; 
    scgi_request_buffering  off; 

    proxy_buffering  off; 
    fastcgi_buffering off; 
    scgi_buffering  off; 

    resolver_timeout    5s; 
    client_header_timeout   10s; 
    client_body_timeout   60s; 
    send_timeout     60s; 
    keepalive_timeout    65s 20s; 
    client_max_body_size   0; 
    server_names_hash_max_size 8192; 

    ssl_certificate   /usr/syno/etc/certificate/system/default/fullchain.pem; 
    ssl_certificate_key  /usr/syno/etc/certificate/system/default/privkey.pem; 
    ssl_protocols    TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers    ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA; 
    ssl_dhparam    /usr/syno/etc/ssl/dh2048.pem; 
    ssl_prefer_server_ciphers on; 

    gzip_disable "msie6"; 
    gzip_min_length 1000; 
    gzip_types  text/plain text/css application/javascript application/json; 
    gzip_vary  on; 
    gzip_static  on; 

    upstream synoscgi { 
     server unix:/run/synoscgi.sock; 
    } 

    index index.html index.htm index.php; 

    set_real_ip_from 127.0.0.1; 
    real_ip_header X-Real-IP; 

    server { 
     listen 5000 default_server; 
     listen [::]:5000 default_server; 

     server_name _; 

     gzip on; 

     include app.d/alias.*.conf; 
     root /usr/syno/synoman; 
     index index.cgi; 

     ignore_invalid_headers off; 

     include app.d/dsm.*.conf; 
     include /usr/syno/share/nginx/conf.d/dsm.*.conf; 
     include conf.d/dsm.*.conf; 

     location =/{ 
      try_files $uri /index.cgi$is_args$query_string; 
     } 

     location ~ ^/volume(?:X|USB|SATA|Gluster)?\d+/ { 
      internal; 

      root /; 

      include app.d/x-accel.*.conf; 
      include conf.d/x-accel.*.conf; 
     } 

     location ~ /webman/modules/(PersonalSettings|ExternalDevices|FileBrowser)/index_ds.php$ { 
      alias /usr/syno/share/OAuth/index_ds.php; 
      default_type text/html; 
     } 

     location ~ \.cgi { 
      include    scgi_params; 
      scgi_read_timeout 3600s; 
      scgi_pass   synoscgi; 
     } 

     error_page 403 404 500 502 503 504 @error_page; 

     location @error_page { 
      root /usr/syno/share/nginx; 
      rewrite (.*) /error.html break; 
     } 

     location ~ ^/webman/modules/Indexer/ { 
      deny all; 
     } 

     location ~ ^/webapi/lib/ { 
      deny all; 
     } 

     location ~ ^/webapi/(:?(:?.*)\.lib|(:?.*)\.api|(:?.*)\.auth|lib.def)$ { 
      deny all; 
     } 

     location ~ /\. { access_log off; log_not_found off; deny all; } 

     location ~* \.(?:js|css|png|jpg|gif|ico)$ { 
      access_log off; 
      log_not_found off; 
     } 

     location = /favicon.ico { 
      access_log off; 
      log_not_found off; 
     } 

     location = /robots.txt { 
      allow all; 
      access_log off; 
      log_not_found off; 
     } 

    } 

    server { 
     listen 5001 default_server ssl; 
     listen [::]:5001 default_server ssl; 

     server_name _; 

     include app.d/alias.*.conf; 
     root /usr/syno/synoman; 
     index index.cgi; 

     ignore_invalid_headers off; 

     include app.d/dsm.*.conf; 
     include /usr/syno/share/nginx/conf.d/dsm.*.conf; 
     include conf.d/dsm.*.conf; 

     location =/{ 
      try_files $uri /index.cgi$is_args$query_string; 
     } 

     location ~ ^/volume(?:X|USB|SATA|Gluster)?\d+/ { 
      internal; 

      root /; 

      include app.d/x-accel.*.conf; 
      include conf.d/x-accel.*.conf; 
     } 

     location ~ /webman/modules/(PersonalSettings|ExternalDevices|FileBrowser)/index_ds.php$ { 
      alias /usr/syno/share/OAuth/index_ds.php; 
      default_type text/html; 
     } 

     location ~ \.cgi { 
      include    scgi_params; 
      scgi_read_timeout 3600s; 
      scgi_pass   synoscgi; 
     } 

     error_page 403 404 500 502 503 504 @error_page; 

     location @error_page { 
      root /usr/syno/share/nginx; 
      rewrite (.*) /error.html break; 
     } 

     location ~ ^/webman/modules/Indexer/ { 
      deny all; 
     } 

     location ~ ^/webapi/lib/ { 
      deny all; 
     } 

     location ~ ^/webapi/(:?(:?.*)\.lib|(:?.*)\.api|(:?.*)\.auth|lib.def)$ { 
      deny all; 
     } 

     location ~ /\. { access_log off; log_not_found off; deny all; } 

     location ~* \.(?:js|css|png|jpg|gif|ico)$ { 
      access_log off; 
      log_not_found off; 
     } 

     location = /favicon.ico { 
      access_log off; 
      log_not_found off; 
     } 

     location = /robots.txt { 
      allow all; 
      access_log off; 
      log_not_found off; 
     } 

    } 

    server { 
     listen 80 default_server; 
     listen [::]:80 default_server; 
     listen 443 default_server ssl; 
     listen [::]:443 default_server ssl; 

     server_name _; 

     location ~ ^/volume(?:X|USB|SATA|Gluster)?\d+/ { 
      internal; 

      root /; 

      include app.d/x-accel.*.conf; 
      include conf.d/x-accel.*.conf; 
     } 

     include app.d/www.*.conf; 
     include app.d/alias.*.conf; 
     include /usr/syno/share/nginx/conf.d/www.*.conf; 
     include conf.d/www.*.conf; 

     location = /webman/pingpong.php { 
      rewrite /webman/pingpong.php /webman/pingpong.cgi break; 

      root /usr/syno/synoman; 
      include scgi_params; 
      scgi_pass synoscgi; 
     } 

     location = /webdefault/images/logo.jpg { 
      alias /usr/syno/share/nginx/logo.jpg; 
     } 

     error_page 405 =200 $uri; 

     location ~* \.php$ { 
      include fastcgi_params; 
      fastcgi_index index.php; 
      fastcgi_read_timeout 240; 
      fastcgi_pass 127.0.0.1:9000; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     } 


     error_page 403 404 500 502 503 504 @error_page; 

     location @error_page { 
      root /usr/syno/share/nginx; 
      rewrite (.*) /error.html break; 
     } 

     location ^~ /.well-known/acme-challenge { 
      root /var/lib/letsencrypt; 
      default_type text/plain; 
     } 

     include app.d/.location.webstation.conf*; 

     location ~ ^/$ { 

      if ($scheme = https) { 
       rewrite/https://$host:5001/ redirect; 
      } 

      rewrite/http://$host:5000/ redirect; 

     } 
    } 

    include conf.d/http.*.conf; 
    include app.d/server.*.conf; 
    include sites-enabled/*; 
} 

Ich habe viel im Internet gesucht und bisher nur einige interessante Leads aber nichts funktionierte.

Ich habe versucht, das Folgende zur nginx.conf hinzuzufügen (deshalb hat meine aktuelle nginx.conf diese Zeilen), aber es hat mein Problem nicht gelöst.

location ~* \.php$ { 
     include fastcgi_params; 
     fastcgi_index index.php; 
     fastcgi_read_timeout 240; 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    } 

Informationen, hier ist der Fehler in Protokolldatei:

2017/02/10 18:14:07 [Fehler] 18555 # 18555: * 2563 Upstream timed out (110: Zeitüberschreitung der Verbindung) beim Lesen des Response-Headers von Upstream, Client: xxx.xxx.xxx.xxx, Server: example.com, Anfrage: "POST /wp-admin/admin-ajax.php HTTP/1.1", Upstream: "fastcgi: // unix: /run/php-fpm/php56-fpm.sock", Host: "www.beispiel.com", Referrer: http://example.com/wp-admin/admin.php?page=laborator-demo-content-installer&install-pack=agency&

Wenn Sie eine Idee haben, dieses Problem zu lösen ... weil ich jetzt seit einigen Wochen zu kämpfen habe ... Vielen Dank im Voraus

+0

können Sie diese gelöst werden? Ich habe das gleiche Problem und nach einer Woche oder so der Suche bin ich hier gelandet ... – LukeP

+0

@LukeP sehe meine Antwort. Wenn es immer noch nicht funktioniert, poste bitte den Kern deiner error_page-Direktiven, da sie der Schlüssel dazu sind. – mknecht

+0

@mknecht Danke. Ich habe es am Ende funktioniert. Kann mich nicht erinnern, was es war, aber es war spezifisch für meine Umgebung. Ich verwende ResourceSpace DAM auf dem Synology NAS und die Konfiguration wird von Synology DSM verwaltet, die die Konfigurationsänderungen ersetzen würde, die ich bei jedem Neustart des Webservers vorgenommen habe, um sie anzuwenden. – LukeP

Antwort

3

tl; dr-Wordpress ist zu langsam . Springe nach unten, um zu sehen, wie du NGINX dazu bringen kannst, dir den richtigen 504 GATEWAY TIMEOUT Statuscode zurückzugeben.

Die längere Version: Sie haben eine Reihe von separaten Problemen, die auf nicht hilfreiche Weise zusammenarbeiten.

1. Wordpress, die Upstream-Server reagiert nicht schnell genug

Es dauert länger als 4 Minuten, das ist, warum Sie ein 110: Connection timed out in Ihren Protokollen zu sehen. Die Lösung zur Langsamkeit soll WordPress beschleunigen. Um dieses Problem zu umgehen, können Sie der Anfrage mehr Zeit geben. Erhöhen Sie dazu die Nummer in Ihrer fastcgi_read_timeout 240; Regel. Beachten Sie, dass die Zeitüberschreitung in Sekunden angegeben wird. Wenn Sie also 10 Minuten warten möchten, legen Sie dies auf 600 fest.

Ich würde jedoch davon abraten, die Zeitüberschreitung zu erhöhen. Sie sollten das Leistungsproblem selbst ansprechen. Solch lange Anfragen blockieren Ressourcen in NGINX und WordPress und ermöglichen es Ihnen daher, DDoSed ganz einfach zu werden, sogar versehentlich von Ihnen selbst.

Da Ihr Upstream zu lange dauert, antwortet NGINX mit einem 504 GATEWAY TIMEOUT. Es kann nicht, weil ...

2. POST-Anfragen können nicht mit statischen Dateien

In Ihrem error_page Ort beantwortet werden, sind Sie NGINX sagen statische Dateien zu verwenden, um die Anforderungen zu verarbeiten.Das ist in Ordnung für GET oder HEAD, aber es funktioniert nicht für POST, weil es NGINX bitten würde, Dateien zu überschreiben/zu erstellen. Das ist weder beabsichtigt noch wird es von NGINX unterstützt. (Der Antrag würde nicht auch andere modifizierende Verben wie PUT und DELETE verwenden, aus dem gleichen Grund.)

Beachten Sie, dass Sie eine benannte Stelle verwenden, @error_page, für die die method remains POST, as the manual says:

If there is no need to change URI and method during internal redirection it is possible to pass error processing into a named location. 

Sie kennen Sie schon einen Teil davon, weshalb Sie die error_page 405 =200 $uri; Regel hinzugefügt haben. Leider ist dies Sie nicht retten, weil ...

3. Interne error_page Umleitungen nicht standardmäßig rekursiv sind

Dies ist nicht für die error_page Handbuch in der Dokumentation erwähnt, soweit ich sehen kann, aber es ist in der Dokumentation der folgenden Richtlinie erwähnt:

Umgehung: Aktivieren rekursive error_page Umleitungen

Th Die Direktive recursive_error_pages ermöglicht es Ihnen, aufgetretene Fehler zu behandeln während ein vorheriger Fehler behandelt wird. Aus der Dokumentation:

Enables or disables doing several redirects using the error_page directive. The number of such redirects is limited. 

Wenn Sie diese aktivieren, indem recursive_error_pages on; in Ihren Server-Block setzt, werden Sie erlauben, die error_page 405 Richtlinie Leider

zu treten, sind da Sie immer noch die gleiche Ressource anfordert. Mit Ihrem $uri Teil wird WordPress für die gleiche URL erneut abgefragt, diesmal mit einer GET-Anfrage. Keine Ahnung, wie Ihr WordPress das handhabt, aber Chancen sind der Fehler, der dann auftreten wird, wird Ihnen nicht helfen, dies zu debuggen.

Das ist wirklich nur das Problem herumspringen; Was Sie bekommen sollten, ist das Original 504. Daher empfehle ich Sie die folgenden tun, statt rekursive Fehlerseite ermöglichen Umleitungen:

Lösung: Verwenden Sie GET auf Ihre Fehlerseiten

holt ich nehme an, Sie immer noch Ihre error.html sogar auf einem zurückkehren wollen POST-Anfrage Dazu müssen Sie NGINX zwingen, die POST fallen zu lassen und den Fehler mit GET zu behandeln, so dass statische Dateien verwendet werden können. Der einzige Weg, den ich gefunden habe, ist, keinen benannten Ort zu benutzen (die mit @ am Anfang), sondern stattdessen einen internal.

Um diese Option zu verwenden, ändern Sie Ihre @error_page Lage einen pseudo-Pfad zu schließen und die internal Richtlinie, zum Beispiel wie folgt:

location /error_page { 
     internal; 
     root /usr/syno/share/nginx; 
     rewrite (.*) /error.html break; 
    } 

Danach ändert die error_page Richtlinie, den neuen Standort zu verwenden:

error_page 403 404 500 502 503 504 /error_page; 

Ressourcen:

+0

Ich habe die obigen Fehler zusammengefasst, und andere, die ich in der read_page-Direktive in diesem Blogpost gefunden habe, hoffentlich ist es hilfreich für jemanden (wahrscheinlich ich in der Zukunft): http://muratknecht.de/tech/why-nginx-returns-405 -post-504-gateway-timeout-gotchas-fehlerseite / – mknecht

Verwandte Themen