我们将写好的前端服务部署到阿里云机器上,提前获取到阿里云机器,执行如下步骤安装整体的部署环境和工具。

配置免密登陆

  1. 本地客户端生成公私钥(如果已存在,直接跳过):

    1. $ ssh-keygen
  2. 上面命令会在用户目录.ssh文件夹下创建公私钥: ```bash $ cd ~/.ssh

$ ls // id_rsa(私钥) // id_rsa.pub(公钥)

  1. 3. 上传公钥到服务器:
  2. ```bash
  3. $ ssh-copy-id -i ~/.ssh/id_rsa.pub root@xxx.xxx.xxx.xx

可以在服务器的 cd ~/.ssh 目录查看已经配置的公钥内容:

  1. $ vim authorized_keys

配置完成后,即可通过ssh免密连接服务器即可;

Centos安装git

  1. $ yum install git -y

Centos修改Hosts

修改hosts的目的是部分centos无法访问github网站,需要进行域名手动解析,解析地址可以使用:解析网站 获取对应github的网站ip并在host下配置解析地址;

  1. $ vim /etc/hosts
  2. # 添加github的ip解析
  3. 140.82.114.3 github.com
  4. # 重启网络
  5. $ service network restart
  6. 或者
  7. $ /etc/init.d/network restart

Centos安装Node环境

此处通过安装nvm来管理node版本,使用Git将NVM的源码克隆到本地的~/.nvm目录下,并检查最新版本:

  1. $ git clone https://github.com/cnpm/nvm.git ~/.nvm && cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`

依次运行以下命令,配置NVM的环境变量:

  1. # 步骤一
  2. echo ". ~/.nvm/nvm.sh" >> /etc/profile
  3. # 步骤二
  4. source /etc/profile

运行以下命令,查看Node.js版本:

  1. $ nvm list-remote

安装Node:

  1. $ nvm install v14.17.6

设置服务器默认启动Node版本:

  1. $ nvm alias default 14

Centos安装Nginx

通过yum安装:

  1. $ sudo yum -y install nginx # 安装 nginx
  2. $ sudo yum remove nginx # 卸载 nginx

使用 yum 进行 Nginx 安装时,Nginx 配置文件在 /etc/nginx 目录下。

配置 Nginx 服务

  1. # 设置开机启动
  2. $ sudo systemctl enable nginx
  3. # 启动 nginx 服务
  4. $ sudo service nginx start
  5. # 停止 nginx 服务
  6. $ sudo service nginx stop
  7. # 重启 nginx 服务
  8. $ sudo service nginx restart
  9. # 重新加载配置,一般是在修改过 nginx 配置文件时使用
  10. $ sudo service nginx reload

Centos安装PM2

全局安装pm2命令,用来管理node服务;

  1. $ npm install pm2 -g

配置SSL(支持泛域名和自动更新证书)

为了让网站启用HTTPS,我们需要从证书颁发机构(CA)申请SSL证书。Let’s Encrypt 是一个证书颁发机构,向 Let’s Encrypt 申请证书是免费的。
Let’s Encrypt 支持泛域名证书,不需要为每个子域名单独申请证书。本文以申请泛域名证书为例,详细介绍安装和配置 SSL 证书的过程。
目前常用的 Let’s Encrypt 证书生成工具有 certbot、acme.sh、acme-tiny,本文使用的是 acme.sh。acme.sh 申请和安装泛域名 SSL 证书相对来说是比较方便的。

安装socat

安装前需要服务器已安装 socat 工具,它是一个多功能网络工具;

  1. $ dnf install socat -y

通过下面命令安装 acme.sh ,Email 用来接收重要重要通知,如证书快到期未更新会收到通知。

  1. curl https://get.acme.sh | sh -s email=xxx@qq.com

如果上面官方下载地址失败 或者 太慢,可以选用国内的备用地址:

  1. curl https://gitcode.net/cert/cn-acme.sh/-/raw/master/install.sh?inline=false | sh -s email=xxx@qq.com

再不行,参考更多的高级安装方式
执行命令后几秒就安装好了,如果半天没有反应请 Control+C 后重新执行命令。
acme.sh 安装在 ~/.acme.sh 目录下,并自动创建了一个 cronjob,每天 0:00 点自动检测所有的证书,如果快过期了, 则会自动更新。

注意⚠️:安装后,理论上会自动添加一个 acme.sh 全局应用别名,但有时候会 command not found,需要手动执行以下命令:source ~/.bashrcsource ~/.bash_profile,或关掉终端重新打开,然后再继续下一步。

生成证书

acme.sh 实现了 acme 协议支持的所有验证协议,一般有三种验证方式:

  1. HTTP 方式
  2. 手动 DNS 方式
  3. DNS API 方式。推荐使用 DNS API 方式

此处我们使用DNS API方式生成,其他方式暂时不支持自动更新签名证书:

HTTP方式

此处不建议使用此方式,http验证方式暂不支持泛域名证书;

手动DNS方式

这种方式需要手动在域名上添加一条 TXT 解析记录,验证域名所有权。这种方式的好处是, 你不需要任何服务器,不需要任何公网 IP,只需要 DNS 的解析记录即可完成验证。
执行以下命令进行手动 DNS 验证:

  1. acme.sh --issue -d example.com -d "*.example.com" --dns \
  2. --yes-I-know-dns-manual-mode-enough-go-ahead-please

到 DNS 解析中,新增一条 TXT 记录,域名前缀为 _acme-challenge,记录值为终端输出的 TXT value 的值。然后再次执行:

  1. acme.sh --renew -d example.com -d "*.example.com" \
  2. --yes-I-know-dns-manual-mode-enough-go-ahead-please

注意:这种方式的坏处是,如果不同时配置 DNS API,将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。

DNS API 方式

自动 DNS 验证方式需要使用域名解析服务商的 DNS API,像腾讯云(DNSPos)和阿里云都提供 DNS API 功能。
如果是腾讯云 DNSPod,在这里申请API Token
image.png
如果使用阿里云,在右上角头像下拉中选择“AccessKey 管理”,创建密钥:
image.png
创建好密钥后,使用如下命令把它们的 Id 和 Token 或 Secret 放到环境变量中:

  1. # 腾讯云
  2. export DP_Id="YourId"
  3. export DP_Key="YourToken"
  4. # 阿里云
  5. export Ali_Key="YourAccessKeyId"
  6. export Ali_Secret="YourAccessKeySecret"

再通过下面命令生成证书:

  1. # 腾讯云
  2. acme.sh --issue --dns dns_dp -d example.com -d *.example.com
  3. # 阿里云
  4. acme.sh --issue --dns dns_ali -d example.com -d *.example.com

注意:这里第一个域名为顶级域名,后面一个为泛域名。这种方式将自动为你的域名添加一条 TXT 解析,验证成功后,这条解析记录会被删除,对你来说是无感的。
证书生成成功后,默认保存在 ~/.acme.sh/example.com/ 目录中。请不要直接使用 ~/.acme.sh/ 目录下的文件,这里面的文件都是内部使用的,而且目录结构可能会变化,我们需要把证书复制到需要用的地方去。

安装证书

在 ~/.acme.sh/example.com/ 目录生成的证书文件中,我们主要需要用到两个文件:fullchain.cer 和 example.com.key。下面以 Nginx 为例,来看看如何安装证书。

1. 创建通用SSL配置文件

在 /etc/ginx/ 目录下,创建一个为名 ssl-options.conf 的 SSL 通用配置文件,内容参考如下:

  1. ssl_protocols TLSv1.2 TLSv1.3;
  2. ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
  3. ssl_prefer_server_ciphers off;
  4. ssl_session_cache shared:le_nginx_SSL:10m;
  5. ssl_session_timeout 1200m;
  6. ssl_session_tickets on;
  7. ssl_stapling on;

参数说明:

  • ssl_protocols:加密协议;
  • ssl_ciphers:加密算法;
  • ssl_prefer_server_ciphers:服务端加密算法优先;
  • ssl_session_cache:会话缓存;
  • ssl_session_timeout:用户会话缓存失效时间,对安全性有高要求的站点需要降低该值;
  • ssl_stapling:启用 OCSP 可减少用户验证证书的时间;
  • ssl_session_tickets:为复用会话创建或加载 Ticket Key。

    2. 生成 dhparam.pem

    OpenSSL 的 dhparam 用于生成和管理 dh 文件。dh(Diffie-Hellman) 是著名的密钥交换协议,它可以保证通信双方安全地交换密钥。
    使用如下命令生成一个 dhparam.pem 文件: ```bash openssl dhparam -out /etc/nginx/dhparam.pem 2048

acme.sh —install-cert -d luojh.com \ —key-file /etc/nginx/cert/luojh.com/luojh.com.key \ —fullchain-file /etc/nginx/cert/luojh.com/fullchain.cer \ —reloadcmd “systemctl force-reload nginx”

  1. <a name="TeA5X"></a>
  2. #### 3. 为Nginx站点配置证书
  3. 先为网站的证书创建一个存放目录:
  4. ```bash
  5. mkdir -p /etc/nginx/cert/example.com

目录中的文件我们后面通过脚本复制进来,这里先不管。

4. 配置Http/Https/Wss证书认证

打开对应的 Nginx 站点配置文件,例如:/etc/nginx/nginx.conf,参考编辑其内容如下:

  1. # 其他配置同Nginx默认配置,不需要改动
  2. # 此处是核心配置,主要是配置http/https/wss的证书配置;
  3. server {
  4. listen 80 default_server;
  5. listen [::]:80 default_server;
  6. server_name www.example.com example.com;
  7. root /usr/share/nginx/html;
  8. # 80端口自动重定向到443端口
  9. return 301 https://$host$request_uri;
  10. }
  11. server {
  12. listen 443 ssl http2 default_server;
  13. listen [::]:443 ssl http2 default_server;
  14. server_name example.com www.example.com;
  15. root /usr/share/nginx/html;
  16. ssl_certificate /etc/nginx/cert/example.com/fullchain.cer;
  17. ssl_certificate_key /etc/nginx/cert/example.com/example.com.key;
  18. include /etc/nginx/ssl-options.conf;
  19. ssl_dhparam /etc/nginx/dhparam.pem;
  20. # Load configuration files for the default server block.
  21. include /etc/nginx/default.d/*.conf;
  22. location /im {
  23. # 配置wss域名和端口,如果没有wss,则不需要配置/im location
  24. proxy_pass http://127.0.0.1:3001;
  25. proxy_http_version 1.1;
  26. proxy_set_header Upgrade $http_upgrade;
  27. proxy_set_header Connection "upgrade";
  28. proxy_set_header Host $host;
  29. proxy_cache_bypass $http_upgrade;
  30. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  31. proxy_set_header X-Forwarded-Proto $scheme;
  32. }
  33. location / {
  34. # 配置https域名和端口
  35. proxy_pass http://127.0.0.1:3001;
  36. proxy_http_version 1.1;
  37. proxy_set_header Upgrade $http_upgrade;
  38. proxy_set_header Connection keep-alive;
  39. proxy_set_header Host $host;
  40. proxy_cache_bypass $http_upgrade;
  41. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  42. proxy_set_header X-Forwarded-Proto $scheme;
  43. }
  44. }

5. 安装和自动更新证书

不要直接复制证书到目标目录,正确的方式是使用 -install-cert 命令安装。在命令中指定目标位置,证书文件会被复制到相应的位置。并且,可以指定 reloadcmd 命令,当证书更新以后,reloadcmd 命令会被自动调用,让新的配置生效。
执行如下安装命令完成证书安装:

  1. acme.sh --install-cert -d example.com \
  2. --key-file /etc/nginx/cert/example.com/example.com.key \
  3. --fullchain-file /etc/nginx/cert/example.com/fullchain.cer \
  4. --reloadcmd "systemctl force-reload nginx"

如果执行异常,可以分开执行:

  1. # 执行安装证书并开启自动更新模式
  2. acme.sh --install-cert -d example.com --key-file /etc/nginx/cert/example.com/example.com.key --fullchain-file /etc/nginx/cert/example.com/fullchain.cer --reloadcmd
  3. # 重启Nginx
  4. systemctl force-reload nginx

这里指定的所有参数都会被自动记录下来,并在将来证书自动更新以后, 被再次自动调用。证书在到期之前会自动更新,你无需任何操作。
安装完成,可以验证自己的服务是否正确启动了Https访问内容。正常情况下,一般都不会出问题,如果出问题,需要依次验证自己的步骤执行是否正确;

6. 更新acme.sh

目前由于 acme 协议和 Let’s Encrypt CA 都在频繁的更新,因此 acme.sh 也经常更新以保持同步。
手动升级 acme.sh 到最新版:

  1. acme.sh --upgrade

如果你不想手动升级,可以开启自动升级:

  1. acme.sh --upgrade --auto-upgrade

你也可以随时关闭自动更新:

  1. acme.sh --upgrade --auto-upgrade 0

参考

  1. acme.sh 官方文档(英文): https://github.com/acmesh-official/acme.sh/wiki
  2. acme.sh 官方文档(中文): https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E
  3. ACME v2证书自动化快速入门:https://blog.freessl.cn/acme-quick-start/
  4. https://freessl.cn/