nginxサーバーの構築をしてみた

### はじめに
nginxサーバーを勉強のため、構築しました。

infracollegeで学びました。
https://infracollege.vamdemicsystem.black/linux/

nginxは外部からアクセスできる場所に配置し、
クライアントからアクセスが来たら、内部のサーバーに代理で中継する際に使用されます。

今回の構成は、クライアントが443ポートでnginxにアクセスした際に、
ドメインによって、nagiosサーバー又は、nginxのhttpdに中継する設定にしてます。

詳細は以下の構成図を参照してください。
### 構成図
クライアントがブラウザから「https\://192.168.0.3/test1/」にアクセスすると、
nginxサーバーがnagiosサーバー「http\://192.168.0.2/nagios/;」に中継します。

クライアントがブラウザから「https\://192.168.0.3/test2/」にアクセスすると、
nginxサーバーがhttpdサーバー「http\://192.168.0.3:9000/;」に中継します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/16cd934d-0157-c958-04f6-07f886d07276.png)


※ブリッジアダプタとは、外と通信できるネットワークです。
※内部ネットワークは、外と通信できないネットワークです。

### 前提条件
VirtualBoxで2台のゲストOSを作成する。
nginxサーバー/nagiosサーバー　CentOS7

nagiosサーバーの構築は、以下のサイトを参照してください
https://qiita.com/gama1234/items/6869d23c5bc287403f78

ネットワーク設定は設定は、以下のサイトを参照してください
https://qiita.com/gama1234/items/d857fe5941ad5519f04c


### nginxサーバーの構築手順
#### 便利なツールをインストール
ネットワーク関連のコマンドとコマンド補完等の便利なツールをインストールしました。
```
※ローカル端末のWSLからssh接続しました。
# yum -y install vim bash-completion net-tools bind-utils
```
#### SElinuxを停止
```
# vi /etc/selinux/config
※ファイルの中身です。

#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
#SELINUX=enforcing　　←SELINX有効をコメントアウトした。
SELINUX=disabled　　　←SELINX無効を設定した。
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted                                                                                                             "/etc/selinux/config" line 15 of 15 --100%-- col 1
```
#### サーバーを再起動した
```
[root@localhost ~]# reboot
Connection to 192.168.0.3 closed by remote host.
Connection to 192.168.0.3 closed.
```

#### EPELリポジトリ登録
nginxは、epelリポジトリにパッケージがあるため、
事前にepelリポジトリをインストールする必要があります。
```
# yum -y install epel-release

以下のリポジトリをインストールしました。
Installing : epel-release-7-11.noarch
```
#### nginxをインストールした
```
# yum --enablerepo=epel -y install nginx

以下のリポジトリをインストールしました。
Installed:
  nginx.x86_64 1:1.20.1-9.el7
[root@localhost ~]#
Dependency Installed:
  centos-indexhtml.noarch 0:7-9.el7.centos   gperftools-libs.x86_64 0:2.6.1-1.el7   nginx-filesystem.noarch 1:1.20.1-9.el7
  openssl11-libs.x86_64 1:1.1.1k-3.el7
```
#### nginxを起動した
nginxを起動した
```
# systemctl start nginx
```
nginxが起動したことを確認した。
```
# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2022-07-23 15:30:50 JST; 7s ago
  Process: 1282 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 1280 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 1279 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 1284 (nginx)
   CGroup: /system.slice/nginx.service
           ├─1284 nginx: master process /usr/sbin/nginx
           └─1286 nginx: worker process

Jul 23 15:30:50 localhost.localdomain systemd[1]: Starting The nginx HTTP and reverse proxy server...
Jul 23 15:30:50 localhost.localdomain nginx[1280]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Jul 23 15:30:50 localhost.localdomain nginx[1280]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Jul 23 15:30:50 localhost.localdomain systemd[1]: Started The nginx HTTP and reverse proxy server.
```
nginxをサーバー再起動時に、自動起動する設定にした
```
# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
```
#### ファイアウォールを許可した
httpとhttpsとポート9000を許可した
```
# firewall-cmd --add-service=http --permanent
# firewall-cmd --permanent --add-port=9000/tcp --zone=public --permanent
# firewall-cmd --add-service=https --permanent
```
ファイアウォール設定を反映させる
```
# firewall-cmd --reload
```
ファイアウォールのhttpが許可されていることを確認した
```
[root@nextcloud nginx]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: dhcpv6-client http https ssh
  ports: 9000/tcp 53/udp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```
#### ローカル端末からCentOSのページが表示されることを確認
ローカル端末からhttp\://192.168.0.3にアクセスして、CentOSのページが開くことを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/a0954196-83c8-6f9a-a2f7-a3ee6996e5bf.png)

#### SSL証明書を作成した
nginxのコンフィグファイルに、中間証明書を設定する箇所がないため、
サーバー証明書と中間証明書が別ファイルの場合、一つのファイルにする必要があります。


```
# openssl genrsa 2048 > server.key && openssl req -new -key server.key -subj "/C=JP/ST=Tokyo" -out server.csr && openssl x509 -days 3650 -req -signkey server.key -in server.csr -out server.crt

# ls -ltr
-rw-r--r--  1 root root 1679 Jul 23 16:37 server.key
-rw-r--r--  1 root root  903 Jul 23 16:37 server.csr
-rw-r--r--  1 root root 1001 Jul 23 16:37 server.crt
```
#### SSL証明書ファイルをnginxのフォルダへ移動した
```
# pwd
/root
[root@localhost ~]# ls -tlr
合計 16
-rw-------. 1 root root 1432  8月  6 10:17 anaconda-ks.cfg
-rw-r--r--  1 root root 1675  8月  6 11:47 server.key
-rw-r--r--  1 root root  903  8月  6 11:47 server.csr
-rw-r--r--  1 root root 1001  8月  6 11:47 server.crt
# mv server.* /etc/nginx/
# ls -ltr /etc/nginx/server.*
-rw-r--r-- 1 root root 1679 Jul 23 16:37 /etc/nginx/server.key
-rw-r--r-- 1 root root  903 Jul 23 16:37 /etc/nginx/server.csr
-rw-r--r-- 1 root root 1001 Jul 23 16:37 /etc/nginx/server.c
```
#### nginxサーバーでhttpdの設定をした
httpdをインストールした
```
yum install httpd
```
httpdファイルを開き、Lsten9000
```
vi /etc/httpd/conf/httpd.conf
[root@nextcloud conf]# sdiff -s httpd.conf httpd.confbk
Listen 9000                                                   | Listen 80
```
文法チェックとhttpdサービスを再起動した
```
httpd -t
Syntax OK
systemctl restart httpd
```
#### nginx設定ファイルを更新した
SSL証明書の準備が完了したため、nginxのメインファイル「/etc/nginx/nginx.conf」
を443で通信できる設定に変更した
・ポート番号を80から443に変更した
・先程作成したSSL証明書を設定した

事前に設定ファイルをバックアップした。
```
# cp -p /etc/nginx/nginx.conf /etc/nginx/nginx.confbk20220723
```
設定ファイルの以下の部分を修正した
```
vi /etc/nginx/nginx.conf
※一部設定ファイルの記述を省略
# Settings fornabled server.
#
    server {
        listen 443 ssl http2;
        listen       [::]:443 ssl http2;←　443に変更した
        server_name  192.168.0.3;　←自身のIPを設定した
        root         /usr/share/nginx/html;

        ssl_certificate "/etc/nginx/server.crt";←　SSL証明書を設定した
        ssl_certificate_key "/etc/nginx/server.key";←　SSL証明書の秘密鍵を設定した
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
　　　　※nagiosサーバーを設定した
        location /test1/{
           proxy_pass http://10.0.0.2/nagios/;
           proxy_set_header host $host;
        }
　　　　※httpdサーバーを設定した 9000ポートで設定した
         location /test2/{
           proxy_pass http://192.168.0.3:9000/;
           proxy_set_header host $host;
        }
        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

}

```
#### nginx設定ファイルの修正後と修正前の差分取得
左側が修正後で右側が修正前になります。
```
[root@nextcloud nginx]# sdiff -s nginx.conf nginx.confbk20220723
                                                              <
# Settings fornabled server.                                  <
#                                                             <
        listen 443 ssl http2;                                 |         listen       80;
        listen       [::]:443 ssl http2;                      |         listen       [::]:80;
        server_name  192.168.0.3;                             |         server_name  _;
        ssl_certificate "/etc/nginx/server.crt";              <
        ssl_certificate_key "/etc/nginx/server.key";          <
        ssl_session_cache shared:SSL:1m;                      <
        ssl_session_timeout  10m;                             <
        ssl_ciphers HIGH:!aNULL:!MD5;                         <
        ssl_prefer_server_ciphers on;                         <
                                                              <
                                                              |
        location /test1/{                                     <
           proxy_pass http://10.0.0.2/nagios/;             <
           proxy_set_header host $host;                       <
        }                                                     <
         location /test2/{                                    <
           proxy_pass http://192.168.0.3:9000/;               <
           proxy_set_header host $host;                       <
        }                                                     <
            location = /40x.html {                            |         location = /404.html {
            location = /50x.html {                            |         location = /50x.html {
}                                                             | # Settings for a TLS enabled server.
                                                              | #
                                                              > #    server {
                                                              > #        listen       443 ssl http2;
                                                              > #        listen       [::]:443 ssl http2;
                                                              > #        server_name  _;
                                                              > #        root         /usr/share/nginx/html;
                                                              > #
                                                              > #        ssl_certificate "/etc/pki/nginx/server.crt";
                                                              > #        ssl_certificate_key "/etc/pki/nginx/private/server.k
                                                              > #        ssl_session_cache shared:SSL:1m;
                                                              > #        ssl_session_timeout  10m;
                                                              > #        ssl_ciphers HIGH:!aNULL:!MD5;
                                                              > #        ssl_prefer_server_ciphers on;
                                                              > #
[root@nextcloud nginx]#
                                                              > #        include /etc/nginx/default.d/*.conf;
                                                              > #
                                                              > #        error_page 404 /404.html;
                                                              > #            location = /40x.html {
                                                              > #        }
                                                              > #
                                                              > #        error_page 500 502 503 504 /50x.html;
                                                              > #            location = /50x.html {
                                                              > #        }
                                                              > #    }
                                                              > }
[root@nextcloud nginx]#
```
### nginxの文法チェックをした
```
# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```
### nginx再起動する
```
[root@localhost nginx]# systemctl restart nginx
[root@localhost nginx]#
[root@localhost nginx]#
[root@localhost nginx]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2022-07-23 17:14:42 JST; 7s ago
  Process: 1452 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 1450 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 1449 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 1454 (nginx)
   CGroup: /system.slice/nginx.service
           ├─1454 nginx: master process /usr/sbin/nginx
           └─1456 nginx: worker process

Jul 23 17:14:41 localhost.localdomain systemd[1]: Stopped The nginx HTTP and reverse proxy server.
Jul 23 17:14:41 localhost.localdomain systemd[1]: Starting The nginx HTTP and reverse proxy server...
Jul 23 17:14:42 localhost.localdomain nginx[1450]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Jul 23 17:14:42 localhost.localdomain nginx[1450]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Jul 23 17:14:42 localhost.localdomain systemd[1]: Started The nginx HTTP and reverse proxy server.
```
### nginxのサーバーのポートの状態を確認した
9000ポートと443のポートで待ち受けています。
```
# netstat -an | grep LISTEN
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp6       0      0 :::9000                 :::*                    LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN

netstatコマンドでは、ポートの状態が分かりにくいため、nmapコマンドを実行した
# nmap 10.0.0.1
Starting Nmap 6.40 ( http://nmap.org ) at 2022-08-07 07:41 JST
Nmap scan report for 10.0.0.1
Host is up (0.0000060s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
443/tcp  open  https
9000/tcp open  cslistener

# netstat -an | grep EST
tcp        0      0 192.168.0.3:22          192.168.0.14:54170      ESTABLISHED
```
### nagiosサーバーのポートの状態を確認した。
80ポートと22ポートが開いていることを確認した。
また、以下からnginxサーバー経由でnagiosにssh接続を確認した。
```
# netstat -an | grep LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN
tcp6       0      0 :::80                   :::*                    LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
tcp6       0      0 ::1:25                  :::*                    LISTEN                  :::*                    LISTEN

netstatコマンドでは、ポートの状態が分かりにくいため、nmapコマンドを実行した
# nmap 10.0.0.2
Starting Nmap 7.92 ( https://nmap.org ) at 2022-08-07 07:34 JST
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 10.0.0.2
Host is up (0.0000060s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

現在接続中のポートを確認した
# netstat -an | grep EST
tcp        0      0 10.0.0.2:22             10.0.0.1:55240          ESTABLISHED
```

ブラウザからnagiosサーバーへアクセスした
https:\//192.168.0.3/test1/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/bdbcd878-5413-76bd-e6fb-564a5d5dafa1.png)

ブラウザからhttpdサーバーへアクセスした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/53703c03-719d-e1a8-d1bd-4bed5011df8f.png)

### アクセスログを確認した
nginxサーバーに入って、nagiosとhttpdのアクセスログを確認した。
```
# less /var/log/nginx/access.log
192.168.0.14 - - [07/Aug/2022:07:04:49 +0900] "GET /test1/ HTTP/2.0" 401 381 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36" "-"
192.168.0.14 - nagiosadmin [07/Aug/2022:07:04:56 +0900] "GET /test1/ HTTP/2.0" 200 1055 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36" "-"

#httpdにアクセスした際のログです。
192.168.0.14 - - [07/Aug/2022:07:14:47 +0900] "GET /test2/noindex/css/open-sans.css HTTP/2.0" 200 5081 "https://192.168.0.3/test2/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Saf
```
nagiosサーバーに入って、アクセスログを確認した。
```
#less /etc/httpd/logs/access_log
10.0.0.1 - nagiosadmin [07/Aug/2022:07:44:55 +0900] "GET /nagios/main.php HTTP/1.0" 200 7401 "https://192.168.0.3/test1/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
```
### まとめ
nginxサーバーを実際に構築して、ざっくりと仕組みが分かりました。
nginxサーバーはよく使用されるため、知識として知っていたら役に立つと思います。
私の記事を参考して頂けたら幸いです。