这个博客网站是本纯小白参考搭建WordPress博客网站教程,一步步通过自己学习相关知识和解决问题搭建起来的。网站机器为阿里云ECS实例,规格为2核2G内存,网站采用LNMP架构。这篇博客记录网站搭建过程中的过程和遇到的问题,篇幅较长,希望能够对读者产生一定的启发。
1. 准备工作
1.1 购买云服务器
搭建网站时选择购买云服务器(如阿里云ECS、腾讯云CVM等)作为托管平台,是基于云服务器提供的强大功能、灵活性和可靠性。优点有:
- 可以根据网站的访问量自动或手动调整资源配置,如CPU、内存、存储空间等,以适应不同的流量需求,既节省成本又保证了性能。
- 云服务提供商负责硬件的维护和更新,用户可以通过控制面板轻松管理服务器,如重启、备份、监控等,减轻了技术维护的负担。
- 云服务器可以与其他云服务(如数据库服务、内容分发网络CDN、负载均衡等)无缝集成,构建一个完整、高效的网站生态系统。
经过筛选,购买了阿里云2核2G,40G硬盘,带宽为3Mb,地域位于深圳的服务器,预装操作系统选择CentOS,价格为99元一年。
其中2核2G应该能抗住低访问量的个人博客的负载,服务器选择注意要靠近网站目标访问用户所处的地域,降低用户的访问延迟。因为服务器与用户之间的物理距离越远,数据需要经过的网络节点越多,延迟越高。
为什么选择预装CentOS,而不是选择更加简单的宝塔面板等方式来搭建网站,目的是挑战自己,从底层原理中真正明白网站的架构和搭建。而操作系统的选择,参考Linux系统的划分,选择稳定的、更加适合服务器的CentOS作为预装系统。
1.2 配置云服务器
阿里云提供了网页版的远程连接控制台,但是对于有追求的极客(就是我)来说,肯定是希望能够更好地操作网络服务器,经过调研和学习,确定了以下几个方向。
- 安装本地远程连接服务器的软件,方便登录服务器操作。
- 优化服务器的配置,包括创建新用户,安装更好用的shell。
1.2.1 安装MobaXTerm
经过调研,找到一款专为 Windows 用户设计,被广泛用于远程服务器管理、开发、调试和网络测试等场景的远程工具:MobaXTerm。此外还可选择PuTTY、XShell等等。
安装好软件后,我们如何连接到远程服务器?答案是使用SSH。SSH(Secure Shell) 是一种加密的网络协议,能够通过 SSH 客户端连接到远程服务器,执行命令和管理服务器。其默认使用 22 端口,但可以配置为其他端口。因此,我们需要打开服务器的22端口。
网络端口 是计算机网络中用于区分不同服务或应用程序的逻辑标识。它用于标识计算机上运行的不同服务或应用程序,确保数据能够正确传递到目标服务。
- 下载MobaXTerm,重置ECS实例Root密码,ssh登录云服务器。
阿里云的端口打开,是在安全组 – 安全规则中编辑,而访问规则分为入方向和出方向。其中入方向规则用于控制从外部网络进入服务器的网络流量,比如允许外部用户通过 HTTP(80 端口)或 HTTPS(443 端口)访问网站,允许管理员通过 SSH(22 端口)或 RDP(3389 端口)远程管理服务器。而出方向规则用于控制从服务器流向外部网络的网络流量,比如允许服务器访问第三方 API 服务。这里打开入方向的22端口:
TCP(Transmission Control Protocol) 和 UDP(User Datagram Protocol) 是两种常用的网络传输协议,其中HTTP/HTTPS、SSH、Telnet、FTP、SFTP 等协议基于 TCP。在数据传输前,TCP 需要通过“三次握手”建立连接,因此数据可靠性高,适合传输重要数据。
打开SSH的连接端口后,在MobaXTerm中使用root账户建立起与服务器的连接。
1.2.2 配置服务器
使用服务器的root用户来安装和运行程序是一件很危险的事,因此需要创建低权限用户来运行我们的网站程序,在保障服务器安全的同时,也更好地实行权限控制。
在root用户下,创建新用户:
adduser admin # 新建admin用户
passwd admin # 修改admin用户密码
vim /etc/sudoers # 加上 admin ALL=(ALL) ALL ,给admin用户超级管理员权限,然后wq!强制保存退出
创建好新用户后,使用su admin命令切换到admin用户。接下来,安装zsh。Zsh(Z Shell) 是一种功能强大的 Unix/Linux Shell,作为 Bash(Bourne Again Shell)的扩展和改进版,提供了更丰富的功能和更好的用户体验。
Shell 是操作系统与用户之间的命令行接口(Command Line Interface,CLI),允许用户通过输入命令与操作系统交互。它是操作系统内核(Kernel)的外壳,负责解释和执行用户输入的命令,并将结果返回给用户。结构示意图如下:
使用如下命令安装配置zsh:
sudo yum install -y zsh
sudo chsh -s /bin/zsh
sudo yum install -y git
vim ~/.zshrc # 修改zsh主题,修改要用的插件:ZSH_THEME="ys" plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
git clone git@github.com:zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone git@github.com:zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
由于使用的是国内的阿里云服务器,因此连接github有网络问题。当时尝试过更改本地DNS配置,想通过谷歌的DNS服务器来解决因DNS污染而连接不上github的问题,但是更改之后并不奏效。后经过研究,通过ssh连接github来解决,可参考Github配置ssh key教程来配置。
2. 部署LNMP
2.1 什么是LNMP
LNMP 是一个常见的技术栈组合,代表 Linux、Nginx、MySQL 和 PHP,它是构建动态网站和 Web 应用程序的流行技术架构。
Linux 是一种开源的类 Unix 操作系统内核,由 Linus Torvalds 在 1991 年首次发布。它基于 POSIX 和 Unix 的设计理念,具有高度的灵活性、稳定性和安全性。Linux 不仅是操作系统的核心(内核),还通常指基于 Linux 内核的完整操作系统(称为 Linux 发行版)。
Nginx是一个高性能的 Web 服务器、反向代理服务器 和 负载均衡器。其用于托管静态文件(如 HTML、CSS、JS、图片等),支持 HTTP/2、HTTPS 等现代协议。
MySQL 是一个开源的关系型数据库管理系统(RDBMS),以其高性能、易用性和可靠性而闻名,是世界上最流行的数据库之一,广泛应用于 Web 应用程序、数据存储和分析等领域。
PHP(全称:PHP: Hypertext Preprocessor,递归缩写)是一种开源的服务器端脚本语言,主要用于 Web 开发。PHP 以其简单易学、开发效率高和广泛的应用场景而闻名,是构建动态网站和 Web 应用程序的重要工具。
2.2 LNMP的工作原理
- 用户请求:用户通过浏览器访问网站,发送 HTTP 请求。
- Nginx 处理:Nginx 接收请求,如果是静态文件(如 HTML、CSS、JS),直接返回;如果是动态请求,转发给 PHP 处理。
- PHP 执行:PHP 解析请求,执行相应的脚本逻辑,可能需要从 MySQL 中查询数据。
- MySQL 查询:PHP 通过 MySQL 查询数据,并将结果返回给 PHP。
- 生成页面:PHP 将数据与 HTML 模板结合,生成最终的网页内容。
- 返回响应:Nginx 将生成的网页内容返回给用户浏览器。
2.3 安装LNMP
一开始执行wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz
命令,一直无法建立连接。当时怀疑是国内阿里云无法访问soft.vpser.net
(注:随着所学知识的增加,想到当时应该ping soft.vpser.net
看是否能够连通目标服务器,排查到底是哪里的网络问题),因此在阿里云官网上找到了一个官方安装LNMP的文档。本网站就是参考这个官方文档进行搭建,也导致了后续的文件权限问题。这些问题会逐步深入讨论,虽然在解决问题的过程中学习了更多的知识,但还是建议直接按照上面的命令直接下载安装脚本安装,应该能给小白们减少不必要的麻烦。
2.4 安装后遇到的问题
- 套件部署后,使用http://ip无法建立连接,根据官方常见问题文档,发现是http的80端口在安全组规则中未打开,因此打开入方向的80端口。
- 打开后通过http://ip访问网站,报500错误。5xx是服务器程序出了问题,因此上服务根据/var/log/nginx/下的access.log日志,发现每次访问都有和服务器建立连接。继续深究问题,发现是在测试PHP连接Mysql的测试代码中,将密码写错了(不想把Mysql的root用户的密码明文写在文件里连接所以故意写错)导致的。为此,根据官方创建Mysql新用户的文档,创建了一个admin用户来作为连接数据库的用户。
- 创建新用户后无法通过mysql -u admin -p -h ip -P 3306访问数据库,在开通安全组入方向3306端口后解决问题。
通过解决上述问题,可以通过http://ip访问到网站的Nginx页面了。
因为是参考官方文档使用yum安装的nginx,默认主配置文件是
/etc/nginx/nginx.conf
,其他配置文件为/etc/nginx/conf.d/default.conf。
3. 安装WordPress
WordPress 是一个开源的内容管理系统(CMS),用于创建和管理网站。其主要作为博客平台,但现在已经发展成为一个功能强大的网站构建工具,支持从简单博客到复杂企业网站的各种应用场景。本网站是参考搭建WordPress博客网站教程来安装,以下记录安装过程中遇到的问题。
1. 使用admin用户创建wordpress库报错:
create database wordpress;
ERROR 1044 (42000): Access denied for user 'admin'@'%' to database 'wordpress'
登录Mysql,查看有哪些权限,发现是数据库名的授权错了:
mysql> SHOW GRANTS FOR 'admin'@'%';
+----------------------------------------------------------+
| Grants for admin@% |
+----------------------------------------------------------+
| GRANT USAGE ON *.* TO `admin`@`%` |
| GRANT ALL PRIVILEGES ON `database_name`.* TO `admin`@`%` |
+----------------------------------------------------------+
因此切到Mysql的root用户,REVOKE ALL PRIVILEGES ON database_name.* FROM 'admin'@'%';
并且GRANT ALL PRIVILEGES ON wordpress.* TO 'admin'@'%';
然后FLUSH PRIVILEGES;
修改授权。
2. 修改Nginx的root目录:
server {
listen 80;
server_name localhost;
root /home/wwwroot/wordpress; # 定义了服务器的默认根目录。当访问 http://localhost 时,Nginx 会从 /home/wwwroot/wordpress 目录中查找文件。如果没有在 location 块中重新定义 root,则所有 location 块都会继承这个全局 root。
location / {
index index.php index.html index.htm;
}
location ~ .php$ {
root /home/wwwroot/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
其中location ~ .php$定义了 PHP 文件的根目录,仅对匹配 location ~ .php$
的请求生效。使用sudo nginx -t验证配置文件语法是否正确,然后重新加载sudo nginx -s reload。
3. 浏览器打开http://ip/wp-admin/setup-config.php,安装wordpress,报错出现config.php文件无法写入。WordPress 是一个动态的 PHP 应用程序,需要 Nginx 和 PHP-FPM 对文件和目录具有读写权限。例如:Nginx 需要读取静态文件(如 CSS、JS 和图片),而PHP-FPM 需要执行 PHP 文件并写入缓存或上传文件。而参照阿里云官方文档安装LNMP套件时,每个组件的启动用户都不是一样的。因此首先查看Nginx 和 PHP-FPM 的运行用户:
ps aux | grep nginx
ps aux | grep php-fpm
然后将Wordpress目录的所有者改为 nginx,组用户改为apache,并设置目录权限为775
sudo chown -R nginx /home/wwwroot/wordpress
sudo chgrp -R apache /home/wwwroot/wordpress
sudo chmod -R 775 /home/wwwroot/wordpress
接着将 nginx 用户添加到 apache 组:sudo usermod -a -G apache nginx
最后重启 Nginx 和 PHP-FPM,问题解决:
sudo systemctl restart nginx
sudo systemctl restart php-fpm
Linux 使用 文件权限 控制用户和组对文件和目录的访问权限。每个文件或目录都有三组权限:
- 所有者(Owner):文件的所有者。
- 所属组(Group):文件的所属组。
- 其他用户(Others):既不是所有者也不属于所属组的用户。
每组权限包括:
- r(读):查看文件内容或列出目录内容。
- w(写):修改文件内容或创建/删除目录中的文件。
- x(执行):执行文件或进入目录。
为什么不是将所有者改为 apache
?
- 如果将目录的所有者改为
apache
,nginx
用户可能无法访问该目录,导致 Nginx 无法读取静态文件。 - 通过将组改为
apache
,并确保nginx
用户属于apache
组,可以同时满足 Nginx 和 PHP-FPM 的访问需求。
4. 网站优化
4.1 安装WordPress主题
WordPress自带的主题太丑了,找了一圈最后选择了argon主题:https://github.com/solstice23/argon-theme/releases
安装主题后,发现网站头像不显示,原因是Gravatar网络不通。解决办法是安装wp-china-yes插件来管理WordPress后台。需要下载插件后将插件手动上传到wp-content/plugins
目录下,然后在WordPress后台启用。使用WinScp并使用admin用户上传遇到报错:Permission denied. Error code: 3。原因是该目录的用户是nginx,组是apache,所以只能切换root用户上传目录。上传后发现插件不显示,原因是目录内必须包含一个 主插件文件,因此执行命令sudo unzip wp-china-yes.3.8.zip -d /home/wwwroot/wordpress/wp-content/plugins/
。
安装wp-china-yes后,将Gravatar切换到cravatar,然后登录cravatar更换勤奋猫猫头像。
4.2 配置DNS解析
一次完整的HTTP请求过程,包含DNS请求和响应及域名解析,也包括TCP连接,三次握手,以及服务器响应HTTP请求,浏览器对html解析呈现,最后服务器关闭TCP连接,进行四次挥手。示意图如下:
从上面我们可以知道,DNS解析是将域名解析成服务器的IP地址。而DNS解析的过程为:
搭建网站时,域名 和 DNS 解析 是必不可少的环节。它们的作用是将用户友好的域名转换为计算机可以理解的 IP 地址,从而让用户能够通过浏览器访问网站。
域名的作用有:
- 人类可读的地址:
- IP 地址(如
192.168.1.1
)是计算机识别网络资源的方式,但对用户来说难以记忆。- 域名(如
example.com
)是用户友好的名称,方便用户访问网站。- 品牌标识:
- 域名是网站的品牌标识,有助于用户记住和信任网站。
- 灵活性:
- 域名可以指向不同的服务器 IP 地址,方便网站迁移或更换服务器。
DNS 的作用是:
- 域名到 IP 地址的转换:
- DNS(Domain Name System,域名系统)将域名解析为服务器 IP 地址,使浏览器能够找到并访问网站。
- 例如,当用户输入
example.com
时,DNS 会将其解析为服务器的 IP 地址(如192.168.1.1
)。- 分布式数据库:
- DNS 是一个全球分布的数据库,存储域名与 IP 地址的映射关系。
域名为用户提供了友好的访问地址,而 DNS 解析则将域名转换为服务器 IP 地址,使浏览器能够找到并访问网站。通过正确配置域名和 DNS 解析,可以确保网站的正常运行和用户体验,同时为网站的灵活性和扩展性提供支持。
阿里云中参考https://help.aliyun.com/zh/dns/add-a-dns-record?spm=a2c1d.8251892.console-base_help.dexternal.2a7c5b76WNcgdX或https://help.aliyun.com/zh/dns/add-an-a-record-to-a-website-domain?spm=a2c4g.11186623.0.0.19bf2aabits8pF配置DNS解析:
4.3 网站备案
位置处于国内的服务器搭建网站需要备案,不然无法访问网页(会有阿里云的提示网页,显示你的网页还未备案),需要参考阿里云的官方文档进行备案资料提交。备案号下来后,最好将你的备案号放到底部(好像会有检查)。
因此备案成功后,添加备案号:从WordPress后台的 外观 – 主题文件编辑器 – 主题页脚(footer.php)找到以下代码,添加你的备案号:
<footer id="footer" class="site-footer card shadow-sm border-0">
<?php
echo get_option('argon_footer_html');
?>
<div>版权所有 © 2025 | 粤ICP备2025383662号/div>
<div>Theme <a href="https://github.com/solstice23/argon-theme" target="_blank"><strong>Argon</strong></a><?php if (get_option('argon_hide_footer_author') != 'true') {echo " By solstice23"; }?>
</div>
</footer>
但是WordPress后台显示无文件编辑权限报错:
因此上服务器,sudo chown -R nginx:apache argon先修改主题文件夹,发现还是报错。原因是当前用户admin无法修改文件,而网页也无法修改。因此直接sudo vim footer.php修改源代码。
4.4 使用固定链接
固定链接(Permalinks)是指在网站中为特定页面或文章分配的永久性URL地址。这些URL通常是用户友好且易于记忆的,便于搜索引擎优化(SEO)和用户分享。例如:
- 默认链接结构:
http://example.com/?p=123
- 文章名称链接结构:
http://example.com/sample-post/
参考搭建WordPress博客网站教程,在WordPress的后台中修改链接为固定链接的形式:
然后还要修改nginx配置,因为使用固定链接如果请求的资源不存在,都会被转发到index.php
进行处理,执行sudo vim /etc/nginx/conf.d/default.conf,修改nginx配置为:
location / {
if (!-e $request_filename) {
rewrite (.*) /index.php;
}
index index.php index.html index.htm;
}
5. 服务器优化
5.1 PHP配置导致服务器卡慢问题解决
5.1.1 问题排查
网站搭建好后的几天,ssh登录机器卡慢,wordpress打开网站和博客后台卡慢,首先排查网络延迟:ping ip看time值高不高。然后看机器负载,top命令查看负载:
可以看到两个现象:1. 总共1.78G内存,被用了1.64G,只有70MB内存空余。2. mysqld占用了1/4的内存。
接着使用top -o %MEM 查看内存占用最高的进程:
使用以下命令列出所有进程的内存占用情况:
ps aux --sort=-%mem | head -n 10
%MEM
:进程占用的内存百分比。RSS
:进程实际使用的物理内存大小(单位:KB)。VSZ
:进程占用的虚拟内存大小(单位:KB)。
可以看到,机器中有大量的php-fpm进程。php-fpm
(PHP FastCGI Process Manager)是PHP的一种进程管理器,用于处理PHP脚本的请求。每个php-fpm
进程都负责处理一个PHP请求,因此在高并发的Web服务器中,php-fpm
进程的数量和内存占用可能会较高。
如果Web服务器接收的并发请求较多,php-fpm
会创建更多进程来处理请求,因此会出现多个php-fpm
进程。
每个php-fpm
进程都需要加载PHP解释器和相关的扩展,同时处理PHP脚本时可能会分配内存。以下原因可能导致php-fpm
进程占用大量内存:
- PHP脚本内存泄漏:PHP脚本中可能存在内存泄漏,导致内存占用持续增长。
- 扩展加载过多:PHP加载了不必要的扩展,增加了内存占用。
pm.max_children
设置过高:如果pm.max_children
设置过高,会导致大量php-fpm
进程占用内存。- 大文件或大数据处理:PHP脚本处理大文件或大数据时,可能会占用较多内存。
使用 ps
命令查看进程状态:
ps aux | grep php-fpm
查看进程的 STAT
列:
S
:睡眠状态(等待请求)。R
:运行状态(正在处理请求)。Z
:僵尸进程(需要清理)。
从 ps aux
输出中可以看到,php-fpm
进程数量非常多(约 25 个)。这表明 php-fpm
的进程池配置可能不合理,或者应用程序的并发请求较高。
接着使用 netstat
查看连接:
netstat -anp | grep php-fpm
查看 php-fpm
进程是否与客户端或其他服务保持连接。
从 netstat
输出中可以看到,php-fpm
监听在 127.0.0.1:9000
,并且没有大量的 ESTABLISHED
连接。这表明 php-fpm
的连接状态正常,没有未关闭的连接。
综合以上信息,可知当前服务器的主要问题是 php-fpm
进程数量过多且内存占用较高,可采取以下措施:
- 优化
php-fpm
配置,减少进程数量。 - 检查 PHP 脚本,修复内存泄漏问题。
- 优化
php.ini
配置,减少内存占用。 - 增加服务器内存或启用 Swap 分区。
- 监控
php-fpm
的状态,确保其正常运行。
在阿里云控制台安装插件,就可以在控制台直接监控到服务器的情况。我在排查以前没有安装,导致得上系统用命令排查问题。
5.1.2 解决方案
解决办法:首先找到php-fpm的pm模式的配置文件,sudo vim /etc/php-fpm.conf发现没有相关配置,然后sudo vim /etc/php-fpm.d/www.conf找到相关配置,并修改为以下配置:
pm = ondemand # 在 ondemand 模式下,PHP-FPM 不会预先启动子进程,而是只有在收到请求时才会创建新的子进程来处理请求。
pm.max_children = 20
pm.process_idle_timeout = 10s # 在 ondemand 模式下,如果一个子进程在 10 秒内没有处理任何请求,它将被终止。
并且启用 Swap 分区:
sudo fallocate -l 1G /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
最后重启php-fpm:
sudo systemctl restart php-fpm
上面的配置修改好之后,查看现在内存使用情况:
发现内存占用变小了很多,Swap分区也被打开了。然后查看PHP的连接进程是否会自动关闭:
发现配置生效了,php-fpm没有闲置的进程,只有刷新博客页面,出现了连接进程,10秒后进程退出。由此可知,以上PHP的配置生效,PHP进程如果闲置就会自动关闭,从而节约了服务器的内存使用。但是以上配置存在弊端:由于请求到达时才创建进程,首次请求的响应时间可能较长,而且如果新的请求在子进程被终止后到达,需要重新创建子进程,可能导致响应时间增加。
因此根据本网站的情况,将PHP的配置修改为如下:
pm = dynamic
pm.max_children = 15
pm.max_spare_servers = 15
;pm.process_idle_timeout = 10s;
但是用起来首次访问体感感觉差距不大。后续继续监测着看怎么调优。
5.2 未部署https导致浏览器自动填充网址无法打开
5.2.1 问题排查
访问过本网站后,在chrome中输入y,会弹跳出完整的网址:
点击这个自动填充的域名,等待许久,出现报错:
使用填充的网站每次都连接不上,必须要自己手动输入网址来访问,觉得这个肯定不是浏览器的问题,肯定是部署网站的时候哪里有疏漏导致的。
首先,排查请求是否到服务器了,查看sudo vim /var/log/nginx/access.log,发现请求没有到服务器。换了另一台电脑的chrome上重复步骤,发现也是这个问题。那又是什么问题呢?这时换了edge浏览器来重复上面的步骤,发现edge迅速跳出了响应时间太长的报错页面,正在难受的时候,突然发现了edge的自动填充的网址是默认使用了https协议!终于被我找到了问题的根源,因为部署网站的时候偷懒,没有参考搭建WordPress博客网站教程的部署https的步骤来部署https,导致这些主流浏览器在使用填充的网址访问网站的时候,默认用的是https协议,导致网站无法连接!
现代主流浏览器(如 Chrome 和 Edge)在用户输入网址时,默认会尝试使用 HTTPS 协议。如果网站没有部署 HTTPS,浏览器会无法建立安全连接,从而导致报错。HTTPS 是加密协议,能够保护用户数据不被窃取或篡改。主流浏览器鼓励甚至强制使用 HTTPS。浏览器(如 Chrome、Edge)会将用户输入的域名默认解析为 https://
,除非用户明确输入 http://
。
HTTPS(HyperText Transfer Protocol Secure)是一种用于在客户端(如浏览器)和服务器之间安全传输数据的协议。它是 HTTP 的安全版本,通过加密和身份验证机制,保护数据在传输过程中不被窃听、篡改或劫持。它的核心特性为:
- 加密传输:
- 使用 SSL/TLS 协议 对数据进行加密,确保即使数据被截获,攻击者也无法解密其内容。
- 加密范围包括:URL、请求参数、响应内容、Cookies 等。
- 身份验证:
- 服务器必须提供 SSL/TLS 证书,由受信任的证书颁发机构(CA)签发。
- 证书用于验证服务器的身份,防止中间人攻击(如冒充服务器)。
- 数据完整性:
- 通过加密和哈希算法,确保数据在传输过程中未被篡改。
HTTPS的工作原理:
- 客户端发起请求:
- 用户在浏览器中输入
https://example.com
,浏览器向服务器发起 HTTPS 请求。- SSL/TLS 握手:
- 服务器返回其 SSL/TLS 证书。
- 浏览器验证证书的有效性(如是否由受信任的 CA 签发、是否过期、域名是否匹配等)。
- 密钥交换:
- 客户端和服务器协商生成一个对称密钥,用于后续的加密通信。
- 加密通信:
- 客户端和服务器使用对称密钥加密和解密数据,确保传输的安全性。
HTTP和HTTPS的对比:
特性 HTTP HTTPS 安全性 明文传输,不安全 加密传输,安全 协议 http://
https://
默认端口 80 443 SSL/TLS 证书 不需要 需要 性能 较快 略慢,但影响较小 SEO 和用户体验 被标记为“不安全”,SEO 不利 显示“安全”锁图标,SEO 有利 应用场景 不涉及敏感数据的场景 涉及敏感数据的场景
5.2.2 解决方案
解决方案有两种:
- 部署 HTTPS:使用免费的 SSL 证书为网站启用 HTTPS,这是最根本的解决方法。
- 强制重定向 HTTP:若暂时无法部署 HTTPS,可以通过Nginx配置服务器将 HTTPS 请求重定向到 HTTP。
这里采用最根本的解决方案:部署HTTPS,参考搭建WordPress博客网站教程的相关章节来申请SSL证书和部署HTTPS。但是宝塔现在所有的SSL证书都要收钱了,真滴坑。因此参考下面阿里云的官网文档来申请SSL证书:https://help.aliyun.com/zh/cow/user-guide/https-configurations-for-website。
注意在创建证书的步骤,要点击验证才会去提交你的证书签发申请:
签发之后会绑定你的域名:
将证书以nginx包可读的形式下载下来,然后继续参考搭建WordPress博客网站教程的部署HTTPS环节。首先通过WinScp将证书上传到服务器,然后修改nginx的配置为(我的nginx的与server相关的配置文件在sudo vim /etc/nginx/conf.d/default.conf):
server {
listen 443 ssl;
# listen 80;
# 证书文件名称,注意以;结尾
ssl_certificate ylliu.cn.pem;
# 私钥文件名称,注意以;结尾
ssl_certificate_key ylliu.cn.key;
server_name localhost;
root /home/wwwroot/wordpress;
location / {
if (!-e $request_filename) {
rewrite (.*) /index.php;
}
index index.php index.html index.htm;
}
location ~ .php$ {
root /home/wwwroot/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
然后重启nginx,但是发生报错:
$ sudo systemctl restart nginx
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
使用nginx -t检查语法,发现证书文件和密钥文件要放在/etc/nginx/目录下:
$ sudo nginx -t
nginx: [emerg] cannot load certificate "/etc/nginx/ylliu.cn.pem": BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/nginx/ylliu.cn.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)
nginx: configuration file /etc/nginx/nginx.conf test failed
挪动文件后,重启nginx,使用https://ylliu.cn访问网站成功:
Chrome浏览器也出现了安全连接的图表,真是激动又开心。但是这时候事情还没有结束,首先需要在WordPress后台进行一些配置,不然从网站跳转的时候还是会使用 http:
然后,修改Nginx配置,将 http 重定向到你 https,不然有人在浏览器输入 ylliu.cn 时,访问的还是 http。使用 vim 编辑/etc/nginx/conf.d/default.conf,在原本 server 的前面加入下面这么一段代码:
server {
listen 80;
server_name ylliu.cn;
rewrite ^(.*) https://$server_name$1 permanent;
}
然后再重启 nginx,即可保证有人在输入https://ylliu.cn的时候,请求也会被服务器的nginx转发到https协议来解析。