如何在 Ubuntu 18.04 上设置 Apache 虚拟主机

news2024/12/27 10:56:18

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

简介

Apache Web 服务器是一种流行的在互联网上提供网站服务的方法。截至2019年,据估计,它为所有活跃网站的29%提供服务,并为开发人员提供了强大的灵活性。使用 Apache,管理员可以设置一个服务器来托管多个域或站点,通过使用匹配系统,这些域或站点可以从单个接口或 IP 进行访问。

使用 Apache 配置的每个域或单独的站点(称为“虚拟主机”)将访问者定向到保存该站点信息的特定目录,而不会指示同一服务器还负责其他站点。只要您的服务器能够处理负载,这种方案就可以扩展,没有任何软件限制。描述单个站点或域的基本单元称为“虚拟主机”。

在本指南中,我们将指导您如何在 Ubuntu 18.04 服务器上设置 Apache 虚拟主机。在此过程中,您将学习如何根据访问者请求的域名为不同访问者提供不同的内容。

先决条件

在开始本教程之前,您应该创建一个非根用户。

您还需要安装 Apache 才能完成这些步骤。如果尚未安装,您可以通过 apt 包方式在服务器上安装 Apache:

sudo apt update
sudo apt install apache2

如果您想要更详细的说明以及防火墙设置,请参考我们的指南《如何在 Ubuntu 18.04 上安装 Apache Web 服务器》。

在本指南中,我们的配置将为 example.comtest.com 创建虚拟主机。在本指南中将引用这些域,但您应该在跟随指南时用您自己的域或值进行替换。

如果您使用的是 DigitalOcean,您可以通过阅读产品文档《如何添加域》来学习如何设置域。对于其他提供商,请参考其相关产品文档。如果您目前没有可用的域,可以使用测试值。

稍后我们将展示如何编辑您的本地 hosts 文件以测试配置,如果您使用测试值,这将允许您从家用计算机验证配置,尽管您的内容对其他访问者不会通过域名可用。

步骤一 — 创建目录结构

我们要采取的第一步是创建一个目录结构,用于保存我们将向访问者提供的站点数据。

我们的文档根目录(Apache 用于查找要提供的内容的顶级目录)将设置为 /var/www 目录下的各个目录。我们将在这里为我们计划创建的每个虚拟主机创建一个目录。

在每个这些目录中,我们将创建一个 public_html 文件夹,用于保存我们的实际文件。这为我们的托管提供了一些灵活性。

例如,对于我们的站点,我们将创建以下目录。如果您使用实际域或替代值,请用这些值替换高亮显示的文本。

sudo mkdir -p /var/www/example.com/public_html
sudo mkdir -p /var/www/test.com/public_html

红色部分代表我们希望从我们的 VPS 服务的域名。

步骤二 — 授予权限

现在我们已经为我们的文件创建了目录结构,但它们是由我们的根用户拥有的。如果我们希望我们的常规用户能够修改我们的网页目录中的文件,我们可以通过执行以下操作更改所有权:

sudo chown -R $USER:$USER /var/www/example.com/public_html
sudo chown -R $USER:$USER /var/www/test.com/public_html

当您按下 ENTER 键时,$USER 变量将取当前登录的用户的值。通过这样做,我们的常规用户现在拥有我们将存储内容的 public_html 子目录。

我们还应该修改权限,以确保允许对一般网页目录及其包含的所有文件和文件夹进行读取访问,以便可以正确提供页面:

sudo chmod -R 755 /var/www

您的 Web 服务器现在应该具有提供内容所需的权限,您的用户应该能够在必要的文件夹中创建内容。

步骤三 — 为每个虚拟主机创建演示页面

现在我们已经准备好了目录结构。让我们创建一些内容来提供服务。

出于演示目的,我们将为每个站点创建一个 index.html 页面。

让我们从 example.com 开始。我们可以在文本编辑器中打开一个 index.html 文件,这里我们将使用 nano:

nano /var/www/example.com/public_html/index.html

在此文件中,创建一个指示其连接的站点的 HTML 文档,如下所示:

<html>
  <head>
    <title>Welcome to Example.com!</title>
  </head>
  <body>
    <h1>Success! The example.com virtual host is working!</h1>
  </body>
</html>

完成后保存并关闭文件(在 nano 中,按 CTRL + X 然后 Y 然后 ENTER)。

我们可以通过输入以下命令将此文件复制为我们第二个站点的基础:

cp /var/www/example.com/public_html/index.html /var/www/test.com/public_html/index.html

然后我们可以打开文件并修改相关信息:

nano /var/www/test.com/public_html/index.html
<html>
  <head>
    <title>Welcome to Test.com!</title>
  </head>
  <body>
    <h1>Success! The test.com virtual host is working!</h1>
  </body>
</html>

同样,完成后保存并关闭文件。现在您已经拥有测试虚拟主机配置所需的页面。

第四步 — 创建新的虚拟主机文件

虚拟主机文件是指定虚拟主机实际配置并指示 Apache Web 服务器如何响应各种域请求的文件。

Apache 自带一个名为 000-default.conf 的默认虚拟主机文件,我们可以将其用作起点。我们将复制它以创建每个域的虚拟主机文件。

我们将从一个域开始,配置它,复制它到我们的第二个域,然后进行进一步的调整。默认的 Ubuntu 配置要求每个虚拟主机文件以 .conf 结尾。

创建第一个虚拟主机文件

首先复制第一个域的文件:

sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/example.com.conf

使用 root 权限在编辑器中打开新文件:

sudo nano /etc/apache2/sites-available/example.com.conf

删除注释后,文件将类似于这样:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

在此文件中,我们将为我们的第一个域定制项目并添加一些额外的指令。此虚拟主机部分匹配在端口 80 上进行的任何请求,即默认的 HTTP 端口。

首先,我们需要将 ServerAdmin 指令更改为站点管理员可以通过其接收电子邮件的电子邮件:

ServerAdmin admin@example.com

之后,我们需要添加两个指令。第一个称为 ServerName,建立应该匹配此虚拟主机定义的基本域。这很可能是您的域。第二个称为 ServerAlias,定义应该作为基本名称匹配的进一步名称。这对于匹配您定义的主机(如 www)很有用:

ServerName example.com
ServerAlias www.example.com

我们需要为虚拟主机文件做的另一件事是更改此域的文档根目录的位置。我们已经创建了所需的目录,所以我们只需要修改 DocumentRoot 指令以反映我们创建的目录:

DocumentRoot /var/www/example.com/public_html

完成后,我们的虚拟主机文件应如下所示:

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

此时,保存并关闭文件。

复制第一个虚拟主机并定制为第二个域

现在我们已经建立了第一个虚拟主机文件,我们可以通过复制该文件并根据需要进行调整来创建第二个虚拟主机。

首先复制它:

sudo cp /etc/apache2/sites-available/example.com.conf /etc/apache2/sites-available/test.com.conf

使用 root 权限在编辑器中打开新文件:

sudo nano /etc/apache2/sites-available/test.com.conf

现在,您需要修改所有信息以引用您的第二个域。完成后,它应如下所示:

<VirtualHost *:80>
    ServerAdmin admin@test.com
    ServerName test.com
    ServerAlias www.test.com
    DocumentRoot /var/www/test.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

完成后保存并关闭文件。

第五步 — 启用新的虚拟主机文件

现在我们已经创建了虚拟主机文件,我们必须启用它们。Apache 包含一些工具,允许我们执行此操作。

我们将使用 a2ensite 工具来启用我们的每个站点。如果您想阅读有关此脚本的更多信息,可以参考 a2ensite 文档。

sudo a2ensite example.com.conf
sudo a2ensite test.com.conf

接下来,禁用 000-default.conf 中定义的默认站点:

sudo a2dissite 000-default.conf

完成后,您需要重新启动 Apache 以使这些更改生效,并使用 systemctl status 来验证重启的成功。

sudo systemctl restart apache2
sudo systemctl status apache2

您的服务器现在应该已经设置好,可以为两个网站提供服务。

第六步 — 设置本地 hosts 文件(可选)

如果您一直在使用您拥有的实际域名来测试此过程,并且一直在使用一些示例域,您可以通过临时修改本地计算机上的 hosts 文件来测试此过程的功能。

这将拦截您配置的域的任何请求,并将它们指向您的 VPS 服务器,就像 DNS 系统在您使用注册域名时所做的那样。这只会在您的本地计算机上工作,仅用于测试目的。

确保您在本地计算机上执行这些步骤,而不是在 VPS 服务器上。您需要知道计算机的管理员密码,或者是管理员组的成员。

如果您使用的是 Mac 或 Linux 计算机,请使用管理员权限编辑本地文件:

[本地环境]
sudo nano /etc/hosts

如果您使用的是 Windows 计算机,您可以在此处找到有关修改 hosts 文件的说明。

您需要添加的详细信息是服务器的公共 IP 地址,后跟您要用来访问该服务器的域。

使用本指南中使用的域,并将您的服务器 IP 替换为 your_server_IP 文本,您的文件应如下所示:

[本地环境]

127.0.0.1   localhost
127.0.1.1   guest-desktop
your_server_IP example.com
your_server_IP test.com

保存并关闭文件。

这将在我们的计算机上拦截对 example.comtest.com 的任何请求,并将它们发送到我们的服务器。如果我们实际上不是这些域的所有者,这是我们想要的,以便测试我们的虚拟主机。

第七步 — 测试你的结果

现在你已经配置好了虚拟主机,你可以通过在浏览器中输入你配置的域名来测试你的设置:

http://example.com

你应该会看到一个类似这样的页面:

!Apache虚拟主机示例

你也可以访问你的第二个页面,查看你为第二个站点创建的文件。

http://test.com

!Apache虚拟主机测试

如果这两个站点都按预期工作,那么你已经成功在同一台服务器上配置了两个虚拟主机。

如果你修改了你家庭电脑的 hosts 文件,你可能希望在验证了你的配置后删除你添加的行。这样可以防止你的 hosts 文件被填满了不再需要的条目。

如果你需要长期访问这些站点,考虑为你需要的每个站点添加一个域名,并设置它指向你的服务器。

结论

如果你跟着操作,现在你应该有一个单一的服务器处理两个独立的域名。你可以通过按照我们上面概述的步骤来扩展这个过程,以创建额外的虚拟主机。

Apache可以处理的域名数量没有软件限制,所以可以根据你的服务器的处理能力自由地创建任意数量的虚拟主机。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2251806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python小黄人

文章目录 系列目录写在前面完整代码代码分析1. 初始化部分2. 身体部分3. 右眼睛部分4. 左眼睛部分5. 嘴巴部分6. 裤子部分7. 脚部部分8. 手部部分9. 头顶装饰部分10. 代码总结 写在后面 系列目录 序号直达链接爱心系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码…

操作系统 | 学习笔记 | 王道 | 2.2处理机调度

2.2 处理机调度 文章目录 2.2 处理机调度2.2.1 调度的概念2.2.2 调度的目标2.2.3 调度的实现2.2.4 典型的调度算法错题总结&#xff1a; 2.2.1 调度的概念 调度的基本概念 处理机调度是对处理机进行分配&#xff0c;即从就绪队列中按照一定的算法&#xff08;公平、高效的原则&…

算法与数据结构(1)

一&#xff1a;数据结构概论 数据结构分为初阶数据结构&#xff08;主要由C语言实现&#xff09;和高阶数据结构&#xff08;由C实现&#xff09; 初阶数据结构当中&#xff0c;我们会学到顺序表、链表、栈和队列、二叉树、常见排序算法等内容。 高阶数据结构当中&#xff0…

【Android】EventBus的使用及源码分析

文章目录 介绍优点基本用法线程模式POSTINGMAINMAIN_ORDEREDBACKGROUNDASYNC 黏性事件 源码注册getDefault()registerfindSubscriberMethods小结 postpostStickyunregister 介绍 优点 简化组件之间的通信 解耦事件发送者和接收者在 Activity、Fragment 和后台线程中表现良好避…

深度学习笔记——生成对抗网络GAN

本文详细介绍早期生成式AI的代表性模型&#xff1a;生成对抗网络GAN。 文章目录 一、基本结构生成器判别器 二、损失函数判别器生成器交替优化目标函数 三、GAN 的训练过程训练流程概述训练流程步骤1. 初始化参数和超参数2. 定义损失函数3. 训练过程的迭代判别器训练步骤生成器…

成都睿明智科技有限公司抖音电商服务的新引擎

在这个短视频风起云涌的时代&#xff0c;抖音不仅成为了人们休闲娱乐的首选&#xff0c;更是商家们竞相角逐的电商新蓝海。在这片充满机遇与挑战的海域中&#xff0c;成都睿明智科技有限公司如同一艘装备精良的航船&#xff0c;引领着众多企业向抖音电商的深水区进发。今天&…

51c视觉~YOLO~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/12512597 1、Yolo8 1.1、检测PCB元件 技术世界正在以惊人的速度发展&#xff0c;而这种转变的核心是一个革命性的工具 — 计算机视觉。它最有趣的应用之一是电子印刷电路板 &#xff08;PCB&#xff09; 的检测和分析。本文…

Jenkins的使用

文章目录 一、Jenkins是什么\有什么用\与GitLab的对比二、Jenkins的安装与配置Jenkins的安装方式在Linux上安装Jenkins&#xff1a;在Windows上安装Jenkins&#xff1a;配置Jenkins&#xff1a; &#xff08;可选&#xff09;配置启动用户为root&#xff08;一定要是root吗??…

图论入门教程:GTM173 Graph Theory

这是本图论的入门教材&#xff0c;Graph Theory Fifth Edition&#xff0c;隶属于著名的GTM系列&#xff0c;作者是Reinhard Diestel。这是本对新人友好的教材&#xff0c;之前本科上离散数学的课时&#xff0c;因为涉及到图论&#xff0c;而学校的课堂又太水让我心生不满&…

QT5 Creator (Mingw编译器) 调用VS2019 (阿里云 oss C++库) 报错的解决方法

方法就是不要用VS2019编译&#xff0c;要用MINgw32编译。 编译命令如下&#xff1a; cmake -G "MinGW Makefiles" ^-DCMAKE_MAKE_PROGRAMD:\qt\Tools\mingw810_32\bin\mingw32-make.exe ^-DCMAKE_C_COMPILERD:\qt\Tools\mingw810_32\bin\gcc.exe ^-DCMAKE_CXX_COMP…

反向传播、梯度下降与学习率:深度学习中的优化艺术

目录 反向传播&#xff1a;神经网络的学习机制 梯度下降&#xff1a;优化算法的基石 学习率&#xff1a;平衡速度与稳定性的关键 学习率的调整策略 固定学习率 学习率衰减 自适应学习率 梯度消失与梯度爆炸 结语 在深度学习的领域中&#xff0c;构建一个有效的神经网络…

论文笔记(五十九)A survey of robot manipulation in contact

A survey of robot manipulation in contact 文章概括摘要1. 引言解释柔顺性控制的概念&#xff1a;应用实例&#xff1a; 2. 需要接触操控的任务2.1 环境塑造2.2 工件对齐2.3 关节运动2.4 双臂接触操控 3. 接触操控中的控制3.1 力控制3.2 阻抗控制3.3 顺应控制 4. 接触操控中的…

881.救生艇

目录 题目过程 题目 给定数组 people 。people[i]表示第 i 个人的体重 &#xff0c;船的数量不限&#xff0c;每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人&#xff0c;但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船数 。 过程 cla…

【汇编】逻辑指令

文章目录 一、逻辑运算指令&#xff08;一&#xff09;各逻辑运算指令格式及操作&#xff08;1&#xff09;逻辑非指令 NOT&#xff08;2&#xff09;逻辑与指令 AND&#xff08;3&#xff09;逻辑或指令 OR&#xff08;4&#xff09;异或指令 XOR&#xff08;5&#xff09;测试…

网页开发的http基础知识

请求方式-GET&#xff1a;请求参数在请求行中&#xff0c;没有请求体&#xff0c;如&#xff1a;/brand/findAll?nameoPPo&status1。GET请求大小在浏览器中是有限制的请求方式-POST&#xff1a;请求参数在请求体中&#xff0c;POST请求大小是没有限制的 HTTP请求&#xf…

如何做好一份技术文档

如何做好一份技术文档 以下是本人的一些微不足道的经验&#xff0c;希望可以与大家互相交流学习 方向一&#xff1a;技术文档的规划布局 确定整体架构 创建一份优秀技术文档的第一步是规划其整体架构。一个好的架构应能引导读者理解文档的内容&#xff0c;同时提供一个逻辑清…

Springboot——SseEmitter流式输出

文章目录 前言SseEmitter 简介测试demo注意点异常一 ResponseBodyEmitter is already set complete 前言 最近做AI类的开发&#xff0c;看到各大AI模型的输出方式都是采取的一种EventStream的方式实现。 不是通常的等接口处理完成后&#xff0c;一次性返回。 而是片段式的处理…

Java 虚拟机:承载 Java 生态的神奇魔盒

在软件开发的世界里&#xff0c;Java 虚拟机&#xff08;JVM&#xff09;就像一位智慧的管家&#xff0c;默默守护着 Java 生态系统的运行。它不仅让 Java 实现了"一次编写&#xff0c;到处运行"的梦想&#xff0c;更是成为了多种编程语言的运行平台。让我们一起走进…

sqlmap详细使用

SQLmap使用详解 SQLmap&#xff08;常规&#xff09;使用步骤 1、查询注入点 python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id12、查询所有数据库 python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id1 --dbs3、查询当前数据库 python sqlmap.py -u htt…

【Linux】Linux2.6内核进程调度队列与调度原理

目录 一、进程管理中的部分概念二、寄存器三、进程切换四、Linux2.6内核进程调度队列与调度原理结尾 一、进程管理中的部分概念 竞争性: 系统进程数目众多&#xff0c;而CPU资源只有少量&#xff0c;甚至1个&#xff0c;所以进程之间是具有竞争属性的。为了高效完成任务&#…