kobalab.net ではWebサーバに Apache を使用していましたが、今後WebSocketを使用したアプリを配置する可能性があることを考慮して、nginx に乗り換えました。Apacheで配信していたコンテンツは
に分類できます。1 はnginxで直接配信、2 はnginxをリバースプロキシにしてApacheに連携*3、3 はnginxをリバースプロキシにして直接連携 としました。
インストール
$ sudo yum -y install nginx
起動
$ sudo systemctl enable nginx $ sudo systemctl start nginx
設定
設定ファイルは /etc/nginx/ に配置されているのでこれを修正します。
$ sudo nginx -t
で設定ファイルのチェックが行えます。
設定ファイルは http / server / location の階層構造になっており、http がWebサーバ全体*4、server が仮想サーバ(HTTP/HTTSは仮想サーバ相当)、location がURLに対応します。
http / server まではメインの設定ファイルである nginx.conf に記述し、location はファイルを分けて記述するのがよいでしょう。
サーバ全体の設定
ログフォーマット
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は一致しません。なので書き方が微妙に異なります。location と proxy_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