nginx.confの解説、書き方

# 経緯
nginxの設定ファイルを書こうとするとテンプレートはいっぱい出てきます。しかし、雰囲気で使っていたため、おさらいです。

# nginxとは？
nginxの基本的な特徴は以下の記事にまとめています。

https://qiita.com/ponponnsan/items/9a224d5692747fe1eb5e

# nginxで使うファイル名と保存先

以下のようになります。

![スクリーンショット 2024-04-17 13.07.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/6beaf8bc-ea52-13fd-1c62-3b3112dd8a6c.png)

dockerで見るとerror.log、重くてみれないんですよね...
`/user/share/nginx/html/`や`/var/www/html/`は他サービスとの共有フォルダみたいなイメージを持っています。

# nginx.confの解説
基本的なconf設定について解説していきます。

```nginx.conf
server {
    # 80番ポート(http)でリクエストを受け付ける
    listen       80;
    # ドメイン名の指定
    server_name  localhost;

    location / {
        # リクエストされた際にドキュメントがある場所を指定
        root   /usr/share/nginx/html;
        # リクエストを受けた際に提供するファイル名
        index  index.html index.htm;
    }

    # エラーコードが発生した際に表示するURIの指定
    error_page   500 502 503 504  /50x.html;
    # "/50x.html"ページへ内部リダイレクト
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

```

## listen
ipアドレスやポート番号、unixドメインソケットを設定できます。

ipアドレスを指定する際は、以下のように設定できます。

```
listen IPアドレス:ポート番号;
```
ipv6の場合は、角括弧で囲みます。

```
listen [2001:db8:dead:beef::1]:80;
```

ポート番号で設定する際は以下のように設定します。
```
listen ポート番号;
```

unixドメインソケットの場合は以下です。

```
listen unix:/var/run/nginx.sock;
```

## server_name
アクセスする際のホスト名と一致したserver_nameの設定が適応されます。

一つのサーバーだけを指定する際は以下のように記載します。
```
server_name example.com;
```
複数のサーバー名を記述する際には次のようにします。
```
server_name example.com www.example.com;
```
サブドメインにすべて一致させる場合は以下のようにします
```
server_name *.example.com;
server_name .example.com;
```

## location

URIのパス毎の設定ができます。このパスの条件に一致した場合に、location以下の設定が適応されます。

```
location / {
    root   /usr/share/nginx/html;
    index  index.html index.html;
}
```

### プレフィックス
locationでは、URIのパスの前に4種類のプレフィックスをつけることができます。

![スクリーンショット 2024-04-17 15.19.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/6b0276f5-c4f7-cd3f-8034-6b49783fa3f0.png)

また、優先順序もありますが、ここでは扱いません。
以下の記事が詳しく説明しています。

https://heartbeats.jp/hbblog/2012/04/nginx05.html

### root
ドキュメントルートのディレクトリを指定します。上記の例では/usr/share/nginx/htmlがドキュメントルートとなります。

### index
リクエストのURIが"/"で終わっている時にindexとして使われるファイル名を指します。
デフォルトの設定値は`index  index.html index.htm;`であり、`index.html`パスに追加され、そのパス内部へリダイレクトします。

次のような設定では、リクエストパスが"/example/"の際に`index.html`というファイルが存在すれば、`/example/index.html`に内部ダイレクトします。`index.html`が存在せず、index.phpが存在すれば、`/example/index.php`に内部ダイレクトします。

設定の一番右に、"/"で始まるファイル名のパスを書くと、ファイルが存在しなかったときにフォールバックするURIのパスになります。index.htmlやindex.phpが存在しなかったら、`/index.php`にリダイレクトします。

```
location /example/ {
    index index.html index.php /index.php;
}
```

## error_page

```
error_page コード ... [=[レスポンスコード]] uri;
```
コードには300〜599までの数値を記述できます。

リダイレクト先には、外部のURIを指定することもできます。

```
error_page 500 502 503 504 http://example.jp/sorry.html;
```

また、アクセス制限により、アクセスが拒否された場合に表示するページを用意する場合にも使えます。
```
error_page 403 /forbidden.html
location = /forbidden.html {
    internal;
    allow all;
}
```

# IPアドレスによる制限

ファイアーウォールで制御するIPアドレスですが、nginxでも同様のことができます。

```
location / {
    deny   <deny ip address>;
    allow  <allow ip address>;
    deny   all;
}
```
以下の例だと、許可されているIPアドレス以外からのアクセスでは、403というステータスコードが表示されてアクセスできません。

```
location /secret-page {
    deny all
    allow <allow ip address>;
    root /var/www/html/secret;
    index index.html
}
```

# 参考文献

https://www.cfxlog.com/nginx/#rtoc-13

https://heartbeats.jp/hbblog/2012/04/nginx04.html

https://heartbeats.jp/hbblog/2012/04/nginx05.html