不用面板建站:LNMP 手动部署全流程

面板虽好,但手动 LNMP 让你真正理解网站是怎么跑起来的:Nginx + MySQL + PHP,一步步装、一步步配,再到虚拟主机、权限、PHP 调优、安全加固和故障排查。小够带你走完完整流程,适合想学真本事的人。

我是小够,只推够用的 VPS。

面板是好,但有个代价:你永远不知道网站"到底是怎么跑起来的"。手动搭一次 LNMP(Linux + Nginx + MySQL + PHP),是理解建站原理最快的一课。今天走完整流程,跟着敲就行,顺便把虚拟主机、权限、备份一起讲了。

先说清楚:适合谁

  • 想学 Linux 运维、理解网站原理的人:强烈推荐走一遍,这是基本功。
  • 只想快速上线做业务的人:用面板,别折磨自己——时间也是成本,面板就是花钱买时间(虽然是免费的)。

第一步:装 Nginx

以 Ubuntu/Debian 为例:

apt update && apt install nginx -y
systemctl enable --now nginx

装完浏览器访问服务器 IP,看到 Nginx 欢迎页,Web 服务器就绪。enable --now 是"开机自启+现在启动"二合一,记住这个组合,以后常用。

第二步:装 MySQL(MariaDB)

apt install mariadb-server -y
mysql_secure_installation

按提示设 root 密码、删匿名用户、禁远程 root 登录——这三项是数据库安全的基线。然后建库建用户:

CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY '强密码';
GRANT ALL ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;

记住:给网站用的数据库账号,只给它自己库的权限,别用 root 跑网站。utf8mb4 别写成 utf8,后者存不了 emoji,生僻字也会乱码。

第三步:装 PHP

apt install php-fpm php-mysql php-gd php-xml php-mbstring php-curl php-zip -y

装完确认 php-fpm 在跑:systemctl status php-fpm,看到 active (running) 就行。扩展按需加,WordPress 常用就上面这些:mysql(连数据库)、gd(图片处理)、xml/mbstring(编码)、curl(对外请求)、zip(解压)。

PHP 版本选系统源里最新的稳定版即可,别为了追新加第三方源——第三方源的更新节奏和稳定性都不如官方源,生产环境求稳。

第四步:配 Nginx 虚拟主机

给网站写个配置文件 /etc/nginx/conf.d/myblog.conf:

server {
    listen 80;
    server_name your-domain.com www.your-domain.com;
    root /var/www/myblog;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

关键就三处:

  • try_files 处理伪静态,WordPress 的固定链接靠它。
  • fastcgi_pass 把 PHP 请求转给 php-fpm——Nginx 自己不执行 PHP,这个分工是理解 LNMP 的核心。
  • 最后那段禁掉 .ht 文件访问,防信息泄露。

配完 nginx -t 检查语法(看到 syntax is ok 才算过),systemctl reload nginx 生效——reload 不断现有连接,线上改配置就靠它。

第五步:放程序、配权限

把 WordPress 解压到 /var/www/myblog,权限这样设:

chown -R www-data:www-data /var/www/myblog
find /var/www/myblog -type d -exec chmod 755 {} \;
find /var/www/myblog -type f -exec chmod 644 {} \;

目录 755、文件 644,属主是 Nginx 运行用户(Debian/Ubuntu 一般是 www-data)。永远不要 777——777 等于谁都能写,一个上传漏洞就进马。

浏览器打开域名,走 WordPress 安装向导,填刚才建的数据库名、用户名、密码,完工。

第六步:SSL 和日常维护

证书用 certbot,certbot --nginx -d your-domain.com 会自动改 Nginx 配置、自动续期,把 certbot renew 加进 cron 每天跑一次。

日常维护三件事:

  1. 更新:apt update && apt upgrade 定期跑。大版本升级先在测试机试,别直接上生产。
  2. 备份:写个 cron,定时打包网站目录 + mysqldump 导出数据库,传到异地。手动搭的站没有面板帮你备,备份脚本要自己写。
  3. 看日志:Nginx 错误日志 /var/log/nginx/error.log、PHP 错误日志,出问题先看日志再猜——日志是服务器的嘴。

第七步:PHP-FPM 调优(小机器必做)

默认的 php-fpm 配置是给"通用场景"的,小内存机器要手动调。改 /etc/php/*/fpm/pool.d/www.conf 几个关键参数:

  • pm = dynamic,pm.max_children 按内存算:1G 内存设 5-10——每个 PHP 进程几十 MB,children 太多内存爆掉,网站直接 502。
  • pm.start_servers、pm.min_spare_servers、pm.max_spare_servers 按 max_children 的比例设,空闲进程别太多,白占内存。

调完 systemctl restart php-fpm,用 htop 观察几天,内存稳定不爆、响应正常,就是调对了。小机器的 PHP 调优,核心就四个字:别贪多。

第八步:Nginx 安全加固

手动配的 Nginx,默认配置偏"好用"不偏"安全",补三条:

  1. 隐藏版本号:server_tokens off;——别把 Nginx 版本号广播给全世界,扫描器就爱这个。
  2. 限制请求体大小:client_max_body_size 32m;——防超大请求攻击,WordPress 传大文件够用了。
  3. 禁掉敏感路径:.git、.env、wp-config.php 这些,一个都别让外网访问到。特别是用 Git 部署的站,.git 目录泄露等于源码公开。

故障排查速查表

手动环境出问题,按这个顺序查:

现象先看
打不开,连接被拒绝Nginx 在跑吗?systemctl status nginx;防火墙 80/443 开了吗
502 Bad Gatewayphp-fpm 在跑吗?socket 路径和 Nginx 配置里的一致吗
白屏 / 500PHP 错误日志;刚改了什么配置,先回滚
404 但文件存在try_files 和伪静态规则;root 路径写对了吗
改了配置没生效nginx -t 检查语法了吗?reload 了吗

排查铁律:一次只动一个地方,动完验证。同时改三处,出问题都不知道是哪处惹的。

第九步:日志与监控(别当瞎子)

手动环境没有面板的 dashboard,监控靠自己搭。最低配方案:

  • Nginx 访问日志:默认就开了,定期看看有没有异常 IP 在扫。goaccess 一行命令把日志变成可视化报表,哪个页面被刷、哪个 IP 最凶,一目了然。
  • 磁盘监控:写个 cron,每天 df -h 检查磁盘,超过 80% 发告警。日志是磁盘杀手,logrotate 配好自动轮转——磁盘满导致的宕机,是最冤的宕机。
  • 服务存活监控:用 Uptime Kuma(自己搭,免费)或在线监控服务,Nginx/php-fpm/MySQL 挂了第一时间知道。手动环境没有面板兜底,监控就是你的眼睛。

第十步:从零到上线的检查清单

全部做完,对着这个清单过一遍再宣布上线:

  • 防火墙只开了 80、443 和 SSH 端口
  • SSH 密钥登录已配,密码登录已禁,root 禁止远程登录
  • 文件权限 755/644,wp-config.php 是 600
  • SSL 证书已配,http 跳 https,续期 cron 已加
  • 备份脚本已写,异地备份已验证能恢复
  • PHP-FPM 参数按内存调过
  • 监控和告警已配,磁盘、服务、证书三处都有人盯

清单全勾,才能说"生产就绪"。上线不是"能访问",是"出问题有人知道、丢数据能恢复"。

附:LNMP 常用命令速查

手动环境没有面板点,全靠命令。把这几个记熟,日常够用:

  • 看服务状态:systemctl status nginx php*-fpm mysql
  • 重载配置:nginx -t && systemctl reload nginx(改完配置必做两步)
  • 看实时日志:tail -f /var/log/nginx/error.log
  • 看端口监听:ss -tlnp(80/443/MySQL 端口在不在)
  • 看磁盘内存:df -h、free -h、htop

命令不用背,理解+收藏。小够当年也是把常用命令贴在显示器边上,用一个月就熟了。手动环境的底气,就来自这几个命令——服务挂了,你知道去哪看、怎么重启,这就够了。

从 LNMP 出发,下一步学什么

走完这一遍,你已经摸到了运维的门。下一步按兴趣选:

  • 想深入 Web 服务:学 Nginx 的 location 匹配优先级、反向代理、负载均衡——这是 LNMP 之外最有用的技能。
  • 想玩自动化:学 Ansible/Shell 脚本,把"装机→配环境→部署"做成一键脚本,管 10 台机器和管 1 台一样轻松。
  • 想玩容器:学 Docker,把这套 LNMP 容器化——手动搭过 LNMP 的人学 Docker 快得多,因为原理是通的。

手动 LNMP 是运维的"第一性原理",后面的路怎么走,都有这一课垫底。

学完之后的第一个练手项目

理论走完,来个练手项目巩固:用手动 LNMP 搭一个带 SSL 的 WordPress,要求全部达标:

  1. Nginx 虚拟主机 + Let’s Encrypt 证书,http 强制跳 https
  2. MariaDB 独立账号,权限最小化
  3. 文件权限 755/644,wp-config.php 600
  4. PHP-FPM 按内存调过参数
  5. 备份 cron 已配,异地保存
  6. Uptime 监控已加

这个项目做完,LNMP 就算真正入了门。学技术的标志不是"看懂了",是"亲手跑通了"——照着本文敲一遍,比看十遍管用。遇到报错把报错信息原样搜一下,答案基本都有;实在搞不定,回头过一遍检查清单。

从手动到面板:什么时候该"投降"

走完这一遍,你可能会问:以后都手动吗?小够的建议:

  • 学习期:手动,理解原理。
  • 做业务:面板。业务站求的是稳定和效率,面板的备份、监控、SSL 自动化能省大量时间——你的时间比面板贵。
  • 多台机器:面板+手动结合。面板管日常,手动能力用来排查疑难杂症。

最好的状态是"会手动,但日常用面板"——手动是底气,面板是效率,两者不矛盾。

手动部署 vs 面板:一句话

手动 LNMP 的价值不在"省面板",而在你终于知道每个环节在干嘛:请求怎么进 Nginx、PHP 怎么被执行、数据怎么存。出问题时,你排查的是原理,不是"面板哪个按钮"。走完这一遍再回去用面板,你会用得更明白——知道面板替你省了哪些事,也知道它没替你省哪些事(备份和安全,永远是你的责任)。