尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Linux服务器LNMP环境搭建与安全加固实战指南

Linux服务器LNMP环境搭建与安全加固实战指南 1. 环境初始化与登录配置服务器到手第一件事别急着装软件先把系统账号、登录方式和基础安全做完。这一步偷懒后面全是麻烦。我踩过最深的坑就是一开始图方便直接用密码登录结果三天后日志里全是扫描爆破记录虽然没被攻破但看着几千条 failed password 的日志就烦。所以这次从零开始把基础打牢。1.1 创建普通用户并配置 sudo 权限拿到一台全新的 Alibaba Cloud Linux 3 实例默认只有 root 账号但日常操作强烈不建议直接拿 root 干活。原因很简单root 权限太大一个手滑就可能把系统搞挂而且很多应用服务用 root 启动会带来额外的安全风险。所以第一件事是创建普通用户再给它 sudo 权限。# SSH 登录到服务器后先切换或直接以 root 身份执行 useradd -m -s /bin/bash opuser passwd opuser这里-m会同时创建用户目录-s /bin/bash指定默认 shell。接着把用户加入 wheel 组Alibaba Cloud Linux 3 和 CentOS 系一样默认 sudo 配置里 wheel 组有全部权限usermod -aG wheel opuser验证一下免密 sudo 是否生效。编辑/etc/sudoers.d/opuser文件或者直接运行visudo -f /etc/sudoers.d/opuser写入opuser ALL(ALL) NOPASSWD: ALL这样后续脚本里用 sudo 执行命令不用反复输密码做自动化任务会省很多事。不过要注意NOPASSWD 只适合信任的服务器环境如果是团队共用机器建议改成需要密码的默认配置。1.2 配置 SSH 密钥登录并关闭密码认证密码登录最大的问题是容易被暴力破解尤其是公网 IP 的服务器几乎无时无刻不在被扫描。配置密钥登录并关闭密码认证是我每次建服务器必做的一步。ssh-keygen -t ed25519 -C your-nameyour-server -f ~/.ssh/server_key在本地生成密钥对然后把公钥上传到服务器ssh-copy-id -i ~/.ssh/server_key.pub opuser你的服务器IP然后修改服务端/etc/ssh/sshd_config关键几项PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes改完记得systemctl restart sshd。这里有个容易踩的坑如果PermitRootLogin no和PasswordAuthentication no一起配而你又忘了把公钥写到新用户的 authorized_keys 里会导致彻底连不上服务器。所以务必先验证新用户能通过密钥登录再重启 sshd。稳妥的做法是同时开一个额外的systemd定时任务兜底systemctl stop firewalld # 在测试窗口验证密钥登录成功后再执行 sshd 重启另外如果用的是云厂商安全组最后把入口白名单收窄只允许常用办公 IP 段的 22 端口访问。这样即使有人拿到了你的密码也无法从陌生 IP 登进来算是给 SSH 加了一层物理隔离。2. 系统基础配置与软件源优化登录和账号处理好之后下一步是把系统基础环境弄顺。这里包括时区、字符集、软件源、常用工具安装这套做完后续所有操作都会顺畅很多。别小看这几步很多奇奇怪怪的问题比如程序显示乱码、日志时间差 8 小时、装个包依赖报错都是因为基础配置没做好。2.1 时区、时间同步与字符集设置Alibaba Cloud Linux 3 默认是 UTC 时区国内服务器日志、定时任务、数据库时间都不对劲必须改成 Asia/Shanghaitimedatectl set-timezone Asia/Shanghai timedatectl status同时确认 NTP 服务正常如果不放心可以安装 chrony 并设置开机自启yum install -y chrony systemctl enable --now chronyd chronyc sources -v字符集方面默认可能是en_US.UTF-8或POSIX如果程序要处理中文建议统一改成zh_CN.UTF-8localectl set-locale LANGzh_CN.UTF-8 source /etc/locale改完以后SSH 重新登录一次就能看到中文提示了。这里有个小经验直接用export LANGzh_CN.UTF-8虽然可以临时生效但每次 SSH 都要重新设置反而容易乱直接通过 localectl 写进系统配置才是正解。2.2 配置 epel 和常用工具包Alibaba Cloud Linux 3 自带阿里云的 yum 源国内外速度都不错。但默认软件仓库里不是所有包都有尤其是一些编译工具、第三方软件配一个 epel 源很有必要yum install -y epel-release yum makecache然后装一套我每次必装的工具组合yum install -y vim wget curl net-tools lsof telnet tcpdump bind-utils zip unzip tree git jq这些工具的用途不用多讲但有一点值得说bind-utils里带的dig命令排查 DNS 和网络问题比nslookup好用得多jq处理 JSON 输出在写脚本时非常省事。别用net-tools里的ifconfig做过多的网络管理新系统官方推荐ip命令但排查连通性时老命令确实更顺手。2.3 内核参数的初步调优服务器要应对高并发Linux 默认的sysctl参数不够用。我在部署业务之前习惯把几个关键参数调一调比如文件句柄数、TCP 连接复用等。先看当前文件句柄限制ulimit -n如果只有 1024需要调高。修改/etc/security/limits.conf加上* soft nofile 655350 * hard nofile 655350 * soft nproc 65535 * hard nproc 65535然后改/etc/sysctl.conf里几个网络参数net.ipv4.tcp_fin_timeout 15 net.ipv4.tcp_tw_reuse 1 net.ipv4.ip_local_port_range 1024 65535 net.core.somaxconn 65535 fs.file-max 2097152执行sysctl -p生效。这几个参数的作用大家应该都熟悉tcp_tw_reuse能快速复用 time-wait 连接somaxconn决定 accept 队列长度ip_local_port_range扩大可用端口范围。配完之后用sysctl -a | grep tcp_tw_reuse验证一下就行。这里我再强调一次别盲目照抄网上的“极限调优”参数很多参数在不同内核版本和业务模型下效果差很多务必压测验证。3. LNMP 环境搭建实战这里以最常用的 LNMPLinux Nginx MySQL PHP组合为例完整走一遍编译和配置流程。很多人觉得直接用 apt/yum 安装更快但编译安装的好处是路径干净、参数可控、升级灵活尤其在 Nginx 上想加自定义模块的时候用包管理器反而麻烦。我这次是兼顾效率和可控性Nginx 采用官方源码编译MySQL 用二进制包部署PHP 用 yum 源快速安装然后做整合。3.1 Nginx 源码编译安装先安装编译依赖yum install -y gcc gcc-c autoconf automake make pcre-devel zlib-devel openssl-devel然后下载 Nginx 源码我这里用 1.24 稳定版你也可以选最新 stablewget https://nginx.org/download/nginx-1.24.0.tar.gz tar -xzf nginx-1.24.0.tar.gz cd nginx-1.24.0配置编译参数是关键根据自己的需求裁剪。我常用的 configure 指令./configure \ --prefix/usr/local/nginx \ --usernginx \ --groupnginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-stream这里--with-stream是为了后面做 TCP/UDP 反向代理如果有端口转发的需求这个模块非常实用。--with-http_realip_module配合 CDN 或反代场景能拿到用户真实 IP做日志分析和封 IP 都靠它配置。http_v2_module现在基本是必开的HTTP/2 对性能提升明显特别是首页资源较多时。编译安装make -j$(nproc) make install创建 nginx 用户及 systemd 服务useradd -M -s /sbin/nologin nginx接着写 systemd 管理脚本内容大致是 ExecStart 指向/usr/local/nginx/sbin/nginxExecReload 执行nginx -s reloadPIDFile 指向/usr/local/nginx/logs/nginx.pid。这样以后启动、开机自启都很标准。3.2 MySQL 8.0 二进制部署MySQL 我习惯用官方二进制包省去编译时间性能也有保证。下载时会比较大建议先在本地确认 md5再上服务器。wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz解压到/usr/local/mysql创建 mysql 用户和数据目录useradd -M -s /sbin/nologin mysql mkdir -p /data/mysql chown -R mysql:mysql /data/mysql初始化数据库时注意 MySQL 8.0 的默认认证插件是 caching_sha2_password很多老客户端连不上。如果需要兼容旧程序可以在初始化后改下默认认证插件mysqld --initialize-insecure --basedir/usr/local/mysql --datadir/data/mysql --usermysql这样 root 用户没有密码第一次登录后再设置。写好/etc/my.cnf[mysqld] basedir/usr/local/mysql datadir/data/mysql socket/tmp/mysql.sock port3306 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci max_connections1000 innodb_buffer_pool_size1Ginnodb_buffer_pool_size是 InnoDB 的缓存池大小一般建议设为物理内存的 70% 左右但如果你机器内存只有 2G别硬设 1G留点余量给系统和 PHP。启动并加入 systemdsystemctl enable mysqld systemctl start mysqld然后运行安全初始化脚本设置 root 密码、删除匿名账号、禁止 root 远程登录mysql_secure_installation至此 MySQL 就绪。关于 utf8mb4 的字符集设定我多说一句现在新项目一律用它不要再用老的 utf8实际上 utf8mb3否则 emoji 和生僻字会存不进去。utf8mb4_unicode_ci在排序上也比较科学。3.3 PHP 8.2 的安装与整合PHP 我这里用的是 yum 安装因为 Alibaba Cloud Linux 3 内置 AppStream 仓库里就有 PHP 8.2一条命令装完比编译省太多时间。有特殊扩展需求时再用编译不迟。yum install -y php php-fpm php-cli php-mysqlnd php-pdo php-mbstring php-xml php-json php-gd php-bcmath php-opcache php-zip装完确认版本php -v php-fpm -v启动 PHP-FPM 并设置开机自启systemctl enable --now php-fpm这里有个值得注意的点yum 装的 php-fpm 默认以 apache 用户运行而 Nginx 是 nginx 用户。如果不对齐后面 Nginx 转发给 PHP-FPM 时会遇到权限问题。修改/etc/php-fpm.d/www.conf里的 run user 和 groupuser nginx group nginx listen /run/php-fpm/www.sock listen.owner nginx listen.group nginx listen.mode 0660这里用 unix socket 方式监听比 TCP 方式性能好一点而且没有端口暴露风险。改完重启 php-fpm。最后在 Nginx 配置一个站点整合测试比如新建/usr/local/nginx/conf/sites-enabled/demo.conf内容包含 server 块、root 路径、index 和 location 规则。location ~ \.php$这一段里用fastcgi_pass unix:/run/php-fpm/www.sock;转发给 PHP-FPM同时设置include fastcgi_params;。3.4 目录权限与上传部署LNMP 装好以后目录权限是个容易翻车的地方。我的习惯是站点代码目录权限分离代码文件属于 root:nginx文件夹权限设为 755涉及写入的 runtime 或 upload 目录单独设置为 nginx:nginx 且 750。这样既能跑起来又不会把整个站点目录放开写权限。mkdir -p /data/www/demo chown -R root:nginx /data/www/demo find /data/www/demo -type d -exec chmod 755 {} \; find /data/www/demo -type f -exec chmod 644 {} \;如果站点里用了 Laravel 之类的框架习惯把 storage、bootstrap/cache 这类目录提权给 PHP-FPM 用户比如chown nginx:nginx -R /data/www/demo/storage这块配置好了LNMP 的主流程基本就通了访问服务器 IP能看到 Nginx 欢迎页写个test.php打印 phpinfo能正常显示就说明整个链路没问题。4. 应用部署与安全加固实践环境能跑只是第一步真正上线前要做的事情还很多。这一节我会从数据库备份、Web 站点 SSL、以及常见安全基线整改三个维度展开全程围绕实操来展开很多细节是我在实际运维中踩过坑后总结出来的。试想一下如果数据库没备份一次误删或数据损坏就足够让人崩溃如果 HTTPS 没配好哪怕网页加载正常浏览器地址栏的“不安全”三个字也足以让访客瞬间失去信任。4.1 数据库定时备份方案数据库备份这事只有发生了事故才能真正理解它的重要性。我第一次写备份脚本时想法很简单每天用 mysqldump 全量导出放到某个目录就行。后来才发现单纯一个脚本并不是重点重点在于“定时执行自动清理异地容灾”三层都要打通。写一个备份脚本/usr/local/bin/mysql_backup.sh#!/bin/bash DB_USERbackup DB_PASSYourPassword BACKUP_DIR/data/backup/mysql DATE$(date %Y%m%d_%H%M%S) KEEP_DAY7 mkdir -p $BACKUP_DIR mysqldump -u$DB_USER -p$DB_PASS --all-databases --single-transaction --quick | gzip $BACKUP_DIR/all_db_$DATE.sql.gz find $BACKUP_DIR -name *.sql.gz -mtime $KEEP_DAY -exec rm {} \;这里有几个参数值得说明--single-transaction是 InnoDB 引擎下做一致性快照的关键不加它备份过程中写入的数据会导致备份数据不一致--quick可以避免导出大库时占用太多内存。备份用户不要直接用 root建一个专门的 backup 账号授权加上SELECT、LOCK TABLES、RELOAD等最小必要权限即可。然后写入定时任务crontab -e # 每天凌晨2点执行备份 0 2 * * * /usr/local/bin/mysql_backup.sh /var/log/mysql_backup.log 21最后记得把备份目录同步到对象存储 OSS 或者另一台异地机器上。我有一台 2C4G 的跳板机专门做备份中转用ossutil或者 rsync 都行。备份文件是 gzip 压缩后的 sql一般不太大保持 7 天本地、30 天云端就够应付绝大多数事故了。4.2 SSL 证书申请与 Nginx 配置HTTPS 早就是标配尤其涉及登录或支付的应用没证书用户都不敢往下操作。自签名证书虽然有加密效果但浏览器会弹红色警告所以我的建议是直接用免费的 ACME 自动签发证书方案。安装 acme.shcurl https://get.acme.sh | sh借助 DNS API 申请证书以阿里云 DNS 为例export Ali_Key你的AccessKeyId export Ali_Secret你的AccessKeySecret acme.sh --issue --dns dns_ali -d demo.example.comDNS 方式的好处是不需要占用 80 端口也不依赖外网能访问你的服务器适合刚建好的机器。证书生成后复制到 Nginx 的配置目录acme.sh --install-cert -d demo.example.com \ --key-file /etc/nginx/ssl/demo.key \ --fullchain-file /etc/nginx/ssl/demo.pem \ --reloadcmd nginx -s reload--reloadcmd是重点acme.sh 自动续期后会执行这里的命令重载 Nginx让新证书立即生效。很多人的网页还是旧证书就是因为签完了不知道要 reload。接着在 Nginx 的 server 块里加上listen 443 ssl; ssl_certificate /etc/nginx/ssl/demo.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5;同时把 80 端口全部跳转到 443server { listen 80; server_name demo.example.com; return 301 https://$host$request_uri; }这个配置完成后重启 Nginx用curl -I https://demo.example.com验证证书链是否完整。这里我想补一句ssl_protocols里不要开 TLSv1.0 和 TLSv1.1老协议漏洞多银行和浏览器都在逐步淘汰它们。4.3 安全基线自查与常见加固安全加固是个细活并且不能单靠某一个工具。我一般按“账户、端口、日志、进程”四个方向过一遍下面列出一些我每次都会检查的项目。密码策略方面修改/etc/login.defs和/etc/security/pwquality.conf保证新密码最小长度 12 位包含大小写和数字。对root以外的运维账号建议开启 SSH 双因子认证或者强制密钥登录。端口方面只保留 22、80、443 以及业务必须的端口其余全部在安全组和本机 firewalld 中关闭。日志方面开启rsyslog的远程转发功能把所有系统日志实时推送到集中的日志服务器方便事后回溯。另外我会用一个简单的脚本检查最近 7 天是否有异常登录lastb | head -50 journalctl -u sshd --since -7 days | grep Failed password | wc -l如果数字过大比如上千条说明你的公网 IP 正在被扫描优先检查安全组白名单、SSH 端口是否已更换以及系统是否有后门启动项。还有一点容易被忽略就是 crontab 和 systemd timer 里有没有被写入恶意的定时任务。要养成定期查看的习惯crontab -l ls -la /etc/systemd/system/*.timer /etc/cron*这些做完之后再用lynis这种开源审计工具跑一遍高分通过基本说明基线扎实了。安全不是装了某个软件就高枕无忧它是日常运维里不断夯实的一个过程。5. 常见问题与排查技巧实录服务器环境搭建过程中大概率会遇到不少“坑”。有的坑看过文档就能避免有的只能在实战里踩过才知道。这一节我把几个高频问题的排查过程完整记录下来包含现象、原因、定位方法和最终处理给你一个可复制的排查思路。5.1 80 端口被占用导致 Nginx 启动失败新装的 Nginx启动时报错bind() to 0.0.0.0:80 failed十有八九是 httpd 或别的进程抢占了 80 端口。用lsof -i :80或ss -tlnp | grep 80就能看到谁占用了。我遇到过的情况是系统自带了 httpd而且已经开机自启。处理方法很简单禁用掉 httpdsystemctl disable --now httpd然后重新启动 Nginx。如果是其他业务程序占用了端口就先确认能不能换端口不能换再停掉占用进程。不要一上来就 kill 进程先确认是什么业务否则很容易把正常服务干掉。5.2 PHP 页面出现 502 Bad GatewayNginx 访问静态页面正常访问 PHP 直接 502这个问题的根子基本都在 PHP-FPM 和 Nginx 的沟通上。排查顺序如下检查 PHP-FPM 是否在运行systemctl status php-fpm检查 socket或端口是否可访问ls -l /run/php-fpm/www.sock检查 Nginx 配置文件里fastcgi_pass的地址和 PHP-FPM 的监听地址是否一致特别是 unix socket 的路径检查 PHP-FPM 运行用户与 Nginx 运行用户是否一致或者文件权限是否能 read看/var/log/nginx/error.log和/var/log/php-fpm/error.log。有一次我排查了很久最后发现是 php-fpm 启动失败原因是内存不够。当时机器只有 1G 内存跑了 MySQL 和 Nginx 之后再给 php-fpm 默认的memory_limit128M分配导致起不来。解决办法是调低并发进程数pm.max_children并适当减小pm.start_servers。做服务器配置一定要根据实际资源情况来不能永远按默认值跑。5.3 MySQL 启动失败或 error log 报错MySQL 8.0 启动失败的原因五花八门最常见的是初始化目录权限不对。比如我把 datadir 设置在/data/mysql忘了chown -R mysql:mysql /data/mysql导致 mysqld 无法写入数据文件。启动时报错信息虽然长但关键还是末尾几行Permission denied或Cant create/write to file。如果是权限问题直接改归属chown -R mysql:mysql /data/mysql如果是 my.cnf 配置写错了比如指定了系统不支持的插件或错误路径mysqld 会直接拒绝启动。可以先跳过权限表做最小启动测试mysqld --usermysql --skip-grant-tables --socket/tmp/mysql-debug.sock启动成功就说明 my.cnf 本身没大问题再回头逐项检查权限及 socket 冲突就行。对初始化时的日志要格外敏感/var/log/mysql/error.log里如果有Please read Security section of the manual那就是 root 密码设置问题按提示重新 init 即可。5.4 服务器重启后服务没自动拉起这个问题出现的频率非常高。明明 Nginx、MySQL、PHP-FPM 都配了 systemd 服务但服务器重启后总是有几个服务没起来。原因一般是 systemd 的enable没有真正生效或者依赖顺序写错。以 Nginx 为例如果启动脚本是自己写的要保证 unit 文件里有WantedBymulti-user.target。写完以后执行systemctl daemon-reload systemctl enable nginx systemctl is-enabled nginx查询结果应显示 enabled。如果显示 disabled 或 static就得回头检查 unit 文件是否有语法错误。另外在 CGroup 版本不同的新系统上如果 unit 文件里没有指定PIDFilesystemd 可能无法准确跟踪主进程极端情况下也会报 failed。所以自写 systemd 服务时文件里的ExecStart路径要写绝对路径PIDFile也别省能省很多麻烦。5.5 常见问题汇总表我把这些年经常遇到的“坑”整理成一张速查表方便你对照定位现象常见原因排查命令解决办法Nginx 启动失败80/443端口被占用ss -tlnp | grep 80释放端口或改 Nginx listen 端口PHP 页面 502PHP-FPM 未启动或 socket 路径不对systemctl status php-fpm启动 php-fpm 并统一 fastcgi_pass 路径PHP 页面 404Nginx location 规则不匹配curl -I 域名/index.php检查 root 和 location ~ .php 块MySQL 连接失败socket 路径不一致mysql -uroot -p -S /tmp/mysql.sock统一 my.cnf 里的 socket 路径服务器重启后服务没起systemd enable 未生效systemctl is-enabled mysql重新 daemon-reload 并 enable网站访问慢DNS 解析、PHP-FPM 进程数、数据库慢查询top、php-fpm 日志、slow query log逐层排查先看 CPU 内存再看数据库慢日志证书到期但网页没更新定时续期失败或 acme.sh reloadcmd 缺失acme.sh --list检查本地证书过期时间并确认 reloadcmd 已配置这张表并不全面但覆盖了新手阶段最容易碰到的几个问题。实际上大多数故障是组合因素比如 Nginx 配置改了没 reload、MySQL 密码变了应用没更新、安全组 443 没放行等不会单一出现。所以排查时一定要有全局意识先确认网络层通不通再看服务层最后看应用层层层递进才不会在两三个点之间反复转圈。6. 性能压测与持续运维建议环境稳定之后不能直接拍拍胸脯说没问题我习惯先用工具压一次掌握当前配置的底线。这里我简单说一下压测流程以及后续日常运维的小建议很多内容也是我服务线上业务以来慢慢沉淀下来的方法。6.1 用 ab 和 sysbench 做个快速体检ab 是 ApacheBench可以用来做 HTTP 请求压测。一个简单的命令ab -n 10000 -c 200 http://demo.example.com/-n表示总请求数-c表示并发数。如果请求全部成功、平均响应时间在几十毫秒内基本说明 Nginx 到 PHP 这条链路没问题。如果大量请求失败就要考虑是不是 PHP-FPM 的进程数太少或者 MySQL 慢查询拖了性能。MySQL 压测可以用 sysbenchsysbench oltp_read_write --table-size1000000 --mysql-userroot --mysql-passwordxxx prepare sysbench oltp_read_write --threads16 --time60 --mysql-userroot --mysql-passwordxxx run看 TPS每秒事务数和延迟。一般来说1G 内存的机器 TPS 可能只有几百到一千4C8G 的实例能轻松上万。这里我不给你具体“达标值”因为业务模型不同差距会非常大。重要的是通过压测找到当前硬件和配置的瓶颈再针对性地优化。6.2 日志切割与监控提醒Nginx、PHP-FPM、MySQL 的日志都会无限增长长期不处理会占满磁盘。systemd 系统自带的 journald 也有日志压力。我一般直接用 logrotate 统一切割比如 Nginx 日志的配置/usr/local/nginx/logs/*.log { daily rotate 14 compress missingok notifempty sharedscripts postrotate [ -f /usr/local/nginx/logs/nginx.pid ] kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid) endscript }监控方面如果不想引入整个 Prometheus 栈可以先从简单的 shell 脚本加告警开始。比如检查磁盘使用率超过 85% 时发邮件或企业微信通知df -h | awk NR1 int($5)85 {print $0}把这些脚本挂到 crontab 里五分钟一跑能覆盖大部分基础故障。团队规模上来之后再平滑迁移到专业监控平台就行。6.3 给新手的几条运维习惯建议环境能跑通只是起点真正拉开运维水平差距的是日常流程。结合我这几年的经验给刚入门的同学几个建议所有服务器配置和操作尽量记录到文档里哪怕只是简单的 Markdown 笔记。半年后回看你会发现当时随手记下的命令省了大量回忆成本。每次变更操作前先确认当前配置和业务状态粗心是运维最大的敌人。改配置前记得先备份原文件哪怕只是cp xxx.conf xxx.conf.bak。定时任务、计划脚本里凡是重定向到文件的操作后面一定要接21这样错误信息才不会被吞掉。排查问题的时候日志就是你的眼睛。手动执行过的系统命令能写成脚本就写成脚本脚本能放到版本管理就放到版本管理。真实的生产环境没人愿意用脑袋记几十条命令。如果业务流量可能增长从一开始就留好优化空间比如数据库连接池配置、CDN 接入方式、静态资源分离方案提前设计比临时加机器效果好得多。我个人习惯每季度对服务器做一次巡检包括系统更新、内核版本审查、安全基线检查、备份恢复测试。听起来繁琐但能避免不少“温水煮青蛙”式的隐患。备份恢复测试特别重要只备份不恢复等于没备份真出事的时候才发现备份文件损坏才是最痛苦的。7. 写在最后的经验分享如果你和我一样是从零开始接触云服务器不用被上面这些命令行吓到。Alibaba Cloud Linux 3 的兼容性做得很好教程和工具链也丰富照着这篇实战记录一步步走基本能把一套稳定的 LNMP 环境搭起来。我第一次搭的时候也踩了不少坑尤其是权限和 systemd 这两块浪费了整整一个下午。这里再分享一个小技巧以后只要动到 Nginx、PHP-FPM、MySQL 的配置改完先执行nginx -t、php-fpm -t、mysqld --validate-config这类语法检查再实际 reload。很多线上事故其实不是业务代码出了问题而是配置改错了没检查就重启。一条检查命令能挡掉九成低级故障。最后环境搭建只是一个开始。真正的挑战在于后续的业务部署、安全运营和性能调优。希望这篇记录能帮你把这第一步走得稳一点少一点深夜加班排查问题的经历。如果你在搭建过程中还有什么长期烦恼的问题也欢迎随时拿日志来找我一起分析毕竟踩坑经验都是聊出来和试出来的。
返回列表