当前位置: 首页 > news >正文

如何在 Ubuntu 22.04 上安装 Apache Web 服务器

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

如何在 Ubuntu 22.04 上安装 Apache Web 服务器

介绍

Apache HTTP 服务器是世界上使用最广泛的 Web 服务器。它提供了许多强大的功能,包括动态可加载模块、强大的媒体支持以及与其他流行软件的广泛集成。

在文中,我们将了解如何在 Ubuntu 22.04 服务器上安装 Apache Web 服务器。

先决条件

在开始本文之前,我们需要使用具有sudo权限的非root用户设置 Ubuntu 22.04 服务器,并启用防火墙来阻止非必要端口。可以参考Ubuntu 20.04 初始服务器设置指南来了解如何执行此操作。

设置完成后,以非root用户身份登录并继续执行第一步。

第 1 步 — 安装 Apache

Apache 在 Ubuntu 的默认软件存储库中可用,因此可以使用传统的包管理工具来安装它。

首先更新本地包索引以反映最新的上游更改:

sudo apt update

然后,安装apache2`包:

sudo apt install apache2

确认安装后,apt将安装 Apache 和所有必需的依赖项。

第 2 步 — 调整防火墙

在测试 Apache 之前,有必要修改防火墙设置以允许外部访问默认 Web 端口。如果我们按照先决条件中的说明进行操作,则应该配置 UFW 防火墙来限制对服务器的访问。

在安装过程中,Apache 会向 UFW 注册,以提供一些应用程序配置文件,可用于启用或禁用通过防火墙对 Apache 的访问。

通过运行以下命令列出应用程序配置文件:

sudo ufw app list

我们的输出将是应用程序配置文件的列表:

OutputAvailable applications:ApacheApache FullApache SecureOpenSSH

如输出所示,Apache 可以使用三个配置文件:

  • Apache:此配置文件仅打开80端口(正常、未加密的网络流量)
  • Apache Full:此配置文件打开80端口(正常、未加密的 Web 流量)和443端口(TLS/SSL 加密流量)
  • Apache Secure:此配置文件仅打开443端口(TLS/SSL 加密流量)

建议启用限制最严格的配置文件,该配置文件仍将允许配置的流量。由于本文中尚未为服务器配置 SSL,因此我们只需要允许端口80上的流量:

sudo ufw allow 'Apache'

可以通过检查状态来验证更改:

sudo ufw status

输出将提供允许的 HTTP 流量列表:

Output
Status: activeTo                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Apache                     ALLOW       Anywhere                
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Apache (v6)                ALLOW       Anywhere (v6)

如输出所示,配置文件已被激活以允许访问 Apache Web 服务器。

第 3 步 — 检查我们的 Web 服务器

在安装过程结束时,Ubuntu 22.04 会启动 Apache。Web 服务器已经启动并运行。

通过运行 init 系统命令systemd确保服务处于活动状态:

sudo systemctl status apache2
Output
● apache2.service - The Apache HTTP ServerLoaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor prese>Active: active (running) since Tue 2022-04-26 15:33:21 UTC; 43s agoDocs: https://httpd.apache.org/docs/2.4/Main PID: 5089 (apache2)Tasks: 55 (limit: 1119)Memory: 4.8MCPU: 33msCGroup: /system.slice/apache2.service├─5089 /usr/sbin/apache2 -k start├─5091 /usr/sbin/apache2 -k start└─5092 /usr/sbin/apache2 -k start

经此输出确认,服务已成功启动。然而,测试这一点的最佳方法是从 Apache 请求页面。

我们可以通过我们的IP地址访问默认的Apache登陆页面,确认软件是否正常运行。如果我们不知道服务器的 IP 地址,可以通过命令行通过几种不同的方式获取它。

尝试在服务器的命令提示符下编写以下内容:

hostname -I

我们将收到一些用空格分隔的地址。我们可以在网络浏览器中尝试每种方法以确定它们是否有效。

另一种选择是使用免费的icanhazip.com工具。这是一个网站,访问时会返回从互联网上其他位置读取的计算机的公共 IP 地址:

curl -4 icanhazip.com

当我们获得服务器的 IP 地址后,请将其输入到浏览器的地址栏中:

http://your_server_ip

将看到默认的 Ubuntu 22.04 Apache 网页,如下所示:

Apache 默认页面

此页面表明 Apache 工作正常。它还包括有关重要 Apache 文件和目录位置的一些基本信息。

第 4 步 — 管理 Apache 进程

现在我们已经启动并运行了 Web 服务器,让我们回顾一下使用systemctl.

要停止我们的网络服务器,请运行:

sudo systemctl stop apache2

要在 Web 服务器停止时启动它,请运行:

sudo systemctl start apache2

要停止然后再次启动该服务,请运行:

sudo systemctl restart apache2

如果只是进行配置更改,Apache 通常可以重新加载而不会断开连接。为此,请使用以下命令:

sudo systemctl reload apache2

默认情况下,Apache 配置为在服务器启动时自动启动。如果这不是想要的,请通过运行以下命令来禁用此行为:

sudo systemctl disable apache2

要重新启用该服务以在引导时启动,请运行:

sudo systemctl enable apache2

现在,当服务器再次启动时,Apache 将自动启动。

第 5 步 — 设置虚拟主机(推荐)

使用 Apache Web 服务器时,我们可以使用虚拟主机(类似于 Nginx 中的服务器块)来封装配置详细信息并从一台服务器托管多个域。我们将设置一个名为your_domain的域,并将其替换为自己的域名

Ubuntu 22.04 上的 Apache 默认启用一个服务器块,该服务器块配置为提供/var/www/html目录中的文档。虽然这对于单个站点来说效果很好,但如果我们托管多个站点,它可能会变得笨拙。所以我们要为your_domain站点创建一个/var/www/html目录结构,如果客户端请求与任何其他站点都不匹配,则将其保留为要提供服务的默认目录。

为your_domain创建目录,如下所示:

sudo mkdir /var/www/your_domain

接下来,使用环境变量将目录的所有权分配给我们当前登录的用户$USER

sudo chown -R $USER:$USER /var/www/your_domain

如果我们没有修改设置默认文件权限的 umask 值,则我们的 Web 根目录的权限应该是正确的。为了确保我们的权限正确并允许所有者读取、写入和执行文件,同时只授予组和其他人读取和执行权限,我们可以输入以下命令:

sudo chmod -R 755 /var/www/your_domain

接下来,使用我们最喜欢的nano编辑器创建一个示例index.html页面:

sudo nano /var/www/your_domain/index.html

在里面添加以下示例 HTML:

/var/www/your_domain/index.html

<html><head><title>Welcome to Your_domain!</title></head><body><h1>Success!  The your_domain virtual host is working!</h1></body>
</html>

完成后保存并关闭文件。如果使用的是nano,则可以按CTRL + X,然后Y按 和 ENTER来执行此操作。

为了让 Apache 提供此内容,需要使用正确的指令创建虚拟主机文件。不要直接修改位于/etc/apache2/sites-available/000-default.conf 的默认配置文件,而是在/etc/apache2/sites-available/your_domain.conf 处创建一个新配置文件:

sudo nano /etc/apache2/sites-available/your_domain.conf

添加以下配置块,该配置块与默认配置块类似,但针对我们的新目录和域名进行了更新:

/etc/apache2/sites-available/your_domain.conf

<VirtualHost *:80>ServerAdmin webmaster@localhostServerName your_domainServerAlias www.your_domainDocumentRoot /var/www/your_domainErrorLog ${APACHE_LOG_DIR}/error.logCustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

完成后保存并关闭文件。

现在使用a2ensite工具启用该文件:

sudo a2ensite your_domain.conf

禁用中定义的默认站点000-default.conf

sudo a2dissite 000-default.conf

接下来,测试配置错误:

sudo apache2ctl configtest

应该收到以下输出:

Output
. . .
Syntax OK

重新启动 Apache :

sudo systemctl restart apache2

Apache 现在将为我们的域名提供服务。我们可以通过导航到 http://your_domain来测,将在其中看到类似以下内容的内容:

Apache 虚拟主机示例

第 6 步 – 熟悉重要的 Apache 文件和目录

现在我们已经知道如何管理 Apache 服务本身,下来花几分钟来熟悉一些重要的目录和文件。

内容

  • /var/www/html:实际的 Web 内容默认情况下仅包含我们之前看到的默认 Apache 页面,是从/var/www/html目录中提供的。这可以通过更改 Apache 配置文件来更改。

服务器配置

  • /etc/apache2:Apache 配置目录。所有 Apache 配置文件都驻留在此处。
  • /etc/apache2/apache2.conf:主要的 Apache 配置文件。可以修改它以更改 Apache 全局配置。该文件负责加载配置目录中的许多其他文件。
  • /etc/apache2/ports.conf:该文件指定 Apache 将侦听的端口。默认情况下,Apache 侦听端口80,在启用提供 SSL 功能的模块时另外侦听443端口。
  • /etc/apache2/sites-available/:可以存储每个站点虚拟主机的目录。Apache 将不会使用在此目录中找到的配置文件,除非它们链接到该sites-enabled目录。通常,所有服务器块配置都在此目录中完成,然后通过使用a2ensite命令链接到其他目录来启用。
  • /etc/apache2/sites-enabled/:存储已启用的每站点虚拟主机的目录。Apache 在启动或重新加载时读取此目录中的配置文件和链接以编译完整的配置。
  • /etc/apache2/conf-available/, :这些目录与和目录/etc/apache2/conf-enabled/具有相同的关系,但用于存储不属于虚拟主机的配置片段。目录中的文件可以使用该命令启用,也可以使用该命令禁用。
  • /etc/apache2/mods-available/, /etc/apache2/mods-enabled/:这些目录分别包含可用和启用的模块。以 .load结尾的文件包含加载特定模块的片段,而以.conf 结尾的文件包含这些模块的配置。可以使用a2enmoda2dismod命令启用和禁用模块。

服务器日志

  • /var/log/apache2/access.log:默认情况下,对 Web 服务器的每个请求都会记录在此日志文件中,除非 Apache 配置为其他方式。
  • /var/log/apache2/error.log:默认情况下,所有错误都记录在此文件中。Apache 配置中的指令LogLevel指定错误日志将包含多少详细信息。

结论

现在我们已经安装了 Web 服务器,对于可以提供的内容类型以及可以用来创建更丰富体验的技术,我们有多种选择。如果我们想构建更完整的应用程序堆栈,可以阅读这篇关于如何在 Ubuntu 22.04 上配置 LAMP 堆栈的文章

相关文章:

如何在 Ubuntu 22.04 上安装 Apache Web 服务器

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 如何在 Ubuntu 22.04 上安装 Apache Web 服务器 介绍 Apache HTTP 服务器是世界上使用最广泛的 Web 服务器。它…...

【python爬虫】爬虫编程技术的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a; 爬虫】网络爬虫探秘⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1f33c;实验目的 &#x1f…...

VisualSVN Server下载安装和使用方法、服务器搭建、使用TortoiseSvn将项目上传到云端服务器、各种错误解决方法

VisualSVN Server下载安装和使用方法、服务器搭建、使用TortoiseSvn将项目上传到云端服务器、各种错误解决方法 0.写在前面00.电脑配置01.思路 1.VisualSVN Server下载安装01.下载02.安装03.电脑命名不能有中文04.制作VisualSVN Server快捷方式05.License limits exceeded, Som…...

Python模块与包:扩展功能、提高效率的利器

文章目录 一、引言1.1 模块与包对于Python开发的重要性1.2 Python作为拥有丰富生态系统的编程语言 二、为什么学习模块与包2.1 复用代码&#xff1a;利用现有模块与包加速开发过程2.2 扩展功能&#xff1a;通过模块与包提供的功能增强应用的能力 三、模块的使用3.1 导入模块&am…...

【每日一题】4.LeetCode——杨辉三角

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢迎各位大佬指点&…...

蓝桥杯(Python)每日练Day5

题目 OJ1229 题目分析 题目完全符合栈的特征&#xff0c;后进先出。如果能够熟练使用列表的9种方法那么这道题很容易解出。 题解 a[]#存衣服 nint(input()) for i in range(n):llist(input().split())#判断每一步的操作if len(l[0])2:a.append(l[1])else:while a.pop()!l…...

SpringCloud(二)

Spring Cloud 文章目录 Spring Cloud任务三&#xff1a;Spring Cloud与微服务架构1.Spring Cloud课程内容介绍2.单体应用架构2.1 互联网应用架构演进2.2 单体应用架构 3.垂直应用架构4.SOA应用架构5.微服务应用架构介绍6.微服务架构核心思想及优缺点7.微服务架构的核心概念8.Sp…...

【java】常见的面试问题

目录 一、异常 1、 throw 和 throws 的区别&#xff1f; 2、 final、finally、finalize 有什么区别&#xff1f; 3、try-catch-finally 中哪个部分可以省略&#xff1f; 4、try-catch-finally 中&#xff0c;如果 catch 中 return 了&#xff0c;finally 还会执行吗&#…...

虚幻UE 插件-像素流送实现和优化

本笔记记录了像素流送插件的实现和优化过程。 UE version&#xff1a;5.3 文章目录 一、像素流送二、实现步骤1、开启像素流送插件2、设置参数3、打包程序4、打包后的程序进行像素流参数设置5、下载NodeJS6、下载信令服务器7、对信令服务器进行设置8、启动像素流送 三、优化1、…...

Vue2 props组件通信

一、父组件向子组件传值 1、流程图 2、父组件代码 <template><div class"app"><UserInfo:usernameusername:ageage:isSingleisSingle:carcar:hobbyhobby></UserInfo></div> </template><script> import UserInfo from .…...

重构改善既有代码的设计-学习(三):重新组织数据

1、拆分变量&#xff08;Split Variable&#xff09; 有些变量用于保存一段冗长代码的运算结果&#xff0c;以便稍后使用。这种变量应该只被赋值一次。 如果它们被赋值超过一次&#xff0c;就意味它们在函数中承担了一个以上的责任。如果变量承担多个责任&#xff0c;它就应该被…...

群狼调研(长沙品牌忠诚度测试)|广告效果测评方法

广告效果测评方法可以根据具体的目标和需求而有所差异&#xff0c;以下是一些常见的广告效果测评方法&#xff1a; 1.品牌调研和调查&#xff1a;通过定量或定性的调研和调查方法&#xff0c;评估广告对品牌认知、品牌形象和品牌偏好的影响&#xff0c;包括品牌知名度、品牌关联…...

Gradle学习笔记:Gradle的使用方法

文章目录 1.初始化项目2.构建脚本语言选择3.项目命名4.项目构建过程 1.初始化项目 创建一个test空文件夹&#xff0c;在该文件夹下打开终端&#xff0c;并执行命令&#xff1a;gradle init. 会有一个选项让你选择项目的类型。下面是每个选项的含义和用途&#xff1a; basic&am…...

少儿编程 2023年12月电子学会图形化编程等级考试Scratch二级真题解析(选择题)

2023年12月scratch编程等级考试二级真题 选择题(共25题,每题2分,共50分) 1、在制作推箱子游戏时,地图是用数字形式储存在电脑里的,下图是一个推箱子地图,地图表示如下:第一行( 111111)第二行( 132231) 第三行( 126621) 第四行( ) 第五行( 152321) 第六行( 111111 ) 根…...

基于Java+SpringMvc+vue+element实现上海汽车博物馆平台

基于JavaSpringMvcvueelement实现上海汽车博物馆平台 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 …...

Sybase PowerDesigner15安装配置

1&#xff0c;软件介绍 ​ Power Designer 是Sybase公司的CASE工具集&#xff0c;使用它可以方便地对管理信息系统进行分析设计&#xff0c;他几乎包括了数据库模型设计的全过程。利用Power Designer可以制作数据流程图、概念数据模型、物理数据模型&#xff0c;还可以为数据仓…...

基于物联网设计的水稻田智能灌溉系统(STM32+华为云IOT)

一、项目介绍 随着科技的不断发展和人们生活水平的提高&#xff0c;农业生产也逐渐向智能化、高效化的方向发展。水稻作为我国主要的粮食作物之一&#xff0c;其生长过程中的灌溉管理尤为重要。传统的灌溉方式往往依赖于人工观察和控制&#xff0c;不仅效率低下&#xff0c;而…...

【数据结构】数据结构初识

前言&#xff1a; 数据结构是计算存储&#xff0c;组织数据的方式。数据结构是指相互间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 Data Structure Vi…...

java多线程测试websocket demo(使用文件流)

这个demo主要是利用Java多线程来测试WebSocket通信。首先&#xff0c;创建一个WebSocket服务器和客户端&#xff0c;然后使用多线程来模拟多个客户端同时连接服务器进行通信。通过多线程测试&#xff0c;可以验证WebSocket通信的并发性能和稳定性。同时&#xff0c;可以通过多线…...

Tosei 自助网络店铺管理系统network_test.php_RCE漏洞复现

简介 Tosei 自助洗衣机是日本一家公司的产品,在 network_test.php 文件存在命令执行 漏洞复现 FOFA语法: body="tosei_login_check.php" 主要是日本 访问界面如下所示: 验证POC: /cgi-bin/network_test.php 拼接访问url: https://ip:port/cgi-bin/network_tes…...

uni-app 国际化

vue i18n v9的迁移后的$t()无法获取数组、对象 http://t.csdnimg.cn/WkCHy api:vue i18n [intlify] Not found ‘language’ key in ‘zh-Hans’ locale messages. [intlify] Fall back to translate ‘language’ key with ‘zh’ locale. [intlify] Not found ‘languag…...

git:git reset 和 git revert

在使用 git 进行项目开发的过程中&#xff0c;有时会出现错误提交的情况&#xff0c;这时就需要能够撤销错误的提交&#xff0c;将代码恢复到提交之前的样子。根据不同情况&#xff0c;可以使用 git reset 或 git revert 命令。 一. git reset git reset 的原理是修改 HEAD 的…...

LeetCode:670. 最大交换(Java 贪心)

目录 670. 最大交换 题目描述&#xff1a; 实现代码与解析&#xff1b; 贪心 原理思路&#xff1a; 670. 最大交换 题目描述&#xff1a; 给定一个非负整数&#xff0c;你至多可以交换一次数字中的任意两位。返回你能得到的最大值。 示例 1 : 输入: 2736 输出: 7236 解释…...

【STM32】STM32学习笔记-Unix时间戳(41)

00. 目录 文章目录 00. 目录01. Unix时间戳02. UTC/GMT03. 时间戳转换04. C 标准库 <time.h>05. 时间相关函数示例5.1 time函数5.2 gmtime函数5.3 localtime函数5.4 mktime函数5.5 ctime函数5.6 asctime函数5.7 strftime函数 06. 预留07. 附录 01. Unix时间戳 •Unix 时…...

2016年认证杯SPSSPRO杯数学建模B题(第一阶段)低分辨率下看世界全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 B题 低分辨率下看世界 原题再现&#xff1a; 数码摄像技术被广泛使用于多种场合中。有时由于客观条件的限制&#xff0c;拍摄设备只能在较低的分辨率下成像。为简单起见&#xff0c;我们只考虑单色成像。假设成像的分辨率为 32 64&#xff0c…...

16、Kafka ------ SpringBoot 整合 Kafka (配置 Kafka 属性 及对应的 属性处理类 解析)

目录 配置 Kafka 及对应的 属性处理类配置KafkaKafka配置属性的约定代码演示生产者相关的配置消费者相关的配置 代码&#xff08;配置文件&#xff09;application.properties 配置 Kafka 及对应的 属性处理类 配置Kafka spring.kafka.* 开头的配置属性&#xff0c;这些属性将由…...

【蓝桥杯选拔赛真题61】python偶数平方 第十五届青少年组蓝桥杯python 选拔赛比赛真题解析

目录 python偶数平方 一、题目要求 1、编程实现 2、输入输出...

智能语音识别源码系统+语义理解+对话管理+语音合成 带完整的搭建教程

人工智能技术的不断发展&#xff0c;智能语音识别技术逐渐成为人们日常生活和工作中不可或缺的一部分。然而&#xff0c;目前市场上的智能语音识别产品大多存在一定的局限性&#xff0c;如识别率不高、功能单一等。为了解决这些问题&#xff0c;罗峰给大家分享一款基于智能语音…...

cdh6.3.2的hive配udf

背景 大数据平台的租户要使用udf&#xff0c;他们用beeline连接&#xff0c; 意味着要通过hs2&#xff0c;但如果有多个hs2&#xff0c;各个hs2之间不能共享&#xff0c;需要先把文件传到hdfs&#xff0c;然后手动在各hs2上create function。之后就可以永久使用了&#xff0c;…...

在DevEco开发工具中,使用Previewer预览界面中的UI组件

1、在DevEco工具中&#xff0c;点击并展开PreViewer预览器 2、在PreViewer预览器中&#xff0c;点击Tt按钮&#xff08;Inspector&#xff09;切换至组件查看模式 3、在组件查看模式下选择组件&#xff0c;代码呈现选中状态&#xff0c;右侧呈现组件树&#xff0c;右下方呈现组…...

公司网站实用性/电商seo是什么意思啊

0.在探究 ResNets 之前&#xff0c;我们简单回顾 classic networks&#xff0c;即 plain networks: LeNet-5、AlexNet and VGGNet-16/19。 这些网络以CONV(若干)POOLFC这种串联形式组成&#xff0c;成为plain nets。 其中&#xff0c;VGG提出随着网络深度加深&#xff0c;可学…...

长沙市网站推广多少钱/上海网站制作

【解决】putty使用从AWS下载的private key登录失败在AWS启动一个实例时如果创建并下载了一个KeyPair的私钥(*.pem),则可以此私钥作为Credentials通过putty远程登录到这个实例系统.但在实际操作中,用putty登录时会提示如下错 ...一个最简单的ftpsever没有什么事情可以做,无聊的很…...

盘锦门户网站制作/相城seo网站优化软件

1.vCenter中添加虚拟机的参数&#xff1a; 在vCenter上的ESXI系统创建的虚拟机&#xff0c;再创建虚拟机的方法&#xff1a;打开vCenter界面关闭虚拟机电源 右键单击虚拟机----编辑设置-选择“选项”----选择“常规”----在右下的配置参数中点击“配置参数”在配置参数界面&…...

河南电商网站开发/软件开发一般需要多少钱

* 1 检查和过滤无效参数&#xff0c;以及多余的字符和参数&#xff1b;* 2 程序头部应标明程序运行的依赖关系&#xff0c;包括&#xff1a;依赖的软件/命令名称及版本号需求&#xff0c;硬件平台等&#xff1b;* 3 可能变更的、不确定的文件路径和文件名称&#xff0c;尽可能定…...

网站建设拾金手指下拉/电商广告

Linux之查看CPU状态一、 能够查看CPU的命令lscpu 命令cat /proc/cpuinfo nproc 命令dmidecode -t processor 命令getconf _NPROCESSORS_ONLN 命令二、 各个命令案例2.1 lscpu命令$ lscpu$ lscpu | egrep Model name|Socket|Thread|NUMA|CPU(s)执行结果&#xff1a;$ lscpuLinux…...

vs网站开发入门/关键词排名推广怎么做

从CSDN来博客园开个博...