使用Nginx反向代理,在Amazon Linux 2023上搭建支持HTTPS的Node-RED环境

背景 – 背景信息

由于各种原因,我需要在互联网环境中使用Node-RED执行环境,并在EC2上建立了一个服务器。
我原本打算在常用的Amazon Linux 2上进行搭建,但在以下网站上看到了“警告:用于 NodeJS 18+ 的构建系统当前存在问题”的提示,所以我选择了在Amazon Linux 2023上进行搭建。

 

步骤

启动和初始化EC2实例

只提及注意事项,并省略详细内容。

在启动实例时需要注意的事项

image.png

实例启动后的工作

    • 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
…
image.png

透過代理服务器的引入与HTTPS支持

安装nginx

安装nginx,并启动服务,并配置自动启动。

$ sudo -s
# dnf install -y nginx
# systemctl start nginx
# systemctl enable nginx
image.png

我们来安装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
image.png

建议您删除安全组的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"

请提供一个参考的网址。

感谢以下作者的信息,使得我们能够在短时间内实现这次活动。谢谢所有相关前辈们的支持。

 

广告
将在 10 秒后关闭
bannerAds