平常服务器如果有异常,需要重装系统,下面做一个记录,也方便以后更换新服务器时配置。本着极简的方式,安装和配置的越少越好,达到快速迁移快速部署的目的,一劳永逸最好,精力要放到写博客上面。

首先要备份

首先要进行备份,主要有博客所有文件夹、数据库导出、Nginx配置文件、MySQL配置文件、GoAccess配置文件、计划任务相关脚本等等。

以下为重新安装步骤:

一、安装Linux面板

虽然在服务器上部署的东西不多,用终端命令也能实现,但对于不懂编程的人来说,还是不太方便,直接用现成的面板体验会更好一些,比如 宝塔1panel

最开始用的是1panel,开源的用着也比较放心,但由于该面板安装应用都是基与docker容器,不太会用,面板操作逻辑不太理解,搭建好tycho博客后,访问总是找不到文件,有时候能访问到博客页面,但css样式又不显示了,总有奇奇怪怪的问题。而且占用内存还比较高,只是安装好博客相关的应用后,内存就已经到1G多了,里面MySQL占用最多,大概500兆左右。

同样的在宝塔里面安装好博客相关的环境和应用后,内存大概在500兆左右,整体比1panel少了一半,而且搭建博客也比较简单,对于从来没接触过服务器的人来说很容易上手。虽然宝塔不是开源的,里面的广告也多,不过没关系,好用不容易出错就行。

总体来说,用哪个都行,看个人喜好吧。

注意:安装好之后,记得先在服务器安全组开放宝塔对应的端口。

二、搭建博客

Nginx、PHP:我一般安装当前次新的版本,因为占用内存也不大,能用新的就用新的,为了稳定,选择次新。

Mysql:一般安装5.7版本的,占用内存比较少一些。

在宝塔后台添加站点,数据库和FTP都不选,后续根据需要单独创建,比较灵活。注意:在添加站点过程中如果创建数据库,数据库名称和用户名是相同的,感觉这样不太安全。

站点和数据库都创建好后,把之前导出的站点文件夹和数据库文件导出,一般情况,直接访问域名就会成功,和之前网站一模一样,安装配置过程都不用。

注意:如果新服务器站点的数据库名称和密码与原服务器不一致需要修改一下,具体位置在网站根目录的config.inc.php里。

三、博客设置

1.开启Typecho伪静态

Nginx伪静态

在宝塔站点设置里有相关配置,直接选typecho就行。如果没有就把以下代码保存为typecho.conf文件,然后在网站配置文件调用,由于Nginx安装路径不同等影响,实际请以当前Web环境设置为准。

if (!-e $request_filename) {
    rewrite ^(.*)$ /index.php$1 last;
}

如果上面代码不管用,就用下面这个,

if (-f $request_filename/index.html){
    rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
    rewrite (.*) $1/index.php;
}
if (!-e $request_filename){
    rewrite (.*) /index.php;
}

Apache伪静态

Apache 服务器网站伪静态是通过网站根目录的.htaccess文件来实现的,复制粘贴下面伪静态规则,保存到.htaccess文件中,并将.htaccess上传到网站根目录即可。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
注意:如果在Typecho后台开启伪静态,但没在Nginx或Apache里设置好相应的规则就容易出现异常,比如,网站只能访问首页,点任何链接都是404的情况。

2.网站文件缓存设置

在网站Nginx配置文件相应位置填写如下内容

add_header Cache-Control "public, max-age=31536000, must-revalidate";

如果开启防盗链,需要在防盗链位置再次设置。

3.增加安全响应头(按需写)

在网站Nginx配置文件相应位置填写如下内容

add_header Content-Security-Policy "default-src 'self'; img-src 'self' https:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'" always;
add_header Cross-Origin-Opener-Policy "same-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;

响应头说明

Content-Security-Policy作用:控制资源加载来源,防止XSS(跨站脚本攻击)等。可以通过限制脚本、样式、图片等来源提升安全性。

  • default-src 'self':默认只允许主域名(wangrufei.com,包括 www.wangrufei.com)的资源。
  • img-src 'self' https:;允许主域名和任何https域名的图片。
  • style-src 'self' 'unsafe-inline':允许主域名的外部 CSS 文件和内联 CSS。
  • script-src 'self' 'unsafe-inline':允许主域名的外部 JS 文件和内联 JS。
  • always:确保 CSP 头部在所有响应(包括错误页面)发送。

如果想实现前后端不同csp策略,可以在nginx的server块下面这样设置

location /admin/ {
add_header Content-Security-Policy "default-src 'self'; img-src 'self' img.wangrufei.com; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'" always;
}

location / {
add_header Content-Security-Policy "default-src 'self'; img-src 'self' img.wangrufei.com; style-src 'self'" always;
}

不过宝塔面板的网站配置里额外引用了文件enable-php.conf,所以只能在这里面设置,内容如下。

# 动态添加 CSP
if ($request_uri ~ "^/admin/") {
add_header Content-Security-Policy "default-src 'self'; img-src 'self' img.wangrufei.com; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'" always;
}
if ($request_uri !~ "^/admin/") {
add_header Content-Security-Policy "default-src 'self'; img-src 'self' img.wangrufei.com; style-src 'self'" always;
}

注意:单独配置前后端不同csp策略有点麻烦,网站的nginx配置里add_header和css等设置都需要跟着一起设置,不方便维护。

还有一种简单方法,单独在nginx主配置文件,用map方式来设置,不影响网站配置文件里现有的add_header。如下
第一步

http
{
# 动态 CSP 策略
map $request_uri $csp_policy {
    ~*^/admin/  "default-src 'self'; img-src 'self' https:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'";
    default     "default-src 'self'; img-src 'self' https:";
    }
}

第二步
在网站配置文件添加以下内容即可

add_header Content-Security-Policy $csp_policy always;

Strict-Transport-Security作用:启用 HTTP 严格传输安全(HSTS),强制浏览器通过 HTTPS 访问你的网站。

  • max-age=31536000(1年)是标准值。
  • includeSubDomains 应用于子域名。
  • preload 预加载 HSTS,需手动提交到 HSTS 预加载列表,提交容易,移除会很慢。

什么是预加载 HSTS ?

由于网站在浏览器访问时会告知浏览器它们支持 HSTS,因此浏览器在用户首次访问网站之前无法获知网站的 HSTS 策略。因此,浏览器在首次连接到网站之前无法强制使用 HTTPS,这可能会导致用户失去保护。首次加载后,网络浏览器会获取网站的 HSTS 策略,并能够在所有后续加载中强制使用 HTTPS。

为了解决此首次加载问题,Chrome 维护了一个具有强 HSTS 策略且仅支持 HTTPS 的域名列表。此 HSTS 预加载列表内置于 Chrome 中。对这些域名的请求将仅通过 HTTPS 发出;如果 HTTPS 不可用,任何 HTTP 请求都将升级到 HTTPS 并连接失败。其他主流浏览器(Firefox、Safari、IE 11 和 Edge)也基于 Chrome 列表拥有 HSTS 预加载列表。

Cross-Origin-Opener-Policy作用:COOP控制跨源窗口的访问权限,限制新窗口与当前页面之间的交互,防止跨站攻击(如Spectre类攻击或跨源信息泄露)。

  • same-origin:仅允许同源窗口访问,隔离跨源窗口。

注意:开启此项后,浏览器自带的 Lighthouse 网页性能检测部分功能会失效。

X-Content-Type-Options作用:防止浏览器对 MIME 类型进行嗅探,强制使用服务器声明的 Content-Type,降低 XSS 和 MIME 类型混淆攻击风险。

X-Frame-Options作用:防止网站被嵌入到其他网站的iframe中,降低点击劫持(clickjacking)风险。

  • 推荐值:DENY(禁止任何iframe)或SAMEORIGIN(仅允许同源iframe)。

always 的作用

  • 默认行为(无 always):Nginx 的 add_header 指令仅在HTTP响应状态码为 200、201、204、206、301、302、303、304、307 或 308 时添加指定的头部。如果响应状态码是其他值(如 404、500 等错误状态),该头部不会包含在响应中。
  • 加上 always:确保指定的头部在所有HTTP响应中都包含,无论状态码是多少(包括错误页面如 404、403、500 等)。

securityheaders.com或者developer.allizom.org可以测试响应头安全等级

4.禁止ip访问

在网站Nginx配置文件相应位置填写如下内容

    if ($host ~* ^\d+\.\d+\.\d+\.\d+$) {
        return 403;
    }

5.拒绝无 User-Agent 的请求

    if ($http_user_agent = "") {
        return 403;
    }

5.拦截异常 User-Agent(根据需要调整正则表达式)

    if ($http_user_agent ~* "(bot123|unknown|malicious|curl|wget)") {
        return 403;
    }

6.请求频率限制(包括 HTML、CSS、JS、图片等)

网站配置文件(需要配合主配置文件)

    limit_req zone=mylimit burst=10 nodelay; #每个IP每秒10次,允许突发10次
    limit_req_status 429;                    # 返回 429 状态码

无 nodelay:突发请求(≤ burst)被放入队列,延迟处理。
有 nodelay:突发请求立即处理,不延迟排队;超出 burst 的请求直接返回 429。

主配置文件

    # 添加请求频率限制(每个IP每秒10次在这设置)
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

7.小知识limit_req rate和limit_conn perip区别

特性rate=10r/sperip 10
限制对象每秒请求次数同时保持的连接数
维度时间资源
典型场景防御高频 HTTP 请求(如 CC 攻击)防御高并发连接占用(如 DoS 攻击)
超出响应429429
突发支持支持(burst=20)不支持(严格限制连接数)

5.开启https

如果是在阿里云生成的证书,根据web服务器类型,选择下载相应的证书文件,比如Nginx的为pem/key两个格式的文件,Apache的为crt/key两个格式的文件,下载后,用记事本打开,复制里面的内容到宝塔就能开启https访问了,记得提前在安全组或者防火墙开放80和443端口。

6.设置HTTP/3

之前在博客写过相关文章 博客网站启用 HTTP/3,设置后可提高网站访问速度。

7.修改404页面

默认的太单调且没有引导访问首页,更改代码如下

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="robots" content="noindex, nofollow">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>404 - 页面未找到</title>
    <style>
        body {font-family: Arial, sans-serif;text-align: center;margin-top: 35px;}
        h1 {font-size: 24px;}
        p {font-size: 16px;}
    </style>
</head>
<body>
        <h1>404 - 页面未找到</h1>
        <p>抱歉,您访问的页面不存在或已被移除。</p>
        <p>您可以尝试返回 <a href="https://wangrufei.com">我的首页</a> 。</p>
</body>
</html>

8.MySQL优化

在博客相关环境里,MySQL是占用内存大户,一般版本越新越占用内存,优化一下让内存小一点,首先在宝塔面板MySQL设置的性能调整里根据自己的内存大小选择相应的优化方案,然后再到配置文件里添加一条指令降低MySQL的内存占用

优化方案选1-2g,其他主要参数设置:

key_buffer_size = 8M(innodb引擎,可忽略此项索引命中率)
tmp_table_size = 96M
innodb_buffer_pool_size = 512M
innodb_log_buffer_size = 16M
sort_buffer_size = 512K
read_buffer_size = 256K
join_buffer_size = 512K
thread_cache_size = 32
table_open_cache = 160
max_allowed_packet = 16M

9.设置博客目录权限

1.公共仅读744

2.目录禁止访问

    location ~* ^/usr.*.(php|jsp)$ {
        deny all;
    }

    location ~* ^/var.*.(php|jsp)$ {
        deny all;
    }
    
    location = /config.inc.php {
    deny all;
    }

10.其他安全

1.删除安装文件

安装完成后删除 install.php 文件、install文件夹

2.修改网站登录地址

1、修改admin文件夹名称
2、修改 config.inc.php 里相关的文件名称

/** 后台路径(相对路径) */
define('__TYPECHO_ADMIN_DIR__', '/刚才更改的名称/');

11.添加robots.txt

该文件包含针对机器人的说明,告诉机器人或者搜索引擎爬虫哪些网页可以和不可以访问,还能限制爬虫抓取频率,当然这个文件只是建议,合法的爬虫一般都会遵守的。

User-agent: *
Crawl-delay: 120
Disallow: /author/
Disallow: /search/
Disallow: *.jpg$
Disallow: *.jpeg$
Disallow: *.png$
Disallow: *.gif$
Disallow: *.webp$
Sitemap: https://wangrufei.com/sitemap.xml
  • User-agent: *:适用所有机器人爬虫
  • Crawl-delay: 120: 这条指令告诉爬虫每次抓取请求之间至少等待 120 秒。
  • Disallow: /search/:禁止抓取 URL 为 /search/ 开头的页面。

四、宝塔设置

1.修改设置

修改安全入口、端口、用户名、密码、ssh仅密钥登录等等。

2.防止恶意解析

宝塔-网站-默认站点。设置一个不常用或不用的站点,这样所有未绑定站点的域名访问,都会访问到这个默认站点,有效防止恶意解析。由于这个网站平常并没有什么用,可以关闭日志生成,这样以后就可以完全不用管这个网站了,在配置文件底部,写上如下命令:

access_log /dev/null;
error_log /dev/null;

3.设置计划任务

同步时间、备份网站、备份数据库、切割日志等等。注意:宝塔定时任务里有一个清理内存的选项,如果是用Linux系统,完全可以不用清理内存,不要把Windows系统清理内存的习惯带过来。Linux系统有优化的内存管理机制,服务器最佳状态就是保持高内存低负载。比如PHP的缓存扩展、MySQL都是靠充分利用内存提高性能的。

宝塔默认续签Let's Encrypt证书的计划是全部网站,如果想续签指定网站,方法如下:

续签指定网站Let's Encrypt证书

/www/server/panel/pyenv/bin/python /www/server/panel/class/acme_v2.py --domain example1.com,example2.com --renew=1

--domain 域名列表,多个以逗号隔开!

五、安装应用

1.安装Fail2ban

增加安全,网站防cc、防扫描。

规则配置如下,路径/etc/fail2ban/filter.d/。(主配置文件在/etc/fail2ban/jail.conf一般不用管,通过面板设置就好。)

防cc

[Definition]
failregex = <HOST> .*? "HTTP/1\.[01]"
或
failregex = <HOST> -.*- .*HTTP/1.* .* .*$
ignoreregex = <HOST> .*? \b(503|429|404|403|401|400)\b

防扫描

[Definition]
failregex = <HOST> .*? \b(503|429|404|403|401|400)\b
ignoreregex =

清空fail2ban.log内容脚本

用宝塔计划任务定时清空

#!/bin/bash

LOG_FILE="/var/log/fail2ban.log"

> $LOG_FILE

echo "已清空"
记得排除服务器和自己常用的ip

2.安装GoAccess

分析日志,具体安装配置见GoAccess安装及配置

3.PHP设置

安装PHP缓存扩展opcache

作用:增加性能,降低高并发cpu占用。启动后效果显著,博客加载基本都是50ms以内,之前都80ms左右。高频刷新cpu也基本在10%以下,之前cpu基本在50%。
opcache参数设置如下

opcache.enable = 1
opcache.memory_consumption=128
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=4000
opcache.revalidate_freq=30
opcache.fast_shutdown=1
opcache.enable_cli=1
opcache.jit_buffer_size=128m
opcache.jit=1205

安装PHP缓存扩展Memcached

作用:提高前端页面性能,减少服务器响应(TTFB)时间。启动后,博客页面加载基本在20-30ms。扩展Memcached需要在主题安装缓存插件才可以生效,我用的是TpCache 魔改版

TpCache 魔改版里有作者自用判断暗色样式的代码,需要去掉,不然在页面顶部会有错误提示。

位置如下

$html = str_replace('{colorMode}',$_COOKIE['night']=='1'?'dark':'light',$data['html']);

修改如下

$html = $data['html'];

4.安装Linux工具箱

设置Swap虚拟内存值:2048M

5.安装宝塔网站加速

在http协议层,对动态页面进行缓存,对需要实时信息及已登录的会话跳出缓存,此技术主要针对匿名访问的用户进行加速响应,以减少应用服务器和数据库的开销。相对与redis和Memcached之类的缓存配置较简单,不用在网站单独安装开启缓存的插件,在后台安装上就可以使用,开启后网页最快加载用时15ms,但不稳定。

六、服务器设置

1.关闭22端口

仅在需要的时候开启。

2.修改宝塔端口

在服务器的安全组把宝塔端口授权ip设置成自己本地的。