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依赖B,B依赖C,rpm会直接告诉你"缺少依赖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服务?不同的需求,装的东西完全不一样。最常见的组合是LNMP(Linux + Nginx + MySQL + PHP)或者LAMP(Linux + 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默认开着firewalld,80端口没放行的话,外面访问不了。放行命令:firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https 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默认源里的是MariaDB(MySQL的一个分支),如果你要装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 'root'@'localhost' 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-FPM:systemctl 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-FPM:systemctl 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和https:firewall-cmd --zone=public --add-service=http --permanent firewall-cmd --zone=public --add-service=https --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程序连数据库报错,错误信息通常是"Can't 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绑定的,'user'@'localhost'和'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里的DefaultLimitNOFILE=65535,重启生效。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发行版上一样管用。关键不是记住某条命令,而是理解"为什么这条命令能解决问题"。这个能力,才是真正值钱的。
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依赖B,B依赖C,rpm会直接告诉你"缺少依赖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服务?不同的需求,装的东西完全不一样。最常见的组合是LNMP(Linux + Nginx + MySQL + PHP)或者LAMP(Linux + 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默认开着firewalld,80端口没放行的话,外面访问不了。放行命令:firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https 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默认源里的是MariaDB(MySQL的一个分支),如果你要装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 'root'@'localhost' 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-FPM:systemctl 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-FPM:systemctl 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和https:firewall-cmd --zone=public --add-service=http --permanent firewall-cmd --zone=public --add-service=https --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程序连数据库报错,错误信息通常是"Can't 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绑定的,'user'@'localhost'和'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里的DefaultLimitNOFILE=65535,重启生效。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发行版上一样管用。关键不是记住某条命令,而是理解"为什么这条命令能解决问题"。这个能力,才是真正值钱的。