aws ec2 实例部署后端api全过程
1. 执行初始化命令
密钥文件夹下,使用 pawershell
// 使用 SSH 连接到你的 EC2 实例 |
2. 然后,到这里喝杯水..
开始初始化数据库
// 执行初始化 |
ubuntu@ip-172-31-30-64:~$ sudo mysql_secure_installation
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?Press y|Y for Yes, any other key for No: n
在执行
mysql_secure_installation
时,系统询问是否要设置 VALIDATE PASSWORD 组件,它用于测试密码强度并确保用户设置足够安全的密码。你可以根据需要选择:
- 按
y
或Y
以启用密码强度验证,这样会强制用户设置强密码。 - 按任何其他键(如
n
或N
)以跳过密码强度验证,允许设置任何密码。
- 按
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.Remove anonymous users? (Press y|Y for Yes, any other key for No) :y
你可以根据以下两种选择进行操作:
- 按 y 或 Y 删除匿名用户,这将增强 MySQL 的安全性,避免未经授权的用户访问。
- 按其他键 (如
n
或N
)保留匿名用户,但不推荐在生产环境中使用这种配置。
建议选择 删除匿名用户(按
y
),以确保 MySQL 的安全性。Normally, root should only be allowed to connect from
‘localhost’. This ensures that someone cannot guess at
the root password from the network.Disallow root login remotely? (Press y|Y for Yes, any other key for No) :y
你可以根据以下两种选择进行操作:
- 按 y 或 Y 禁止 root 用户远程登录,这样只有在本地机器上才可以使用 root 用户登录 MySQL,增强安全性。
- 按其他键 (如
n
或N
)允许 root 用户远程登录,但这种做法会增加远程攻击的风险,通常不推荐。
建议选择 禁止 root 用户远程登录(按
y
),以提高安全性。如果需要远程访问,可以创建一个普通用户并授予适当的权限。By default, MySQL comes with a database named ‘test’ that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.Remove test database and access to it? (Press y|Y for Yes, any other key for No) :y
你可以选择以下操作:
- 按 y 或 Y 删除
test
数据库以及访问权限,这样可以避免不必要的安全风险。 - 按其他键 (如
n
或N
)保留test
数据库,但不推荐在生产环境中使用该数据库。
建议选择 删除 test 数据库(按
y
),以增强数据库的安全性。- 按 y 或 Y 删除
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
这个提示是在询问你是否要 刷新权限表,以确保之前的更改(如删除
test
数据库、删除匿名用户等)立即生效。建议你按 y 或 Y 来刷新权限表,这样所有更改将立即生效。
如果你选择 按 n 或 N,更改将不会立即生效,直到下次 MySQL 服务重启或刷新权限表。
为了确保更改生效,最好选择 刷新权限表(按
y
)。
设置root密码并创建一个新用户
// 设置 root 密码并登录 |
然后,使用新用户远程连接 ec2 数据库,记得去安全组放开3306端口。
最后,编辑Mysql配置文件:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf |
修改配置:
在配置文件中找到 bind-address
配置项,确保它设置为 0.0.0.0
,表示允许来自任何 IP 地址的连接。
// 重启Mysql 服务 |
接下来,就可以使用新用户通过命令行或workbench远程连接啦!
3. 在 EC2 实例中生成 SSH 密钥对
使用
ssh-keygen
命令来生成一个新的 SSH 密钥对。ssh-keygen -t rsa -b 4096 -C "youruilin@gmail.com"
解释:
-t rsa
:表示使用 RSA 算法。-b 4096
:设置密钥长度为 4096 位。-C "your_email@example.com"
:为密钥添加注释(通常是您的邮箱地址)。
系统会提示您选择密钥保存的路径:
默认情况下,密钥会保存到~/.ssh/id_rsa
,如果您希望使用默认路径,可以直接按 Enter。提示您设置密钥的密码(可选):
如果您不希望设置密码保护,可以直接按 Enter 跳过。完成后,SSH 密钥对将被生成,并保存在
~/.ssh/
目录中。此时,您应该会看到两个文件:id_rsa
(私钥)id_rsa.pub
(公钥)
使用
cat
命令查看公钥内容,并复制它。cat ~/.ssh/id_rsa.pub
输出的内容应该是以
ssh-rsa
开头的一串字符串。将这串字符串复制下来。将公钥添加到GitHub
登录到你的 GitHub 账户,进入 Settings -> SSH and GPG keys -> New SSH key,然后粘贴你刚刚复制的公钥,保存即可。
测试链接
公钥添加到 GitHub 后,可以通过以下命令测试 SSH 连接:
ssh -T git@github.com
4. 部署 Node.js + Express 后端 API 项目
可以直接从 GitHub 克隆代码:
# 创建目录
sudo mkdir -p /var/www/shuangzhao-api-project
# 可以给当前用户(例如 ubuntu)设置适当的权限:
sudo chown -R ubuntu:ubuntu /var/www/shuangzhao-api-project
cd /var/www/shuangzhao-api-project
git clone git@github.com:youruilin/shuangzhaoServerApi.git安装项目依赖
cd your-project-folder
npm install配置环境变量
项目根目录创建 .env 用于存储环境变量
touch .env
// 编辑 .env
nano .env # 或者使用其他编辑器
DB_HOST=localhost
DB_USER=iooio
DB_PASSWORD=5320di
# 需要特别注意,尽量核对ai助手生成的代码片段
DB_NAME=shuangzhao_iooio # 这里名字搞错了我次奥,
JWT_SECRET_KEY=iooio使用 pm2 来管理 Node.js 应用
npm install pm2 -g #安装pm2 -g
# 根目录下启动 Node.js 应用
pm2 start app.js --name "shuangzhao_api"
# 设置开机自启,这将输出一条命令,复制并执行这条命令以设置开机自启。
pm2 startup
# 然后,使用以下命令来保存当前的进程列表:
pm2 save其中
--name
参数是可选的,它指定了该进程的名称,方便你管理多个进程。如果不指定名称,pm2 会自动给进程命名为app.js
。
5. 配置 Nginx 反向代理
在生产环境中,你通常会使用 Nginx 来处理请求,并将它们转发到你的 Node.js 应用(反向代理)。
安装&配置 Nginx:
sudo apt install nginx |
或者,可以通过 vscode Remote 插件,远程连接 ec2 进行配置文件编辑:
打开命令面板
- 按
F1
或Ctrl+Shift+P
打开命令面板。
- 连接到远程主机
- 在命令面板中输入
Remote-SSH: Connect to Host...
并选择该选项。 - 如果是第一次使用,你会看到一个对话框提示选择或输入远程主机地址。
- 输入 SSH 连接信息
在弹出的输入框中,输入如下格式的连接信息:
ssh ubuntu@35.94.43.44 -i C:/Users/youruilin/Desktop/0317/code/aws/keys/america_ele.pem
ubuntu
是默认的 EC2 实例用户名(如果是 Amazon Linux 实例,则可能是ec2-user
)。<EC2_PUBLIC_IP>
是你 EC2 实例的公有 IP 地址。/path/to/your-key.pem
是你在创建 EC2 实例时下载的私钥文件的路径,使用绝对路径。
或者,可以使用ssh配置文件,方便后续连接:
打开终端并编辑
~/.ssh/config
文件(如果文件不存在,可以创建一个):Host 35.94.43.44
HostName 35.94.43.44
User ubuntu
IdentityFile C:/Users/youruilin/Desktop/0317/code/aws/keys/america_ele.pem
- 选择连接方式
- 如果是第一次连接,VS Code 会提示你选择连接方式。选择正确的身份验证方式(使用密钥文件)。
- 输入完信息后,VS Code 会自动连接到 EC2 实例。
- 编辑远程文件
连接成功后,你会看到 VS Code 显示 “已连接到远程主机”。然后:
打开文件浏览器(左侧的文件图标),点击 “Open Folder”。
输入
/etc/nginx
或其他你想编辑的路径。选择并打开你要编辑的文件(例如
/etc/nginx/sites-available/default
)。
# 终端执行:sudo nano /etc/nginx/sites-available/default |
保存并重载 Nginx
编辑文件后,保存它。你可以在 VS Code 的集成终端中输入以下命令来重载 Nginx 配置:
sudo systemctl reload nginx
6. 到此,基本是进入了尾声
接下来,可以去域名代理商那里,为ec2的公网ip添加一条解析记录。
然后,可以分别测试域名和公网的访问是否正常。
7. 填坑记录
在生产环境部署时,使用环境变量来动态设置 API 地址是一种非常常见的做法,尤其是当你的应用需要在多个环境(如开发、测试、生产等)中运行时。这种方式可以确保你不需要手动更改代码,而是根据部署环境自动调整配置。
在项目根目录下,创建一个 .env.production
文件。该文件用于生产环境的配置。
VITE_API_URL=https://aws_ele.iooio.cn/api |
然后,/src/utils/request
// 从环境变量获取 API 地址 |
这样,axios
请求的 baseURL
就会根据环境变量的值动态设置。
- 在生产环境(如
.env.production
中配置的地址)下,baseURL
会设置为https://aws_ele.iooio.cn/api
。
要留意的是:
从 HTTPS 页面请求 HTTP 资源: 如果你的网站是通过 HTTPS 协议提供服务的(即,使用了 https://yourdomain.com
),但你尝试请求的资源是通过 HTTP 协议提供的(如 http://aws_ele.iooio.cn/api/login/code
),浏览器会阻止这种行为。这是为了保护用户的安全,避免潜在的中间人攻击。
API 地址协议不匹配: 在你的前端页面中,如果你使用 HTTPS(例如:https://youruilin.github.io
),而你的 API 请求地址是通过 HTTP(如 http://aws_ele.iooio.cn
),这就导致了 Mixed Content
错误。
其实说的是一回事。
所以接下来,还需要完成最后一步:
为了让后端 API 服务支持 HTTPS,需要配置 Nginx 和 SSL 证书。我们将使用免费的 Let’s Encrypt SSL 证书来启用 HTTPS。以下是详细的步骤:
8. 为后端项目配置ssl证书
安装 Certbot和Nginx 插件
sudo apt install certbot python3-certbot-nginx
现在,你已经安装了 Certbot,可以使用它来获取 SSL 证书。执行以下命令:
sudo certbot --nginx
填坑:关于域名中的下划线(
_
)的问题。这同时也是,为什么上一步没有自动识别域名的原因,尽管 nginx 配置文件中已经指定了域名。
HTTP 协议本身并不禁止使用下划线,但 HTTPS 协议(以及更多的标准和安全协议)要求域名符合严格的规范。具体来说:
- HTTP 协议:理论上允许域名中包含下划线(
_
),但这并不符合域名的标准,且不推荐这样做。 - HTTPS 协议:因为 HTTPS 需要经过证书验证,域名必须符合 DNS 的规范,而根据 RFC 1035 和其他相关标准,域名不能包含下划线。因此,Let’s Encrypt 等证书颁发机构不会为包含下划线的域名颁发 SSL 证书。
所以,即便在 HTTP 中
aws_ele.iooio.cn
可以访问,使用 HTTPS 时会遇到问题,不能生成证书。为了支持 HTTPS 访问,你需要将域名中的下划线(_
)替换为合法字符,比如破折号(-
),然后重新配置证书。- HTTP 协议:理论上允许域名中包含下划线(
执行以下代码,设置证书自动续期
sudo certbot renew --dry-run
9. 关于 fetch 引入本地 json 文件的一些实践
在项目demo阶段,有可能需要预先将项目构建好静态部署进行测试(炫耀),这种情况下原本fetch引入的本地数据路径需要根据项目环境来设置一个环境变量,用于区分向您处于开发阶段还是部署上线阶段,原本的fetch请求方式为:
100 . test
test