伺服器重新部署踩坑記

WeihanLi發表於2020-11-29

伺服器重新部署踩坑記

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;
    }
}

折騰的遇到最多的問題就是伺服器 SSH 超時問題和 Nginx SELinux 的問題,以後再部署的時候伺服器資源要完全新建,SELinux 要禁用

Reference