![仅当您重新启动 php-fpm 时才会加载页面](https://linux22.com/image/751369/%E4%BB%85%E5%BD%93%E6%82%A8%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%20php-fpm%20%E6%97%B6%E6%89%8D%E4%BC%9A%E5%8A%A0%E8%BD%BD%E9%A1%B5%E9%9D%A2.png)
以下是 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 的东西有同样的问题。
更新2添加配置
更新3fastcgi_read_timeout 1;
因此,如果我添加到块(Drupal 配置),显然问题就得到了解决location ~ '\.php$|^/update.php' {
,页面现在在 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 时,我没有遇到这个问题。
答案1
为了在装有 nginx 和 PHP 7.3 FPM 的 WSL2(Ubuntu 20.04)上修复这个问题,我添加了
fastcgi_buffering off;
到 PHP 位置块。感谢 SE 的这个问答:https://stackoverflow.com/questions/52416299/php7-2-fpm-timeout-nginx-wsl-18-04