使用域名访问服务器资源

使用域名访问服务器资源

概览

Getting Started – Apache
RFC-791

URLs - Uniform Resource Locators,统一资源定位符 表示 Web 上的一个地址,由 协议(https)、服务器名(www.example.com)、URL(/docs/current/getting-started.html)、请求字符串 等若干部分组成

我们的服务器上运行着某种 Web 服务器软件(例如 apache、nginx),它是一种服务,在运行时会监听指定的端口,
我们的 客户端(Client) 用某种 协议(protocol) 连接到 服务器(server),当客户端发起 请求(request)时,如果对应的端口正在被服务器 监听(listen),则服务器会进行处理。
如果服务端处理成功,则会返回一个东西,这个东西可能是一个文件(比如 *.html)、可能是一个程序(*.php),而客户端接到来自 服务端的 回执(response) 后由浏览器解析为 可读、可交互 的画面
而如果服务端无法解析,则会返回 HTTP 状态码

客户端和服务端之间的通信,会通过 TCP/IP 协议簇,我们访问一个 Web服务器上的资源需要提供一个 URL,
URL 的每一部分都是有讲究的:

  • 协议:默认使用 HTTP,当你的服务器使用了 SSL 认证,则能“升级”为 HTTPs,变得更加可靠、安全。
  • 域名:在你的请求从客户端发往服务端的过程中,有些特殊的服务器(DNS解析)会将你请求的(易于记忆的)地址替换为特定的IP(难以记忆);这些相比于IP地址更易于记忆的地址,被称为域名,由特定的第三方机构分发、解析。
  • Host:主机名,和域名类似,只不过本身只是一个将 “(可能并未认证的)域名” 映射到 ip 的本地解析文件。它的优先级高于 DNS,但缺点也很明显,就是当 DNS 映射的 IP 地址发生变化时,无法及时得到更新。
  • 端口:在服务器上,每一个服务都会占用一个端口;每一个来自客户端的请求都会往某个端口发送;当服务端有从某个端口监听到发来的数据时,对应的 服务(程序) 就能进行处理、并且回执。

前面提到,hostname(主机名) 本质上是一个映射,比如 localhost 就表示本机名,根据不同场合映射为不同的实际值
servername(服务器名)是确定的,要么是一个固定的 IP 地址,要么是被 DNS 解析的域名
一台服务器设备上,可能绑定多个IP;而一个 IP 地址也可能映射多个 hostname,比如 www.example.comexample.com 本质上是两个 hostname
如果一台电脑上能运行多个网站,则将他们称为 virtual hosts(虚拟主机)
对于 虚拟主机 的理解,稍后在实际例子中进行说明

之后,根据规则,请求会访问服务器上的一些内容,这些内容分为 静态、动态
DocumentRoot 路径决定了你的静态内容存放的位置,客户端请求只有权限访问这里的内容
当客户端提供的URL指向服务器上某个文件夹时,如果存在 index.html(这个名称是根据你的配置决定的,而 index 是约定俗成的名字)则将其以静态网页的形式呈现给客户端,
而动态内容则是每次请求时都可能以不同形式呈现的内容,它有若干方式实现,通常是PHP(由 mod_php 提供)

流程梗概

在 Linux 部署网站服务器需要哪几步?

  1. 通过 网络供应商(腾讯云、阿里云) 租一台服务器,以远程连接的方式控制服务器
  2. 在服务器上安装 Apache 或者 Nginx ,配置并且启动服务、测试
  3. 申请域名(需要审核大概 1个月),并且将域名解析到你的服务器IP,再用域名访问
  4. 使用 SSL 证书让你的网站能用 https 协议访问
  5. 下载 MySQL、PHP,并且尝试新建数据库、将主页修改为 index.php
  6. 使用 CMS 让你的主页更加好看

配置服务器

选购好服务器以后,通过远程连接登入,详情参考各个 网络供应商 的教程
登录完成后,如果不是 root 账户,输入 su - 切换到 root 账户,
以阿里云ECS服务器为例,登录 root 账户时,需要输入实例密码,这可以在阿里云控制台里设置/重置

安装 Web 服务器软件

Web 服务器软件的意义

首先拿到你服务器的公网IP,比如我的是 121.89.212.8,之后在家用电脑的控制台使用 ping 测试,发现能够收到返回,说明这个 IP 能在互联网上被找到
然后,在家用电脑使用用浏览器访问这个IP,浏览器不会回应,
为此,你需要安装 nginx 或者 apache,这样你的服务器接收到请求时,会回馈给访问者一个网页(index.html、index.php 等等,根据你的配置来)

在你选择 nginx 或者 apache 之前,需要纠正一个误区,他们两个对 CMS 都是支持的,只不过两者侧重点不同

安装软件

这里以 ubuntu 版本的 Linux 举例,使用 apt 进行安装,早期版本使用的是 apt-get,用法基本差不多,替换一下就行。
其他版本的 Linux 可能使用 yum 之类的,安装方式大同小异,请根据自己的 Linux 版本来
另外,如果权限不够请自行在前面补 sudo

更新 apt 包,并且安装 apache2

apt update
apt install apache2

安装后,apache2 服务默认会被启动
借助 systemctl 查看其状态:

systemctl status apache2

你也可以利用 systemctl 去启动、重启、停止 apache2 服务,

此时,在你的家用电脑中,在浏览器中通过服务器的IP地址访问,就能看到 apache2 的欢迎页了,比如我的就是 121.89.212.8
apache2 默认使用 80 端口,这等价于你输入 http://121.89.212.8:80

欢迎页

欢迎页中提到了很多有用的引导信息
首先,它告诉你 apache 成功在这台 Ubuntu 版本的 Linux 系统上启动了
其次,它告诉你这个静态网页文件位于 /var/www/html/index.html,你随时可以用你 自己的、同名的 静态网页文件进行替换,
它还告诉你 /usr/share/doc/apache2/README.Debian.gz 中有完整的文档帮助,如果你安装了apache2-doc,则可以直接点欢迎页的 manual 进入。这里可以直接用 apt install apache2-doc,然后点进 manual,你会发现这个文档实际上就是 Apache HTTP 服务器 2.4 文档

接下来,它告诉你,配置文件夹 /etc/apache2/ 下的结构:

/etc/apache2/
|-- apache2.conf
|       `--  ports.conf
|-- mods-enabled
|       |-- *.load
|       `-- *.conf
|-- conf-enabled
|       `-- *.conf
|-- sites-enabled
|       `-- *.conf

其中,apache2.conf 是主要配置,在 apache 服务启动时,它会包含(Include)旗下的 mods-enabledconf-enabledsites-enabled 三个文件夹下所有相关的文件

mods-enabled 用于管理 modules(模块)
conf-enabled 管理 global configuration fragments(全局配置片段)
sites-enabled 管理 virtual host configurations(虚拟主机配置),也就是你的站点

三个文件夹有名称对应的 XXX_available 文件夹,这可以用于存放一些可用的、备份的代码,在你需要的时候随时从这里拿;并且默认情况下,里面包含了一些详细的教程、例子,以供参考。
另外还有一个 ports.conf 用于定义你要监听的端口

在 apache2 中进行配置时,要借助 a2enmod, a2dismod, a2ensite, a2dissite, a2enconf, a2disconf 这些命令,
具体需要查看 man 文档
apachectl configtest 可以检测配置语法是否正确

然后,文档建议你用 systemctl {start|stop|restart|status} apache2 来操作 apache2 服务,而不是用 apache2 的命令,因为它是以 systemd 管理的二进制文件(?)

最后,它提到
Document Roots 默认会访问 /var/wwwpublic_html/usr/share(用于web程序) ,如果想改成别的位置,可能要加白名单(?)
以及 BUG 反馈的问题,一般是遇不到什么明显BUG的,不用管这个

修改欢迎页

既然前面提到我们的静态网页位于 /var/www/html/index.html
我们打开 index.html 文件

cd /var/www/html
vim index.html

修改 title>...</title> 标签,并且刷新预览,会发现网页的标题同步发生了变化

解析请求

端口绑定

Binding to Addresses and Ports
apache2 的 httpd 在默认情况下会监听所有端口,但它的配置中默认会定义 Listen 80 监听 80 端口
你可以在 /etc/apache2/ports.conf 找到 apache2 的端口配置进行确认

Listen 80

<IfModule ssl_module>
        Listen 443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 443
</IfModule>

你自己的服务器上运行的 apache2 服务,可以监听多个端口,
而客户端在访问服务器IP时,要用对应的这些端口
并且,网络供应商 那里会有一个额外的拦截,例如在阿里云被称为 “安全组” ,你需要在里面新增该端口的规则
因此,一个端口的修改,需要三方配合:

  1. 服务器上运行的 apache2,需要修改配置
  2. 网络供应商 需要放行对应端口
  3. 客户端需要用指定端口访问

例如,我们在 Listen 80 下面新增一个 Listen 8989,然后去 阿里云的安全组配置 8989 的规则,最后用http://121.89.212.8:8989/ 访问
为了方便叙述,接下来我们默认认为你仍然保持的是 80 端口

模块启用

端口绑定 这里提到的配置文件中, 还使用了 IfModule,意思是:当配置引用了 ssl_module 模块时,额外监听443端口,这将用于 SSL验证(与刚才的 80 端口不同,这个 443 端口不建议修改)
我们检查一下这个模块是否正被 包含(Include),用 apache2ctl -h 查看帮助,得知 apache2ctl -M 可以查看当前所有已包含模块(included configuration files),
如果你找不到 ssl_module (shared) 这一行,说明配置没有被包含(启用),需要用 a2enmod 命令进行启用

a2enmod ssl

重启服务,并且再次查看

systemctl restart apache2
apache2ctl -M

这时 ssl_module (shared) 显示,表示 ssl_module 已被正确包含,
此时,你用 443 端口访问网页,例如我的是:http://121.89.212.8:443/ ,如果能成功进入主页,则说明IfModule 的判定通过,443端口被监听

虚拟主机

Apache 虚拟主机文档

首先我们根据前面提到的方法(apache2配置、安全组放行),额外监听 3个 端口,为接下来做准备

Listen 80
Listen 8989
Listen 2368

然后前往 /var/www 也就是默认的 DocumentRoot,
新建几个平行的文件夹,作为我们不同的网站的根

/var/www# mkdir website1
/var/www# mkdir website2
/var/www# ls

之后应该会显示:

html  website1  website2

然后各自填充一个 index.html 作为静态主页,内容随意

vim website1/index.html
vim website2/index.html

准备好站点内容后,找到并编辑默认的虚拟主机配置

vim /etc/apache2/sites-enabled/000-default.conf

在默认的虚拟主机配置上新增:

<VirtualHost *:8989>
        DocumentRoot /var/www/website1
</VirtualHost>

<VirtualHost *:2368>
        DocumentRoot /var/www/website2
</VirtualHost>

之后,重启服务 systemctl restart apache2
然后我们用客户端分别访问
http://121.89.212.8:80/
http://121.89.212.8:8989/
http://121.89.212.8:2368/
呈现了三个不同的站点,这就是虚拟主机的作用之一,它允许一台服务器设备上运行多个不同 DocumentRoot 的站点

Ubuntu 对于 apache2 的处理

如果一个“可通行”的端口,没有对应的虚拟主机去解析,会出现什么情况?
我们将 整个 000-default.conf 的内容注释掉(或者直接删除,稍后在 sites-available 文件夹找回)
重启服务,再访问网址,会发现,无论用哪个端口都会跳转到默认页面
这个问题我简单查了一下,在 这篇文章 中的评论有一个推测。这个问题出现在 Ubuntu 版本的Linux上,而且对这个问题感到困惑的人不少,不过没有看到确切的答案。换句话说,这个问题 不是因为你遗漏了某些需要注意的配置 而造成。
正常情况下你只用关心 sites-enabled 需要定义的虚拟主机,以及 ports.conf 需要开放的端口即可。特别情况下你可以修改、追加 apache2.conf 中的

#<Directory /srv/>
#       Options Indexes FollowSymLinks
#       AllowOverride None
#       Require all granted
#</Directory>

额外指定、或者修改已有的目录,这个目录将作为外部请求访问时共享资源的目录,是对外开放的,因此需要授予一定权限(默认是没有权限的,否则谁都能在你的服务器上“搞破坏”)
所有该服务器设备上运行的站点(每个站点拥有不同的 DocumentRoot),都需要放在这个目录下,因此对于每一个网站,通常指定一个公共的根目录即可(也就是说保持默认,不用去改)。另一个 /usr/share 目录也拥有访问权限,但用得相对较少。

DNS

当服务器有 公网IP 了,客户端就能以 IP地址 通过 WWW(万维网) 访问服务器上的资源
但 IP 地址是非常难记的,因此就有了 域名、DNS 解析,
在客户端的请求到服务器的途中,经过某些特定的 DNS 解析服务器,然后将 客户端提供的、人更容易记住的 域名地址,映射为 IP 地址,然后进行转发,这就是 DNS解析的本质

一般的网络供应商都会提供DNS域名解析服务,为了申请一个(国内的)域名,你需要(通过网络供应商)去监管局报备你的域名的用途,并且等待审核(一般20天左右)
当你的域名可用时,就要设置规则。规则决定:在允许范围内,你的域名要如何去映射地址。
一条解析规则包含:

  • 主机记录:例如你的主域名如果是 www.helloworld.com,前缀的www就表示主机记录
    • 通常会设置 *@www 三种记录
  • 记录类型:A记录表示将域名指向IP,其他记录类型参考网络供应商的文档
  • 解析线路(ISP):一般保持默认
  • 记录值:表示映射的IP
  • TIL:表示这个 DNS解析 刷新、生效 的间隔,一般是10分钟
  • 状态:表示当前记录是否正常生效

当解析规则添加后,使用 DNS 诊断工具DNSPod 域名检测工具 检测你的域名是否被 DNS 正常解析,如果解析正常那么就可以到下一步了

正常来说,如果你在客户端用 IP地址 是能够访问服务器的,当你的域名设置了解析规则以后,使用 HTTP 协议也能访问服务器,例如我的就是:http://www.yanghanwen.cn
如果打开的网页提示:

此站点的连接不安全

yanghanwen.cn 发送了无效的响应。
尝试运行 Windows 网络诊断。
ERR_SSL_PROTOCOL_ERROR

这是因为你还没有为 SSL 设置证书(暂时还无法用 HTTPs,但是你请求的链接自动转了HTTPs 的协议)
你可以暂时将 ssl 模块关掉,然后重启 apache2

a2dismod ssl
systemctl restart apache2

如果又不行,则客户端可能存在DNS缓存,Windows系统用 ipconfig/flushdns 的 DOS 命令清一下
如果又双叒叕不行,大概率是电脑上某些设置造成的(比如浏览器不允许用不安全的链接之类的),建议用手机访问看看

编写虚拟主机配置

回到 /etc/apache2/sites-enabled 目录,打开 000-default.conf

cd /etc/apache2/sites-enabled
vim 000-default.conf

我们先将多余的内容删去,只保留:

# <VirtualHost *:80> 
        DocumentRoot /var/www/html  
        ServerName www.example.com 
        ServerAlias server server2.example.com server2
        ServerAlias *.example.com
        # ErrorLog ${APACHE_LOG_DIR}/error.log
        # CustomLog ${APACHE_LOG_DIR}/access.log combined
        # ServerAdmin webmaster@localhost
# </VirtualHost>

VirtualHost 标签可以填具体的域名,例如 <VirtualHost 121.89.212.8:80> ,可以填 IPv4地址、IPv6地址(需要用[]包起来)后面尾随端口,但并不推荐这么做
通常会使用 * 匹配任意IP地址,等价于 _default_ 别名
这相当于一条规则,当规则匹配时,这个 虚拟主机 就会对请求进行处理

DocumentRoot 指定当前站点内容的根,需要放在 apache2.conf 定义的、有权限的目录结构之下(默认是 /var/www

ServerName 需要每个 <VirtualHost> 块内都声明一个,否则就只会继承主配置的设置。
语法是:ServerName [scheme://]domain-name|ip-address[:port],是服务器用来标识自己的
在作为 Name-based Virtual Host Support 时,用于表示虚拟主机的唯一标识
不要把这个和 DNS 解析搞混,DNS解析决定了客户端的请求能不能发到服务器,而 ServerName 是决定了这个虚拟主机如何标识自己

ServerAlias 表示别名,可以填多个

ErrorLog、CustomLog 表示日志
ServerAdmin 表示服务器给客户端返回错误消息时附带的联系地址,因为目前客户端就是你自己,所以可以不用填

HTTPs

SSL/TLS
我们之前的例子都是在用 HTTP 请求,现在我们为电脑安装 SSL 证书,让 HTTP “升级”为 HTTPs
首先启用ssl模块(如果没启用的话)

a2enmod ssl
systemctl restart apache2
apache2ctl -M

确认ssl_module (shared)有被打印
然后尝试用 443 端口访问,例如: http://121.89.212.8:443,会提示无法处理
我们需要添加一个 虚拟主机处理发向 443端口 的请求
而 apache2 有一个默认的实现,我们把它拷贝到sites-enabled 目录

cd /etc/apache2
cp sites-available/default-ssl.conf sites-enabled/default-ssl.conf

然后编辑内容

vim sites-enabled/default-ssl.conf

这里会发现它要我们指定一些证书的路径,我们去 网络供应商 那里找到 SSL 服务,申请一个免费证书
然后在证书上选择 部署 (它会自动把证书下到你的服务器上,否则你就只能手动自己下、然后自己用 FTP 传,很麻烦)
我们直接把证书和 apache2 的配置扔一起,方便找

/etc/apache2/ssl/yanghanwen.pem
/etc/apache2/ssl/yanghanwen.key
/etc/apache2/ssl/yanghanwen.crt

接着回到编辑页面,将证书文件的路径指向你刚才上传的两个文件,
还有个 *.crt 文件是证书链,那个是可选操作,可以不用管它

SSLCertificateFile      /etc/apache2/ssl/yanghanwen.pem
SSLCertificateKeyFile   /etc/apache2/ssl/yanghanwen.key

确保完成以上若干步骤:

  • 证书申请、上传到服务器
  • apache2 开启了 ssl 模块(并因此启用了443端口的监听)
  • apache2 的虚拟主机配置被声明,并且处理发往443端口的请求,同时保证 SSLCertificateFileSSLCertificateKeyFile 两个证书文件的路径被正确指定

重启apache2服务,再用 HTTPs 加上 域名 访问你的网页,即可看到我们熟悉的欢迎页(存放在 /var/www/html)
至此,一个基本流程就已经搞完了,任何人都能通过你的域名访问你服务器上的静态网页了
在此之上,如果要搭建个人博客,还需要进行 PHP、MySql 的部署,以及 WordPress 等 CMS 的安装

部署 CMS

什么是 CMS

CMS是什么,能做什么,怎么用呢?
Content Management System,直译为 内容管理系统,
你可以通俗地理解为 建站工具,它能帮助你快速部署一个个人网站,并且提供容易上手的网站管理工具

主流建站工具有:Wordpress,Drupal,Joomla
而目前 WordPress 已经独占鳌头

早年国内会有用 ghost 的,然而那玩意儿看上去都没维护了,会踩很多坑,不是特别建议

使用 PHP

安装PHP

apt install php

安装 apache2 的 PHP 包

apt install libapache2-mod-php

启用 PHP 模块(可以在 /etc/apache2/mods-enabled 里确认具体的模块名)
然后重启服务

a2enmod php8.1
systemctl restart apache2

到这里,我们已经可以直接提供 PHP 文件(apache2已经设置好了)
前往 /var/www/html 将原有的 index.html 文件删掉或者移动到别处

cd /var/www/html
mv index.html ..

然后新建一个 php 文件,

vim index.php

打印 “helloworld”

<?php
echo "hello"; 
print "world";
?>

在网页中预览后能看到我们刚才由 PHP 表达的主页

创建数据库

创建数据库

网站上所有用户的信息、文章,都是要存在数据库中的
而 MySql 是目前最主流的数据库

安装MySql

apt install mysql-server

新安装的MySQL链接数据库时只需要输入:

mysql

第一次安装时,一定要给你的 root 账户设置一个密码,
否则谁都能用 root 权限访问你的数据库,这是非常危险
在 MySql 8.0 以上版本,设置密码需要:

ALTERUSER'root'@'localhost' IDENTIFIED BY'<password>';

其中 <password> 替换为你自己的密码,并且一定要妥善保管这个密码,root 账户的密码不像普通用户的密码,如果遗失的话改起来很麻烦
刷新授权表,退出

FLUSH PRIVILEGES;
quit;

然后使用 mysql -u <user_name> -p 语法重新链接数据库

mysql -u root -p 

当你输入完密码之后,为你即将诞生的网站创建一个 数据库、一个数据库管理者(非 root 的用户)

-- 创建数据库CREATE DATABASE yanghanwen;

-- 创建用户(如果没有)CREATEUSER'wugeng'@'localhost' IDENTIFIED BY'123456';

-- 授予用户权限-- 如果 root 有密码就往后面加 IDENTIFIED BY '<password>'GRANTALL PRIVILEGES ON yanghanwen.*TO'wugeng'@'localhost';

-- 刷新授权表
FLUSH PRIVILEGES;

-- 退出
quit;

这时,数据库已经准备完成,但你可能感知不到,你需要部署一个 CMS ,让它去将你数据库里的内容展示出来

部署 WordPress

访问 WordPress 历史版本 以获取最新的版本
访问 WordPress 安装引导 获得最新安装教程

# 假设你的根目录是保持默认的cd /var/www

# 用 wget 下载,并且等待下载完成# 你也可以直接在别的电脑下好,然后(通过 FTP)拷贝到服务器  
wget https://wordpress.org/wordpress-6.0.1.tar.gz

# 解压
tar -xvzf wordpress-6.0.1.tar.gz 

# [可选] 移除安装包
rm wordpress-6.0.1.tar.gz 

# [可选] 移除掉之前默认的 html 文件夹(里面放了默认网页)# 移除后避免错误解析到这里
rm html -r

# 将 wordpress 文件夹更名为你的站点名
mv wordpress yanghanwen.cn
cd yanghanwen.cn

# [可选] 更名# 否则 word press 会给你创建一个默认的配置
mv wp-config-sample.php wp-config.php 

# 编辑 wordpress 配置
vim wp-config.php

之后,参考 wp-config.php 修改这几项:

// ** Database settings - You can get this info from your web host ** ///** The name of the database for WordPress */
define( 'DB_NAME', 'database_name_here' );

/** Database username */
define( 'DB_USER', 'username_here' );

/** Database password */
define( 'DB_PASSWORD', 'password_here' );

修改为你刚才生成数据库时填的信息,保存
然后回到 apache2 配置目录,新增一个虚拟主机指向我们的站点

cd /etc/apache2/sites-enabled/
vim 000-default.conf 

例如我的是:

 <VirtualHost *:80>
        DocumentRoot /var/www/yanghanwen.cn
        # ServerName www.yanghanwen.cn
        # ServerAlias yanghanwen.cn *.yanghanwen.cn
 </VirtualHost>

然后 ssl 配置的 DocumentRoot 也要跟着改

vim default-ssl.conf

重启下服务

systemctl restart apache2

如果你用的 PHP 是高版本的(这没什么问题),进主页会显示一个

Your PHP installation appears to be missing the MySQL extension which is require

你需要按照 这篇文章 的提示,根据 这个安装教程 为 php 安装 mysqli 模块

 apt install php-mysqli
 phpenmod mysqli
 systemctl restart apache2

之后再进入就会到 wordpress 的引导页,跑完引导就进 wordprress 的 hello world 页面啦,可喜可贺

1 comment on “使用域名访问服务器资源”

Leave A Reply

Your email address will not be published. Required fields are marked *