使用域名访问服务器资源
概览
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.com 和 example.com 本质上是两个 hostname
如果一台电脑上能运行多个网站,则将他们称为 virtual hosts(虚拟主机)
对于 虚拟主机
的理解,稍后在实际例子中进行说明
之后,根据规则,请求会访问服务器上的一些内容,这些内容分为 静态、动态
DocumentRoot 路径决定了你的静态内容存放的位置,客户端请求只有权限访问这里的内容
当客户端提供的URL指向服务器上某个文件夹时,如果存在 index.html
(这个名称是根据你的配置决定的,而 index 是约定俗成的名字)则将其以静态网页的形式呈现给客户端,
而动态内容则是每次请求时都可能以不同形式呈现的内容,它有若干方式实现,通常是PHP(由 mod_php 提供)
流程梗概
在 Linux 部署网站服务器需要哪几步?
- 通过
网络供应商(腾讯云、阿里云)
租一台服务器,以远程连接的方式控制服务器 - 在服务器上安装 Apache 或者 Nginx ,配置并且启动服务、测试
- 申请域名(需要审核大概 1个月),并且将域名解析到你的服务器IP,再用域名访问
- 使用 SSL 证书让你的网站能用 https 协议访问
- 下载 MySQL、PHP,并且尝试新建数据库、将主页修改为 index.php
- 使用 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-enabled
、conf-enabled
、sites-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/www
、public_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时,要用对应的这些端口
并且,网络供应商 那里会有一个额外的拦截,例如在阿里云被称为 “安全组” ,你需要在里面新增该端口的规则
因此,一个端口的修改,需要三方配合:
- 服务器上运行的 apache2,需要修改配置
- 网络供应商 需要放行对应端口
- 客户端需要用指定端口访问
例如,我们在 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端口被监听
虚拟主机
首先我们根据前面提到的方法(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端口的请求,同时保证
SSLCertificateFile
和SSLCertificateKeyFile
两个证书文件的路径被正确指定
重启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 “使用域名访问服务器资源”