網頁顯示超時網關錯誤 FastCGI
以我有限的知識,我繼續解釋這個問題和場景有點複雜。
最初我認為這是與我的腳本和查詢的性能相關的一些問題,所以我在網站上用西班牙語創建了這篇文章:LINK
但是在研究了下午的大部分時間之後;我將把這一切都歸因於我的開發環境的錯誤配置。
我正在使用 2 台設備伺服器:
- 當地的:
- 視窗 10
- 拉拉貢伺服器
- 發展:
- 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() 以確認有效配置。