不用面板建站: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 每天跑一次。
日常维护三件事:
- 更新:
apt update && apt upgrade定期跑。大版本升级先在测试机试,别直接上生产。 - 备份:写个 cron,定时打包网站目录 +
mysqldump导出数据库,传到异地。手动搭的站没有面板帮你备,备份脚本要自己写。 - 看日志: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,默认配置偏"好用"不偏"安全",补三条:
- 隐藏版本号:
server_tokens off;——别把 Nginx 版本号广播给全世界,扫描器就爱这个。 - 限制请求体大小:
client_max_body_size 32m;——防超大请求攻击,WordPress 传大文件够用了。 - 禁掉敏感路径:
.git、.env、wp-config.php这些,一个都别让外网访问到。特别是用 Git 部署的站,.git目录泄露等于源码公开。
故障排查速查表
手动环境出问题,按这个顺序查:
| 现象 | 先看 |
|---|---|
| 打不开,连接被拒绝 | Nginx 在跑吗?systemctl status nginx;防火墙 80/443 开了吗 |
| 502 Bad Gateway | php-fpm 在跑吗?socket 路径和 Nginx 配置里的一致吗 |
| 白屏 / 500 | PHP 错误日志;刚改了什么配置,先回滚 |
| 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,要求全部达标:
- Nginx 虚拟主机 + Let’s Encrypt 证书,http 强制跳 https
- MariaDB 独立账号,权限最小化
- 文件权限 755/644,
wp-config.php600 - PHP-FPM 按内存调过参数
- 备份 cron 已配,异地保存
- Uptime 监控已加
这个项目做完,LNMP 就算真正入了门。学技术的标志不是"看懂了",是"亲手跑通了"——照着本文敲一遍,比看十遍管用。遇到报错把报错信息原样搜一下,答案基本都有;实在搞不定,回头过一遍检查清单。
从手动到面板:什么时候该"投降"
走完这一遍,你可能会问:以后都手动吗?小够的建议:
- 学习期:手动,理解原理。
- 做业务:面板。业务站求的是稳定和效率,面板的备份、监控、SSL 自动化能省大量时间——你的时间比面板贵。
- 多台机器:面板+手动结合。面板管日常,手动能力用来排查疑难杂症。
最好的状态是"会手动,但日常用面板"——手动是底气,面板是效率,两者不矛盾。
手动部署 vs 面板:一句话
手动 LNMP 的价值不在"省面板",而在你终于知道每个环节在干嘛:请求怎么进 Nginx、PHP 怎么被执行、数据怎么存。出问题时,你排查的是原理,不是"面板哪个按钮"。走完这一遍再回去用面板,你会用得更明白——知道面板替你省了哪些事,也知道它没替你省哪些事(备份和安全,永远是你的责任)。