网站打不开常见错误排查_从DNS到服务器全链路诊断
网站数据库连接失败(Error establishing a database connection / mysql connection refused / Access denied)是动态网站常见错误。原因:1.数据库配置错误——config.php中数据库地址、库名、用户名、密码填写错误(搬服务器后没改、密码记错);2.数据库服务没启动——MySQL/MariaDB服务停止(崩溃、被停、内存不足OOM被杀),connection refused;3.数据库用户权限不足——用户没有该数据库的访问权限(GRANT没授),或用户只能从特定IP连接(localhost用户从远程连接被拒,Access denied);4.数据库不存在——配置的库名没创建(搬服务器后没导入数据库);5.密码错误——数据库用户密码不对(改了密码但配置没更新,或密码含特殊字符没转义);6.端口/防火墙——数据库端口3306被防火墙拦截(远程连接时),或MySQL监听地址不对(bind-address=127.0.0.1只允许本地,远程连接被拒);7.连接数满——max_connections满,新连接被拒(Too many connections);8.数据库损坏——表损坏或数据库文件损坏,连接失败;9.MySQL版本不兼容——老数据库导入到新版本(或反之),格式不兼容。排查:1.确认数据库服务运行——service mysql status(或mysqld/mariadb),没启动就启动(service mysql start),启动失败看错误日志(/var/log/mysql/error.log);2.测试数据库连接——命令行mysql -u用户名 -p密码 -h地址 库名,看能否连接(连接成功说明配置问题,连接失败看报错);3.检查配置文件——config.php中数据库地址/库名/用户名/密码,和实际数据库信息逐一核对;4.检查用户权限——登录MySQL,SHOW GRANTS FOR '用户'@'localhost'; 看是否有该库权限,没有就GRANT ALL ON 库.* TO '用户'@'localhost' IDENTIFIED BY '密码'; FLUSH PRIVILEGES;5.检查数据库存在——SHOW DATABASES; 看配置的库名是否存在,没有就创建(CREATE DATABASE 库名 CHARACTER SET utf8mb4;)并导入数据;6.检查连接数——SHOW PROCESSLIST; 看当前连接数,SHOW VARIABLES LIKE 'max_connections'; 看上限,满了就杀无用连接或调大max_connections;7.检查防火墙/端口——远程连接时确认3306端口开放(服务器防火墙+云安全组),MySQL bind-address设为0.0.0.0(允许远程,注意安全);8.看错误日志——MySQL错误日志看具体原因(启动失败、表损坏、权限)。解决:根据原因修复(配置错改配置、服务没启启动、权限不足授权、数据库不存在创建+导入、密码错改密码或配置、连接数满调大、防火墙开放端口、表损坏REPAIR TABLE)。数据库连接失败是严重错误,网站完全无法访问,快速定位关键是测试命令行连接+看错误日志。
网站502/503/504错误排查。502 Bad Gateway——网关错误,Web服务器(Nginx)作为反向代理时,从上游服务器(PHP-FPM/后端)收到无效响应。原因:a.PHP-FPM没启动或崩溃——service php-fpm status,没启动就启动,崩溃看错误日志(内存不足OOM、配置错误);b.PHP-FPM连接数满——pm.max_children太小,并发请求超过上限,502,调大pm.max_children(根据内存,每个进程约20-50M,max_children=可用内存/单进程内存);c.PHP执行超时——fastcgi_read_timeout太短(默认60秒),大请求(大备份/导入)超时,调大fastcgi_read_timeout 300; d.Nginx配置错误——fastcgi_pass地址错(PHP-FPM sock文件路径或127.0.0.1:9000),确认PHP-FPM监听方式(sock或TCP)和Nginx配置一致;e.后端服务不可用——反向代理到后端服务器,后端宕机/端口不通,检查后端服务。排查:看Nginx错误日志(502具体原因,如connect() failed、upstream prematurely closed connection),看PHP-FPM状态和日志,测试PHP-FPM连接(ps aux | grep php-fpm看进程数)。解决:启动PHP-FPM、调大pm.max_children、调大fastcgi_read_timeout、修正Nginx fastcgi配置、修复后端服务。503 Service Unavailable——服务不可用,服务器暂时无法处理请求(过载、维护、后端不可用)。原因:a.服务器过载——CPU/内存/带宽满,无法响应,看资源使用(top、free、df),优化程序/升级配置;b.维护模式——网站开启维护模式(临时),关闭维护;c.后端服务不可用——PHP-FPM/数据库/缓存服务停,启动服务;d.限流/WAF——WAF/限流插件拦截(误判攻击),临时关闭测试;e.云服务器故障——物理机故障/迁移,联系云服务商。排查:看服务器资源(top/free/df)、看服务状态(PHP-FPM/MySQL/Nginx)、看错误日志、测试是否维护模式。解决:释放资源/升级配置、关闭维护、启动服务、调整WAF规则、等待云服务商恢复。504 Gateway Timeout——网关超时,Nginx作为反向代理,上游服务器(PHP-FPM/后端)响应超时(没在规定时间内返回响应)。原因:a.PHP脚本执行慢——大查询、死循环、外部API调用慢、大数据导入,超过fastcgi_read_timeout;b.PHP-FPM进程忙——所有进程都在处理慢请求,新请求排队超时;c.数据库慢查询——SQL查询慢(没索引、大表、锁表),PHP等数据库响应超时;d.外部API超时——PHP调用第三方API(支付/短信/天气),API响应慢或不通,PHP等待超时;e.fastcgi_read_timeout太短——默认60秒,正常请求但超过60秒(大备份/导出)。排查:看Nginx错误日志(upstream timed out),看PHP慢日志(slowlog,记录执行慢的脚本和函数),看数据库慢查询日志,看PHP-FPM进程状态(是否都忙)。解决:优化慢PHP脚本(数据库加索引、优化逻辑、缓存)、优化慢SQL(EXPLAIN分析、加索引、避免大表全扫描)、外部API加超时设置(curl_setopt CURLOPT_TIMEOUT)并异步处理、调大fastcgi_read_timeout(合理范围,如300秒,不要无限大)、增加PHP-FPM进程数、用队列处理慢任务(异步)。502/503/504都是服务器端错误,关键是看Nginx和PHP-FPM/后端日志,定位是服务没启、资源不足、还是脚本慢。
网站上传/邮件/验证码/session错误排查。文件上传错误——原因:a.上传目录权限不足——PHP对上传目录(upload/data/upload/static/upload)没有写入权限(应755,属主www),解决:chmod 755 上传目录,chown www-data:www-data;b.PHP配置限制——upload_max_filesize(上传文件最大,默认2M)、post_max_size(POST数据最大,应大于upload_max_filesize)太小,大文件上传失败,解决:php.ini改upload_max_filesize=20M、post_max_size=25M,宝塔PHP设置中改;c.最大执行时间——大文件上传超过max_execution_time(默认30秒)被中断,解决:调大max_execution_time=300,或用分片上传;d.Nginx限制——client_max_body_size太小(默认1M),大文件上传Nginx返回413,解决:Nginx配置http或server块加client_max_body_size 50M; e.磁盘满——服务器磁盘空间不足,上传失败,解决:df -h看空间,清理旧备份/日志/缓存,扩容;f.文件类型限制——程序只允许特定类型(jpg/png/gif/pdf),上传不允许的类型被拒,解决:检查程序上传类型配置,确认文件类型在允许列表;g.临时目录不可写——PHP上传临时目录(upload_tmp_dir,默认/tmp)不可写或满,解决:确认/tmp可写且有空间,或改upload_tmp_dir到可写目录;h.安全软件拦截——WAF/安全狗/云锁拦截上传(误判恶意文件),解决:临时关闭测试,把上传URL加白名单。排查:看PHP错误日志(上传错误信息)、看程序上传日志、测试小文件是否能传(小文件能传大文件不能是配置限制,都不能传是权限/目录问题)、检查php.ini配置(phpinfo看upload_max_filesize等)、检查磁盘空间。解决:根据原因修复(权限、PHP配置、Nginx配置、磁盘、类型、临时目录、WAF)。邮件发送错误——网站发邮件(注册/留言/密码重置/订单)失败。原因:a.SMTP配置错误——SMTP服务器地址、端口、用户名、密码、加密方式(SSL/TLS)填写错误,解决:核对SMTP配置(QQ邮箱smtp.qq.com:465 SSL、163 smtp.163.com:465、阿里云邮件推送smtpdm.aliyun.com:465),密码是授权码不是登录密码(QQ/163需要开启SMTP并生成授权码);b.服务器禁用mail函数——php.ini disable_functions禁用了mail(),解决:用SMTP方式发信(PHPMailer/SwiftMailer,不走mail函数),或取消禁用mail(不推荐,容易被滥用);c.25端口被封——云服务商(阿里云/腾讯云)默认封禁25端口(防垃圾邮件),用25端口发信失败,解决:用465(SSL)或587(TLS)端口,不用25;d.防火墙拦截——服务器防火墙拦截SMTP端口(465/587),解决:开放出站端口;e.邮件被拒收/进垃圾箱——新服务器IP信誉低、没有SPF/DKIM、内容被判定垃圾邮件,解决:配置SPF记录(DNS TXT v=spf1 ip4:服务器IP ~all)、DKIM签名、PTR反向解析,用第三方邮件推送服务(阿里云邮件推送、SendGrid、Mailgun)保证送达率;f.PHP扩展缺失——需要openssl扩展(SSL/TLS加密),没装导致SMTP SSL连接失败,解决:安装openssl扩展;g.邮件内容编码——中文邮件没设编码(UTF-8),乱码或被拒,解决:邮件头部设Content-Type: text/html; charset=utf-8,用PHPMailer自动处理。排查:看邮件发送日志(程序日志、SMTP调试信息),测试SMTP连接(命令行telnet smtp.qq.com 465或openssl s_client -connect smtp.qq.com:465),看是否能连通,用测试脚本发信看错误信息。解决:修正SMTP配置、用465/587端口、配置SPF/DKIM、用第三方邮件服务、安装openssl、设编码。验证码错误——验证码不显示或验证失败。原因:a.GD库未安装——PHP GD扩展没装,验证码图片无法生成,解决:安装php-gd扩展(宝塔PHP设置中安装gd),phpinfo确认GD支持;b.输出前有内容——验证码图片输出前有其他输出(空格、BOM头、echo),图片格式损坏显示不出来,解决:确保验证码PHP文件开头没有BOM、没有空格/输出,ob_clean()清缓冲再输出图片;c.session问题——验证码存在session中,session没启动或session目录不可写,验证时取不到验证码,解决:session_start()确保启动,session目录(/var/lib/php/sessions)可写,session.cookie_path正确;d.验证码过期——验证码设置了有效期(如5分钟),超时失效,解决:在有效期内使用,或延长有效期;e.区分大小写——验证码区分大小写但用户输入大小写不对,解决:程序中统一转小写(strtolower)再比较,或提示不区分大小写;f.字体文件缺失——验证码用了自定义字体但字体文件路径错或不存在,解决:确认字体文件存在,路径正确,或用默认字体;g.缓存——CDN/浏览器缓存了旧验证码图片,显示旧的,解决:验证码URL加随机参数(?t=时间戳)防缓存,CDN不缓存验证码URL。排查:phpinfo看GD扩展,直接访问验证码PHP文件看是否显示图片(不显示是GD/输出问题,显示是session/验证逻辑问题),看session是否正常(测试session读写),看验证码文件编码(无BOM)。解决:安装GD、清输出缓冲、修session、统一大小写、确认字体、加随机参数防缓存。session错误——登录状态丢失、验证码取不到、购物车清空。原因:a.session没启动——代码没session_start(),session不生效,解决:在用到session的页面开头session_start();b.session目录不可写——session.save_path目录(默认/var/lib/php/sessions或/tmp)权限不足或满,session无法存储,解决:chmod 733 /var/lib/php/sessions(或属主root:www-data 770),确认空间,或改session.save_path到可写目录;c.cookie问题——sessionid存在cookie中,cookie路径/域名不对、浏览器禁用cookie、cookie过期,解决:session.cookie_path设为/,session.cookie_domain设为域名(或不设默认当前域名),确认浏览器允许cookie,session.gc_maxlifetime设足够长(如7200秒);d.session丢失——页面跳转时session丢失(HTTP和HTTPS混用、www和非www域名不同、sessionid没传),解决:全站统一HTTPS和域名(301重定向统一),session.cookie_secure=On(HTTPS站点),session.cookie_httponly=On(安全);e.并发写入——多个请求同时写session(AJAX并发),session锁导致数据丢失,解决:session_write_close()用完就关闭写锁,或用数据库/Redis存session;f.空间满——session所在磁盘满,无法写session,解决:清理磁盘。排查:测试session(页面1存session,页面2读,看是否能读到),看session目录权限和空间,看浏览器cookie是否有PHPSESSID,看phpinfo session配置。解决:启动session、修session目录权限、统一域名/HTTPS、调大session生命周期、用完关闭写锁、清理磁盘。上传/邮件/验证码/session是网站常见功能错误,按流程排查基本能解决。
用户真实体验:「数据库连接失败,按教程命令行测试mysql连接,发现是搬服务器后config.php数据库密码没改,改了就好了,排查要先测连接再看配置」「502错误查了Nginx日志是PHP-FPM进程数不够,调大pm.max_children就好了,502基本是PHP-FPM的问题」。
操作提示:网站错误排查通用流程——1.看HTTP状态码(4xx客户端问题/5xx服务器问题);2.看错误日志(Nginx/Apache error.log、PHP错误日志、网站runtime/log、MySQL error.log,日志记录具体错误文件+行号);3.看最近修改(最近改了什么文件/配置/插件?回滚测试,最近修改的最可能出错);4.默认主题/禁用插件(排除主题/插件冲突,逐个启用定位);5.检查配置(数据库连接信息、伪静态规则、SSL证书、文件权限644/755、DNS解析);6.测试环境复现(本地测试环境复现问题,隔离排查)。常见错误速查:500→PHP语法错误/内存/.htaccess/权限,开错误显示看日志;404→URL错/页面删/伪静态未配置,测动态URL+检查重写规则;白屏→PHP语法错/BOM头/内存耗尽,开错误显示+转无BOM;502→PHP-FPM没启/进程数不够/超时,看Nginx日志+PHP-FPM状态;504→PHP脚本慢/数据库慢查询/外部API超时,看PHP慢日志+数据库慢查询;数据库连接失败→先命令行mysql测试连接,再核对配置,检查服务运行/权限/库存在;403→权限不足/目录无index/IP被封/SELinux,检查权限和封禁规则。

更新时间:2026-08-27 13:00:45
上一篇:FileZilla字符集设置UTF-8不生效怎么办_UTF-8编码无效字节教程详解