nginx のインストールと設定

nginx

kobalab.net ではWebサーバに Apache を使用していましたが、今後WebSocketを使用したアプリを配置する可能性があることを考慮して、nginx に乗り換えました。Apacheで配信していたコンテンツは

  1. 静的コンテンツ (電脳麻将)
  2. CGIやSSIを使用したコンテンツ (トップページ*1XiuMai*2
  3. Node.js のサービスに連携するリバースプロキシ (LiuLian天鳳牌譜変換サーバ)

に分類できます。1 はnginxで直接配信、2 はnginxをリバースプロキシにしてApacheに連携*3、3 はnginxをリバースプロキシにして直接連携 としました。

インストール

$ sudo yum -y install nginx

起動

$ sudo systemctl enable nginx
$ sudo systemctl start nginx

f:id:xlc:20210327205521p:plain:w600

設定

設定ファイルは /etc/nginx/ に配置されているのでこれを修正します。

$ sudo nginx -t

で設定ファイルのチェックが行えます。

設定ファイルは http / server / location の階層構造になっており、http がWebサーバ全体*4server が仮想サーバ(HTTP/HTTSは仮想サーバ相当)、location がURLに対応します。

http / server まではメインの設定ファイルである nginx.conf に記述し、location はファイルを分けて記述するのがよいでしょう。

サーバ全体の設定

サーバ名

server レベルの server_name に設定します*5

http {
    server {
        listen       80;
        server_name  kobalab.net;
    }
}
ログフォーマット

http レベルに設定します。log_format でフォーマットを定義し、access_log で適用します。

http {
    log_format  common  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent';

    access_log  /var/log/nginx/access.log  common;
}
エラーページ

server レベルに設定します。デフォルトで設定されているカスタムのエラーページの出来が ひどすぎる ので、使わないようにします。

http {
    server {

        # error_page 404 /404.html;
        # location = /404.html {
        # }

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

SSLの設定

SSLの有効化

HTTPSに対応した server 内のコメントを外し、SSL証明書と秘密鍵の配置場所を設定します。

http {
    server {
        listen       443 ssl http2;
        server_name  kobalab.net;

        ssl_certificate "/etc/nginx/ssl/cert.pem";
        ssl_certificate_key "/etc/nginx/ssl/key.pem";
    }
}
非HTTPSのアクセスをリダイレクト

HTTP(HTTPSではない)に対応した server に設定します。

http {
    server {
        rewrite ^(.*)$ https://kobalab.net$1 permanent;
    }
}

静的コンテンツ配信の設定

location ごとに設定します。/majiang/home/www/majiang を割り当て、文字セットに utf-8 を指定し、CSSとJavaScriptはgzip圧縮して送信します*6

location /majiang {
    alias   /home/www/majiang;
    charset utf-8;
    gzip on;
    gzip_types text/css application/javascript;
}

リバースプロキシの設定

転送先に送信する追加ヘッダを定義する必要があります*7が、この設定は server レベルで行う必要があります。

http {
    server {
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}
Apacheへのリバースプロキシ

Apacheはポート 8080 で動作しているものとします。Apache側はおそらくはリバースプロキシからアクセスされることを想定していないので、nginxでのURLと ApacheでのURLは一致させた方がよいでしょう。圧縮や文字コードの指定はApacheに任せます。

トップページの場合。

location / {
    proxy_pass  http://127.0.0.1:8080;
}

XiuMaiの場合。

location /xiumai {
    proxy_pass  http://127.0.0.1:8080/xiumai;
}
Node製サービスへのリバースプロキシ

Node製のサービスは個別にサーバ化されているので基本的にURLは一致しません。なので書き方が微妙に異なります。locationproxy_pass の末尾の / に注意してください。

天鳳牌譜変換サーバの場合。

location /majiang/tenhou-log/ {
    proxy_pass  http://127.0.0.1:8001/tenhou-log/;
    gzip on;
    gzip_types application/json application/xml;
}

LiuLianの場合。

location /liulian/ {
    proxy_pass  http://127.0.0.1:3571/;
    gzip on;
    gzip_types text/plain text/css
               application/javascript application/json application/xml;
}

再起動

設定を反映するためにnginxを再起動します。

$ sudo systemctl restart nginx.service

*1:アクセスカウンタや新着情報はCGIの出力をSSIで取り込んでいる

*2:mod_perl で動作

*3:可能であればnginxで直接動作させたいが、気軽に雑なCGIが動かせる環境は残しておきたい

*4:nginxにはメールプロキシなどの機能もあるので、Web部分という意味

*5:名前ベースの仮想サーバを使わなければ設定しなくても可だが、HTTPSは名前ベースなのでHTTPSを使う場合は設定が必要

*6:HTMLは設定なしでも圧縮します

*7:Apacheのリバースプロキシ機能では、これらのヘッダ設定はいらず自動的に送信します