Apache 详解 在 Ubuntu 24 中安装和配置 Apache

站点配置和全局配置的区别

全局配置文件(例如:/etc/apache2/apache2.conf)。

站点配置文件(例如:/etc/apache2/sites-available/000-default.conf)。

二者的区别

  1. 全局配置是 Apache 的 "全局基准",管所有站点,核心参数不轻易动;
  2. 站点配置是单个站点的 "专属配置",管单个站点,灵活修改无副作用;
  3. 作用域和优先级是两者最核心的区别,站点配置可覆盖全局配置的局部规则 ,例如:当全局配置和站点配置中出现相同类型的配置项(比如都配置了/home/jean/personal/huagai的访问权限)时,站点配置的优先级高于全局配置。实际操作中,推荐优先修改站点配置(不污染全局规则,风险更低)。
  4. 实际运维中,遵循 "全局配置少改,站点配置按需改" 的原则,更安全、更易维护。

www-data 用户介绍

即使你已经设置了目标目录 /home/jean/personal/huagai 的权限,如果其父目录(如 /home/jean/personal 和 /home/jean)没有适当的权限,Apache 也无法访问最终的目标目录。 这是因为:Apache 使用用户 www-data 对网站进行访问,这个用户既不是/home/jean目录的所有者(所有者是jean),也不属于 jean 的用户组,而是属于其他用户,这个用户不具备访问父目录的权限。

额外补充: 所有对www-data的权限配置,都要针对o来设置,o是Other的简写;x是excute的简写,代表执行某个文件或进入某个目录的权限。

什么是进程的上下文切换?

  • 进程从运行状态切换到睡眠状态
  • 保存当前 CPU 寄存器、内存映射等
  • 恢复另一个进程的状态
  • 开销很大: 通常需要几千个 CPU 周期

TCP 连接的三个阶段

客户端和服务器通信的过程

客户端:SYN → SYN-ACK → ACK → 数据

服务器:监听 → 接受连接 → 读取数据

当客户端连接到服务器时:

  1. 三次握手 (SYN, SYN-ACK, ACK)在内核中完成
  2. 连接进入服务器的 "等待接受队列"
  3. 服务器应用程序(如 Apache)需要接受这个连接
  4. 然后才能读取数据

开启 AcceptFilter 和关闭 AcceptFilter的区别

一、启用 AcceptFilter 时

AcceptFilter 默认是开启状态。在这种情况下:

在支持 AcceptFilter 的系统上(如 FreeBSD、Linux 的某些版本):内核会等待客户端发送数据后才将连接交给 Apache 进程,这样可以过滤掉大量的空连接、端口扫描、DDoS攻击连接。

工作原理:

  1. 客户端发送 SYN
  2. 内核完成三次握手
  3. 连接进入特殊队列(不是等待接受队列)
  4. 客户端发送第一个数据包(如 HTTP 请求的 "GET /")
  5. 内核收到数据后,将连接放入等待接受队列
  6. 这时 Apache 调用 accept() 才会收到这个连接

二、关闭 AcceptFilter 时

设置为 none 后,系统使用传统的 accept() 系统调用,工作原理是:

  1. 客户端发送 SYN(开始连接)
  2. 内核完成三次握手
  3. 连接进入等待队列
  4. Apache 调用 accept()
  5. 内核返回连接给 Apache
  6. Apache 调用 recv() 等待数据

使用传统的 accept() 系统调用的特点:

  • 立即接受:禁用内核级别的连接过滤,连接建立后立即交给 Apache。
  • 立即接受所有 TCP 连接,即使连接上没有数据。
  • 阻塞等待:如果没有连接,进程会休眠
  • 一对一处理:每个连接都需要单独的 accept() 调用

禁用 AcceptFilter(设置为 none)的好处:

  1. 立即接受所有连接。
  2. 兼容性最好
  3. 延迟最低

注意: 在 Windows 系统中,不支持 AcceptFilter,配置会被忽略。

在 Ubuntu 24 中安装和配置 Apache

安装 Apache

说明: 这个安装过程对于在Ubuntu 24 系统中安装Apache、在 Windows 系统上的WSL2中的Ubuntu 24系统中安装Apache,都适用。

  • 第一步:先更新软件仓库、升级软件模块。打开 Ubuntu 终端,更新软件源并升级现有包,确保系统处于最新状态:sudo apt update -y && sudo apt upgrade -y

  • 第二步:安装 Apache 服务器:sudo apt install apache2 -y

  • 第三步:查看安装的 Apache 的版本:apache2 -v

第四步:启动 Apache 服务:sudo systemctl start apache2

第五步:设置开机自动启动 Apache 服务:sudo systemctl enable apache2

第六步:验证 Apache 是否安装成功:

  • 方法一:在 Windows 浏览器中访问 http://localhost
  • 方法二:通过检查Apache状态:sudo systemctl status apache2【若显示 active (running),则代表 Apache 已启动】

为开发 Drupal 项目而配置 Apache

解决 Apache 经常出现的连接延迟和超时问题

在 Ubuntu 中输入命令:sudo nano /etc/apache2/apache2.conf(Apache 的全局配置文件),在文件中添加如下参数:

复制代码
	AcceptFilter https none
	AcceptFilter http none
  • AcceptFilter 指令是什么?
    详见本文的"TCP 连接的三个阶段"部分,同时在此处进行简要介绍。
    • 用途: 配置操作系统内核如何处理新的网络连接
    • 目的: 提高服务器性能,减少进程上下文切换开销
    • 原理: 让内核在连接真正有数据到达时才唤醒 Apache 进程

开启 Apache 的简洁链接功能

说明:

  1. 对于 Drupal 开发来说,必须要开启 Apache 的 URL 重写模块,才能开启 Apache 的简洁链接功能。
  2. 默认情况下,Apache 没有开启该模块。可以通过命令 apache2ctl -M 或 apachectl -M,查看Apache当前已经加载的模块,看是否有rewrite_module 模块。

具体开启步骤:

  • 启用 rewrite_module 模块:sudo a2enmod rewrite【a2enmod是 Apache 2 enable module 的缩写】
  • 重启 Apache,激活新的配置:sudo systemctl restart apache2
  • 检查 Apache 配置是否有误:sudo apache2ctl configtest(语法正确的话会返回Syntax OK)
  • 给 Apache 启用简洁链接功能:在Ubuntu系统中,执行命令 sudo nano /etc/apache2/apache2.conf,把其中的 AllowOverride None 改为 AllowOverride All,如图:
  • 重启 Apache 使配置生效:sudo systemctl restart apache2

修改 Apache 的默认站点根目录

补充知识
  • Apache 的默认根目录是:/var/www/html
  • 修改目标:把 Apache 的默认根目录改为:/home/jean/personal/huagai
配置过程
第一步:修改 Apache 站点配置文件(指定新根目录)
  • 先备份原始的站点配置文件:sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.bak

  • 用文本编辑器打开默认站点配置文件:sudo nano /etc/apache2/sites-available/000-default.conf

  • 找到 DocumentRoot 配置项,将其默认值(通常是/var/www/html)修改为你的目标目录:

    复制代码
    # 原配置
    # DocumentRoot /var/www/html
    # 新配置
    DocumentRoot /home/jean/personal/huagai
  • 找到或新建(若没有则手动添加)对应的 配置块,该配置块的作用是配置目录访问权限(允许 Apache 读取该目录):

    复制代码
    <Directory /home/jean/personal/huagai>
        # 允许目录索引
        Options Indexes FollowSymLinks
        # 允许使用.htaccess文件
        AllowOverride All
        # 核心:授权所有客户端访问该目录(Apache 2.4+ 语法)
        Require all granted
    </Directory>
  • 保存并退出(在 nano 中按 Ctrl+O,回车,再按 Ctrl+X)。以上几步操作后的完整代码如下:

    复制代码
    <VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /home/jean/personal/huagai
    
        <Directory /home/jean/personal/huagai>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>
    
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>
第二步:修改 huagai 的父目录的访问权限

Apache 进程默认以www-data用户(组)运行站点,而目标目录/home/jean/personal/huagai属于用户jean和用户组jean,需要赋予www-data足够的读取权限,或者将www-data加入到用户组jean中。在这步操作中,我们选择"将www-data加入到用户组jean中"。

方法一:把用户www-data加入到用户组jean中(推荐)

复制代码
    sudo usermod -a -G jean www-data

方法二:赋予其他用户(也包括了www-data用户)进入目录的权限(不推荐)

  • 对必要的父目录设置合适的权限,允许 Apache 进入这些目录但不读取它们的内容:给 /home/jean/ 和 /home/jean/personal 目录的「其他用户(包含 www-data)」,新增「进入 / 搜索目录的权限」,让 Apache 能从/home/进入/home/jean/,再继续进入personal/,最终访问到huagai/。

    复制代码
      chmod o+x /home/jean
      chmod o+x /home/jean/personal
第三步:设置huagai目录及其子目录和文件的权限

现在,www-data用户可以进入到 personal 目录了,但还无法操作 huagai 目录。下一步,以管理员权限,递归地将 /home/jean/personal/huagai 目录本身、以及该目录下的所有子目录和文件的所有者设置为 jean,所属用户组设置为 jean。
sudo chown -R jean:jean /home/jean/personal/huagai

  • 以管理员权限,递归地为 /home/jean/personal/huagai 目录及其所有子目录、文件设置权限:所有者和所属组拥有完整的读、写、执行权限,其他用户仅拥有读和执行权限,无写入权限。
    sudo chmod -R 775 /home/jean/personal/huagai

因为之前设置了 www-data 在用户组 jean 中,因此,www-data 现在可以操作(读、写、执行)huagai目录及其所有子目录、文件了。

第四步:验证上述配置的语法是否正确
  • 先验证配置语法是否正确(避免配置错误导致服务无法启动):sudo apache2ctl configtest,若输出 Syntax OK 则说明配置无误;若有报错,根据提示修正配置文件。
  • 重启 Apache 服务使配置生效:sudo systemctl restart apache2
第五步:检查 Apache 状态,看配置是否有误
复制代码
    sudo systemctl status apache2
    sudo tail -f /var/log/apache2/error.log
第六步:验证配置是否成功

在浏览器中输入:http://localhost

补充说明

  • 若出现 403 Forbidden 错误,大概率是权限问题,优先检查目标目录及其上级目录的权限是否配置正确,以及www-data是否有访问权限。
相关推荐
爱莉希雅&&&19 分钟前
linux中MySQL数据库备份恢复的四种方法(更新中)
linux·数据库·mysql·数据库备份·mysqldumper
藤谷性能35 分钟前
Ubuntu 22.04:安装SEGGER Embedded Studio
ubuntu·nrf52832·ses·embedded studio
coppher38 分钟前
Ubuntu 22.04 amd64 离线安装 Docker 完整教程
linux·docker
xyz5991 小时前
如何在 WSL 中删除指定版本的 Ubuntu 以及安装
linux·运维·ubuntu
亚空间仓鼠1 小时前
OpenEuler系统常用服务(五)
linux·运维·服务器·网络
minji...2 小时前
Linux 线程同步与互斥(二) 线程同步,条件变量,pthread_cond_init/wait/signal/broadcast
linux·运维·开发语言·jvm·数据结构·c++
虚伪的空想家2 小时前
k8s集群configmap和secrets备份脚本
linux·容器·kubernetes
the sun343 小时前
从 QEMU 直接启动到 U-Boot 引导:嵌入式 Linux 启动流程的本质差异
linux·运维·服务器
草莓熊Lotso3 小时前
【Linux 线程进阶】进程 vs 线程资源划分 + 线程控制全详解
java·linux·运维·服务器·数据库·c++·mysql
ShineWinsu3 小时前
对于Linux:文件操作以及文件IO的解析
linux·c++·面试·笔试·io·shell·文件操作