CentOS8にNginx+SSL化してdaemonにリバースプロキシで動かす

ひさしぶりに素のCentOS8.2にnginxで環境設定する機会があったので流れまとめました。
やりたいことは、デーモンソフトウェアを起動しそのポートにnginxでリバースプロキシ（ssl）でアクセスするというものです。


# Nginx

素のOSなのでWebサーバーがありません。
Webサーバーはnginxを使いたかったので、まずはnginxをインストールします。

## Nginxリポジトリを設定する

nginxのリポジトリを指定します。

```
vi /etc/yum.repos.d/nginx.repo
```

```
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
```

## リポジトリパッケージの確認とインストール  

リポジトリの情報に間違いがないか確認してください。

```
$ yum info nginx
```

問題なければインストールします。

```
$ yum -y install nginx
```

インストールできたらバージョンを確認してみましょう。

```
$ nginx -v
nginx version: nginx/1.18.0
```

## Nginxのサービスを自動化

サーバーが起動したら自動的にnginxを起動するように設定しておきます。
（設定していないと、サーバーが終了する度に再度nginxを起動させなくてはならなくなります）

```
$ systemctl enable nginx
```

いよいよnginxを起動します。

```
$ systemctl start nginx
```

nginx起動後、ドメインやIPアドレスを叩いてブラウザに「Welcome to nginx!」が表示されれば成功です。
ちなみにデフォルトのnginxのドキュメントルートは以下のとおりです。

```
/usr/share/nginx/html/index.html
```

もしうまく動かなったら以下を参考に。

[nginx に繋がらない場合の確認方法・調査方法とコマンド解説
](https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=2841)

[【Nginx】portが占領されてサーバーが起動できないときの対処法](https://qiita.com/ngron/items/55a84ef6abce903c4424)

[ポートを握っているプロセスを見たい時](https://qiita.com/ionis_h/items/21cd094136c45ad98b44)

# ファイアーウォール

## firewalld

CentOS7から導入された管理コマンド「firewall-cmd」を使っていきます。
まずは現状のステータスを確認しましょう。

```
$ firewall-cmd --state
```

ステータスがrunningになっていなければ、ファイアウォールを起動します。
ついでに自動起動も設定しておきます。

```
$ systemctl enable firewalld
$ systemctl status firewalld
```

もしすでにmaskされていた場合でファイアーウォールが起動しないケースでは、unmaskしたあとに再度起動してみてください。

```
$ systemctl unmask firewalld 
$ systemctl status firewalld
```

### デフォルトゾーンの確認

firewalldにはゾーンという考え方があります。
いくつかのルールをまとめた雛形が予め用意されているのですが、デフォルトで割り当てられているゾーンを確認しましょう。

```
$ firewall-cmd --get-default-zone
public
```

デフォルトでは「public」ゾーンが割当られています。
servicesをみるとsshなどが設定されているので、sshのポートがあいていることなります。

```
$ firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```

### ポートの追加

http（80）やhttps（443）も開通しておきましょう。
publicゾーンに以下を追加します。

```
$ firewall-cmd --add-service=http --zone=public --permanent
$ firewall-cmd --add-service=https --zone=public --permanent
```

設定変更したあとは、リロードしておきます。

```
$ firewall-cmd --reload
```

その他、連続したポートを開けたい場合の例です。

```
$ firewall-cmd --add-port=100-1000/udp --zone=public --permanent
```

# デーモンソフトウェアのインストールと起動

今回は、あるデーモンソフトウェアを使いました。
デーモンソフトウェアのインストールは以下で行いました。

```
$ cd /usr/local/bin
```

今回のデーモンソフトウェアは5000番ポートで起動するようになっています。
後にnginxの設定で5000番ポートにリバースプロキシすることで、nginxを前段においてデーモンプロセスにアクセスすることができます。

ユニットファイルを作れば、ソフトウエアのOSの起動合わせて自動起動（`systemctl enable`設定）などができるようになりますのでやってみてください。
https://tex2e.github.io/blog/linux/create-my-systemd-service


# SSL化

DNSを割り当てたあと、ssl化したい場合の手順です。
snapインストール > certbotインストール＆設定 > nginxの設定ファイルの更新の流れで設定します。

## snapのインストール

certbotインストール用のツールを以下の手順にしたがってインストールします。

https://snapcraft.io/docs/installing-snap-on-centos

## certbotのインストール

snapを使ってcertbotをインストールしてください。
証明書がインストールされます。

https://certbot.eff.org/lets-encrypt/centosrhel8-nginx

## nginxの設定

nginxの設定ファイルを修正します。

設定方法はこちら。
https://qiita.com/morrr/items/7c97f0d2e46f7a8ec967

```
$ vim /etc/nginx/conf.d/default.conf
```


デーモンソフトウェアは5000番で動いているので、`https://test.example.com`に対して5000番ポートにリバースプロキシしてやることで、nginx経由でデーモンソフトウェアを動かすことができます。


```
server {

        listen 443 ssl default_server;

        index index.html index.htm;

        server_name test.example.com;

        location / {
                proxy_pass http://127.0.0.1:5000;
        }
}
```

confファイルの確認

```
$ nginx -t
```

エラーが起きてなければnginxを再起動します。

```
$ systemctl restart nginx
```

ドメインにアクセスしてデーモンソフトウェアが処理されることを確認します。

# 番外編（selinuxの無効化）

selinuxが有効になっていると、サービスが動作しない原因になることがあるので、基本的には無効化しておきます。

```
$ getenforce
Enforcing
```

```
vim /etc/selinux/config
```

```:config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
```

disabledに設定することでoffにできます。

```
SELINUX=disabled
```

サーバーの再起動。

```
reboot
```