服务器重新部署踩坑记
Intro
之前的服务器是 Ubuntu 18.04 ,上周周末想升级一下服务器系统,从 18.04 升级到 20.04,结果升级升挂了... 后来 SSH 始终连不上,索性删除重新部署了一个,新部署了一个 Centos 8 的系统,新部署之后很多东西需要配置,折腾了好几天,简单记录一下容易踩的坑。
虚拟机配置
Azure 上的服务器默认新建的时候需要配置网络安全组(NSG),这次新建之后想着使用之前的网络安全组配置,这样就不需要再配置一下端口白名单了,结果这样部署了之后,SSH 经常超时,但是从内网走的话会很快,没有问题,使用 Azure Cloud Shell SSH 没有超时的问题,从另外一个服务器上 SSH 也是正常的。后来删除了,又重新建了一个,这次完全是新建的,没有用之前的网络安全组配置,这次 SSH 再没有超时的问题了……
新建的时候可以指定服务器要开放的端口,一般 22,80,443 先打开,SSH以及 web server 的端口先开放
服务器新建完成后,修改 IP 地址,默认是动态 IP,修改为静态 IP,这样可以方便做 DNS 解析
新建的服务器和之前的 IP 不一致,需要修改域名解析,将原来的域名解析配置修改为新的服务器的 IP
有几个应用使用的是云数据库,需要修改数据库服务器防火墙,把原来服务器的 IP 修改为新的服务器 IP 地址
Nginx 配置
使用 suo yum install nginx -y
来安装 nginx,安装完成之后可以通过上面配置的域名解析或者直接用 IP 地址在浏览器中访问,应该可以看到 nginx 的默认页面
执行 sudo systemctl enable nginx
来配置开机启动
安装之后默认的配置是 /etc/nginx
目录,默认的 nginx 配置修改 /etc/nginx/nginx.conf
文件,如果要新增配置可以添加在 /etc/nginx/conf.d
目录下面
修改默认的 nginx 配置,将默认站点转发到后端服务中,修改 location 配置,添加 proxy_pass
location / {proxy_pass http://172.18.0.2:31230;
}
添加了之后发现服务转发有问题,后来终于在网上找了解决方案,原来默认 nginx 不能进行 Http 的转发,要转发需要配置一下 selinux 的一个配置 httpd_can_network_connect
可以参考:https://stackoverflow.com/questions/27435655/proxy-pass-isnt-working-when-selinux-is-enabled-why
后来在配置 HTTPS 的时候读取证书文件的时候出现了 Permission Denied 的情况,后来排查下来也是 SELinux 的问题,关掉 SELinux 之后就可以了,后来在网上看了看,很多人推荐直接关掉 SELinux,于是就索性直接把 SELinux 给关掉了。
HTTPS 配置
HTTPS 证书使用的是免费的 Let's Encrypt 的证书,使用 acme.sh 进行配置,安装好 acme.sh,配置好 DNS 的 Access Key 执行一行命令就可以了,而且还会生成一个 crontab 定时任务定期会更新证书(Let's Encrypt 免费证书默认 90 天内有效)
通过执行 curl https://get.acme.sh | sh
来安装 acme.sh
安装成功之后配置 DNS 的配置,我的域名在阿里云上,从阿里云生成 AccessKey 来更新域名配置,会添加或更新一个 _acme-challenge
的域名解析记录
我的域名在阿里云上,就以阿里云为例子,将下面的 Key 和 Secret 替换成自己实际的 Key 和 Secret
export Ali_Key="111111"
export Ali_Secret="222222"
申请泛域名证书,泛域名证书需要指定两个 domain,如下面的示例:
acme.sh --issue --dns dns_ali -d *.weihanli.xyz -d weihanli.xyz
执行之后会看到类似下面这样的截图:
Nginx 配置:
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_certificate /home/liweihan/.acme.sh/*.weihanli.xyz/*.weihanli.xyz.cer;
ssl_certificate_key /home/liweihan/.acme.sh/*.weihanli.xyz/*.weihanli.xyz.key;if ($scheme = http) {return 301 https://$host$request_uri;
}
SELinux 配置
SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。但是配置起来很是繁琐,很容易因为这个导致很多问题,浪费很多时间,所以还是直接关掉好了。
SELinux 有三种状态,分别是:
Enforcing: 默认的配置,默认强制使用,发生权限问题的时候就直接报错,阻止应用程序的执行
Permissive:允许访问,当出现权限问题的时候不会阻止应用程序的执行,但是会记录一条 Wanring 级别的日志
Disabled: 完全禁用,应用程序的执行不会被 SELinux 所影响,也不会有任何日志
通过 sestatus
可以查看 SELinux 当前的状态
如果要临时修改 selinux 的状态可以通过命令 sudo setenforce 0
禁用 selinux 或 sudo setenforce Permissive
如果要永久性的修改 selinux 状态需要修改配置文件 /etc/selinux/config
Docker 配置
参考 docker 官方文档或者参考 Centos 安装 docker
需要注意的是,你可能会需要配置 docker group,把需要的用户配置到 docker 这个用户组里以免每次 docker ps
的时候都要使用管理员权限 sudo
K8S 配置
自己玩 k8s 的话推荐使用 kind 部署 k8s,我自己就是在使用 kind 部署 k8s,具体的安装步骤可以参考之前的文章介绍
https://www.cnblogs.com/weihanli/p/12831225.html
之前的 kind 都会有一个问题,每次系统重启或 docker daemon 重启的时候会导致原来的创建的集群不可用,需要重新创建才可以,从 0.8 版本开始,kind 不再需要重新创建集群了,基于这个集群的资源部署也会自动重启,无需再手动重新部署了,非常方便了
SSR 配置
SSR 的配置在 Github 上找了一个基于 docker 部署的,可以参考 https://github.com/winterssy/SSR-Docker
开启 BBR
首先可以执行 lsmod | grep bbr
命令,如果已经有 bbr 则证明已经开启了 BBR 加速,如果没有进行下面的配置
sudo echo "net.core.default_qdisc=fq" | sudo tee --append /etc/sysctl.conf
sudo echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee --append /etc/sysctl.conf
sudo sysctl -p
执行之后再执行 lsmod | grep bbr
命令,如果已经有 bbr 则证明已经开启了 BBR 加速
安装 docker-compose
如果没有安装 docker-compose 可以执行下面的命令来进行安装
compose_version=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4)
sudo curl -L "https://github.com/docker/compose/releases/download/${compose_version}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
配置
可以将项目 clone 到服务器上,如果没有安装 Git,可以 sudo yum install git -y
来安装,之后 git clone https://github.com/winterssy/SSR-Docker.git
克隆到本地之后可以根据自己需要修改 /etc/config.json
文件中的配置
config.json
配置可以参考:https://github.com/winterssy/SSR-Docker/blob/f0439c232add3a4addbbce68f3c1be32464e0d18/etc/README.md
可以根据需要修改 docker-compose 映射到本地的端口
配置好之后执行 docker-compose up -d
即可启动 SSR 服务,启动之后在虚拟机对应的网络安全组配置中开放需要的端口
More
还有一些配置,脚本需要准备一下来部署服务,索性大多数的服务我都是有 k8s deploy yaml 的,只是有些 configMap 里的数据要更新一下。整理一下放在服务器上,最后整理出一个 k8s 服务部署脚本
如果出现了什么意外情况或者要重新部署 k8s 只要执行一下这个脚本即可~
其他服务的 Nginx 配置,需要新增服务配置的时候只要在 /etc/nginx/conf.d
目录下增加对应服务的配置即可
server {listen 443;server_name sparktodo.weihanli.xyz;location / {proxy_pass http://172.18.0.2:31256;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
Reference
https://linoxide.com/linux-how-to/how-to-disable-selinux-on-centos/
https://www.zhihu.com/question/20559538
https://baike.baidu.com/item/SELinux
https://github.com/winterssy/SSR-Docker
https://github.com/acmesh-official/acme.sh