Nginx

頁面僅在您重新啟動 php-fpm 時載入

  • May 29, 2020

所以這裡是 GIF 中的更多上下文

在此處輸入圖像描述

請注意頁面不會在連結點擊時載入,但是一旦您執行service php7.2-fpm restart它就會立即載入頁面,並且每個頁面都如此。

這是什麼原因造成的?

我在 WSL2 Ubuntu 18.04、Nginx、PHP7、MariaDB 上,該網站是 Drupal 8 的全新安裝,這是一個本地主機。

如果您不重新啟動 php-fpm,那麼慢速頁面實際上會載入,但僅在等待 1-2 分鐘後才會載入。

nginx.conf(預設)

   user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
   worker_connections 768;
   # multi_accept on;
}

http {

   ##
   # Basic Settings
   ##

   sendfile on;
   tcp_nopush on;
   tcp_nodelay on;
   keepalive_timeout 65;
   types_hash_max_size 2048;
   # server_tokens off;

   # server_names_hash_bucket_size 64;
   # server_name_in_redirect off;

   include /etc/nginx/mime.types;
   default_type application/octet-stream;

   ##
   # SSL Settings
   ##

   ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
   ssl_prefer_server_ciphers on;

   ##
   # Logging Settings
   ##

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

   ##
   # Gzip Settings
   ##

   gzip on;

   # gzip_vary on;
   # gzip_proxied any;
   # gzip_comp_level 6;
   # gzip_buffers 16 8k;
   # gzip_http_version 1.1;
   # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

   ##
   # Virtual Host Configs
   ##

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


#mail {
#   # See sample authentication script at:
#   # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
#   # auth_http localhost/auth.php;
#   # pop3_capabilities "TOP" "USER";
#   # imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
#   server {
#       listen     localhost:110;
#       protocol   pop3;
#       proxy      on;
#   }
# 
#   server {
#       listen     localhost:143;
#       protocol   imap;
#       proxy      on;
#   }
#}

Drupal Nginx 配置

server {
       listen 8080;
       listen [::]:8080;
       server_name d8.local;
   root /var/www/d8.local/web;

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

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

   # Very rarely should these ever be accessed outside of your lan
   location ~* \.(txt|log|twig|yml)$ {
       allow 192.168.0.0/16;
       deny all;
   }

   location ~ \..*/.*\.php$ {
       return 403;
   }

   location ~ ^/sites/.*/private/ {
       return 403;
   }

   # Block access to scripts in site files directory
   location ~ ^/sites/[^/]+/files/.*\.php$ {
       deny all;
   }

   # Allow "Well-Known URIs" as per RFC 5785
   location ~* ^/.well-known/ {
       allow all;
   }

   # Block access to "hidden" files and directories whose names begin with a
   # period. This includes directories used by version control systems such
   # as Subversion or Git to store control files.
   location ~ (^|/)\. {
       return 403;
   }

### advagg_css and advagg_js support
  #location ~* files/advagg_(?:css|js)/ {
   location ~* /sites/default/files/js/.*\.js$ {
       access_log off;
       expires 1w;
       add_header ETag "";
       add_header Cache-Control "max-age=2628000, no-transform, public";
       try_files $uri $uri/ @rewrite;
   }

   location ~* /sites/default/files/css/.*\.css$ {
       access_log off;
       expires 1w;
       add_header ETag "";
       add_header Cache-Control "max-age=2628000, no-transform, public";
       try_files $uri $uri/ @rewrite;
   }

   #location ~* \.(?:css|js|ico|gif|jpeg|jpg|png|woff|ttf|otf|svg|woff2|eot)$ {
   #    expires 1w;
   #    add_header ETag "";
   #    add_header Cache-Control "max-age=2628000, no-transform, public";
   #}

   location / {
       # try_files $uri @rewrite; # For Drupal <= 6
       try_files $uri /index.php?$query_string; # For Drupal >= 7
   }

   location @rewrite {
       rewrite ^/(.*)$ /index.php?q=$1;
   }

   # Don't allow direct access to PHP files in the vendor directory.
   location ~ /vendor/.*\.php$ {
       deny all;
       return 404;
   }

   # Block access to all /vendor/ files.
   location ^~ /vendor/ {
     deny all;
     return 404;
   }


   # In Drupal 8, we must also match new paths where the '.php' appears in
   # the middle, such as update.php/selection. The rule we use is strict,
   # and only allows this pattern with the update.php front controller.
   # This allows legacy path aliases in the form of
   # blog/index.php/legacy-path to continue to route to Drupal nodes. If
   # you do not have any paths like that, then you might prefer to use a
   # laxer rule, such as:
   #   location ~ \.php(/|$) {
   # The laxer rule will continue to work if Drupal uses this new URL
   # pattern with front controllers other than update.php in a future
   # release.
   location ~ '\.php$|^/update.php' {
       fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
       # Security note: If you're running a version of PHP older than the
       # latest 5.3, you should have "cgi.fix_pathinfo = 0;" in php.ini.
       # See http://serverfault.com/q/627903/94922 for details.
       include fastcgi_params;
       # Block httpoxy attacks. See https://httpoxy.org/.
       fastcgi_param HTTP_PROXY "";
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param PATH_INFO $fastcgi_path_info;
       fastcgi_param QUERY_STRING $query_string;
       fastcgi_intercept_errors on;
       # PHP 5 socket location.
       #fastcgi_pass unix:/var/run/php5-fpm.sock;
       # PHP 7 socket location.
               fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
   }

   # Fighting with Styles? This little gem is amazing.
   # location ~ ^/sites/.*/files/imagecache/ { # For Drupal <= 6
   location ~ ^/sites/.*/files/styles/ { # For Drupal >= 7
       try_files $uri @rewrite;
   }

   # Handle private files through Drupal. Private file's path can come
   # with a language prefix.
   location ~ ^(/[a-z\-]+)?/system/files/ { # For Drupal >= 7
       try_files $uri /index.php?$query_string;
   }

   location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
       try_files $uri @rewrite;
       expires max;
       log_not_found off;
   }

}

Wordpress Nginx 配置(預設)

server {
   listen 8080;
   listen [::]:8080;
   root /var/www/wp/web;
   index index.php index.html index.htm;
   server_name wp.local;

   location / {
   try_files $uri $uri/ /index.php?$args;      
   }

   location ~ \.php$ {
       fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
       # Security note: If you're running a version of PHP older than the
       # latest 5.3, you should have "cgi.fix_pathinfo = 0;" in php.ini.
       # See http://serverfault.com/q/627903/94922 for details.
       include fastcgi_params;
       # Block httpoxy attacks. See https://httpoxy.org/.
       fastcgi_param HTTP_PROXY "";
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param PATH_INFO $fastcgi_path_info;
       fastcgi_param QUERY_STRING $query_string;
       fastcgi_intercept_errors on;
       # PHP 5 socket location.
       #fastcgi_pass unix:/var/run/php5-fpm.sock;
       # PHP 7 socket location.
               fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
   }

}

Nginxerror.log沒有錯誤,access.log

127.0.0.1 - - [26/Apr/2020:21:07:07 +0300] "GET / HTTP/1.1" 200 3582 "http://d8.local:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0"
127.0.0.1 - - [26/Apr/2020:21:07:07 +0300] "GET /core/misc/normalize-fixes.css?q95i75 HTTP/1.1" 200 0 "http://d8.local:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0"

更新與 Drupal 無關,與 Wordpress 安裝或任何需要 PHP 的問題相同。

Update2添加了配置

更新3因此,如果我添加fastcgi_read_timeout 1;location ~ '\.php$|^/update.php' {塊(Drupal 配置),顯然它會得到解決,頁面現在載入 1 秒,但每個請求都會出錯:

[error] 21920#21920: *8 upstream timed out (110: Connection timed out) while reading upstream, client: 127.0.0.1, server: d8.local, request: "GET /contact HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:", host: "d8.local:8080", referrer: "http://d8.local:8080/"

因此,例如,如果我將其設置為fastcgi_read_timeout 30;它將載入相同的頁面,直到 30 秒過去。

它不會完全載入頁面,例如它不會載入頁腳中的元素,您必須引用 20 次才能載入它至少一次。

如果您設置為 0,您會得到 502 bad gateway 並出現類似錯誤:

[error] 22007#22007: *1 upstream timed out (110: Connection timed out) while reading upstream, client: 127.0.0.1, server: d8.local, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:", host: "d8.local:8080", referrer: "http://d8.local:8080/contact"

更新 2020-05-09可能是 Windows 或 WSL 問題,我在同一台機器上部署了與 Debian 相同的設置並遇到了同樣的問題。

我遇到了同樣的問題<?php echo '<p>Hello World</p>'; ?>(我沒有遇到沒有任何 PHP 程式碼的靜態 HTML 的問題)

在此處輸入圖像描述

接下來我將在同一台機器上嘗試 VirtualBox,會不斷更新。

更新 2020-05-09 2我在禁用 Nginx 的同一 Ubuntu 實例上使用 Apache2 + PHP-FPM 沒有遇到此問題。

為了在 WSL2 (Ubuntu 20.04) 上使用 nginx 和 PHP 7.3 FPM 解決這個問題,我添加了

fastcgi_buffering off;

到 PHP 位置塊。感謝這個 SE 問題/答案:https ://stackoverflow.com/questions/52416299/php7-2-fpm-timeout-nginx-wsl-18-04

引用自:https://serverfault.com/questions/1013527