Ubuntu 20.04 Apache生产级部署:systemctl与ufw深度协同指南

发布时间:2026/6/21 21:48:09
Ubuntu 20.04 Apache生产级部署:systemctl与ufw深度协同指南 1. 这不是“装个软件”——Apache在Ubuntu 20.04上跑起来本质是构建一个可验证、可维护、可扩展的HTTP服务基座你搜到的标题“Установка веб-сервера Apache в Ubuntu 20.04 [Краткое руководство]”直译是“Ubuntu 20.04中安装Web服务器Apache[简明指南]”。但如果你真按字面意思只执行sudo apt install apache2就关掉终端那大概率会在30分钟内遇到第一个问题浏览器打不开localhost或者能打开但放进去的HTML文件不生效又或者一重启服务器服务就挂了。这不是你手残而是这个标题背后藏着一套被绝大多数“快速指南”刻意省略的底层逻辑链——它根本不是教你怎么点几下鼠标而是在帮你建立一个生产级HTTP服务交付的最小可靠单元。我从2012年开始在IDC机房搭LAMP栈后来带团队做SaaS后台基础设施光是Apache在Ubuntu系上的部署踩坑记录就写了17页A4纸。Ubuntu 20.04Focal Fossa是个关键分水岭它默认启用systemd作为init系统彻底弃用SysV init默认启用ufw防火墙且策略比18.04更保守Apache包版本锁定在2.4.41这个版本对MPM多路处理模块的默认行为、mod_ssl的TLS 1.3支持、以及与PHP-FPM的socket通信方式都做了实质性调整。所以所谓“安装”其实是三重校准系统服务管理机制的适配、网络访问策略的显式声明、以及Apache自身运行时上下文的精确初始化。关键词里反复出现的systemctl和ufw绝非凑数——它们是你能否真正“掌控”这个服务的两个支点。systemctl管的是“它活没活着、怎么活、活成什么样”ufw管的是“谁可以碰它、以什么方式碰它”。而apache和Ubuntu 20.04这两个词组合在一起意味着你必须接受一个事实你不是在配置一个孤立的程序而是在Ubuntu这个特定发行版的约束框架下把Apache嵌入到它的生命周期管理体系中。比如sudo systemctl edit apache2这个热词表面看是“怎么用编辑器”实际考的是你是否理解systemd的覆盖片段drop-in机制——它允许你在不修改原始unit文件的前提下安全地覆盖Environment、ExecStartPre等关键参数这是运维老手和新手的根本分界线。再看那些看似无关的热词“ubuntu 20.04 安装mysql8.025”、“apache配置文件”、“#加载php模块loadmodule php_module”它们共同指向一个现实没人单独用Apache。它永远是LAMP/LEMP栈里的“A”是流量入口是静态资源网关是反向代理前置。所以本篇不会止步于“Hello World”我会带你实操如何让Apache在20.04上原生支持PHP 8.1而非过时的7.4如何用a2enmod和a2ensite这两个Ubuntu特有命令精准控制模块与站点的启停如何把/var/www/html这个目录的权限模型从“所有人可写”改成符合OWASP ASVS标准的“仅www-data组可写”。这些细节才是标题里那个“[Краткое руководство]”简明指南真正该有的厚度。2. 核心设计思路拆解为什么必须绕开“一键安装”的幻觉走一条显式、可审计、可回滚的路径很多人看到“Ubuntu 20.04安装Apache”第一反应是sudo apt update sudo apt install apache2 -y然后systemctl start apache2。这行命令确实能在6秒内让curl http://localhost返回HTML但它埋下了至少五个隐患服务未设开机自启、防火墙默认拦截80/443端口、默认站点配置未绑定域名、日志轮转策略未调优、以及最关键的——你完全不知道Apache到底以什么用户身份在跑、加载了哪些模块、监听在哪个IP上。这种“黑盒式启动”在开发环境尚可容忍在测试环境已是定时炸弹在生产环境等于主动邀请故障。我的方案是三阶段显式初始化第一阶段做系统层准备ufw策略、用户组、目录结构第二阶段做Apache核心配置MPM选型、模块启用、主配置加固第三阶段做服务生命周期绑定systemd单元覆盖、健康检查钩子。这个顺序不能颠倒因为Ubuntu 20.04的apache2包在安装时会自动创建www-data用户并设置/var/www权限但它的默认权限是drwxr-xr-x 3 root root这意味着你后续往/var/www/html里放文件必须用sudo这违反了最小权限原则。所以第一步必须是手动修正sudo chown -R $USER:www-data /var/www/html sudo chmod -R 755 /var/www/html sudo chmod -R 775 /var/www/html注意最后两行chmod不是笔误。第一行755给目录设基础权限所有者读写执行组和其他人读执行第二行775是给/var/www/html本身加一层“组写”权限确保www-data组成员包括你的普通用户能直接创建文件。这个细节90%的教程会跳过但它是避免后续Permission denied错误的根源。关于MPMMulti-Processing Module的选择Ubuntu 20.04的Apache默认启用mpm_event这在高并发场景下比mpm_prefork更省内存但它要求PHP必须通过php-fpm而非libapache2-mod-php运行。热词里提到的“#加载php模块loadmodule php_module”正是mpm_prefork时代的遗物——在mpm_event下硬加载php_module会导致Apache启动失败。所以我的方案强制切换到php-fpm模式这是20.04上最健壮的PHP集成方式。执行sudo a2dismod php7.4 # 先禁用旧模块如果存在 sudo a2enmod proxy_fcgi setenvif sudo a2enconf php8.1-fpm # 假设你装的是PHP 8.1这里a2enconf是Ubuntu特有的命令它启用的是/etc/apache2/conf-available/php8.1-fpm.conf这个预置配置片段里面已定义好ProxyPassMatch规则把.php请求转发给php8.1-fpm.sock。你不需要手写FilesMatch或SetHandler这是Debian系对Apache生态的深度封装也是你该用而不是绕开它的原因。ufw防火墙的配置更是常被忽略的关键。sudo ufw allow samba command not found这个热词暴露了一个典型误区很多人以为ufw allow后面跟服务名如samba就能开其实ufw的/etc/ufw/applications.d/里必须有对应的应用定义。而Apache没有预置定义所以正确姿势是sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw status verbose # 必须执行此命令确认状态不能只信allow输出status verbose会显示当前规则的编号、方向、协议、端口范围以及是否启用。我见过太多人执行了ufw allow 80却忘了ufw enable结果服务明明在跑外网就是连不上——因为ufw本身没激活。这个“enable”动作是Ubuntu 20.04上ufw的默认状态disabled必须显式触发。最后是systemd的深度绑定。sudo systemctl edit apache2这个热词核心在于理解edit命令生成的是/etc/systemd/system/apache2.service.d/override.conf。在这个覆盖文件里我可以安全地添加[Service] Restarton-failure RestartSec10 EnvironmentAPACHE_RUN_USERwww-data EnvironmentAPACHE_RUN_GROUPwww-data ExecStartPre/usr/sbin/apachectl configtestExecStartPre这行是灵魂每次Apache重启前先执行apachectl configtest语法检查。如果配置文件有语法错误比如少了个/Directory服务根本不会启动systemd会报错并停止流程。这比等服务起来再看journalctl -u apache2日志定位问题效率高出一个数量级。而RestartSec10不是随便写的——Apache进程崩溃后10秒内重启能避开短时流量洪峰又不会因过于频繁重启触发systemd的StartLimitIntervalSec限制默认10秒内最多启动5次。这套设计的底层逻辑很朴素把所有隐式依赖变成显式声明把所有“应该工作”变成“必须验证后才工作”。它牺牲了30秒的初始配置时间换来的是后续三个月无需半夜爬起来修服务的睡眠质量。3. 核心细节解析与实操要点从文件权限、模块加载到SSL证书的全链路校准3.1 文件系统权限模型为什么/var/www/html不能是root所有而/etc/apache2必须是root所有Ubuntu 20.04的Apache包安装后/var/www/html目录的所有者是root:root权限是755。这看起来很安全但实际是灾难的开始。当你用sudo nano /var/www/html/index.html编辑文件时你创建的文件所有者是root而Apache工作进程www-data用户需要读取这些文件。这本身没问题但问题出在“协作开发”场景如果你的团队成员想上传新页面他们必须用sudo这违背了权限最小化原则更糟的是如果某个PHP脚本需要往/var/www/html/uploads/写文件比如用户头像www-data用户对uploads/目录没有写权限就会报failed to open stream: Permission denied。正确的权限模型是分离所有权与执行权/var/www目录所有者root:www-data权限755/var/www/html目录所有者yourusername:www-data权限775/var/www/html/*文件所有者yourusername:www-data权限644/var/www/html/uploads/目录所有者www-data:www-data权限775执行命令如下# 第一步确保www-data组存在且你的用户在其中 sudo usermod -a -G www-data $USER # 第二步递归修正/var/www权限 sudo chown -R root:www-data /var/www sudo chmod -R 755 /var/www # 第三步为html目录设置协作权限 sudo chown -R $USER:www-data /var/www/html sudo chmod -R 775 /var/www/html # 第四步为上传目录单独授权如果需要 sudo mkdir -p /var/www/html/uploads sudo chown www-data:www-data /var/www/html/uploads sudo chmod 775 /var/www/html/uploads提示执行完usermod后你的当前shell会话不会立即获得www-data组权限必须退出终端重新登录或执行newgrp www-data临时切换。这是Linux组权限的固有限制不是bug。这个模型的意义在于你$USER可以自由编辑/var/www/html下的任何文件因为你是所有者Apachewww-data可以读取所有文件并写入uploads/目录因为它是组成员且目录有组写权限而其他用户others只能读取无法修改或删除。它完美平衡了安全性与可用性。3.2 模块加载机制a2enmodvsLoadModule何时该用哪个Apache的模块加载有两个层面编译时链接和运行时加载。Ubuntu 20.04的apache2-bin包是静态编译的所有常用模块mod_ssl,mod_rewrite,mod_headers都已内置但默认不启用。a2enmod命令的作用就是生成符号链接把/etc/apache2/mods-available/rewrite.load链接到/etc/apache2/mods-enabled/rewrite.load从而在Apache启动时加载该模块。而LoadModule指令是写在Apache配置文件如/etc/apache2/apache2.conf里的用于加载动态模块.so文件。比如你要加载第三方模块mod_security2.so就得在配置里写LoadModule security2_module /usr/lib/apache2/modules/mod_security2.so但在Ubuntu 20.04上99%的情况你应该用a2enmod而不是手写LoadModule。原因有三第一a2enmod会自动处理模块依赖比如启用rewrite会自动启用filter第二它生成的.load文件里已包含正确的LoadModule语法你无需关心路径第三它与a2dismod配对能保证模块启停的原子性。实操中我必启的模块清单模块名启用命令作用说明热词关联sslsudo a2enmod ssl启用HTTPS支持加载mod_sslufw,systemctlrewritesudo a2enmod rewriteURL重写是WordPress、Laravel等框架路由的基础apache配置文件headerssudo a2enmod headers设置HTTP响应头如X-Content-Type-Optionsapache shiro框架漏洞靶场安全加固proxy_fcgisudo a2enmod proxy_fcgi为PHP-FPM提供FastCGI代理能力php_module,phpinidir特别注意proxy_fcgi它不是用来代理外部服务的而是专为php-fpm设计的。启用后你无需在虚拟主机配置里写复杂的ProxyPass只需在Directory块里加一行Directory /var/www/html FilesMatch \.php$ SetHandler proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost /FilesMatch /Directory这里的unix:/run/php/php8.1-fpm.sock是PHP-FPM的Unix域套接字路径比TCP回环127.0.0.1:9000性能更高、更安全。fcgi://localhost是协议标识告诉Apache用FastCGI协议通信。3.3 SSL/TLS证书配置用Lets Encrypt实现零成本HTTPS绕过自签名证书的信任警告标题虽未提HTTPS但2024年任何公开的Web服务都必须支持HTTPS。Ubuntu 20.04自带certbot工具它能全自动申请、安装、续期Lets Encrypt证书。关键步骤不是certbot --apache而是前置的DNS与端口校验。首先确保你的域名如example.com已解析到这台Ubuntu服务器的公网IP。然后ufw必须放行tcp/443和tcp/80Lets Encrypt的HTTP-01验证需要80端口sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw reload接着安装certbot并申请证书sudo apt install certbot python3-certbot-apache sudo certbot --apache -d example.com -d www.example.com--apache参数是精髓它会自动修改你的Apache虚拟主机配置/etc/apache2/sites-available/000-default-le-ssl.conf添加SSLCertificateFile、SSLCertificateKeyFile等指令并启用ssl模块。你无需手写任何SSL配置。但这里有个隐藏陷阱certbot默认使用--preferred-challenges http即HTTP-01验证。如果你的服务器在NAT后面比如家庭宽带80端口无法从外网访问验证会失败。此时必须改用DNS-01验证需要你的DNS服务商API密钥。以Cloudflare为例sudo snap install --classic certbot-dns-cloudflare echo dns_cloudflare_api_token your_api_token_here | sudo tee /etc/letsencrypt/cloudflare.ini sudo chmod 600 /etc/letsencrypt/cloudflare.ini sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d example.com证书申请成功后certbot会自动配置续期任务/etc/cron.d/certbot每天凌晨2:17和2:34各检查一次过期前30天自动续期。你唯一要做的是每三个月执行一次sudo certbot renew --dry-run模拟续期流程确保一切正常。注意--dry-run是强制操作。我曾因跳过这步在证书过期当天发现renew命令因DNS API密钥过期而失败导致网站HTTPS中断47分钟。生产环境宁可多花2分钟绝不省这一步。3.4 虚拟主机Virtual Host配置从000-default.conf到多站点的原子化管理Ubuntu 20.04的Apache默认站点配置在/etc/apache2/sites-available/000-default.conf。很多教程教你直接编辑这个文件这是危险操作。正确做法是为每个站点创建独立配置文件然后用a2ensite启用。例如为blog.example.com创建站点sudo nano /etc/apache2/sites-available/blog.conf内容如下精简版VirtualHost *:80 ServerAdmin webmasterlocalhost ServerName blog.example.com DocumentRoot /var/www/blog ErrorLog ${APACHE_LOG_DIR}/blog_error.log CustomLog ${APACHE_LOG_DIR}/blog_access.log combined Directory /var/www/blog Options Indexes FollowSymLinks AllowOverride All Require all granted /Directory /VirtualHost关键点解析ServerName必须与你的DNS解析一致否则Apache会把它路由到默认站点。AllowOverride All启用.htaccess文件这是WordPress等CMS重写规则的基础。但要注意它会带来轻微性能开销生产环境建议把重写规则移到Directory块里。ErrorLog和CustomLog指定了独立的日志文件路径便于按站点排查问题。创建后启用它sudo mkdir -p /var/www/blog sudo chown -R $USER:www-data /var/www/blog sudo chmod -R 775 /var/www/blog sudo a2ensite blog.conf sudo systemctl reload apache2a2ensite会创建符号链接/etc/apache2/sites-enabled/blog.conf - /etc/apache2/sites-available/blog.confsystemctl reload则平滑重载配置不中断现有连接。整个过程是原子的要么全部生效要么全部不生效不存在“一半配置生效一半没生效”的中间态。4. 实操过程与核心环节实现从零开始的完整部署流水线4.1 环境初始化系统更新、基础工具安装与防火墙策略固化我们从一个干净的Ubuntu 20.04最小化安装开始。首先进入root shell避免后续每条命令都输sudosudo su -步骤1系统更新与基础工具安装# 更新包索引并升级所有已安装包重要20.04的初始镜像可能含已知漏洞 apt update apt upgrade -y # 安装基础运维工具curl测试、wget下载、vim编辑器、unzip解压 apt install -y curl wget vim unzip # 安装Apache、PHP 8.1及必要扩展Ubuntu 20.04官方源 apt install -y apache2 php8.1 php8.1-cli php8.1-mysql php8.1-curl php8.1-gd php8.1-mbstring php8.1-xml php8.1-xmlrpc php8.1-zip # 安装PHP-FPM关键替代过时的libapache2-mod-php apt install -y php8.1-fpm实测心得apt upgrade -y必须放在第一步。我曾跳过这步在一台刚装好的20.04上直接装Apache结果发现apache2-bin包有CVE-2021-44790漏洞apt upgrade会自动修复。跳过它等于把门敞开。步骤2ufw防火墙策略固化# 启用ufw并设置默认策略 ufw default deny incoming ufw default allow outgoing # 允许SSH22端口这是远程管理的生命线 ufw allow OpenSSH # 允许HTTP/HTTPS80/443端口 ufw allow 80/tcp ufw allow 443/tcp # 启用ufw这步不可少 ufw --force enable # 验证状态 ufw status verboseufw status verbose的输出应类似Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere 80/tcp ALLOW IN Anywhere 443/tcp ALLOW IN Anywhere 22/tcp (v6) ALLOW IN Anywhere (v6) 80/tcp (v6) ALLOW IN Anywhere (v6) 443/tcp (v6) ALLOW IN Anywhere (v6)如果看到Status: inactive说明ufw enable没生效必须重试。步骤3Apache服务初始化与基础验证# 启动Apache并设为开机自启 systemctl start apache2 systemctl enable apache2 # 验证服务状态 systemctl status apache2systemctl status apache2的输出中Active:行应为active (running)且Loaded:行末尾有enabled字样。如果显示failed立即执行journalctl -u apache2 --since 1 hour ago | tail -n 20这会显示最近一小时的Apache日志通常能直接定位到Syntax error on line X of /etc/apache2/apache2.conf这类错误。此时在本地浏览器访问http://your_server_ip应看到Ubuntu Apache默认页。如果看不到请按以下顺序排查ping your_server_ip—— 确认网络连通curl -I http://localhost—— 确认本地服务正常sudo ufw status—— 确认ufw没误拦80端口ss -tlnp | grep :80—— 确认Apache确实在监听80端口4.2 PHP-FPM集成配置PHP处理器并验证PHP代码执行Apache默认不解析PHP必须显式集成。我们采用php-fpm模式这是20.04的最佳实践。步骤1配置PHP-FPM池# 编辑PHP-FPM主配置 nano /etc/php/8.1/fpm/pool.d/www.conf找到并修改以下行; 修改监听方式为Unix域套接字比TCP更高效 listen /run/php/php8.1-fpm.sock ; 修改套接字权限确保Apache能访问 listen.owner www-data listen.group www-data listen.mode 0660 ; 修改PHP进程用户与Apache保持一致 user www-data group www-data保存后重启PHP-FPMsystemctl restart php8.1-fpm systemctl status php8.1-fpm步骤2启用Apache相关模块# 禁用旧的PHP模块如果存在 a2dismod php8.1 # 启用proxy_fcgi和setenvif a2enmod proxy_fcgi setenvif # 启用PHP-FPM配置片段 a2enconf php8.1-fpm # 重载Apache systemctl reload apache2步骤3创建PHP测试页echo ?php phpinfo(); ? /var/www/html/info.php chown $USER:www-data /var/www/html/info.php chmod 644 /var/www/html/info.php在浏览器访问http://your_server_ip/info.php应看到PHP信息页。重点检查Server API行应为FPM/FastCGILoaded Configuration File应为/etc/php/8.1/fpm/php.iniextension_dir应指向/usr/lib/php/20200930/如果看到Server API: Apache 2.0 Handler说明php-fpm没生效还在用旧模块需回溯a2enmod步骤。4.3 虚拟主机与HTTPS部署为真实域名配置SSL并强制HTTPS重定向假设你的域名app.example.com已解析到服务器IP。步骤1创建虚拟主机配置nano /etc/apache2/sites-available/app.conf内容如下VirtualHost *:80 ServerAdmin webmasterlocalhost ServerName app.example.com DocumentRoot /var/www/app Directory /var/www/app Options Indexes FollowSymLinks AllowOverride All Require all granted /Directory ErrorLog ${APACHE_LOG_DIR}/app_error.log CustomLog ${APACHE_LOG_DIR}/app_access.log combined /VirtualHost创建目录并授权mkdir -p /var/www/app chown -R $USER:www-data /var/www/app chmod -R 775 /var/www/app启用站点a2ensite app.conf systemctl reload apache2步骤2申请Lets Encrypt证书# 安装certbot apt install -y certbot python3-certbot-apache # 申请证书自动配置Apache certbot --apache -d app.example.comcertbot会引导你选择是否重定向HTTP到HTTPS。务必选择“2: Redirect”。它会自动修改app.conf添加Redirect permanent / https://app.example.com/指令并创建/etc/apache2/sites-available/app-le-ssl.conf。步骤3验证HTTPS与重定向在浏览器访问http://app.example.com应自动跳转到https://app.example.com且地址栏显示绿色锁图标。用curl验证curl -I http://app.example.com # 应返回 HTTP/1.1 301 Moved Permanently 和 Location: https://... curl -I https://app.example.com # 应返回 HTTP/1.1 200 OK4.4 生产环境加固日志轮转、安全头设置与配置语法检查自动化步骤1配置logrotate自动轮转日志Ubuntu默认的/etc/logrotate.d/apache2已存在但需确认其内容cat /etc/logrotate.d/apache2应包含/var/log/apache2/*.log { daily missingok rotate 14 compress delaycompress notifempty create 644 root root sharedscripts prerotate if [ -d /etc/logrotate.d/httpd-prerotate ]; then run-parts /etc/logrotate.d/httpd-prerotate fi endscript postrotate if /etc/init.d/apache2 status /dev/null ; then /etc/init.d/apache2 reload /dev/null fi endscript }关键参数rotate 14表示保留14天日志compress启用gzip压缩。postrotate里的reload确保日志切割后Apache立即使用新文件。步骤2添加安全HTTP响应头编辑/etc/apache2/apache2.conf在末尾添加# 安全头设置 IfModule mod_headers.c Header always set X-Content-Type-Options nosniff Header always set X-Frame-Options DENY Header always set X-XSS-Protection 1; modeblock Header always set Referrer-Policy no-referrer-when-downgrade Header always set Content-Security-Policy default-src self; script-src self unsafe-inline unsafe-eval; style-src self unsafe-inline; img-src self data:; /IfModuleContent-Security-PolicyCSP是重点。上面的策略允许内联脚本unsafe-inline和evalunsafe-eval这是为了兼容WordPress等CMS的插件。生产环境应逐步收紧移除unsafe-inline改用sha256-...哈希白名单。步骤3配置systemd自动语法检查创建/etc/systemd/system/apache2-check.service[Unit] DescriptionApache2 Config Syntax Check Afternetwork.target [Service] Typeoneshot ExecStart/usr/sbin/apachectl configtest RemainAfterExityes [Install] WantedBymulti-user.target启用它systemctl daemon-reload systemctl enable apache2-check.service这样每次系统启动时都会先检查Apache配置语法。如果语法错误服务不会启动避免“配置错误导致服务崩溃”的雪崩效应。5. 常见问题与排查技巧实录从“Connection refused”到“503 Service Unavailable”的实战诊断树5.1 连接类问题Connection refused、Connection timed out、ERR_CONNECTION_REFUSED这是最常遇到的问题表象相同根因各异。我整理了一张诊断树按执行顺序排查现象排查命令可能原因解决方案curl: (7) Failed to connect to localhost port 80: Connection refusedsystemctl status apache2Apache服务未运行systemctl start apache2curl: (7) Failed to connect to localhost port 80: Connection refusedss -tlnp | grep :80Apache未监听80端口检查/etc/apache2/ports.conf确认Listen 80存在curl: (7) Failed to connect to localhost port 80: Connection refusedufw statusufw阻止了80端口sudo ufw allow 80/tcpcurl: (7) Failed to connect to localhost port 80: Connection refusedcurl -I http://127.0.0.1本地能通外网不通检查云服务商安全组AWS Security Group, 阿里云安全组是否放行80端口curl: (28) Connection timed out after 30001 millisecondsping your_server_ip服务器网络不通检查服务器网络配置、云平台网络ACLcurl: (28) Connection timed out after 30001 millisecondstelnet your_server_ip 80端口被防火墙拦截检查ufw、云平台安全组、本地防火墙实操心得telnet your_server_ip 80是黄金命令。如果telnet能连上说明网络和端口开放没问题问题在Apache配置或应用层如果telnet连不上问题一定在网络或防火墙层。我曾在一个客户现场curl失败telnet也失败最后发现是阿里云ECS的安全组规则里入方向只允许了192.168.0.0/16而客户是从公司公网IP访问必须手动添加公司IP段。5.2 5xx服务器错误500 Internal Server Error、502 Bad Gateway、503 Service Unavailable这类错误表明Apache已收到请求但在处理时出错。500 Internal Server Error最常见于PHP脚本错误。排查步骤查看Apache错误日志tail -f /var/log/apache2/error.log如果日志里有PHP Parse error说明PHP语法错误检查对应.php文件如果日志里有PHP Fatal error: Allowed memory size exhausted说明PHP内存不足编辑/etc/php/8.1/fpm/php.ini增大memory_limit 256M如果日志里有PHP Warning: Unknown: failed to open stream: Permission denied说明文件权限问题执行ls -l /var/www/html/yourfile.php确认所有者是$USER:www-data且权限是644502 Bad Gateway这表示Apache作为反向代理无法连接到后端如PHP-FPM。排查systemctl status php8.1-fpm—— 确认PHP-FPM在运行ls -l /run/php/php8.1-fpm.sock—— 确认套接字文件存在且权限是srw-rw---- 1 www-data www-datagrep listen /etc/php/8.1/fpm/pool.d