チャットを作りたい② nginxとNode.jsの共存

スポンサーリンク
スポンサーリンク

Node.js

まずNode.jsを使えるようにしてこー。

スポンサーリンク

Node.jsのインストール

distributions/README.md at master · nodesource/distributions
NodeSource Node.js Binary Distributions. Contribute to nodesource/distributions development by creating an account on Gi...

$ curl -sL https://rpm.nodesource.com/setup_14.x | bash -

$ sudo yum install -y nodejs

された。

$ node -v
v14.15.1

現時点のLTS、LTSって何?Long Term Supportの略で長期サポート版ってことらしい。が、インストールされた。

$ npm -v
6.14.8

npmも同時にインストールされる。

スポンサーリンク

Hello World

Node.js — About Node.js®
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

にあるサンプルをそのままやってみる。いつも思うんですけど、こういうのってどのフォルダに置くのが一番いいんですかね。まぁなんでもいいかと

$ mkdir /home/dalomo/nodejs

した。そんでこん中に

$ vi helloworld.js

そんで

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

まるぱくる。とりあえず起動

$ node helloworld.js

そんで!http://dalomo.net:3000/にアクセスしても、反応なし。hostnameとportがちがうんかなーというのと、まずはnginxとhttpdを止める。

$ systemctl stop httpd 
$ systemctl stop nginx
  • hostname = ‘127.0.0.1’ port = 3000 アクセス先 = http://dalomo.net:3000
    • 動かない
  • hostname = ‘サーバーのIP’ port = 3000 アクセス先 = http://dalomo.net:3000
    • 動かない
  • hostname = ‘サーバーのIP’ port = 80 アクセス先 = http://サーバーのIP:80
    • 動く!
  • hostname = ‘dalomo.net’ port = 80 アクセス先 = http://dalomo.net:80
    • 動かない

結局動いたのこれだけだ。知識が足りなすぎて、どういう背景でこうなってるのか予想もつかん。多分だけどポートが開いてないとかなのかな…。試すのめんどくさいので取り合えず動いたやつに合わせてやってこう。

スポンサーリンク

Node.js + forever

現状ctrl+Cしないと何もできなくなるし、その状態だとnginxと共存っつっても何もできんので、foreverでデーモン化してみる。って思ったんだけど、なんかCentOS7以降だとOSの機能としてデーモン化・永続化の機能があるみたい。そっちにしよう!

スポンサーリンク

systemdでNode.jsアプリをデーモン化

デーモン化・永続化・バックグラウンドプロセス・常時起動とか色んな呼び方あるみたいだけど、何が正しいのか分からない!色んなサイトを参考にやってみよう。

centos7で標準のsystemdを使いnode.js製サーバーをデーモン化する - Qiita
centos7で標準のsystemdを使いnode.js製サーバーをデーモン化するはじめにnode.jsをデーモン化するにはforever、pm2、supervisorなどいろいろありますがc…
systemdを使ってnodejsサーバー起動する
nodejsのプロセスバックグラウンドで実行する(デーモン化)する場合、だいたいforeverなどが選択されると思う。今回は、Fedora、CentOS 7のデーモンとなるsystemdを使ってデーモン化してみた。
Node.js のサービス化を systemd にした : (*x).b=z->a+y/c
◆ pm2 や forever を通さず systemd で管理◆ OS 起動時の起動とプロセス終了時の再起動
https://nodesource.com/blog/running-your-node-js-app-with-systemd-part-1
Systemd Unit File チートシート - Qiita
Systemd のサービススクリプトを作る時に毎回調べているので、その負荷軽減のためにメモします。サービススクリプトを作成する際にご利用ください。サンプルDescription=…
How to daemonize a process or service with Systemd
Systemd is a system and service manager for Linux operating system which is running as the first process on boot with PI...
Use systemd to Start a Linux Service at Boot
The systemd daemon allows you to control Linux system services. This guide shows how to configure a custom systemd servi...

/etc/systemd/system下にhelloworld.serviceという名前で

[Unit]
Description=helloworld
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/node /home/dalomo/nodejs/helloworld.js
Restart=always
WorkingDirectory=/home/dalomo/nodejs

[Install]
WantedBy=multi-user.target

こんな内容のファイルを作った。もうこれで使えるようになってるみたい。nginxとApacheを止めて

$ systemctl daemon-reload

で再読み込み。そんで

$ systemctl start helloworld

スタート!どきどき。確認してみる。

$ systemctl status helloworld
● helloworld.service - helloworld
Loaded: loaded (/etc/systemd/system/helloworld.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2020-12-03 22:32:45 JST; 1min 1s ago
Main PID: 13582 (node)
CGroup: /system.slice/helloworld.service
mq13582 /usr/bin/node /home/dalomo/nodejs/helloworld.js

Dec 03 22:32:45 1scp2bi4 systemd[1]: Started helloworld.
Dec 03 22:32:46 1scp2bi4 node[13582]: Server running at http://140.227.173....0/
Hint: Some lines were ellipsized, use -l to show in full.

おお…!できてるっぽい気がする。サーバーのIPアドレスにアクセスすると、上と同じように表示されてるー!すごい!めちゃめちゃ簡単なんだねぇ。そしたら

$ systemctl stop helloworld

で一回止めて、Node.jsアプリのポートを3000に変更して、nginxからリバースプロキシでアクセスできるようにしてきたい。

スポンサーリンク

nginx + Node.js

http://www2.matsue-ct.ac.jp/home/kanayama/text/nginx/node16.html
http://www2.matsue-ct.ac.jp/home/kanayama/text/nginx/node36.html
nginx連載5回目: nginxの設定、その3 - locationディレクティブ
前回と同様に、バーチャルサーバの設定について説明を行います。特に今回はURIのパス名毎の設定を行うlocationディレクティブと関連する設定について説明します。特に次の設定について説明します。 location alias index t...

サブディレクトリごとにどこの何を返すか、みたいなのを決めれるんと思う。現状は

server {
    listen 80;
    server_name localhost;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

server {
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/dalomo.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/dalomo.net/privkey.pem;
    server_name localhost;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

こんな感じになってる。なんとなく、Locationのパスを追加して、proxy_passの所をポート3000に飛ばせばいいような気がする。でもそれ以下の記述は全部一緒で、それが複数回繰り返されるからなんか冗長な気がするんですけどどうなんでしょう。まぁとりあえず愚直に

location /nodejs/ {
    proxy_pass http://127.0.0.1:3000;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

を、80と443をListenしてるserverの{…}内に追記してみる。そんでnginxとhelloworldのサービス起動すると、502 Bad Gateway…うーん?なんとなく、helloworld.jsのhostnameがよくなさそうな気がしたので、サーバーのIPアドレスから127.0.0.1に変えてみた。もっかい起動すると

できたー!!!すごい!動いてる!これでnginxとNode.jsとApacheが共存できた!いよいよチャットを作っていこう!

コメント

タイトルとURLをコピーしました