服务器重新部署踩坑记

服务器重新部署踩坑记

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

执行之后会看到类似下面这样的截图:

acme.sh

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++——优先队列(priority_queue)

优先队列详解/C 优先队列 1.概念:什么是优先队列呢?在优先队列中,元素被赋予优先级,当访问元素时,具有最高级优先级的元素先被访问 .即优先队列具有最高级先出的行为特征。它可以说是队列和排序的完美结合体,不仅可以存储数据&am…

一个div 上下两行_Django 实战 | 搭一个 GitHub 用户展示网站 02

一、创建公共 HTML 模板在 templates 文件里面新建一个 base.html&#xff0c;再到Bootstrap4中文文档找到 最基本的模板&#xff0c;拷贝代码到 base.html&#xff0c;在 home.html 中引入 base.html&#xff1a;{% extends base.html %}{% block content %}<h1>Hello W…

C#如何回到主线程,如何在委托指定线程执行

在多线程情况下&#xff0c;有时候我们需要在主线程里面执行一些逻辑&#xff0c;比如修改UI控件SynchronizationContex可以帮助我们在指定的线程执行SynchronizationContext.Current 为获取当前线程的同步上下文&#xff0c;拿到线程的上下文之后可以通过调用Send&#xff08;…

算法设计与分析——递归与分治策略——循环日程赛

问题描述&#xff1a; 非递归方案一&#xff1a;代码 #include<bits/stdc.h> using namespace std;void gameTable(vector<vector<int>> &vec,int k) {int i0,j0;//二维数组的下标&#xff0c;行&#xff0c;列 int temp;//需要新安排选手数目 int n;//…

linux开发板推荐_【新品发布】WiFi开发板XW-01-Kit,超低功耗,冷启快联,智能门锁首选!...

智能门锁作为智能家居的入口级产品以及家庭智能安防的核心单品&#xff0c;已然成为智能家居生态链中不可或缺的核心组成部分。智能门锁方案的研发仍然面临着诸多痛点&#xff0c;如耗电问题、连接繁琐和安全隐患等。物联网的应用与发展必然离不开对更低功耗的追求&#xff0c;…

如何使用 C# 扩展方法

译文链接&#xff1a;https://www.infoworld.com/article/3130492/how-to-work-with-extension-methods-in-c.htmlC# 在 3.0 版本中提供了对 扩展方法 的支持&#xff0c;扩展方法常用于给一个已存在的类添加新的方法从而扩展该类的功能&#xff0c;最关键的是&#xff1a;你不…

算法设计与分析——递归与分治策略——最接近点对问题

【问题描述】 最近对问题要求在包含有n个点的集合S中&#xff0c;找出距离最近的两个点。设 p1(x1,y1)&#xff0c;p2(x2,y2)&#xff0c;……&#xff0c;pn(xn,yn)是平面的n个点。 严格地将&#xff0c;最近点对可能不止一对&#xff0c;此例输出一对即可。 【基本算法思想…

Visual Studio 即时窗口实用技巧

在 Visual Studio 中有一个窗口叫 Immediate 窗口&#xff0c;中文版本应该叫即时窗口。默认会在你启动调试时在 VS 编辑器中弹出来。你也可以通过 Debug|Windows|Immediate 或者使用快捷键 CtrlAltI 手动把它调出来。这个窗口很实用&#xff0c;尤其是在调试的时候。下面总结几…

怎么判断再一个局域网内一个ip被两台机器占用_交换机与 VLAN 到底是怎么来的...

最近有几个学生粉丝后台私信我&#xff0c;让我说说交换机与 VLAN。我在阅读这几个粉丝私信中发现一个有趣的现象&#xff0c;那就是吐槽大学计算机网络课程的晦涩枯燥&#xff0c;而不是去深层次解释协议出现的原因或者用来去解决什么问题。帅天今天就和大家聊聊交换机与 VLAN…

移动建模平台元数据存储架构演进

源宝导读&#xff1a;明源云天际-移动建模平台是一个快速生成多端移动应用的PaaS平台&#xff0c;元数据是移动应用设计与运行的核心数据结构&#xff0c;本文将从元数据存储这个视角分享我们的技术思考与实践。一、什么是元数据&#xff08;Metadata&#xff09;&#xff1f;这…

浅谈AsyncLocal,我们应该知道的那些事儿

【导读】最近查看有关框架源码&#xff0c;发现AsyncLocal这玩意水还挺深&#xff0c;于是花了一点功夫去研究&#xff0c;同时对比ThreadLocal说明二者区别以及在何时场景下使用AsyncLocal或ThreadLocalThreadLocal相信很多童鞋用过&#xff0c;但AsyncLocal具体使用包括我在内…

算法设计与分析——动态规划——数字三角形问题

数字三角形问题 1.题目描述&#xff1a;给定一个由n行数字组成的数字三角形&#xff0c;如图3-7所示。设计一个算法&#xff0c;计算出从三角形的顶至底的一条路径&#xff0c;使该路径经过的数字总和最大。 算法设计:对于给定的由n行数字组成的数字三角形&#xff0c;计算从三…

如何在 Asp.Net Core MVC 中处理 null 值

译文链接&#xff1a;https://www.infoworld.com/article/3434624/how-to-handle-null-values-in-aspnet-core-mvc.html传统的 asp.net mvc 对应着 .netcore 中的 asp.net core mvc&#xff0c;可以利用 asp.net core mvc 去构建跨平台&#xff0c;可扩展&#xff0c;高性能的w…

算法设计与分析——动态规划——最长公共子序列

#include<iostream> #include<stdio.h> #include<string.h> #include<bits/stdc.h> #define MAXLEN 50 using namespace std;void LCSlength(int m,int n,char *x,char *y,int c[][MAXLEN],int b[][MAXLEN]) {for(int i0;i<m;i)//m为字符个数 {c[i]…

程序员过关斩将--论系统设计的高可扩展性

“此文仅仅代表个人意见&#xff0c;并非行业标准“MQ是万能的高扩展方式&#xff1f;“面向接口是万能的高扩展方式&#xff1f;说到系统设计的三高&#xff0c;每一高都是一个很庞大的话题&#xff0c;甚至可以用一本书甚至N本书来详细阐述。其中高可扩展性是系统架构的众多目…

Docker Vs Podman

翻译自 Chetansingh 2020年4月24日的博文《Docker Vs Podman》 [1]容器化的一场全新革命是从 Docker 开始的&#xff0c;Docker 的守护进程管理着所有的事情&#xff0c;并成为最受欢迎和广泛使用的容器管理系统之一。但是&#xff0c;请稍等&#xff01;您真的会假设 Docker 是…

算法设计与分析——动态规划——01背包问题

#include<iostream> #include<iomanip> using namespace std; //前i个物品装入容量为j的背包中获得的最大价值//0-1背包动态规划算法 构造二维表 int knapsack_problem( int n,int *weight,int *value,int capacity,int **m,int *flag) {for(int i0;i<capaci…

让 CefSharp.WinForms 应用程序同时支持32位(x86)和64位(x64)的解决方案

当我们为基于 .NET Framework 的 WinForm 程序增加 CefSharp.WinForms 依赖后&#xff0c;可能会遇到以下报错信息&#xff1a;CefSharp.Common is unable to proceeed as your current Platform is ‘AnyCPU’. To target AnyCPU please read https://github.com/cefsharp/Cef…

算法设计与分析——贪心算法——活动安排问题

问题描述&#xff1a;设有n个活动的集合E{1,2,…,n}&#xff0c;其中每个活动都要求使用同一资源&#xff0c;如演讲会场等&#xff0c;而在同一时间内只有一个活动能使用这一资源。 每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si<fi 。 如果选择了活动…

c语言——刷新控制台界面与返回上一级

#include<iostream> #include<stdlib.h> using namespace std;int main() {while(1){system("cls");//刷新控制台程序界面 cout<<"请输入1&#xff1a;进入下一级程序A:"<<endl;cout<<"请输入2&#xff1a;进入下一级程…