OCI Compute インスタンスに Nginx をインストール

本ブログは、[オラクル・クラウドの個人ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)の1つです。

# 初めに
今回は、各種な <font color=blue>OCI</font> (Oracle Cloud Infrastruture) <font color=blue>Compute</font>インスタンスに、Nginxをインストールする方法を紹介します。本記事の最後に、Cloud-initスクリプトを提供しています。インスタンス作成時、それらを追加していただければ、インスタンス作成後、Nginxが利用できる状態となります。


__検証環境__
リージョン：東京
インスタンス OS: Oracle Linux <strong>9</strong>, CentOS <strong>8</strong>, Ubuntu <strong>22</strong>, Windows Server <strong>2022</strong>

__目次__
- [1. Oracle Linux 9 に Nginx をインストール](#1-oracle-linux-9-に-nginx-をインストール)
- [2. CentOS 8 に Nginx をインストール](#2-centos-8-に-nginx-をインストール)
- [3. Ubuntu 22 に Nginx をインストール](#3-ubuntu-22-に-nginx-をインストール)
- [4. Windows Server 2022 に Nginx をインストール](#4-windows-server-2022-に-nginx-をインストール)
- [付録 - Cloud-init スクリプト](#付録---cloud-init-スクリプト)
  - [Oracle Linux の場合](#oracle-linux-の場合)
  - [CentOS の場合](#centos-の場合)
  - [Ubuntu の場合](#ubuntu-の場合)
  - [Windows の場合](#windows-の場合)

# 1. Oracle Linux 9 に Nginx をインストール
この方法は、Oracle Linux 7 および 8 にも適用できます。
__コマンドの実行__
```bash
sudo yum update -y
sudo yum install nginx -y
```

__バージョンの確認__
```bash
[opc@oracle-linux-9 ~]$ sudo nginx -v
nginx version: nginx/1.20.1
```

__サービスを有効にし、Nginxを起動する__
```bash
[opc@oracle-linux-9 ~]$ sudo systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service ¨ /usr/lib/systemd/system/nginx.service.
[opc@oracle-linux-9 ~]$ sudo systemctl start nginx
[opc@oracle-linux-9 ~]$
```

__ステータスの確認__
ステータスが、`Active: active (running)`になっていることを確認します。
```bash
[opc@oracle-linux-9 ~]$ sudo 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 Fri 2022-11-04 10:00:52 GMT; 6s ago
......
```

__TCP ポートを開く__
HTTP ポート (80) のコマンド例：
`sudo firewall-cmd --permanent --add-port=80/tcp`

```bash
[opc@oracle-linux-9 ~]$ sudo firewall-cmd --permanent --add-port=80/tcp
success
[opc@oracle-linux-9 ~]$ sudo firewall-cmd --reload
success
[opc@oracle-linux-9 ~]$ sudo firewall-cmd --list-ports
80/tcp
```

__接続テスト__
Web ブラウザを開き、URL ボックスに`http://<ip_address>`と入力すると、次のようなテスト・ページが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/a8618e54-ce65-85e4-743d-4f9ef5e317dc.png)


# 2. CentOS 8 に Nginx をインストール
インストールおよび起動コマンドは、Oracle Linux と同じです。
__コマンドの実行__
```bash
sudo yum update -y
sudo yum install nginx -y
sudo nginx -v
```

__サービスを有効にし、Nginxを起動する__
ステータスが、Active: active (running)になっていることを確認します。
```bash
[opc@centos8 ~]$ sudo systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service ¨ /usr/lib/systemd/system/nginx.service.
[opc@centos8 ~]$ sudo systemctl start nginx
[opc@centos8 ~]$ sudo 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 Fri 2022-11-04 12:10:55 GMT; 4s ago
......
```

__HTTPインプットの許可__
HTTP ポート (80) のコマンド例：
`sudo iptables -I INPUT -p TCP --dport 80 -j ACCEPT`
```bash
[opc@centos ~]$ sudo iptables -I INPUT -p TCP --dport 80 -j ACCEPT
[opc@centos ~]$ sudo iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
2    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED,DNAT
3    ACCEPT     all  --  anywhere             anywhere
4    INPUT_direct  all  --  anywhere             anywhere
5    INPUT_POLICIES_pre  all  --  anywhere             anywhere
6    INPUT_ZONES_SOURCE  all  --  anywhere             anywhere
7    INPUT_ZONES  all  --  anywhere             anywhere
8    INPUT_POLICIES_post  all  --  anywhere             anywhere
9    DROP       all  --  anywhere             anywhere             ctstate INVALID
10   REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
11   ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
12   ACCEPT     icmp --  anywhere             anywhere
13   ACCEPT     all  --  anywhere             anywhere
14   ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
15   REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
[opc@centos ~]$
```

__接続テスト__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/8f3afc74-a666-787b-eed6-c99240473f31.png)


# 3. Ubuntu 22 に Nginx をインストール
__コマンドの実行__
```bash
sudo apt update -y
sudo apt install nginx -y
sudo nginx -v
```
`curl http://localhost`でNginxが起動しているのを確認します。
```bash
ubuntu@ubuntu:~$ curl http://localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
......
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
ubuntu@ubuntu:~$
```

ここまで、Nginx のインストールは成功しましたが、まだ外部からアクセスできません。 HTTP/HTTPSでのインプットを許可するには、次のコマンドを使用して iptables を編集する必要があります。

__HTTPインプットの許可__
HTTP ポート (80) のコマンド例：
`sudo iptables -I INPUT -p TCP --dport 80 -j ACCEPT`

```
ubuntu@ubuntu:~$ sudo iptables -I INPUT -p TCP --dport 80 -j ACCEPT
ubuntu@ubuntu:~$ sudo iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
2    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
3    ACCEPT     icmp --  anywhere             anywhere
4    ACCEPT     all  --  anywhere             anywhere
5    ACCEPT     udp  --  anywhere             anywhere             udp spt:ntp
6    ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
7    REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
ubuntu@ubuntu:~$
```

__接続テスト__
Web ブラウザを開き、URL ボックスに`http://<ip_address>`と入力すると、次のようなウェルカム・ページが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/a3a2df92-41ae-41d7-6d20-b09564340091.png)

# 4. Windows Server 2022 に Nginx をインストール
[ここ](http://nginx.org/en/download.html)から Windows 版の Nginx をダウンロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ba7bebbf-c2d1-7439-2b0e-205306f3df51.png)

ダウンロード後、`nginx-1.23.3.zip`を解凍します。解凍後、`nginx.exe`をダブルクリックして起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/4edf81f6-20f9-8855-d7bd-02a446f7ebb3.png)
ローカルのWEBブラウザを開き、`localhost`を入力したら、次のようなウェルカム・ページが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/3670cdbf-7741-af68-b1b0-97d1a720bc80.png)
外部から接続する場合、<strong>TCPポート80</strong> (SSLの場合は443) の許可は必要です。この時点まだ実施していませんので、外部からアクセスできない状態です。

TCPポート80を許可するのに、`Windows Defender Firewall`より実施してもよいし、PowerShellで以下のコマンドを実施してもよいです。
コマンド例：
```powershell
New-NetFirewallRule -DisplayName "ALLOW TCP PORT 80" -Direction inbound -Profile Any -Action Allow -LocalPort 80 -Protocol TCP
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/1cb5bbfd-7624-8d34-c47b-aacf9965df55.png)
許可後、外部からパブリックIPか、DNS名で接続したら、ウェルカム・ページが表示されます（省略）。

# 付録 - Cloud-init スクリプト
Computeインスタンスを作成する時に、cloud-init スクリプトを追加すれば、Nginx を自動的にインストールできます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c8c71f67-fed1-6816-b0f0-63a72083c388.png", width="600">

## Oracle Linux の場合
__Cloud-init スクリプト__
```bash
#!/bin/bash
yum update -y
yum install nginx -y
systemctl enable nginx
systemctl start nginx
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
```

## CentOS の場合
__Cloud-init スクリプト__
```bash
#!/bin/bash
yum update -y
yum install nginx -y
systemctl enable nginx
systemctl start nginx
iptables -I INPUT -p TCP --dport 80 -j ACCEPT
```

## Ubuntu の場合
__Cloud-init スクリプト__
```bash
#!/bin/bash
apt update -y
apt install nginx -y
iptables -I INPUT -p TCP --dport 80 -j ACCEPT
```

## Windows の場合
__Cloud-init スクリプト__
```powershell
#ps1_sysnative
net user opc "<NewPasswd>"

${nginx_path} = "C:\Nginx\"
${nginx_ver} = "nginx-1.23.3"
${nginx_zip} = ${nginx_ver} + ".zip" # nginx-1.23.3.zip

${download_url} = "http://nginx.org/download/" + ${nginx_zip}

${nginx_full_path} = ${nginx_path} + ${nginx_ver} # "C:\Nginx\nginx-1.23.3"
${nginx_local_zip} = ${nginx_path} + ${nginx_zip} # "C:\Nginx\nginx-1.23.3.zip"

New-Item $nginx_path -itemType Directory
Invoke-WebRequest -Uri ${download_url} -OutFile ${nginx_local_zip}
Expand-Archive -Path ${nginx_local_zip} -DestinationPath ${nginx_path}
New-NetFirewallRule -DisplayName "ALLOW TCP PORT 80" -Direction inbound -Profile Any -Action Allow -LocalPort 80 -Protocol TCP
cd ${nginx_full_path}
start nginx
```
以上

----
__改訂歴__
2022年11月：初版作成
2023年03月：「Windows Server 2022 に Nginx をインストール」を追加

----
__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)
[OCIでNginxのDockerイメージを利用する](https://qiita.com/liu-wei/items/4ec173280cb32fb5e31a)
[OCI コンテナ・インスタンスでNginxコンテナを実行する](https://qiita.com/liu-wei/items/19b03223e03d82818e7c)
[コマンドで各種のOSにHTTPサーバをインストール](https://qiita.com/liu-wei/items/594714eb8de4df498120)