温馨提示×

LNMP常见故障怎么解决

小樊
46
2025-12-25 20:36:53
栏目: 编程语言

LNMP常见故障与排查步骤

一、快速定位流程

  • 明确症状:是访问白屏/502/403/500,还是连接超时/慢,抑或服务无法启动
  • 检查服务状态:
    • Nginx:systemctl status nginx;配置语法:nginx -t
    • PHP-FPM:systemctl status php-fpm;配置语法:php-fpm -t
    • MySQL/MariaDB:systemctl status mysqld;配置检查:mysqld --validate-config
  • 查看日志定位根因:
    • Nginx:/var/log/nginx/error.log/var/log/nginx/access.log
    • PHP-FPM:/var/log/php-fpm.log/var/log/php-fpm/www-error.log
    • MySQL:/var/log/mysqld.log
  • 网络与访问控制:确认域名解析正确、服务器80/443端口开放、以及防火墙/SELinux未拦截。
  • 变更后重载:systemctl reload 服务名systemctl restart 服务名

二、高频故障与处理清单

症状 常见原因 快速修复
502 Bad Gateway PHP-FPM未运行;Nginx与PHP-FPM的监听地址/端口不一致;进程数不足;权限/SELinux拦截 1) systemctl status/start php-fpm 2) 对齐 fastcgi_passlisten(如 127.0.0.1:9000unix:/var/run/php-fpm/php-fpm.sock)3) 调整 pm.max_children 等进程参数 4) 统一Nginx与PHP-FPM运行用户,目录权限设为755/644 5) 开放防火墙/SELinux策略
403 Forbidden 目录无索引文件且未开启目录浏览;Nginx用户无权访问;SELinux策略限制 1) 配置 index index.php index.html; 2) 目录属主与Nginx/PHP-FPM用户一致(如 www-data:www-data)3) 权限755/644 4) 临时 setenforce 0 验证,必要时调整SELinux布尔值
500 Internal Server Error PHP代码语法/逻辑错误;PHP-FPM配置错误;文件/目录权限不当 1) 查 php-fpm 与 Web 错误日志 2) 开发环境临时开启 display_errorserror_reporting(E_ALL) 3) 修正代码与配置并重载服务
Nginx/PHP-FPM无法启动 配置语法错误;端口冲突(如80/443/9000);依赖缺失;数据目录权限错误 1) nginx -t / php-fpm -t 2) `netstat -tulpen
网站无法访问 Nginx未启动;域名未解析到服务器IP;防火墙/安全组未放行 1) systemctl start nginx 2) nslookup/ping 验证解析 3) firewall-cmd --list-all 检查并放行 http/https
数据库连接失败 MySQL未启动;账号/密码错误;用户Host限制;远程访问未放行 1) systemctl start mysqld 2) 校验连接参数 3) SELECT User,Host FROM mysql.user; 调整Host为%localhost并授权 4) 需远程时注释 bind-address=127.0.0.1 并重启

三、配置与权限要点

  • 统一运行用户:Nginx(/etc/nginx/nginx.confuser)与 PHP-FPM(/etc/php-fpm.d/www.confuser/group)保持一致(如 www-datanginx),避免403/502
  • 目录与文件权限:网站根目录(如 /var/www/html)建议属主 www-data:www-data,权限目录755、文件644;避免使用777
  • 监听与转发一致性:Nginx fastcgi_pass 与 PHP-FPM listen 必须一致;常见为 127.0.0.1:9000unix:/var/run/php-fpm/php-fpm.sock
  • 防火墙放行(CentOS 7+ firewalld):
    • firewall-cmd --permanent --zone=public --add-service=http
    • firewall-cmd --permanent --zone=public --add-service=https
    • firewall-cmd --reload
  • SELinux策略(测试时可临时 setenforce 0):
    • 允许Nginx访问网络:setsebool -P httpd_can_network_connect 1
    • 允许访问数据库:setsebool -P httpd_can_network_connect_db 1
  • 变更生效:修改后执行 systemctl reload 服务名systemctl restart 服务名

四、性能优化与稳定性

  • PHP-FPM:
    • 进程模型建议 pm = dynamic;示例参数(按内存调优):pm.max_children=50pm.start_servers=10pm.min_spare_servers=5pm.max_spare_servers=20
    • 开启 OPcacheopcache.enable=1opcache.memory_consumption=128opcache.interned_strings_buffer=8
  • MySQL/MariaDB:
    • 缓冲池:innodb_buffer_pool_size 建议为物理内存的50%–75%(如 1GB 内存可设 512M)。
    • 日志与I/O:innodb_log_file_size=256Minnodb_log_buffer_size=16M;慢查询日志定位需优化SQL。
  • Nginx:
    • 并发与长连接:worker_processes autoworker_connections 1024keepalive_timeout 65
    • 压缩传输:gzip on; gzip_types text/plain text/css application/javascript application/json text/xml; gzip_comp_level 2; gzip_vary on;
  • 缓存与扩展:引入 Redis/Memcached 做数据缓存;页面层可用 Nginx proxy_cache;精简不必要的PHP扩展。

五、常用命令与日志路径速查

  • 服务与语法:
    • systemctl status|start|restart|reload nginx php-fpm mysqld
    • nginx -tphp-fpm -tmysqld --validate-config
  • 端口与进程:
    • netstat -tulpen | grep -E '80|443|9000|3306'
    • ss -lntp | grep -E '80|443|9000|3306'
  • 日志:
    • Nginx:/var/log/nginx/error.log/var/log/nginx/access.log
    • PHP-FPM:/var/log/php-fpm.log/var/log/php-fpm/www-error.log
    • MySQL:/var/log/mysqld.log
  • 防火墙与SELinux:
    • firewall-cmd --list-allfirewall-cmd --permanent --add-service=http --permanent --add-service=https && firewall-cmd --reload
    • getenforcesetenforce 0(测试)、setsebool -P httpd_can_network_connect 1

0