1. 为什么我劝你先搞懂装软件这件事再谈搭环境很多人第一次接触CentOS 7脑子里想的都是我要搭个网站我要跑个服务结果第一步装软件就卡住了。yum报错、依赖冲突、源不可用、编译失败……这些问题看起来零散其实根子上是同一件事你没有搞清楚CentOS 7的软件生态是怎么运转的。我见过太多人拿到一台新机器上来就搜CentOS 7 搭建XX环境 教程照着命令一行行敲敲完发现跑不起来然后换一篇教程继续敲最后系统里堆了一堆半成品自己都不知道装了什么。这种搞法运气好能跑起来运气不好就是无限重装。这篇文章我想把逻辑倒过来讲。先让你理解CentOS 7装软件到底有哪几条路、每条路适合什么场景、各自的坑在哪里然后再带你走一遍完整的网站环境搭建流程。这样你遇到问题的时候不是去搜XX报错怎么办而是能自己判断问题出在哪个环节。CentOS 7这个系统本身已经比较老了官方在2024年6月停止了维护更新这意味着默认的yum源地址已经失效。这是现在新手踩的第一个大坑——你照着三年前的教程敲yum install大概率直接报Could not resolve host: mirrorlist.centos.org。所以现在搞CentOS 7第一件事不是装软件是先把软件源的问题解决掉。这篇文章适合谁看如果你是完全没碰过Linux的新手它能帮你建立一套完整的认知框架少走弯路如果你已经用过一段时间但总是知其然不知其所以然它能帮你把零散的知识点串起来。我尽量不堆术语每个操作都告诉你为什么这么做以及不这么做会怎样。2. CentOS 7装软件的四条路你得知道什么时候走哪条2.1 yum包管理日常首选但源是命门yum是CentOS 7上最主流的软件安装方式原理很简单它从配置好的软件仓库repository里下载已经编译打包好的rpm包自动处理依赖关系然后安装到系统里。你可以把它理解成手机上的应用商店——搜索、下载、安装、卸载一条龙。用yum装软件命令格式很直观yum install -y 软件名-y的意思是自动确认不加的话每装一个包它都会问你是否继续批量操作时很烦。但yum能不能用完全取决于源配得对不对。CentOS 7默认的源文件在/etc/yum.repos.d/目录下里面有一堆.repo文件。系统停止维护后这些文件里指向的官方地址已经不可用了。你需要把它们替换成还能用的镜像源。操作步骤不复杂但有几个细节容易翻车# 第一步备份原有源文件 cd /etc/yum.repos.d/ mkdir backup mv *.repo backup/ # 第二步下载可用的源配置文件 curl -o /etc/yum.repos.d/CentOS-Base.repo 可用镜像源的repo地址 # 第三步清理缓存并重建 yum clean all yum makecache这里有个坑要特别注意yum makecache如果报错大概率是源地址本身有问题或者你的机器DNS解析不了。先ping一下源地址的域名能通再继续。另外有些镜像源只同步了部分仓库你装某些包的时候可能提示没有可用软件包这时候换一个源试试。还有一个常见问题yum install的时候提示Delta RPMs disabled because /usr/bin/applydeltarpm not installed。这不是错误只是说增量更新功能没启用不影响安装忽略就行。提示替换源之后建议先跑一次yum update把系统里已有的包更新到最新。但如果你是在生产环境操作更新前务必确认不会影响现有服务必要时先做快照。2.2 rpm手动安装知道它存在但别轻易用rpm是CentOS底层的包管理工具yum其实就是在它上面套了一层依赖处理的逻辑。你可以直接用rpm装单个包rpm -ivh 包名.rpm-i是安装-v是显示详细信息-h是显示进度条。但rpm最大的问题是不自动处理依赖。比如你装A包A依赖BB依赖Crpm会直接告诉你缺少依赖B然后你就得手动去找B装B的时候又发现缺C……这种依赖链一长手动装就是噩梦。所以rpm一般用在两种场景一是你从某处拿到了一个单独的rpm包且确认依赖都满足二是你要查询某个包的信息rpm -qa | grep 关键词 # 查询已安装的包 rpm -ql 包名 # 列出包安装了哪些文件 rpm -qf /path/to/file # 查询某个文件属于哪个包这几个查询命令很实用后面排查问题时会经常用到。2.3 源码编译安装灵活但费时适合特定需求有些软件在yum源里没有或者源里的版本太老你需要自己编译。典型流程是# 下载源码包 wget 源码包地址 # 解压 tar -zxvf 包名.tar.gz cd 包名 # 配置 ./configure --prefix/usr/local/软件名 # 编译 make # 安装 make install--prefix指定安装目录不指定的话默认散落在系统各处后期卸载很麻烦。源码编译的坑主要集中在依赖上。./configure阶段会检查系统里有没有它需要的库和头文件缺什么它会报出来。常见的缺失包括gcc、make、zlib-devel、openssl-devel这些提前装好能省不少事yum install -y gcc gcc-c make zlib-devel openssl-devel pcre-devel编译过程可能很长尤其是配置不高的机器上make跑十几分钟很正常。如果中途报错仔细看错误信息通常是某个头文件找不到或者版本不兼容。注意源码编译安装的软件yum是管不了的升级和卸载都得手动操作。所以能用yum解决的优先用yum。2.4 二进制包直接解压最省事但要看清楚说明还有一类软件官方直接提供了编译好的二进制包下载解压就能用不需要编译。比如某些数据库、某些运行时环境。这种方式的优点是快缺点是路径和配置需要你自己处理。一般流程是wget 二进制包地址 tar -zxvf 包名.tar.gz -C /usr/local/ # 然后配置环境变量或创建软链接这种包通常会有详细的README说明怎么配置照着做就行。但要注意版本和系统架构的匹配——64位系统别下成32位的包。3. 网站环境搭建从零到能跑通的完整链路3.1 先想清楚你要搭什么再动手网站环境这个词太笼统了。你是要跑一个静态页面还是要跑PHP动态网站还是要跑Java应用还是要跑Python服务不同的需求装的东西完全不一样。最常见的组合是LNMPLinux Nginx MySQL PHP或者LAMPLinux Apache MySQL PHP。这两个组合的区别主要在于Web服务器用Nginx还是Apache。Nginx在高并发场景下表现更好资源占用更低Apache的配置更直观模块生态更成熟。现在新搭的环境选Nginx的居多。我下面以LNMP为例走一遍完整流程但你要理解每一步在做什么这样换成其他组合你也能自己调整。3.2 Nginx的安装与最小化配置Nginx用yum装最省事但CentOS 7默认源里没有Nginx需要先添加EPEL源或者Nginx官方源。# 添加EPEL源 yum install -y epel-release # 安装Nginx yum install -y nginx装完之后Nginx的配置文件在/etc/nginx/nginx.conf默认的网站根目录在/usr/share/nginx/html。启动并设置开机自启systemctl start nginx systemctl enable nginx然后浏览器访问服务器IP看到Nginx的默认欢迎页就说明装好了。但这里有几个实际会遇到的问题第一防火墙。CentOS 7默认开着firewalld80端口没放行的话外面访问不了。放行命令firewall-cmd --permanent --add-servicehttp firewall-cmd --permanent --add-servicehttps firewall-cmd --reload第二SELinux。这玩意有时候会拦住Nginx访问某些目录。如果你确认配置没问题但就是403可以先临时把它设为宽松模式测试setenforce 0如果设了之后就好了说明是SELinux的问题你需要去调整SELinux策略而不是一直关着它。生产环境不建议直接永久关闭SELinux。第三配置文件语法。改完nginx.conf之后别急着重启先测试语法nginx -t它会告诉你配置文件有没有语法错误以及错误在第几行。这个习惯能帮你避免改完配置服务起不来的尴尬。一个最简化的网站配置大概长这样放在/etc/nginx/conf.d/目录下server { listen 80; server_name your_domain_or_ip; root /var/www/html; index index.html index.php; location / { try_files $uri $uri/ 404; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }这个配置里root指定网站文件放哪index指定默认首页location ~ \.php$这一段是把PHP请求转发给PHP-FPM处理。如果你不跑PHP这段可以不要。3.3 MySQL的安装与安全初始化CentOS 7默认源里的是MariaDBMySQL的一个分支如果你要装Oracle官方的MySQL需要先添加MySQL的源。用MariaDB的话yum install -y mariadb-server mariadb systemctl start mariadb systemctl enable mariadb装完之后必须跑一次安全初始化mysql_secure_installation它会问你几个问题是否设置root密码、是否删除匿名用户、是否禁止root远程登录、是否删除测试数据库。建议全部选是。这一步很多人跳过结果数据库裸奔在公网上非常危险。如果你要装Oracle MySQL步骤稍微多一点# 下载MySQL的yum源包 wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm rpm -ivh mysql80-community-release-el7-3.noarch.rpm yum install -y mysql-community-server systemctl start mysqldMySQL 8装完之后root的临时密码在日志里grep temporary password /var/log/mysqld.log拿到临时密码后登录第一件事是改密码ALTER USER rootlocalhost IDENTIFIED BY 新密码;MySQL 8的密码策略比较严格要求大小写字母、数字、特殊字符都有长度至少8位。如果你只是本地测试不想这么麻烦可以调整策略SET GLOBAL validate_password.policy LOW; SET GLOBAL validate_password.length 6;但生产环境别这么干。3.4 PHP的安装与PHP-FPM配置PHP用yum装的话CentOS 7默认源里的版本是5.4太老了。你需要添加Remi源或者EPEL源来装新版本。# 添加Remi源 yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm yum install -y yum-utils yum-config-manager --enable remi-php74 # 安装PHP 7.4及相关模块 yum install -y php php-fpm php-mysqlnd php-gd php-mbstring php-xml php-json装完之后启动PHP-FPMsystemctl start php-fpm systemctl enable php-fpmPHP-FPM的配置文件在/etc/php-fpm.d/www.conf有几个关键参数需要关注user和group指定PHP-FPM进程以哪个用户身份运行默认是apache。如果你用Nginx建议改成nginx并且确保Nginx的worker进程用户和这个一致否则会出现权限问题。listen指定监听地址和端口默认是127.0.0.1:9000和Nginx配置里的fastcgi_pass要对应上。pm.max_children最大子进程数根据服务器内存调整。每个PHP进程大概占30-50MB内存你可以用free -m看看可用内存然后估算一个合理值。改完配置后重启PHP-FPMsystemctl restart php-fpm然后在网站根目录创建一个info.php测试文件?php phpinfo(); ?浏览器访问http://你的IP/info.php如果能看到PHP信息页面说明Nginx和PHP-FPM的联动配置成功了。测试完记得把这个文件删掉它暴露了太多服务器信息。3.5 把网站文件放上去并验证环境搭好之后把你的网站文件放到Nginx配置的root目录下。如果是压缩包解压后注意文件权限chown -R nginx:nginx /var/www/html chmod -R 755 /var/www/html权限问题是最常见的明明配置对了但就是访问不了的原因。Nginx的worker进程以什么用户运行网站目录就得让那个用户有读取权限。如果你跑的是WordPress、Typecho这类PHP程序还需要创建数据库、导入数据、修改配置文件里的数据库连接信息。这些步骤每个程序不一样但核心逻辑是一样的建库、建用户、授权、导入。CREATE DATABASE 网站数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 网站用户localhost IDENTIFIED BY 密码; GRANT ALL PRIVILEGES ON 网站数据库名.* TO 网站用户localhost; FLUSH PRIVILEGES;字符集建议用utf8mb4而不是utf8因为MySQL的utf8实际上不是完整的UTF-8不支持emoji等四字节字符。这个坑很多人踩过——网站存emoji的时候报错或者变成问号。4. 那些教程不会告诉你的踩坑实录4.1 yum源失效之后的连锁反应系统停止维护之后最直接的影响就是yum源不可用。但很多人不知道的是这还会引发一系列连锁问题。比如你装某个软件的时候它依赖一个包这个包在基础源里有但基础源已经失效了于是yum报没有可用软件包。你以为是软件本身的问题其实是源的问题。再比如你之前配了某个第三方源那个源还在正常工作但基础源失效了yum在解析依赖的时候依然会去尝试访问基础源导致超时或者报错。解决办法就是彻底替换掉所有失效的源。检查/etc/yum.repos.d/目录下所有.repo文件把里面指向mirror.centos.org、mirrorlist.centos.org的地址全部替换成可用的镜像地址。有些镜像站提供了CentOS 7的vault归档可以用那些地址。替换完之后yum clean all和yum makecache是必须的否则yum还在用旧的缓存。4.2 防火墙和SELinux两个最容易被忽略的拦路虎我见过太多人Nginx装好了配置也检查了nginx -t也通过了但外面就是访问不了。折腾半天发现是防火墙没放行端口。CentOS 7的firewalld和iptables不太一样它的规则是分zone的。默认的public zone里只有ssh是放行的。你要加http和httpsfirewall-cmd --zonepublic --add-servicehttp --permanent firewall-cmd --zonepublic --add-servicehttps --permanent firewall-cmd --reload--permanent表示永久生效不加的话重启防火墙就没了。--reload是重新加载规则不中断现有连接。SELinux的问题更隐蔽。它不会阻止你启动服务但会阻止服务访问文件。比如你把网站文件放在/home/user/www下面Nginx就是读不了因为SELinux默认不允许Nginx访问home目录。排查方法# 查看SELinux是否开启 getenforce # 查看SELinux的拒绝日志 ausearch -m avc -ts recent如果日志里有denied的记录那就是SELinux在拦。解决办法不是直接关掉它而是给文件打上正确的标签semanage fcontext -a -t httpd_sys_content_t /home/user/www(/.*)? restorecon -Rv /home/user/www或者更简单的方式把网站文件放在SELinux默认允许的目录下比如/var/www/html。4.3 PHP-FPM的权限和连接问题Nginx和PHP-FPM之间的连接问题通常表现为访问PHP文件时返回502 Bad Gateway。502的原因有几个PHP-FPM没启动、监听地址不对、权限不够。先检查PHP-FPM状态systemctl status php-fpm如果没启动看日志journalctl -u php-fpm -n 50如果PHP-FPM在跑但还是502检查Nginx配置里的fastcgi_pass地址和PHP-FPM的listen地址是否一致。一个监听127.0.0.1:9000另一个写unix:/var/run/php-fpm/php-fpm.sock那肯定连不上。还有一个容易忽略的点PHP-FPM的运行用户和Nginx的运行用户不一致时如果PHP-FPM通过socket通信socket文件的权限可能不允许Nginx访问。用TCP端口通信就没这个问题。4.4 数据库连不上的几种可能PHP程序连数据库报错错误信息通常是Cant connect to MySQL server或者Access denied for user。前者一般是MySQL没启动或者监听地址不对。检查systemctl status mysqld ss -tlnp | grep 3306如果MySQL只监听了127.0.0.1而你的程序配置的是服务器的公网IP那就连不上。改MySQL配置里的bind-address或者把程序配置改成127.0.0.1。后者是用户名密码或者授权问题。检查用户是否存在、密码是否正确、是否允许从当前主机连接SELECT user, host FROM mysql.user; SHOW GRANTS FOR 用户名主机;MySQL的授权是跟host绑定的userlocalhost和user%是两个不同的用户。程序连的是哪个host就得有对应的授权。4.5 文件上传大小限制一个改了三处才生效的参数PHP网站上传大文件失败你需要改三个地方第一PHP的upload_max_filesize和post_max_size在/etc/php.ini里改。第二Nginx的client_max_body_size在nginx.conf的http块或者server块里改。第三如果你用了PHP-FPM还要确认php.ini的路径对不对。用phpinfo()看一下Loaded Configuration File指向哪个文件改那个才有效。三个地方都改完重启Nginx和PHP-FPM再测试。5. 环境搭好之后怎么确认它真的稳了5.1 写一个最小化的验证清单环境搭完不是能打开首页就完事了。我习惯跑一遍下面的检查清单检查项命令/方法预期结果Nginx进程systemctl status nginxactive (running)PHP-FPM进程systemctl status php-fpmactive (running)MySQL进程systemctl status mysqldactive (running)端口监听ss -tlnp80、443、3306、9000在监听防火墙规则firewall-cmd --list-allhttp、https已放行PHP解析访问info.php显示PHP信息页数据库连接程序后台登录正常登录文件上传上传一个测试文件成功伪静态访问一个不存在的路径返回程序的404页而非Nginx的404页最后一项伪静态很多人不检查但它是判断Nginx的try_files或rewrite规则是否生效的关键。如果访问一个不存在的路径返回的是Nginx默认的404页面说明请求没有转发给PHP程序处理伪静态规则没生效。5.2 日志是你最好的朋友出问题的时候不要瞎猜先看日志。Nginx的日志在/var/log/nginx/access.log记录所有请求error.log记录错误。PHP-FPM的日志在/var/log/php-fpm/。MySQL的日志在/var/log/mysqld.log。看日志有个技巧用tail -f实时跟踪然后去触发问题日志里会实时输出错误信息。tail -f /var/log/nginx/error.log这比你在那反复刷新页面猜原因高效得多。5.3 备份和快照别等出事再后悔环境搭好、网站跑起来之后第一件事是做快照或备份。虚拟机的话直接打快照物理机的话至少把配置文件备份一份tar -czvf /root/backup/nginx_conf_$(date %Y%m%d).tar.gz /etc/nginx/ tar -czvf /root/backup/php_conf_$(date %Y%m%d).tar.gz /etc/php.ini /etc/php-fpm.d/ mysqldump -u root -p --all-databases /root/backup/all_db_$(date %Y%m%d).sql我自己的习惯是每次改配置之前先备份改完验证没问题再删旧备份。这样万一改崩了回滚就是一条命令的事。5.4 几个让环境更稳的小调整系统默认的一些参数偏保守稍微调一下能避免后面出问题。文件描述符限制。Nginx和MySQL在高并发时会打开大量文件句柄默认的1024可能不够。改/etc/security/limits.conf* soft nofile 65535 * hard nofile 65535然后改/etc/systemd/system.conf里的DefaultLimitNOFILE65535重启生效。MySQL的连接数。默认max_connections是151小网站够用但如果你跑的是多用户系统可能需要调大。在/etc/my.cnf里改[mysqld] max_connections 500但要注意连接数不是越大越好每个连接都占内存调太大反而会把内存耗尽。PHP的内存限制。默认memory_limit是128M跑WordPress可能不够。在php.ini里改成256M或512M根据你的服务器内存来定。这些调整不是必须的但做了之后后面遇到莫名其妙的问题会少很多。6. 从能跑到跑得好中间还差什么环境搭起来只是第一步。真正让一个网站稳定运行还需要考虑更多东西。安全方面至少要做这几件事SSH不要用默认端口、禁止root直接登录、用密钥登录代替密码登录、定期更新系统和软件的安全补丁、数据库不要暴露在公网、网站目录不要给写权限除非程序需要。性能方面Nginx可以开gzip压缩、配置静态文件缓存、调整worker进程数和连接数。PHP可以开opcache加速。MySQL可以调整innodb_buffer_pool_size一般设为可用内存的50%-70%。监控方面至少要有一个能告诉你网站挂了的机制。简单的可以用cron定时curl一下首页检查返回码复杂一点的可以上专业的监控工具。但这些话题展开就太长了而且每个方向都够写好几篇。我写这篇的目的是帮你把从装软件到搭环境这条链路走通让你有一个能跑起来的基础。有了这个基础后面优化也好、排错也好你至少知道每个东西在哪、是干什么的。最后说一个我自己的体会CentOS 7虽然老了但它的生态和文档非常成熟作为学习Linux的入门系统依然很合适。你在这个系统上踩过的坑、学到的排查思路换到其他Linux发行版上一样管用。关键不是记住某条命令而是理解为什么这条命令能解决问题。这个能力才是真正值钱的。