游客发表
服务器里的服务方法网站突然打不开,浏览器弹出“503 Service Unavailable”,器里第一反应多半是网站骂主机商。但先别急,打开十次里有七次不是解决服务器挂了,而是服务方法配置层面出了岔子。
我去年帮朋友排查一个电商站,器里后台登录不上,网站FTP倒是打开正常。查了半天,解决发现是服务方法PHP-FPM进程池被占满,每个请求都在等数据库响应,器里而数据库连接池被一个死循环脚本耗尽了。网站那会儿我盯着监控面板,打开CPU才用了12%,解决内存也没爆,但页面就是转圈圈。后来把慢查询日志打开,才发现有个第三方插件每小时跑一次全表扫描,锁了整张订单表。这破事,主机商还真不背锅。
所以,遇到503,先分清是“服务没起来”还是“服务起不来但进程还活着”。最简单的一招——直接SSH登录服务器,敲curl -I http://localhost。如果返回200,说明网站本身没问题,问题出在反向代理或负载均衡上;如果返回503,那就得往下查了,八成是后端应用或FastCGI进程挂了。
最常见的坑是PHP-FPM或Gunicorn这类应用服务器僵死。你重启一下进程通常能救急,但治标不治本。我见过一个WordPress站,每次流量一上来就503,运维小哥天天手动重启php-fpm,累得够呛。后来一查,是php的pm.max_children设置太小,默认5个进程,高峰期根本不够用。改成动态模式,设个合理的上限(比如根据内存算,每个进程吃50MB,2GB内存就设30左右),世界清净了。
另一个容易忽略的地方是磁盘空间。别笑,真有这事——日志文件把磁盘塞满,Unix系统写不了临时文件,服务直接罢工。你执行df -h看一眼,如果使用率超过95%,赶紧清日志或删缓存。有个生产环境的案例,Nginx的access.log一年没轮转,撑爆了20GB的云盘,结果所有PHP请求都报503,因为session文件写不进去了。
再说说反向代理层的幺蛾子。如果你用了Nginx或Apache做前端,后端是Tomcat或Node.js,偶尔会因为keep-alive连接超时导致503。这时候检查Nginx的proxy_read_timeout,默认60秒,后端处理请求超过这个时间,Nginx就主动断开,客户端就收到503。把超时调到120秒,或者优化后端代码,别让接口卡那么久。
还有个比较隐蔽的情况——防火墙或安全组规则。有时候你改动了iptables或者云厂商的安全策略,忘了放行某个内部端口。前端能连,但后端转发不了,照样503。排查方法很简单,在服务器上telnet 127.0.0.1 9000试试(把9000换成你的实际端口),不通就是防火墙拦了。
最后提醒一句,别迷信“重启大法”。重启能解决临时问题,但如果你不找到根因,同一个坑会反复踩。我见过最离谱的一次,是某台服务器的cron任务里有个脚本,每次执行都会kill掉所有php进程,导致每天凌晨三点准时503。查了三天日志才抓到元凶。所以,下次遇到503,先看日志,/var/log/nginx/error.log和/var/log/php-fpm.log,多半能直接告诉你答案——别瞎猜,日志不会骗人。
友情链接