使用Nginx反向代理,在Amazon Linux 2023上搭建支持HTTPS的Node-RED环境
背景 – 背景信息
由于各种原因,我需要在互联网环境中使用Node-RED执行环境,并在EC2上建立了一个服务器。
我原本打算在常用的Amazon Linux 2上进行搭建,但在以下网站上看到了“警告:用于 NodeJS 18+ 的构建系统当前存在问题”的提示,所以我选择了在Amazon Linux 2023上进行搭建。
步骤
启动和初始化EC2实例
只提及注意事项,并省略详细内容。
在启动实例时需要注意的事项
实例启动后的工作
-
- Elastic IPの割り当て
- DNS登録:ホスト名でグローバルIPが変換できるようにする(当方はRoute53でAレコード追加)
SSH连接
因为似乎无法使用迄今为止一直在用的TeraTerm,所以将会通过命令提示符进行连接。
> cd (キーペアのpemファイルのダウンロードフォルダ)
> ssh -i "(キーペア名).pem" ec2-user@(ホスト名)
操作系统安装后的常见任务。
我們將執行 EC2 的 Amazon Linux 啟動後的共同操作(日語化支援)。
$ sudo -s
# vi /etc/hostname
(ホスト名を書き換えて保存)
# rm -f /etc/localtime; ln -sf /usr/share/zoneinfo/Japan /etc/localtime
# vi /etc/sysconfig/clock
(ZONEを「UTC」から「Asia/Tokyo」に書き換えて保存)
# vi /etc/sysconfig/i18n
(「en_US」を「ja_JP」に書き換えて保存)
# source /etc/sysconfig/i18n
# reboot
安装和初始设置Node-RED。
安装Node-RED
完成重启后,通过SSH重新连接并进行Node-RED的安装。
$ sudo -s
# curl -fsSL https://rpm.nodesource.com/setup_20.x | bash -
# dnf install -y nodejs
# npm install -g --unsafe-perm node-red
密码保护
出于安全考虑,我们将要求使用密码登录。
# node-red admin hash-pw
Password:(パスワード入力しEnter)
$2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(この値をコピーしておく)
# vi /usr/lib/node_modules/node-red/settings.js
…
(以下のコメント解除)
adminAuth: {
type: "credentials",
users: [{
username: "admin",
password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
↓ 初期値は「password」なので、上でコピーしたハッシュ値に変更
password: "$2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
permissions: "*"
}]
},
…
自动启动设置
为了在操作系统启动时自动启动Node-RED,我们需要安装并配置PM2。
# npm install -g pm2
…
# exit
※注意:以下はec2-userで実行する
$ pm2 start /usr/bin/node-red
…
$ pm2 startup
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u ec2-user --hp /home/ec2-user
…
$ pm2 save
…
透過代理服务器的引入与HTTPS支持
安装nginx
安装nginx,并启动服务,并配置自动启动。
$ sudo -s
# dnf install -y nginx
# systemctl start nginx
# systemctl enable nginx
我们来安装Let’s Encrypt
我将进行certbot的安装,获取证书,以及进行nginx的配置。
# dnf install -y python3 augeas-libs pip
# python3 -m venv /opt/certbot/
# /opt/certbot/bin/pip install --upgrade pip
# /opt/certbot/bin/pip install certbot
# ln -s /opt/certbot/bin/certbot /usr/bin/certbot
# systemctl stop nginx
# certbot certonly --standalone
…
(メールアドレスを記入)
…
(ライセンス規程に同意)
…
(メール配信希望に回答)
…
(ホスト名を入力)
…
# vi /etc/nginx/nginx.conf
…
(コメントを外し、ssl_certificateとssl_certificate_keyを編集)
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name _;
root /usr/share/nginx/html;
ssl_certificate "/etc/letsencrypt/live/(ホスト名)/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/(ホスト名)/privkey.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers PROFILE=SYSTEM;
ssl_prefer_server_ciphers on;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
…
# systemctl start nginx
访问https://(主机名),确认欢迎页面是否显示。
反向代理服务器配置
在nginx的配置文件中添加反向代理设置,并重新启动服务。
# vi /etc/nginx/nginx.conf
…
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name _;
root /usr/share/nginx/html;
# ここから追記
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://127.0.0.1:1880/;
}
# ここまで追記
ssl_certificate "/etc/letsencrypt/live/(ホスト名)/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/(ホスト名)/privkey.pem";
…
# systemctl restart nginx
建议您删除安全组的TCP 1880规则,因为已经完成了以上的构建工作。考虑到互联网的公开性,建议您删除该规则。
证明书更新(2023/8/3补充)
由于Let’s Encrypt颁发的证书有效期为3个月,因此需要在有效期前约1个月进行更新。
根据此引用指南进行了更新操作但是出现了“无法使用请求的nginx插件进行更新证书ceemskj.chugai-tec.com,出现错误:所请求的nginx插件似乎未安装” 的问题,因此通过以下命令添加了插件。
# /opt/certbot/bin/pip install certbot-nginx
安装插件后,使用以下命令成功地进行了更新。
# certbot renew --nginx --renew-hook "/bin/systemctl reload nginx"
请提供一个参考的网址。
感谢以下作者的信息,使得我们能够在短时间内实现这次活动。谢谢所有相关前辈们的支持。