さくらのVPS(CentOS7)でnginxサーバを建てる

8 min read読了の目安(約7600字

既にたくさん記事がありそうですが、自分用の覚書を兼ねてまとめておきます。

さくらVPSのコンソール画面からOSインストール

昔一回立ててたらしいけどどういう状態だったか全然覚えてないので再インストールからやります。

CentOS8は2021年末でサポートが終了しちゃうらしいので、CentOS7で。

デフォルトだとポート22だけ許可されてますが、http/httpsも許可しておきましょう。
(追記:これ結局何の意味があるのかあんまり分からなかった……この後firewalldでアクセス許可するポートの設定を行います)

管理者ユーザの公開鍵も登録できるんですが、後でrootでのリモートログインを禁止するので、ここは登録せずで。

あとは画面の指示通りにポチポチやるとOSインストールできます。

サーバ初期設定

一般ユーザ作成

インストール時にrootユーザのパスワードを設定してるはずなので、そのパスワードでログイン。

$ ssh -l root <ホスト名>
root@<ホスト名>'s password:
Last login: Sat May 29 15:57:59 2021

SAKURA internet [Virtual Private Server SERVICE]

まずは一般ユーザを作ります。

# useradd kirk3110
# passwd kirk3110
ユーザー kirk3110 のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

作成した一般ユーザにsudo権限を与えます。wheelグループに入れてあげればOK。

# usermod -G wheel kirk3110
# groups kirk3110
kirk3110 : kirk3110 wheel
# ログアウト

一旦ログアウトして、以降の設定は一般ユーザで行います。

公開鍵認証の設定

一般ユーザで再ログインする前に、ローカルでSSH鍵を作成します。

$ ssh-keygen -t rsa -b 4096 -C <メールアドレス>
Generating public/private rsa key pair.

キーの置き場所を聞かれます。~/.ssh/id_rsaでよければそのままEnter。

Enter file in which to save the key (/Users/kirk3110/.ssh/id_rsa):

上書きしていい? って聞かれます。構わないのでエンター。困る場合はバックアップ取りましょう。

/Users/kirk3110/.ssh/id_rsa already exists.
Overwrite (y/n)? y

パスフレーズを設定すると鍵が作成されます。

Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/kirk3110/.ssh/id_rsa.
Your public key has been saved in /Users/kirk3110/.ssh/id_rsa.pub.
The key fingerprint is:
(略)

公開鍵が作成されていることを確認した上で、ssh-copy-idコマンドで公開鍵をリモートホスト上にコピーします。

$ cat .ssh/id_rsa.pub
ssh-rsa (略)
$ ssh-copy-id -i ~/.ssh/id_rsa.pub kirk3110@<ホスト名>
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/kirk3110/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
kirk3110@<ホスト名>'s password: ###パスワード入力###

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh 'kirk3110@<ホスト名>'"
and check to make sure that only the key(s) you wanted were added.

ログインしてみようとしたら怒られた。前も同名サーバに公開鍵認証で入ってたから、「同じサーバなのに公開鍵変わってるぞ!」って警告されてます。

$ ssh <host名>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
(略)

今回はもちろん自分で公開鍵変えただけなので問題なしです。
一旦このホストについては忘れてもらいます。ssh-keygen -Rコマンドで、known_hostsから当該ホストについての情報を削除することができます。

$ ssh-keygen -R <ホスト名>
/Users/kirk3110/.ssh/known_hosts updated.
Original contents retained as /Users/kirk3110/.ssh/known_hosts.old

今度は問題なくログインできました。

$ ssh <ホスト名>
Enter passphrase for key '/Users/kirk3110/.ssh/id_rsa': 
Last login: Sat May 29 16:02:11 2021 from XXXXXXXXXXXX

SAKURA internet [Virtual Private Server SERVICE]

rootログイン禁止・SSHポート変更

sudo権限を持つ一般ユーザでログインした状態で、sshd_configを編集します。

$ sudo vi /etc/ssh/sshd_config

デフォルトではrootログインが許可されているので、禁止します。

/etc/ssh/sshd_config
#PermitRootLogin yes
+ PermitRootLogin no

また、SSH接続のポートが22になってますが、これをwell-knownでないポート(49152〜65535)に変更します。

/etc/ssh/sshd_config
- Port 22
+ #Port 22
+ Port 50022

sshdサービスを再起動して設定を反映します。

$ systemctl restart sshd.service

締め出されたら怖いので、別のターミナルを立ち上げて、設定が意図通り反映されているか確認します。
まずrootログインができないことを確認。

$ ssh -l root <ホスト名>
ssh: connect to host <ホスト名> port 22: Connection refused

デフォルトの22番ポートでもログインできないことを確認。

$ ssh <ホスト名>

一般ユーザ+設定したポートならログインできることを確認。
大丈夫そうですね。

$ ssh <ホスト名> -p 50022
Enter passphrase for key '/Users/kirk3110/.ssh/id_rsa': 
Last login: Sat May 29 16:03:55 2021 from XXXXXXXXXXX

SAKURA internet [Virtual Private Server SERVICE]

(追記)firewalldの設定

CentOS7の標準ファイアウォールサービスであるfirewalldの設定を行います。
インストール時点ではOFFになっているようですので、起動してあげます。

$ systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
$ sudo systemctl start firewalld

すると締め出されます。
ssh接続ポートをデフォルトから変更していたためでした。

$ client_loop: send disconnect: Broken pipe

$ ssh <ホスト名> -p 50022
ssh: connect to host <ホスト名> port 50022: Connection refused

慌てず騒がず、さくらVPSのVNCコンソールを開きます。

rootユーザでログインします。

firewalldを有効化します。

# systemctl enable firewalld

firewalldの設定を確認します。
eth0インタフェースはゾーンpublicに所属しています。
publicゾーンは、今の所dhcpv6-clientとssh通信のみ許可しています。
ここで言うssh通信は20番portでの通信なので、先程firewalldを起動したときに50022番ポートでの接続は遮断されてしまったのでした。

# firewall-cmd --get-active-zones
public
  interfaces: eth0
# firewall-cmd --list-all --zone=public
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dhcpv6-client ssh
  ports:
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

ということで、50022番ポートでも接続できるようにしてあげます。
--add-portオプションで通信許可するポートを追加して再読み込みすると、リストに追加されていることが分かります。

# firewall-cmd --add-port=50022/tcp --zone=public --permanent
# firewall-cmd --reload
# firewall-cmd --list-all --zone=public
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dhcpv6-client ssh
  ports: 50022/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

この状態でVNCコンソールからログアウトし、再度ssh接続を試みると、無事に成功しました。

$ ssh <ホスト名> -p 50022
Enter passphrase for key '/Users/kirk3110/.ssh/id_rsa': 
Last login: Sat Jun  5 14:17:52 2021 from XXXXXXXXXXX

SAKURA internet [Virtual Private Server SERVICE]

ついでに、http/https接続も許可しておきましょう。
--add-serviceオプションで、通信許可するサービスを追加できます。

# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --add-service=https --zone=public --permanent
# firewall-cmd --reload
# firewall-cmd --list-all --zone=public
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dhcpv6-client http https ssh
  ports: 50022/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

nginxのインストール

yumリポジトリを追加します。

$ vim /etc/yum.repos.d/nginx.repo
/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

nginxをインストールします。

$ yum -y install nginx --enablerepo=nginx
(略)
インストール:
  nginx.x86_64 1:1.20.1-1.el7.ngx

完了しました!
$ nginx -v
nginx version: nginx/1.20.1

nginxを起動してみます。ついでに自動起動設定もします。

$ sudo systemctl start nginx
$ systemctl enable nginx.service

ブラウザからアクセスすると、例のnginxの画面が出てきます。

一旦ここまで。
次回はnginxサーバでJavaのWebアプリケーションを動かすところまでやりたいと思います。