我们将写好的前端服务部署到阿里云机器上,提前获取到阿里云机器,执行如下步骤安装整体的部署环境和工具。
配置免密登陆
本地客户端生成公私钥(如果已存在,直接跳过):
$ ssh-keygen
上面命令会在用户目录.ssh文件夹下创建公私钥: ```bash $ cd ~/.ssh
$ ls // id_rsa(私钥) // id_rsa.pub(公钥)
3. 上传公钥到服务器:
```bash
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@xxx.xxx.xxx.xx
可以在服务器的 cd ~/.ssh
目录查看已经配置的公钥内容:
$ vim authorized_keys
Centos安装git
$ yum install git -y
Centos修改Hosts
修改hosts的目的是部分centos无法访问github网站,需要进行域名手动解析,解析地址可以使用:解析网站 获取对应github的网站ip并在host下配置解析地址;
$ vim /etc/hosts
# 添加github的ip解析
140.82.114.3 github.com
# 重启网络
$ service network restart
或者
$ /etc/init.d/network restart
Centos安装Node环境
此处通过安装nvm来管理node版本,使用Git将NVM的源码克隆到本地的~/.nvm目录下,并检查最新版本:
$ git clone https://github.com/cnpm/nvm.git ~/.nvm && cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`
依次运行以下命令,配置NVM的环境变量:
# 步骤一
echo ". ~/.nvm/nvm.sh" >> /etc/profile
# 步骤二
source /etc/profile
运行以下命令,查看Node.js版本:
$ nvm list-remote
安装Node:
$ nvm install v14.17.6
设置服务器默认启动Node版本:
$ nvm alias default 14
Centos安装Nginx
通过yum安装:
$ sudo yum -y install nginx # 安装 nginx
$ sudo yum remove nginx # 卸载 nginx
使用 yum 进行 Nginx 安装时,Nginx 配置文件在 /etc/nginx 目录下。
配置 Nginx 服务
# 设置开机启动
$ sudo systemctl enable nginx
# 启动 nginx 服务
$ sudo service nginx start
# 停止 nginx 服务
$ sudo service nginx stop
# 重启 nginx 服务
$ sudo service nginx restart
# 重新加载配置,一般是在修改过 nginx 配置文件时使用
$ sudo service nginx reload
Centos安装PM2
全局安装pm2命令,用来管理node服务;
$ 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
工具,它是一个多功能网络工具;
$ dnf install socat -y
通过下面命令安装 acme.sh
,Email 用来接收重要重要通知,如证书快到期未更新会收到通知。
curl https://get.acme.sh | sh -s email=xxx@qq.com
如果上面官方下载地址失败 或者 太慢,可以选用国内的备用地址:
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 ~/.bashrc
或source ~/.bash_profile
,或关掉终端重新打开,然后再继续下一步。
生成证书
acme.sh 实现了 acme 协议支持的所有验证协议,一般有三种验证方式:
- HTTP 方式
- 手动 DNS 方式
- DNS API 方式。推荐使用 DNS API 方式。
此处我们使用DNS API方式生成,其他方式暂时不支持自动更新签名证书:
HTTP方式
手动DNS方式
这种方式需要手动在域名上添加一条 TXT 解析记录,验证域名所有权。这种方式的好处是, 你不需要任何服务器,不需要任何公网 IP,只需要 DNS 的解析记录即可完成验证。
执行以下命令进行手动 DNS 验证:
acme.sh --issue -d example.com -d "*.example.com" --dns \
--yes-I-know-dns-manual-mode-enough-go-ahead-please
到 DNS 解析中,新增一条 TXT 记录,域名前缀为 _acme-challenge,记录值为终端输出的 TXT value 的值。然后再次执行:
acme.sh --renew -d example.com -d "*.example.com" \
--yes-I-know-dns-manual-mode-enough-go-ahead-please
注意:这种方式的坏处是,如果不同时配置 DNS API,将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
DNS API 方式
自动 DNS 验证方式需要使用域名解析服务商的 DNS API,像腾讯云(DNSPos)和阿里云都提供 DNS API 功能。
如果是腾讯云 DNSPod,在这里申请API Token:
如果使用阿里云,在右上角头像下拉中选择“AccessKey 管理”,创建密钥:
创建好密钥后,使用如下命令把它们的 Id 和 Token 或 Secret 放到环境变量中:
# 腾讯云
export DP_Id="YourId"
export DP_Key="YourToken"
# 阿里云
export Ali_Key="YourAccessKeyId"
export Ali_Secret="YourAccessKeySecret"
再通过下面命令生成证书:
# 腾讯云
acme.sh --issue --dns dns_dp -d example.com -d *.example.com
# 阿里云
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 通用配置文件,内容参考如下:
ssl_protocols TLSv1.2 TLSv1.3;
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;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1200m;
ssl_session_tickets on;
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”
<a name="TeA5X"></a>
#### 3. 为Nginx站点配置证书
先为网站的证书创建一个存放目录:
```bash
mkdir -p /etc/nginx/cert/example.com
4. 配置Http/Https/Wss证书认证
打开对应的 Nginx 站点配置文件,例如:/etc/nginx/nginx.conf
,参考编辑其内容如下:
# 其他配置同Nginx默认配置,不需要改动
# 此处是核心配置,主要是配置http/https/wss的证书配置;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name www.example.com example.com;
root /usr/share/nginx/html;
# 80端口自动重定向到443端口
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name example.com www.example.com;
root /usr/share/nginx/html;
ssl_certificate /etc/nginx/cert/example.com/fullchain.cer;
ssl_certificate_key /etc/nginx/cert/example.com/example.com.key;
include /etc/nginx/ssl-options.conf;
ssl_dhparam /etc/nginx/dhparam.pem;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location /im {
# 配置wss域名和端口,如果没有wss,则不需要配置/im location
proxy_pass http://127.0.0.1:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
# 配置https域名和端口
proxy_pass http://127.0.0.1:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
5. 安装和自动更新证书
不要直接复制证书到目标目录,正确的方式是使用 -install-cert 命令安装。在命令中指定目标位置,证书文件会被复制到相应的位置。并且,可以指定 reloadcmd 命令,当证书更新以后,reloadcmd 命令会被自动调用,让新的配置生效。
执行如下安装命令完成证书安装:
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 "systemctl force-reload nginx"
如果执行异常,可以分开执行:
# 执行安装证书并开启自动更新模式
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
# 重启Nginx
systemctl force-reload nginx
这里指定的所有参数都会被自动记录下来,并在将来证书自动更新以后, 被再次自动调用。证书在到期之前会自动更新,你无需任何操作。
安装完成,可以验证自己的服务是否正确启动了Https访问内容。正常情况下,一般都不会出问题,如果出问题,需要依次验证自己的步骤执行是否正确;
6. 更新acme.sh
目前由于 acme 协议和 Let’s Encrypt CA 都在频繁的更新,因此 acme.sh 也经常更新以保持同步。
手动升级 acme.sh 到最新版:
acme.sh --upgrade
如果你不想手动升级,可以开启自动升级:
acme.sh --upgrade --auto-upgrade
你也可以随时关闭自动更新:
acme.sh --upgrade --auto-upgrade 0
参考
- acme.sh 官方文档(英文): https://github.com/acmesh-official/acme.sh/wiki
- acme.sh 官方文档(中文): https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E
- ACME v2证书自动化快速入门:https://blog.freessl.cn/acme-quick-start/
- https://freessl.cn/