当前位置:首页 > 综合 > linux nginx mysql php 正文

linux nginx mysql php

来源:烟消火灭网   作者:热点   时间:2026-10-17 05:49:24

装一台 Linux 服务器,跑 Nginx + MySQL + PHP,这事看起来像老生常谈,但真到动手的时候,坑一个不少。我见过太多人照着教程复制粘贴,最后 Nginx 报 502,MySQL 连不上,PHP 页面直接下载而不是解析。问题往往不在命令本身,而在顺序和权限。

先装 Nginx。Ubuntu 下 apt install nginx 一行搞定,CentOS 得先加 EPEL 源。装完别急着改配置,先 systemctl start nginx,浏览器敲 IP 看到欢迎页,说明基础没问题。这时候再去动 /etc/nginx/sites-available/default,把 root 指向 /var/www/html,加个 index index.php index.html。注意,很多教程漏了这一步,结果 PHP 文件被当成静态文件下载,浏览器弹出一堆源码,看着像黑客入侵。

MySQL 的安装更微妙。Ubuntu 20.04 之后默认是 MySQL 8,认证插件从 mysql_native_password 换成了 caching_sha2_password。PHP 的 mysqli 扩展如果版本旧,连数据库直接报 “Authentication plugin cannot be loaded”。解决办法要么升级 PHP 扩展,要么进 MySQL 执行 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';。我一般选后者,省事。还有,别用 root 跑应用,建个专用用户,权限只给 SELECT, INSERT, UPDATE, DELETE,DROP 和 GRANT 一律不给。这不是洁癖,是血泪教训——去年有个客户被注入了 DROP TABLE,整站数据没了,备份还是三天前的。

PHP 这块,apt install php-fpm php-mysql 只是开始。关键是 Nginx 和 PHP-FPM 的通信。Unix socket 比 TCP 端口快,但权限容易出问题。默认 socket 在 /run/php/php7.4-fpm.sock,Nginx 的 worker 进程用户是 www-data,得确保 socket 文件属组对得上。我习惯在 Nginx 配置里写:

location ~ \.php$ {  include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; }

然后 nginx -t 测试,systemctl reload nginx。如果 502,先看 /var/log/nginx/error.log,十有八九是 socket 路径写错或者 PHP-FPM 没启动。另一个常见问题是 fastcgi_param SCRIPT_FILENAME 没设对,导致 PHP 说 “File not found”。这行配置在 fastcgi-php.conf 里通常有,但如果你自己手写 location,很容易忘。

整套环境跑起来后,别急着上生产。先写个 info.php,内容就一行 <?php phpinfo(); ?>,访问看看能不能输出。能输出,说明 Nginx 和 PHP 通了。再写个连数据库的脚本,new mysqli('localhost', 'user', 'pass', 'db'),如果报错,检查 MySQL 用户权限和 bind-address。默认 MySQL 只监听 127.0.0.1,如果 PHP 和 MySQL 不在同一台机器,得改 /etc/mysql/mysql.conf.d/mysqld.cnf,把 bind-address 改成 0.0.0.0,然后重启。但别这么干,除非你加了防火墙规则。公网暴露 3306 端口,等于把数据库送给扫描器。

性能调优是后话。Nginx 的 worker_processes 设成 CPU 核心数,worker_connections 看内存,一般 1024 够用。PHP-FPM 的 pm.max_children 别拍脑袋,用 pm = dynamic,pm.max_children 按内存算:每个 PHP 进程约 30MB,2GB 内存最多给 50。MySQL 的 innodb_buffer_pool_size 设成物理内存的 50% 到 70%,这是最影响性能的参数。我见过有人设成 128M,结果数据库慢得像蜗牛,还以为是磁盘问题。

最后说个细节:日志。Nginx 的 access.log 和 error.log 默认在 /var/log/nginx/,PHP-FPM 的慢日志在 /var/log/php7.4-fpm.log,MySQL 的慢查询日志默认关着,得在配置文件里加 slow_query_log = 1 和 long_query_time = 2。这些日志平时没人看,出问题时就是救命稻草。我习惯用 lnav 看日志,比 tail -f 舒服,能高亮错误、过滤 IP。

这套组合不新,但稳定。只要把权限、路径、日志这三样盯住,跑个几年没问题。别迷信一键脚本,出事了连日志在哪都不知道。

标签:

责任编辑:综合