重要的事放在最前面讲:如果域名解析后,IP+端口访问网站出现 689 访问页面,说明你没有备案,国内服务器未备案无法正常访问,反向代理后也无法访问,页面加载好慢。原因是服务商对流量进行了限制,需要等到备案通过后一天,才能开放流量,所以,早点备案,先用HTTP+IP+端口,再捣鼓反向代理
购买轻量级应用服务器
- 在服务器实例中,可查看服务器 用户名、密码,修改密码后重启服务器
- 安装MobaXterm
- 打开MobaXterm 新建session
- remote host:公网IP
- Specifity username:右边新建用户,输入服务器的用户名和密码,完成后下拉框选择对应的用户
- 选择完成,连接时,还需要输入服务器密码,连接
服务器上docker部署halo
系统:CentOS 7.6
环境:Linux、docker
版本:Halo v2.19
安装必要的包
首先,你需要安装一些必要的系统包,以确保安装过程顺利。打开终端并执行以下命令:
sudo yum install -y yum-utils
添加Docker仓库
接下来,你需要设置Docker的官方仓库,镜像源使用阿里云的镜像源。执行以下命令来添加Docker仓库:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装Docker
使用yum
命令安装Docker:
sudo yum -y install docker-ce docker-ce-cli containerd.io
启动Docker服务
安装完成后,启动Docker服务,设置为开机自启动:
sudo systemctl start docker
sudo systemctl enable docker
验证安装
验证Docker是否正确安装并运行,可以运行以下命令来检查Docker版本:
docker --version
下载Halo v2.19镜像
docker pull halohub/halo:2.19
报错Error response from daemon: Get "https://registry-1.docker.io/v2/",需要扩展镜像源
解决方案:
sudo vim /etc/docker/daemon.json
按i进入INSERT模式,将下面这段代码复制进去,esc后,输入:wq 退出保存
{
"registry-mirrors":
[
"https://docker.m.daocloud.io/",
"https://huecker.io/",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru/",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://9skwuhnf.mirror.aliyuncs.com",
"http://f1361db2.m.daocloud.io",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
重新加载文件:
systemctl daemon-reload
重新启动Docker:
systemctl restart docker
重新下载镜像
docker pull halohub/halo:2.19
创建容器
docker run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.19
检查服务器 安全规则,端口是否开启,否则无法访问
检查halo容器日志,确保halo服务启动成功
docker logs halo
部署完成,通过下述地址访问halo初始化页面
http://云服务器公网IP地址:8090/console
备份/恢复博客
- 插件定时自动备份
- 手动后台备份,并下载备份到本地,记住博客版本号 V2.19,主题 Joe 3
域名注册和域名解析
- 域名注册:
- 在平台中购买域名
- 域名证书下载,域名实名审核
- 配置域名解析
- 创建A记录,IP指向服务器公网,并启用解析
此时访问域名+端口号,能正常访问。
https:SSL加密证书
我希望网站更安全,采用https访问。首先,华为云每个账号会送 20 次免费测试SSL证书申请,有效时间3个月,过期了更换就可以了
如何申请测试证书
云证书管理服务 -> SSL证书管理 -> 测试证书 -> 创建测试证书
证书选用 DNS验证,默认密钥算法 选2048,兼容性好
DNS验证
意思就行需要在域名解析中添加记录集,用于DNS解析,直接验证就行,平台会自动添加记录集
下载并上传SSL证书到服务器
下载的文件包涵盖了 Apache/Nginx/Tomcat 等服务器类型证书,这里我们选用 Nginx证书, Nginx配置文件添加证书路径即可,比如 /etc/nginx/ssl
配置Nginx,实现反向代理
我希望 url 尽量简单,且达到服务器IP、端口隐藏的目的,需要给项目增加反向代理。
目前网上的实现方案有两种:
- 宿主机上直接安装 Nginx
- Docker容器部署,创建 Nginx 容器
灵魂发问:Nginx安装在宿主机上和部署在docker容器中,有什么区别?
- 部署在docker容器
- 安全隔离
- 解决多版本共存问题
- 有动态扩容、缩容需求时
- 零宕机更新
- 直接安装在宿主机
- 简单快速,只需要修改配置文件,并启动 nginx 服务
总体来说,部署在docker,适合应对更复杂的标准化需求和零容错场景;安装在宿主机适用于简单场景。
由于我的项目比较简单,所以采用直接在宿主机上安装Nginx
宿主机安装Nginx
安装 Nginx
sudo yum install -y nginx
启动Nginx并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx
修改Nginx配置文件
一般安装 nginx 后,路径在 /etc/nginx/nginx.conf
user nginx; # 运行 Nginx 的用户和组
worker_processes 2; # 工作进程数,通常设为 CPU 核心数
error_log /var/log/nginx/error.log warn; # 错误日志路径和级别
pid /var/run/nginx.pid; # 主进程 PID 文件路径
events {
worker_connections 65535; # 每个工作进程的最大连接数
}
http {
include /etc/nginx/mime.types; # 每个工作进程的最大连接数
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; # 日志格式
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on; # 启用 gzip 压缩
#gzip_types text/plain text/css application/json application/plain text/xml application/xml application/xml+rss text/javascript; # 压缩的文件类型
#include /etc/nginx/conf.d/*.conf;
# HTTP 80 端口的 server 块
server {
listen 80;
listen [::]:80;
server_name klcode.site www.klcode.site; # 你的域名
return 301 https://$host$request_uri; # 强制跳转HTTPS
}
# HTTPS 443 端口的 server 块
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name klcode.site www.klcode.site; #你的域名
location / {
proxy_pass http://localhost:8090; # 反向代理到容器
# 设置HTTP头部信息
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
ssl_certificate /etc/nginx/ssl/klcode.site.crt; # SSL 你的证书路径
ssl_certificate_key /etc/nginx/ssl/klcode.site.key; # SSL 你的私钥路径
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
}
}
编辑完之后,因为更改了配置,我们需要停止 nginx
sudo systemctl stop nginx
同时,**测试下配置文件的语法,是否正确,**这一步很重要
sudo nginx -t
关键输出:
- 若显示
syntax is ok
和test is successful
,说明语法正确。 - 若显示错误(如
emerg ...
),会直接提示错误位置(精确到行号)。
确认语法没问题后,重新启动 nginx,加载配置
sudo systemctl restart nginx
sudo systemctl reload nginx
docker容器部署
拉取 Nginx 镜像
docker pull nginx:lastest
docker pull nginx:alpine #这个镜像更小一点
创建nginx容器
挂载配置文件并绑定端口,添加ssl:
docker run -d
--name halo-nginx
-p 80:80
-p 443:443
-v $(pwd)/nginx/nginx.conf:/etc/nginx/conf.d/nginx.conf
-v $(pwd)/nginx/ssl:/etc/nginx/ssl nginx:alpine
# docker run -d --name halo-nginx -p 80:80 -p 443:443 -v $(pwd)/nginx/nginx.conf:/etc/nginx/conf.d/nginx.conf -v $(pwd)/nginx/ssl:/etc/nginx/ssl nginx:alpine
安全组规则与服务器防火墙
服务器实例中,安全组规则是第一道防线,服务器防火墙是第二道防线,防火墙默认是关闭的
刚开始,我认为这应该算是扩展学习内容,但以后就知道,防火墙能教做人,网页无法访问,不管什么,先验证安全组规则和防火墙
安全组规则
安全组规则,该配置哪些?如下,有另外需求的自行添加。不理解的话补一补网络基础,真的很重要!!
入站规则
协议类型 | IP版本 | 来源地址 | 说明 | |
---|---|---|---|---|
TCP | IPv4 | 80,443,8090 | 0.0.0.0/0 | 允许IPv4的HTTP流量 |
TCP | IPv6 | 80,443,8090 | ::/0 | 允许IPv6的HTTP流量 |
ICMP | IPv4 | 全部 | 0.0.0.0/0 | 允许外部使用ping命令验证安全组内实例的网络连通性 |
ICMP | IPv6 | 全部 | ::/0 |
出站规则
通常默认就行了
服务器防火墙
注意:如需加固安全,可以选择以下步骤开启防火墙和端口,学习下就好
如果需要开启防火墙,必须保证安全组规则和防火墙的开放端口一致
不同系统防火墙指令不同,我这是 Centos,希望跨平台通用,可以安装学习 ufw(跨平台防火墙管理工具)
都是血与泪的坑呀
检查防火墙是否运行
sudo firewall-cmd --state
- 未运行,则启动防火墙并自启动:
sudo systemctl start firewalld # 启动防火墙
sudo systemctl enable firewalld # 设置开机自启
- 运行,则查看当前防火墙规则:
sudo firewall-cmd --list-services
如果输出结果为:dhcpv6-client ssh,说明未开放 http、https,需要 开放http、https,反之跳过
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
检查具体开放的端口
sudo firewall-cmd --list-ports
正常情况下,80端口,443端口应该开放,没输出则需要手动添加端口
# 永久性开启
sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --add-port=443/tcp --permanent
sudo firewall-cmd --reload
记住 reload 很重要
扩展:防止SQL注入、XSS攻击
ModSecurity:开源Web应用防火墙(WAF),支持SQL注入、XSS、CSRF等攻击拦截
Nginx:高性能Web服务器,通过模块化扩展实现WAF功能
实现步骤:*ModSecurity+Nginx
以后再补充吧,暂时没必要这么安全,如果我补了,那肯定是吃亏了。。。
参考链接:
评论区