网站搭建笔记

这个博客网站是本纯小白参考搭建WordPress博客网站教程,一步步通过自己学习相关知识和解决问题搭建起来的。网站机器为阿里云ECS实例,规格为2核2G内存,网站采用LNMP架构。这篇博客记录网站搭建过程中的过程和遇到的问题,篇幅较长,希望能够对读者产生一定的启发。

1. 准备工作

1.1 购买云服务器

搭建网站时选择购买云服务器(如阿里云ECS、腾讯云CVM等)作为托管平台,是基于云服务器提供的强大功能、灵活性和可靠性。优点有:

  1. 可以根据网站的访问量自动或手动调整资源配置,如CPU、内存、存储空间等,以适应不同的流量需求,既节省成本又保证了性能。
  2. 云服务提供商负责硬件的维护和更新,用户可以通过控制面板轻松管理服务器,如重启、备份、监控等,减轻了技术维护的负担。
  3. 云服务器可以与其他云服务(如数据库服务、内容分发网络CDN、负载均衡等)无缝集成,构建一个完整、高效的网站生态系统。

经过筛选,购买了阿里云2核2G,40G硬盘,带宽为3Mb,地域位于深圳的服务器,预装操作系统选择CentOS,价格为99元一年。

其中2核2G应该能抗住低访问量的个人博客的负载,服务器选择注意要靠近网站目标访问用户所处的地域,降低用户的访问延迟。因为服务器与用户之间的物理距离越远,数据需要经过的网络节点越多,延迟越高

为什么选择预装CentOS,而不是选择更加简单的宝塔面板等方式来搭建网站,目的是挑战自己,从底层原理中真正明白网站的架构和搭建。而操作系统的选择,参考Linux系统的划分,选择稳定的、更加适合服务器的CentOS作为预装系统。

1.2 配置云服务器

阿里云提供了网页版的远程连接控制台,但是对于有追求的极客(就是我)来说,肯定是希望能够更好地操作网络服务器,经过调研和学习,确定了以下几个方向。

  1. 安装本地远程连接服务器的软件,方便登录服务器操作。
  2. 优化服务器的配置,包括创建新用户,安装更好用的shell。

1.2.1 安装MobaXTerm

经过调研,找到一款专为 Windows 用户设计,被广泛用于远程服务器管理、开发、调试和网络测试等场景的远程工具:MobaXTerm。此外还可选择PuTTY、XShell等等。

安装好软件后,我们如何连接到远程服务器?答案是使用SSH。SSH(Secure Shell)​ 是一种加密的网络协议,能够通过 SSH 客户端连接到远程服务器,执行命令和管理服务器。其默认使用 22 端口,但可以配置为其他端口。因此,我们需要打开服务器的22端口。

网络端口 是计算机网络中用于区分不同服务或应用程序的逻辑标识。它用于标识计算机上运行的不同服务或应用程序,确保数据能够正确传递到目标服务。

  1. 下载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 是一个常见的技术栈组合,代表 ​LinuxNginxMySQL 和 ​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的工作原理

  1. 用户请求:用户通过浏览器访问网站,发送 HTTP 请求。
  2. Nginx 处理:Nginx 接收请求,如果是静态文件(如 HTML、CSS、JS),直接返回;如果是动态请求,转发给 PHP 处理。
  3. PHP 执行:PHP 解析请求,执行相应的脚本逻辑,可能需要从 MySQL 中查询数据。
  4. MySQL 查询:PHP 通过 MySQL 查询数据,并将结果返回给 PHP。
  5. 生成页面:PHP 将数据与 HTML 模板结合,生成最终的网页内容。
  6. 返回响应: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 安装后遇到的问题

  1. 套件部署后,使用http://ip无法建立连接,根据官方常见问题文档,发现是http的80端口在安全组规则中未打开,因此打开入方向的80端口。
  2. 打开后通过http://ip访问网站,报500错误5xx是服务器程序出了问题,因此上服务根据/var/log/nginx/下的access.log日志,发现每次访问都有和服务器建立连接。继续深究问题,发现是在测试PHP连接Mysql的测试代码中,将密码写错了(不想把Mysql的root用户的密码明文写在文件里连接所以故意写错)导致的。为此,根据官方创建Mysql新用户的文档,创建了一个admin用户来作为连接数据库的用户。
  3. 创建新用户后无法通过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 使用 ​文件权限 控制用户和组对文件和目录的访问权限。每个文件或目录都有三组权限:

  1. 所有者(Owner)​:文件的所有者。
  2. 所属组(Group)​:文件的所属组。
  3. 其他用户(Others)​:既不是所有者也不属于所属组的用户。

每组权限包括:

  • r(读)​:查看文件内容或列出目录内容。
  • w(写)​:修改文件内容或创建/删除目录中的文件。
  • x(执行)​:执行文件或进入目录。

为什么不是将所有者改为 apache

  • 如果将目录的所有者改为 apachenginx 用户可能无法访问该目录,导致 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.2a7c5b76WNcgdXhttps://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 进程数量过多且内存占用较高,可采取以下措施:

  1. 优化 php-fpm 配置,减少进程数量。
  2. 检查 PHP 脚本,修复内存泄漏问题。
  3. 优化 php.ini 配置,减少内存占用。
  4. 增加服务器内存或启用 Swap 分区。
  5. 监控 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 的安全版本,通过加密和身份验证机制,保护数据在传输过程中不被窃听、篡改或劫持。它的核心特性为:

  1. 加密传输
    • 使用 ​SSL/TLS 协议 对数据进行加密,确保即使数据被截获,攻击者也无法解密其内容。
    • 加密范围包括:URL、请求参数、响应内容、Cookies 等。
  2. 身份验证
    • 服务器必须提供 ​SSL/TLS 证书,由受信任的证书颁发机构(CA)签发。
    • 证书用于验证服务器的身份,防止中间人攻击(如冒充服务器)。
  3. 数据完整性
    • 通过加密和哈希算法,确保数据在传输过程中未被篡改。

HTTPS的工作原理:

  1. 客户端发起请求
    • 用户在浏览器中输入 https://example.com,浏览器向服务器发起 HTTPS 请求。
  2. SSL/TLS 握手
    • 服务器返回其 SSL/TLS 证书
    • 浏览器验证证书的有效性(如是否由受信任的 CA 签发、是否过期、域名是否匹配等)
  3. 密钥交换
    • 客户端和服务器协商生成一个对称密钥,用于后续的加密通信。
  4. 加密通信
    • 客户端和服务器使用对称密钥加密和解密数据,确保传输的安全性。

HTTP和HTTPS的对比:

特性HTTPHTTPS
安全性明文传输,不安全加密传输,安全
协议http://https://
默认端口80443
SSL/TLS 证书不需要需要
性能较快略慢,但影响较小
SEO 和用户体验被标记为“不安全”,SEO 不利显示“安全”锁图标,SEO 有利
应用场景不涉及敏感数据的场景涉及敏感数据的场景

5.2.2 解决方案

解决方案有两种:

  1. 部署 HTTPS:使用免费的 SSL 证书为网站启用 HTTPS,这是最根本的解决方法。
  2. 强制重定向 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协议来解析。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇