Mysql

網頁顯示超時網關錯誤 FastCGI

  • October 2, 2021

以我有限的知識,我繼續解釋這個問題和場景有點複雜。

最初我認為這是與我的腳本和查詢的性能相關的一些問題,所以我在網站上用西班牙語創建了這篇文章:LINK

但是在研究了下午的大部分時間之後;我將把這一切都歸因於我的開發環境的錯誤配置。

我正在使用 2 台設備伺服器:

  1. 當地的:
  • 視窗 10
  • 拉拉貢伺服器
  1. 發展:
  • Ubuntu 20.04
  • XAMPP

在這種情況下,我將專注於本地

我已將 laragon 堆棧配置為支持虛擬主機並執行 2 個版本的 PHP(7.2 / 7.4)我遵循以下 2 個指南:連結 1連結 2

我的阿帕奇配置:

Define SRVROOT "C:/laragon/bin/apache/httpd-2.4.47-win64-VS16"

ServerRoot "C:/laragon/bin/apache/httpd-2.4.47-win64-VS16"


Listen 80


LoadModule access_compat_module modules/mod_access_compat.so
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
LoadModule allowmethods_module modules/mod_allowmethods.so
LoadModule asis_module modules/mod_asis.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule include_module modules/mod_include.so
LoadModule isapi_module modules/mod_isapi.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule version_module modules/mod_version.so

<IfModule unixd_module>
   User daemon
   Group daemon
</IfModule>

ServerAdmin admin@example.com

ServerName Laragon

<Directory />
   AllowOverride none
   Require all denied
</Directory>


DocumentRoot "C:/laragon/www"
<Directory "C:/laragon/www">
   Options Indexes FollowSymLinks Includes ExecCGI
   AllowOverride None
   Require all granted
</Directory>

<IfModule dir_module>
   DirectoryIndex index.html index.php
</IfModule>

<Files ".ht*">
   Require all denied
</Files>

ErrorLog "logs/error.log"

LogLevel error

<IfModule log_config_module>
   
   LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
   LogFormat "%h %l %u %t \"%r\" %>s %b" common

   <IfModule logio_module>
     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
   </IfModule>

   CustomLog "logs/access.log" common

</IfModule>

<IfModule alias_module>
   
   ScriptAlias /cgi-bin/ "${SRVROOT}/cgi-bin/"

</IfModule>

<IfModule cgid_module>
   #
   # ScriptSock: On threaded servers, designate the path to the UNIX
   # socket used to communicate with the CGI daemon of mod_cgid.
   #
   #Scriptsock cgisock
</IfModule>


<Directory "${SRVROOT}/cgi-bin">
   AllowOverride None
   Options None
   Require all granted
</Directory>

<IfModule headers_module>
   RequestHeader unset Proxy early
</IfModule>

<IfModule mime_module>

   TypesConfig conf/mime.types


   AddType application/x-compress .Z
   AddType application/x-gzip .gz .tgz

</IfModule>



# Configure mod_proxy_html to understand HTML4/XHTML1
<IfModule proxy_html_module>
   Include conf/extra/proxy-html.conf
</IfModule>


<IfModule ssl_module>
   SSLRandomSeed startup builtin
   SSLRandomSeed connect builtin
</IfModule>

AcceptFilter http none
AcceptFilter https none
EnableSendfile Off
EnableMMAP Off

IncludeOptional "C:/laragon/etc/apache2/alias/*.conf"
IncludeOptional "C:/laragon/etc/apache2/sites-enabled/*.conf"
Include "C:/laragon/etc/apache2/httpd-ssl.conf"
Include "C:/laragon/etc/apache2/mod_php.conf"

ScriptAlias /php72 "C:/laragon/bin/php/php72"
Action application/x-httpd-php72-cgi /php72/php-cgi.exe
<Directory "C:/laragon/bin/php/php72">
   AllowOverride None
   Options None
   Require all denied
   <Files "php-cgi.exe">
       Require all granted
   </Files>
</Directory>

虛擬主機:

<VirtualHost *:80> 
   DocumentRoot "D:/webdev/Local/test1/"
   ServerName test1.me
   ServerAlias *.test1.me
   <Directory "D:/webdev/test1/">
       AllowOverride All
       Require all granted
   </Directory>
   <FilesMatch "\.php$">
       SetHandler application/x-httpd-php72-cgi
   </FilesMatch>
</VirtualHost>

phpmyadmin 的別名

Alias /phpmyadmin "C:/laragon/etc/apps/phpMyAdmin/"
<Directory "C:/laragon/etc/apps/phpMyAdmin/">
   Options Indexes FollowSymLinks MultiViews
   AllowOverride all  
   Require local
</Directory>

MySQL 配置

[client]
#password=your_password
port=3306
socket=/tmp/mysql.sock

[mysqld]
port=3306
socket=/tmp/mysql.sock
key_buffer_size=512M
max_allowed_packet=4096M
table_open_cache=256
sort_buffer_size=32M
read_buffer_size=32M
read_rnd_buffer_size=32M
myisam_sort_buffer_size=128M
thread_cache_size=16

secure-file-priv=""
explicit_defaults_for_timestamp=1
datadir= "C:/laragon/data/mysql"
lower_case_table_names=2
sql_mode=""
wait_timeout=28800
interactive_timeout=28800


[mysqldump]
quick
max_allowed_packet=4096M

兩個版本的 PHP 配置 (7.2/7.4)

file_uploads = On
upload_max_filesize = 4096M
max_file_uploads = 100
allow_url_fopen = On
memory_limit = 3G
post_max_size = 600M
max_execution_time = 5000
max_input_time = 5000
max_input_vars = 5000
date.timezone= America/Panama
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
html_errors = On
session.gc_maxlifetime = 2592000
session.cache_expire = 2592000

如您所見,我預設使用 apache 處理程序 2.0 為 php 7.4 提供服務;我正在使用別名服務 php 7.2。

  • phpmyadmin => php 7.4 Apache 處理程序 2.0
  • test1.me => php 7.2 CGI/FastCGI

MySQL的錯誤日誌:

2021-10-02T04:26:59.472441Z 35 [Note] Aborted connection 35 to db: avipac_dbproducts' user: 'root' host: 'localhost' (Got an error writing communication packets)

Apache的錯誤日誌:

[Fri Oct 01 23:22:17.806390 2021] [cgi:error] [pid 3808:tid 1108] [client 127.0.0.1:61857] Script timed out before returning headers: php-cgi.exe, referer: http://test1.me/
[Fri Oct 01 23:23:43.661155 2021] [cgi:error] [pid 3808:tid 1108] [client 127.0.0.1:61857] AH01215: PHP Fatal error:  Allowed memory size of 3221225472 bytes exhausted (tried to allocate 20480 bytes) in D:\\webdev\\Local\\test1\\control\\classgeneric\\class.managerdb.php on line 111: C:/laragon/bin/php/php72/php-cgi.exe, referer: http://test1.me/
[Fri Oct 01 23:23:43.676759 2021] [cgi:error] [pid 3808:tid 1108] [client 127.0.0.1:61857] AH01215: PHP Fatal error:  Allowed memory size of 3221225472 bytes exhausted (tried to allocate 65536 bytes) in Unknown on line 0: C:/laragon/bin/php/php72/php-cgi.exe, referer: http://test1.me/
[Fri Oct 01 23:23:43.676759 2021] [cgi:error] [pid 3808:tid 1108] [client 127.0.0.1:61857] AH01215: PHP Fatal error:  Allowed memory size of 3221225472 bytes exhausted (tried to allocate 24576 bytes) in Unknown on line 0: C:/laragon/bin/php/php72/php-cgi.exe, referer: http://test1.me/
[Fri Oct 01 23:24:59.451291 2021] [cgi:error] [pid 3808:tid 1104] [client 127.0.0.1:53918] Script timed out before returning headers: php-cgi.exe, referer: http://test1.me/

我絕對接受 mysql 查詢對於 Windows 上的本地環境來說是比較大的;但問題是 apache 處理程序 2.0 和 php 7.4 在不到 1 秒的時間內執行了相同的查詢……但在 CGI / FastCGI 中,它在達到超時(180 秒 / 3 分鐘)時停止……我有為 FastCGI 和 Apache Handler 2.0 設置相同的設置,但並不令人信服,因為一個失敗而另一個沒有。

當然,這就是為什麼我的疑惑之一是他們在我的設置中告訴我我需要什麼配置來改進 FastCGI。這是我主要忽略的。(在哪裡,如何和什麼)。

可能有人在我的設置中告訴我需要什麼配置來改進 FastCGI。這是我主要忽略的。(在哪裡,如何和什麼)我真的不明白為什麼我不能讓 Fast CGI 至少不能像 Apache 那樣破壞和工作……

我不知道出了什麼問題,我需要什麼或如何解決這些錯誤……我知道 CGI / FastCGI 需要很長時間並消耗大量記憶體,但我不知道為什麼它不起作用和 Apache Handler正常工作

或者是否存在代理 Apache Handler 2.0 的任何方式,而不是通過 FastCGI 別名使用 php-cgi?


說明性圖像 Apache Handler 2.0:

在此處輸入圖像描述

CGI/FastCGI:

在此處輸入圖像描述

在此處輸入圖像描述


更新#1

我找到了這個配置文件: 注意:我假設這個配置文件很重要;但我不知道它的功能或者我應該添加、刪除或修改什麼東西以使 FastCGI 表現得像 Apache Handler 2.0。

   LoadModule fcgid_module "C:/laragon/etc/apache2/modules/mod_fcgid-2.3.10-win64-VS16.so"

<IfModule fcgid_module>
   FcgidInitialEnv PATH "C:/laragon/bin/php/php74;C:/Windows/system32;C:/Windows;C:/Windows/System32/Wbem;"
   FcgidInitialEnv SystemRoot "C:/Windows"
   FcgidInitialEnv SystemDrive "C:"
   FcgidInitialEnv TEMP "C:/Windows/Temp"
   FcgidInitialEnv TMP "C:/Windows/Temp"
   FcgidInitialEnv windir "C:/Windows"

   # 10 hrs: in case you have long running scripts, increase FcgidIOTimeout 
   
   FcgidIOTimeout 36000
   FcgidIdleTimeout 36000
   FcgidProcessLifeTime 36000
   FcgidBusyTimeout 36000
   FcgidConnectTimeout 3600
   FcgidMaxRequestsPerProcess 0
   FcgidMaxProcesses 50
   FcgidMaxRequestLen 81310720
   # Location php.ini:
   # FcgidInitialEnv PHPRC "C:/laragon/bin/php/php74"
   FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 0

   <Files ~ "\.php$>"
       AddHandler fcgid-script .php
       Options +ExecCGI
       FcgidWrapper "C:/laragon/bin/php/php74/php-cgi.exe" .php
   </Files>
</IfModule>

這些錯誤告訴你它的 PHP (版本 7.2,現在 EoL,修復它!)試圖超過其分配的記憶體限制。

如果腳本在與數據庫通信時終止(mysql 日誌讓我這麼認為),那麼您的數據庫查詢之一(不一定是最後一個!)可能正在返回一個意外的大結果集,它不適合允許的記憶體php腳本?

檢查查詢日誌,手動執行查詢並查看

  • 如果合適:那麼您想分配更多資源或:
  • 如果其中之一不必要地大:那麼您想要改進查詢它們的應用程序或清理不必要的行以減少資源使用。

如果是前者,那麼請記住,大多數係統都設置為具有單獨的 php 配置以用於單獨的部署選項。這可能包括不同的記憶體限製或可用擴展。由於您有多個不同的部署,使用的 php.ini 文件對於 cgi、cli、fpm、apache2-mod、.. 中的每一個都可能不同 - 如果有疑問,請讓您的腳本列印 phpinfo() 以確認有效配置。

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