最近对静态博客比较感兴趣,再加上静态博客相较于动态博客可以减少一大笔性能开销,给其他服务腾出了空间,因此将博客从 WordPress 迁移到了 Hexo 上。既然博客都迁移了,那不如就给服务器也来一次翻新吧!
基础配置
安装系统、配置SSH
我的服务器是阿里云的轻量应用服务器,如果是其他家的服务器,也可以适当参考一下。系统镜像我选择了最新的“CentOS 8.2”。系统安装完成后,首先在控制台配置防火墙。由于我会在服务器上配置 Firewalld 作为防火墙,并不需要用到阿里云的控制台中的防火墙。找到 安全 - 防火墙
,删除自动生成的允许 SSH 的规则,选择 添加规则 - 应用类型 - 全部TCP+UDP
,这样控制台中的防火墙就会允许所有流量通过。结果应该如下图:
配置完防火墙之后,需要设置一下服务器的系统密码。选择 服务器运维 - 远程连接
,打开在线终端。如图:
在终端中,输入如下命令:
配置完密码之后,更改一下主机名:
再安装几个常用软件:
接下来,需要更改一下 SSH 的端口,以减少被爆破的风险。编辑配置文件:
找到如下字样:
修改成:
保存。现在需要重启 SSH 服务使改动生效:
配置防火墙
现在可以使用终端软件来连接了!连接到服务器之后,就可以开始配置 Firewalld 了。在默认情况下,Firewalld 是被禁用的状态,需要手工启用:
现在检查一下 Firewalld 服务的状态:
会得到类似这样的输出:
至此,Firewalld 就已经启动了。服务启动后,默认规则就会生效。现在查看一下默认规则:
会得到类似这样的输出:
现在配置防火墙规则:
检查防火墙规则:
会得到类似这样的输出:
至此,Firewalld 配置完毕。
配置Fail2ban
虽然已经修改了 SSH 的默认端口,但是为了防止被更高阶的扫描器爆破,我选择安装 Fail2ban 来加强防护。
由于系统自带的软件源中不包含 Fail2ban,需要安装新的软件源:
如果在安装过程中,出现了类似这样的报错:
则说明网络存在问题,可以更换阿里云的镜像。编辑配置文件:
将 metalink=
一行注释,并在 #baseurl=
一行后新增一行 baseurl=http://mirrors.cloud.aliyuncs.com/epel/8/Everything/$basearch
。修改结果如下:
保存改动,再次运行命令即可。
安装完软件源之后可以安装 Fail2ban:
在默认情况下,Fail2ban 是被禁用的状态,需要手工启用:
现在检查一下 Fail2ban 的统计信息:
会得到类似这样的输出:
可以看到 Fail2ban 默认没有任何规则。现在添加一个规则来保护 SSH 服务。编辑配置文件:
输入如下内容:
保存,重启一下服务:
再次查看统计信息:
会看到刚刚设置的规则已经被启用了:
而进一步查看 SSH 服务的封禁情况:
会看到目前没有被封禁的 IP:
如果拥有一个以上的公网地址,也可以使用不同的 IP 多次输入错误密码进行测试。失败次数达到 5 次之后,SSH 通讯将被阻断。查看 SSH 服务的封禁情况:
会看到用于测试的 IP 已经被封禁了:
而查看 Firewalld 的规则:
也可以看到相关规则已经被添加到 rich rules 中了:
如要解封测试 IP,可以输入以下命令:
如要解封所有 IP,可以输入以下命令:
至此,Fail2ban 配置完毕。
删除云盾
如果服务器是不同家的,需要参考对应的官方文档。
执行官方的卸载脚本,并删除相关文件,最后重启即可生效:
配置LNMP
安装
创建一个 screen 的实例:
安装 LNMP 环境:
全部选择默认选项即可。
查看所有的 screen 实例:
恢复到某一个 screen 实例(留空则恢复到上一个实例):
创建虚拟主机
首先确保相关域名已经解析到服务器的 IP 上,之后就可以创建虚拟主机了。执行以下命令:
根据情况选择选项即可,可根据情况部署 SSL 证书。
配置rewrite规则
如果有 HTTP 跳转 HTTPS,A 域名跳转 B 域名等需求,可以通过 rewrite 规则来实现。编辑配置文件:
找到 server {}
句块,加入跳转语句:
如果需要条件跳转,则加入语句:
重启 Nginx 即可生效:
开放端口
LNMP 安装完成后,需要开放 HTTP 和 HTTPS 的端口。执行以下命令:
配置frps
关于 frp 的原理和部署,之前已经在别的文章中讲解过了,因此这里只讲一下部署过程。
安装与配置
首先下载 frps。打开官方发布页 https://github.com/fatedier/frp/releases,根据服务器的架构和系统找到合适的版本。比如我的服务器是 X86-64 架构的,使用的是 CentOS 系统,所以选择 linux_amd64
版本的。右键复制链接地址。在终端中输入以下命令:
编辑 frps 的配置文件:
输入以下内容:
解决无日志的问题
默认安装完成后,即便在配置文件中启用了日志功能,也无法看到日志,这是没有权限导致的。现在修改服务项的配置文件:
找到 User=nobody
,改为 User=root
,保存并退出即可。
重新加载服务项:
最后就可以启动服务:
开放端口
执行以下命令:
如果有服务通过 frps 进行内网穿透,也要开放对应的端口。
配置Python
安装
执行以下命令:
测试是否安装成功:
看见类似这样的输出:
说明 Python 已经被成功安装了。
配置虚拟环境
首先安装 virtualenv:
在当前目录下创建一个虚拟环境:
激活虚拟环境:
退出当前的虚拟环境:
使用systemd部署Gunicorn+Flask服务
创建一个新的 systemd 服务项:
输入以下内容:
工作目录:填写 Flask 项目的路径,如 /root/flask_app
。
Gunicorn 路径:填写 Gunicorn 可执行文件的路径,如 /root/flask_venv/bin/gunicorn
。
模组名称和实例名称:填写 Flask 应用的模组名称和实例名称,例如,名为 run.py
的文件中定义了 app = Flask()
,则填写 run:app
。
监听地址:如果希望通过 Nginx 代理给外部访问,则设置 127.0.0.1
;如果希望直接开放端口给外部访问,则设置 0.0.0.0
或服务器地址,并使用以下命令开放端口:
重新加载服务项:
之后,就可以用 systemd 来管理服务了:
配置Nginx代理
编辑对应的 Nginx 虚拟主机的配置文件:
在 server {}
中,添加代理代码:
如果有静态资源,也可以在上述代码片段之前加入以下代码:
这样所有 /statis/
开头的请求都不会被转发,而会在静态资源路径中直接查找。
安装Node.js
运行以下命令:
运行 node
产生类似这样的输出即为安装成功::
安装Java
运行以下命令:
运行 java --version
产生类似这样的输出即为安装成功:
参考文章
- CentOS 7安装fail2ban + Firewalld防止爆破与CC攻击
- yum安装插件报错Failed to download metadata for repo ‘epel-modular‘ 的解决方案
- CentOS 7下的VirtualEnv的安装配置简明教程
- 使用Nginx+Gunicorn+systemd部署flask应用
- 使用Nginx反向代理Flask站点