Linux9レンタルサーバ(xServer)をセットアップする

# はじめに
以前に[こちらの記事](https://qiita.com/k96mz/items/ba983b4d34e94aafa4c2)でLinux8の設定過程を記載しました。今回は職場のサーバがLinux9に置き換わったため、再度テストをするためにVPSサーバをレンタルしました。その設定過程を記載します。
私が求める条件としては、Rocky Linux 9.5が使用出来る、Node.jsがインストール出来る、ドメインのネームサーバの変更が出来るというものでした。

# レンタルサーバ環境
[xServerさんのVPS](https://vps.xserver.ne.jp/)をレンタルすることにしました。
仕事で使用しているサーバがRed Hat Enterprise Linux 9.5 (Plow)ですので、それと互換性があるRocky Linux 9.5を選択します。

OS: Rocky Linux 9.5(64bit)
メモリ：　2GB
ストレージ(NVMe SSD): 50GB
node version: v22.14.0 ※nvmで管理
npm version: 10.9.2

# サーバにログイン
サーバ契約時に作成した公開鍵は、サーバの
/root/.ssh/authorized_keys
にあります。

サーバ契約時に作成した秘密鍵は自身のPCの以下に保存しています。
~/.ssh/xServerKey2.pem

以下のコマンドでログイン出来ます。
```
ssh -i ~/.ssh/xServerKey2.pem root@（IPアドレス）
```

-i ~/.ssh/xServerKey2.pem で使用する秘密鍵を指定しています。

[こちら](https://vps.xserver.ne.jp/support/manual/man_server_port.php
)のxServerさんのマニュアルを参考にして、パケットフィルター設定はOFFにしています。

### ssh接続のための設定
参考記事を見ながら作業します。

以下のコマンドでログイン出来るようになりました。
```
ssh -i ~/.ssh/xServerKey2.pem newusername@（IPアドレス）
```

### sudoコマンドを使用するための設定
デフォルトでは新しいユーザはsudoを実行する権限を持っていないので与えました。

# ファイアウォールの設定
参考記事を見ながら作業して設定しました。

# FTP設定
ローカルからサーバにファイルなどを転送するためにFTP設定を参考記事を見ながら作業して設定しました。

FileZillaを使用した接続も出来ました。

# nvmのインストール
ユーザでサーバにログインします。
[こちらの記事](https://qiita.com/k96mz/items/e33f493be15e9253e2ff#nvm%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を参考にインストールします。

# node.jsのインストール

nvmを利用して、開発環境のホスティングサーバに合わせて
node version: v22.14.0
をインストールします。

```
nvm install v22.14.0
```

ちなみにnpmのバージョンはv10.9.2がインストールされています。

ついでに過去のバージョンであるv16.20.2もインストールしておきます。

```
nvm install v16.20.2
```

# （追記）nvmのアンインストールとnode.jsの再インストール
nvmでバージョン管理を行ってきましたが、sudoを利用するときにnvm のパスが効かずエラーが発生する時があるので、nvmをアンインストールして、node.jsを再インストールします。

## nvm で入れた Node.js のアンインストール

ホームディレクトリの .nvm フォルダを削除
```
rm -rf ~/.nvm
```

.bashrcから以下の行を削除
```
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm

[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
```

シェルを再読み込み
```
source ~/.bashrc
```

ターミナルをもう一度立ち上げ直します。

### 削除確認
```
command -v nvm
```
何も表示されなければ、nvmを削除出来ています。

少し詰まりながらもできました。

## node.jsの再インストール
次に直接node.jsをインストールします。

```
# 1. NodeSource のリポジトリを追加
sudo curl -sL https://rpm.nodesource.com/setup_22.x | sudo bash -

# 2. Node.js をインストール
sudo dnf install -y nodejs
```

node version: v22.14.0
npm verstion: v10.9.2
がインストールされました。


# Nginxのインストール
リバースプロキシを使用したいので、Nginxをインストールします。

### システムを最新の状態に更新
```
sudo dnf update -y
```

### EPEL リポジトリを有効化
Rocky Linux のデフォルトリポジトリには nginx が含まれていますが、最新版を取得するために EPEL (Extra Packages for Enterprise Linux) リポジトリ を追加するのが一般的です。
```
sudo dnf install -y epel-release
```

### Nginx のインストール
```
sudo dnf install -y nginx
```

インストール後、Nginx を起動し、OS 起動時に自動起動するように設定します。
```
# Nginx の起動
sudo systemctl start nginx

# Nginx を自動起動するように設定
sudo systemctl enable nginx

# Nginx の状態を確認
sudo systemctl status nginx
```

ブラウザにおいて、
```
http://<サーバーのIPアドレス>
```
とすると確認できます。

![スクリーンショット 2025-03-17 14.17.34.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/ffe319dc-90fb-41da-998e-017c5c6cdfe4.jpeg)

# Let's Encryptを利用したSSL/TLS 証明書の設定
参考記事を見ながら作業して設定しました。少し詰まりましたが出来ました。

# nginxの設定ファイル

まずはじめに、http接続での設定とします。
## http設定
/etc/nginx/nginx.conf
に設定ファイルがあり、証明書の保存場所やリダイレクト設定などが記載されています。
以下のように設定しました。

```conf: nginx.conf
location / {
    proxy_pass http://localhost:8080;
    proxy_set_header Host $host; # クライアントのホスト名を保持
    proxy_set_header X-Real-IP $remote_addr; # クライアントの IP アドレスを保持
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # プロキシを経由した元の IP アドレスを送信
}
```

例えば、
https://k96mz.xyz/test/index.html
にきたリクエストは、
http://localhost:8080/test/index.html
に転送されます。

あとから確認しましたが、この記述はよく分かりません。http設定は気にしないことにして、https設定を確認します。

### node.jsでサーバを立ち上げる
node.jsでサーバを立ち上げて、実際の挙動を確かめました。

```javascript
const express = require('express');
const app = express();
const PORT = 8080;

// ルート（"/"）にアクセスしたときのレスポンス
app.get('/', (req, res) => {
    res.send('Hello, World!');
});

app.get('/test', (req, res) => {
  res.send('Test response');
});

// サーバーを起動
app.listen(PORT, () => {
    console.log(`Server is running on http://localhost:${PORT}`);
});
```

最初はうまく行きませんでした。
SELinux の状態を確認しました。
```
getenforce
```

Enforcingとなっていたので、一時的に無効化してみました。
```
sudo setenforce 0
```

そうするとうまくいきました。
そのため、この設定を永続化します。
手動でファイルを開いて修正：
```/etc/selinux/config
SELINUX=disabled
```

実際に
https://k96mz.xyz
とすると「Hello, World!」が返り、
https://k96mz.xyz/test
とすると、「Test response」が返ります。

## https設定
次に、https接続での設定とします。
/etc/nginx/nginx.conf
の設定ファイルを以下のように設定します。httpをhttpsにするだけです。

```conf: nginx.conf
location / {
    proxy_pass https://localhost:8080;
}
```

### node.jsでサーバを立ち上げる
node.jsでサーバを立ち上げて、実際の挙動を確かめました。

```javascript
const express = require('express');
const spdy = require('spdy');
const fs = require('fs');

const app = express();
const PORT = 8080; // HTTPS のポート

// SSL 証明書のパス（Let's Encrypt などで取得したものを指定）
const privkeyPath = './key/privkey.pem';
const fullchainPath = './key/cert.pem';

// SSL 証明書の読み込み
const options = {
    key: fs.readFileSync(privkeyPath),
    cert: fs.readFileSync(fullchainPath),
    allowHTTP1: true  // HTTP/1.1 のリクエストも許可
};

// ルート（"/"）にアクセスしたときのレスポンス
app.get('/', (req, res) => {
    res.send('Hello, Secure HTTP/2 World!');
});

app.get('/test', (req, res) => {
    res.send('Test response (HTTP/2)');
});

// HTTP/2 サーバーを起動
spdy.createServer(options, app).listen(PORT, () => {
    console.log(`HTTP/2 Server is running on https://localhost:${PORT}`);
});
```

実際に
https://k96mz.xyz
とすると「Hello, Secure HTTP/2 World!」が返り、
https://k96mz.xyz/test
とすると、「Test response (HTTP/2)」が返ります。


# まとめ
Rocky Linux 9.5のセットアップ過程を記載しました。

# Reference

https://qiita.com/k96mz/items/ba983b4d34e94aafa4c2