Linux基礎

目次

今回のゴール

サーバーの初期設定・公開鍵認証でのログイン設定・Webサーバーの構築ができるようになる

サーバーの構築

SSHでサーバーにアクセス

コントロールパネルからサーバーのIPアドレスをコピーしておきます。

ターミナル/コマンドプロンプトで以下のコマンドを実行します[IPアドレス]には先ほどコピーしたものを貼り付けます。

ssh root@[IPアドレス]

アクセス時以下のメッセージが表示されます。yesまたはnoを入力することを求めらるのでyesと入力します。

The authenticity of host '*****' can't be established.
ED25519 key fingerprint is SHA256:gUPOR0uWyeWsh09fO74eec128nHn5s6KDAQdRn6lUMI.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes # ←yesと入力
Warning: Permanently added '****' (ED25519) to the list of known hosts.

一般ユーザーの追加

ユーザーを追加するコマンド

useradd [オプション] ユーザー名

オプションはこちらを参照

以下のコマンドでユーザーを追加します。

useradd -s /bin/bash -m devel

develユーザーのパスワードを以下のコマンドで設定します。

passwd devel
New password:[任意のパスワード]
Retype new password:[↑で入力したパスワード]
passwd: password updated successfully

ユーザーアカウント情報を変更する(ユーザーのセカンダリグループを変更するなど)コマンド

usermod [オプション] ユーザー名

オプションはこちらを参照

develユーザーにsudoを使えるようにグループを追加します。(セカンダリグループにsudoを追加)

usermod -aG sudo devel

develユーザーにsshする際にパスワードログインを禁止する(公開鍵認証でログインする)

rootユーザーからdevelユーザーに切り替えをします。

su devel
cd

鍵を保存しておくフォルダを作成します。

mkdir ~/.ssh

カレントディレクトリを~/.sshに変更します。

cd ~/.ssh

秘密鍵と公開鍵を生成するコマンド

ssh-keygen [オプション]

こちらオプションはこちらを参照

秘密鍵と公開鍵を生成します。

ssh-keygen -f devel_id_rsa

何を入力せずEnterを2回入力してください。

Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in devel_id_rsa
Your public key has been saved in devel_id_rsa.pub
The key fingerprint is:
SHA256:0ILu8TTaINugRf8MeORHzgeJUQu/5A0RQ9vNdKdv7zY devel@vm-eac26d88-de
The key's randomart image is:
+--[ED25519 256]--+
|    oo*.  . . .  |
|     * O + . o   |
|  . + % o o .    |
| . * * B     .   |
|  = O O S     o  |
| o B % o     . . |
|. . + =         .|
|               E.|
|               .o|
+----[SHA256]-----+

先ほどのコマンドで2つのファイルが生成されました。

ls
devel_id_rsa  devel_id_rsa.pub
  • 秘密鍵:devel_id_rsa ← クライアントからアクセスする際に必要な鍵
  • 公開鍵:devel_id_rsa.pub ← サーバーで保管しておく鍵

devel_id_rsa.pubauthorized_keysという名前でコピーします。

cp devel_id_rsa.pub ~/.ssh/authorized_keys

authorized_keysファイルのパーミッションを変更します。

※パーミッションとは、ファイルやディレクトリのアクセス権のこと

chmod 600 ~/.ssh/authorized_keys

authorized_keysのパーミッションが-rw-------になっていることを確認します。

ls -la
-rw------- 1 devel devel  102 Mar 21 00:10 authorized_keys

exit2回でリモートから抜けます。

ファイルを転送するコマンド(クライアント → サーバー/サーバー → クライアント)

scp [オプション] 転送元パス 転送先パス

# クライアント → サーバー
scp クライアントのファイルパス ユーザー@[サーバーIP/ドメイン]:転送先パス

# サーバー → クライアント
scp ユーザー@[サーバーIP/ドメイン]:ファイルパス 転送先パス

秘密鍵をクライアント側にコピーします。

scp devel@[サーバーのIP]:~/.ssh/devel_id_rsa ~/.ssh
devel@****'s password:[develユーザーのパスワード]
devel_id_rsa                                                                          100%  411     9.3KB/s   00:0

秘密鍵を使用してsshでログインします。

ssh -i ~/.ssh/devel_id_rsa devel@[サーバーIP]

sshログイン時にパスワード認証を禁止するように設定ファイルを変更します。

sudo vi /etc/ssh/sshd_config
PermitRootLogin yes
↓
PermitRootLogin no

#PasswordAuthentication yes
↓
PasswordAuthentication no

変更し終えたらESCキーを押しコマンド入力モードに変更し、:wqを入力しEnterキーを入力してください。

sudo vi /etc/ssh/sshd_config.d/50-cloud-init.conf
PasswordAuthentication yes
↓
PasswordAuthentication no

※vimで検索機能を使うと見つけやすいです。

まず、ESCキーを押してコマンド入力モードにします。以下を入力することで検索することができます。

:/検索文字

以下のコマンドでsshを先起動します。

sudo systemctl reload ssh.service

rootにsshログインできないことを確かめてみます。

ssh root@[サーバーのIP]

パスワードを入力しても以下のメッセージが表示されてログインできません。

Permission denied, please try again

develにパスワード認証でsshログインできないことを確かめます。

ssh devel@[サーバーのIP]

以下のメッセージが表示され、ログインできません。

devel@160.251.211.163: Permission denied (publickey).

Nginxを使ってWebサーバーを構築

develにsshログインします。

ssh -i ~/.ssh/devel_id_rsa devel@[サーバーIP]

まずaptを使用してリポジトリを更新します。

sudo apt update

続いてaptを使用してNginxをインストールします。

sudo apt install -y nginx

80番ポートにアクセスできるようにポート開放をします。

まず、ufwが管理しているアプリケーションを確認します。

sudo ufw app list
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH
  • Nginx Full → ポート80とポート443の両方を開きます。
  • Nginx HTTP → ポート80を開きます。
  • Nginx HTTPS → ポート443を開きます。

今回は80番ポートを解放したいのでNginx HTTPを指定します。

以下のコマンドで80番ポートを解放します。

sudo ufw allow 'Nginx HTTP'
Rule added
Rule added (v6)

以下のコマンドで80番ポートが解放されているか確認します。

sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

WebブラウザでWebサーバーにアクセスするためにConoHaVPSのセキュリティグループにIPv4v6-Webを追加します。

http://[サーバーIP]にアクセスすると以下のページが表示されます。

Next.jsでWebサーバーを立てる

AsdfのインストールとNodejsのインストール

まずNext.jsのプロジェクトを作成するためにNode.jsの環境構築をまず行います。

今回はasdfというバージョン管理ツールを使用してNode.jsをインストールします。

asdfのガイドはこちら

まず、asdfのリポジトリをGitHubからクローンします。

git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.15.0

asdfの実行パスを~/.bashrcに追加します。

echo . "$HOME/.asdf/asdf.sh" >> ~/.bashrc
echo . "$HOME/.asdf/completions/asdf.bash" >> ~/.bashrc

~/.bashrcを再読み込みします。

source ~/.bashrc

asdfコマンドが使用できるか確認します。以下のコマンドを入力してください。

asdf list

以下のメッセージが表示されれば大丈夫です。

No plugins installed

Node.jsをインストールするためのプラグインをasdfに追加します。

asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

インストールするNode.jsのバージョンを確認します。

asdf list-all nodejs
・・・(省略)
23.0.0
23.1.0
23.2.0
23.3.0
23.4.0
23.5.0
23.6.0
23.6.1
23.7.0
23.8.0
23.9.0
23.10.0

今回は表示されている中で最新の23.10.0をインストールします。

以下のコマンドでインストールします。

asdf install nodejs 23.10.0

Node.js23.10.0を使用する設定をします。

asdf global nodejs 23.10.0

※特定のプロジェクトのみ使用するバージョンを変更・指定した場合は以下のコマンドを使用します。

asdf local nodejs バージョン

以下のコマンドを実行してバージョンの隣に*が表示されていれば大丈夫です。

asdf list
nodejs
 *23.10.0

一応npm -vの実行でも確認できます。

Next.jsのプロジェクト作成

以下のコマンドでNext.jsのプロジェクトを作成します。

この資料ではプロジェクト名をsample=web-appとしていますが、任意の名前を付けてください。

npx create-next-app@latest sample-web-app

使用するツールを選択する際にすべてデフォルトを選択します。

✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like your code inside a `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to use Turbopack for `next dev`? … No / Yes
✔ Would you like to customize the import alias (`@/*` by default)? … No / Yes

カレントディレクトリを作成したプロジェクトに変更します。

cs sample-web-app

ポート開放

Next.jsはデフォルトで3000番ポートを使用します。そのため、ufwコマンドで3000番ポートを解放します。

sudo ufw allow 3000

以下のコマンドでufwの状況(解放されているポート)を確認します。

sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
3000                       ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)
3000 (v6)                  ALLOW       Anywhere (v6)

3000が追加されていれば大丈夫です。

ufwのみ設定した状態だとConohaVPS側のセキュリティグループではじかれてしまうのでNext.js用のセキュリティグループを作成しサーバーに設定します。

まず、セキュリティグループを作成します。

ConoHaのコントロールパネルのサイドバーから「セキュリティ」→「セキュリティグループ」を開きます。

右上にある「セキュリティグループ」ボタンをクリックし、セキュリティグループ名にIPv4v6-nextjsを入力し、保存ボタンをクリックします。

IPv4v6-nextjsセキュリティグループの設定をします。

それぞれの設定をいかに変更します。

作成したセキュリティグループをサーバーに設定します。

以下のコマンドを実行してdev環境でsample-web-appのサーバーを立ち上げます。

npm run dev

サーバーが立ち上がったことを確認したらhttp://[サーバーIP]:3000にアクセスしてみましょう。

Next.jsアプリを80番ポートでアクセス

Next.jsアプリのサーバーは3000番ポートのためhttp://[サーバーIP]:3000とurlを指定しなくてはいけません。そこでhttp://[サーバーIP]と指定してもNext.jsのアプリにアクセスできるようにします。

この時使用するものとして「リバースプロキシ」というものがあります。

この「リバースプロキシ」は受け口のようなもので80番ポートでアクセスしたら3000番ポートのアプリにアクセスするというものです。

Nginxにもリバースプロキシをする機能があるので設定していきます。

sudo vi /etc/nginx/conf.d/nextjs.conf
server {
        listen 80;

        location / {
                proxy_pass http://localhost:3000;
                proxy_set_header Host $http_host;
        }
}

:wqでファイルを保存しvimを終了します。

次に/etc/nginx/nginx.confを修正します。

sudo vi /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {
# ・・・(省略)
        ##
        # Virtual Host Configs
        ##

-        # include /etc/nginx/conf.d/*.conf;
+        include /etc/nginx/conf.d/*.conf;
-        include /etc/nginx/sites-enabled/*;
+        # include /etc/nginx/sites-enabled/*;
}


# ・・・(省略)

※行の先頭に-がついているものは削除対象の行。+がついているものは追加対象の行。

:wqでファイルを保存しvimを終了します。

以下のコマンドで作成したnextjs.confと修正したnginx.confを再読み込みさせます。

sudo systemctl reload nginx.service

http://[サーバーIP]にアクセスすると以下のページが表示されます。

※Nextjsのサーバーを立ち上げていないためです。

Next.jsで作成したsample-web-appをビルドします。

npm run build

ビルドが終わったら以下のコマンドでサーバーを起動させます。

npm run start

http://[サーバーIP]にアクセスすると以下のページが表示されます。

補足

tmuxを使用して実行

tmuxで新しいセッションを作成します。

tmux new -s [セッション名]
tmux new -s nextjs

tmuxのnextjsセッションの中でnum run startを実行します。

tmuxのセッションを抜けるにはCtrl + b入力後dを入力します。

Next.jsのサーバーを停止したい場合再度tmuxのnextjsセッションの中でCtrl + Cを2回入力します。

tmux a -t [セッション名]
tmux a -t nextjs

tmuxのセッションを削除するには以下のコマンドを実行します。

tmux kill-session -t [セッション名]
tmux kill-session -t nextjs

バックグランド実行

npm run startをバックグランド実行したい場合

nohup npm run start &

jobsコマンドとfgコマンドを使用してバックグランド実行からフォアグランド実行に変更しNext.jsのサーバーを止める場合

jobs
[1]+  Running                 nohup npm run start &
fg 1

Ctrl + C2回入力

psコマンドとkillコマンドを使用してPIDを指定してプロセスをキルしNext.jsのサーバーを止める場合

ps -f
UID          PID    PPID  C STIME TTY          TIME CMD
devel      18484   18483  0 18:31 pts/0    00:00:00 -bash
devel      20648   18484  0 19:27 pts/0    00:00:00 npm run start
devel      20783   20648  0 19:27 pts/0    00:00:00 sh -c next start
devel      20784   20783  0 19:27 pts/0    00:00:01 next-server (v15.2.3)
devel      20813   18484 99 19:32 pts/0    00:00:00 ps -f

CMDnpm run startsh -c next startnext-server (バージョン)の行ののPIDを見つける

kill -9 20648 20783 20784

その他

この資料で解説はしませんが、Systemdsystemctl)やSupervisorを使用してNext.jsのサーバーをデーモン化する方法もあります。

Nginxにエラーページを追加

リバースプロキシを使用したことによって、Next.jsのサーバーが起動していない場合は502エラーが発生してしまいます。

そこで、502エラーやそれ以外のエラーが発生した場合自作したエラーページを表示させるようにします。

まずは、エラーページ用のhtmlを作成します。

sudo vi /var/www/html/custom_notfound.html

htmlの中身は以下をコピーして貼り付けをしてください。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Not Found</title>
  <script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100 flex items-center justify-center min-h-screen">
  <div class="text-center p-8 bg-white rounded-2xl shadow-lg max-w-md">
    <h1 class="text-6xl font-bold text-red-500 mb-4">Error</h1>
    <h2 class="text-2xl font-semibold text-gray-800 mb-2">ページが見つかりません</h2>
    <p class="text-gray-600 mb-6">
      お探しのページは存在しないか、移動された可能性があります。
    </p>
  </div>
</body>
</html>

次にNginxのnextjs.confにエラー時の設定を追加します。

sudo vi /etc/nginx/conf.d/nextjs.conf
server {
        listen 80;

        # 403, 404, 500, 502, 503エラーが発生した場合すべて404エラーとして処理を/custom_notfound.htmlのuriに変更する
+        error_page 403 404 500 502 503 =404 /custom_notfound.html;

        # uriが/custom_notfound.htmlの場合の処理
+        location /custom_notfound.html {
+                root /var/www/html;
+                internal;
+        }

        location / {
                proxy_pass http://localhost:3000;
                proxy_set_header Host $http_host;
        }
}

追加した設定を読み込ませます。

sudo systemctl reload nginx.service

Next.jsのsample-web-appのサーバーが起動していないことを確認してhttp://[サーバーIP]にアクセスすると以下のページが表示されます。

エラーページが確認できたらNext.jsのsample-web-appのサーバーを起動していつも通りに表示されるか確認します。

npm run start