Nginx セットアップ

date
Jun 6, 2024
slug
nginxSetup
status
Published
tags
nginx server setup
nginx
server setup
summary
Nginxの動静分離、圧縮、キャッシュ、ブラックリスト・ホワイトリスト、クロスオリジン、高可用性、パフォーマンス最適化に関する設定
type
Post

Nginx動静分離、圧縮、キャッシュ、ブラックリスト・ホワイトリスト、クロスオリジン、高可用性、パフォーマンス最適化...

引言

負荷分散の必要性

初期のビジネスは通常、単一ノードのデプロイメントに基づいていました。ビジネスの成長に伴い、トラフィックも増加し、単一サーバーの性能がビジネスの成長に追いつかなくなり、最終的にシステムが頻繁にダウンし、プロジェクトが利用できなくなるという問題が発生しました。負荷分散技術の導入によるメリットは以下の通りです。
  1. システムの高可用性:あるノードがダウンした場合、迅速に他のノードにトラフィックを転送できる。
  1. システムの高性能:複数のサーバーが共同でサービスを提供し、システム全体のスループットを向上させる。
  1. システムの拡張性:ビジネスが再び成長したり縮小したりする場合に、ノードを追加または削減して柔軟に対応できる。

負荷分散技術の選択肢

負荷分散技術には、ハードウェアとソフトウェアの2つの主要なオプションがあります。一般的なハードウェアロードバランサには、A10やF5などがありますが、これらは高価なため、通常は銀行や国有企業などの大企業で採用されます。
コストを抑えつつ負荷分散を実現したい場合、Nginxのようなソフトウェアベースの負荷分散が選択されます。この記事の重点もソフトウェア層の負荷分散です。

Nginxの概要

Nginxは、現在の主流の負荷分散ソリューションであり、ほとんどのプロジェクトで使用されています。Nginxは軽量で高性能なHTTPリバースプロキシサーバーであり、TCP、UDP、SMTP、HTTPSなどのほとんどのプロトコルをサポートする汎用プロキシサーバーでもあります。
Nginxは、リクエストの分散処理を担当し、各リクエストを適切なサーバーに転送します。Nginxの導入によって、システムのパフォーマンスと安定性が大幅に向上します。

Nginx環境の構築

  1. Nginxのディレクトリを作成し、そこに移動します:
    1. [root@localhost]# mkdir /soft && mkdir /soft/nginx/ [root@localhost]# cd /soft/nginx/
  1. Nginxのインストールパッケージをダウンロードします:
    1. [root@localhost]# wget <https://nginx.org/download/nginx-1.21.6.tar.gz>
  1. Nginxのパッケージを解凍します:
    1. [root@localhost]# tar -xvzf nginx-1.21.6.tar.gz
  1. 必要な依存ライブラリとパッケージをインストールします:
    1. [root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ gcc-c++ [root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ pcre pcre-devel [root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ zlib zlib-devel [root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ openssl openssl-devel
  1. Nginxのディレクトリに移動し、設定スクリプトを実行します:
    1. [root@localhost]# cd nginx-1.21.6 [root@localhost]# ./configure --prefix=/soft/nginx/
  1. Nginxをコンパイルしてインストールします:
    1. [root@localhost]# make && make install
  1. 設定ファイルを編集します:
    1. [root@localhost]# vi /soft/nginx/conf/nginx.conf
  1. 設定ファイルの内容を適用し、Nginxを起動します:
    1. [root@localhost]# sbin/nginx -c conf/nginx.conf
  1. ポート80を開放し、ファイアウォールを更新します:
    1. [root@localhost]# firewall-cmd --zone=public --add-port=80/tcp --permanent [root@localhost]# firewall-cmd --reload
  1. ブラウザでNginxのIPアドレスを入力してアクセスします:
      • Nginxのウェルカムページが表示されれば、インストールは完了です。

Nginxの高度な特性

動静分離

静的コンテンツ(HTML、CSS、JavaScript、画像など)と動的コンテンツ(PHP、Python、Node.jsなど)のリクエストを分離することで、サーバーのパフォーマンスを向上させることができます。

実装方法

  1. Nginxのディレクトリにstatic_resourcesディレクトリを作成します:
    1. mkdir /soft/nginx/static_resources
  1. プロジェクトの静的リソースをstatic_resourcesディレクトリにコピーし、プロジェクトからは削除します。
  1. nginx.confファイルに新しいlocationブロックを追加します:
    1. location ~ .*\\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ { root /soft/nginx/static_resources; expires 7d; }

リソース圧縮

Nginxは、ngx_http_gzip_moduleなどのモジュールを使用して、リソースの圧縮をサポートしています。これにより、帯域幅を節約し、応答速度を向上させることができます。

圧縮の設定

nginx.confファイルに以下の設定を追加します:
http { gzip on; gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png; gzip_comp_level 5; gzip_vary on; gzip_buffers 16 8k; gzip_disable "MSIE [1-6]\\."; gzip_http_version 1.1; gzip_min_length 2k; gzip_proxied off; }

キャッシュの設定

Nginxのプロキシキャッシュ機能を使用して、リクエストをキャッシュし、システムのスループットと応答速度を向上させることができます。

キャッシュの設定

nginx.confファイルに以下の設定を追加します:
http { proxy_cache_path /soft/nginx/cache levels=1:2 keys_zone=hot_cache:128m inactive=3d max_size=2g; server { location / { proxy_cache hot_cache; proxy_cache_valid 200 206 304 301 302 1d; proxy_cache_valid any 30m; proxy_cache_key $host$uri$is_args$args; proxy_cache_min_uses 3; proxy_cache_lock on; proxy_cache_lock_timeout 3s; proxy_no_cache $cookie_nocache $arg_nocache $arg_comment; add_header Cache-status $upstream_cache_status; } } }

IPブラックリスト・ホワイトリスト

特定のIPアドレスからのアクセスを許可または禁止するために、Nginxのallowおよびdenyディレクティブを使用します。

設定方法

  1. BlocksIP.confファイルに禁止するIPアドレスを追加します:
    1. deny 192.177.12.222; deny 192.177.44.201; deny 127.0.0.0/8;
  1. WhiteIP.confファイルに許可するIPアドレスを追加します:
    1. allow 192.177.12.222; allow 192.177.44.201; allow 127.45.0.0/16; deny all;
  1. nginx.confファイルにこれら
のファイルをインクルードします:
http { include /soft/nginx/IP/BlocksIP.conf; include /soft/nginx/IP/WhiteIP.conf; }

クロスオリジン設定

NginxでCORS(Cross-Origin Resource Sharing)を設定することで、異なるオリジンからのリクエストを許可します。

設定方法

nginx.confファイルに以下の設定を追加します:
location / { add_header 'Access-Control-Allow-Origin' *; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT'; add_header 'Access-Control-Allow-Headers' *; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; if ($request_method = 'OPTIONS') { add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; } }

高可用性の実現

Nginxの高可用性を実現するために、Keepalivedを使用して仮想IP(VIP)を設定し、マスターとバックアップのNginxインスタンスを設定します。

Keepalivedの設定

  1. Keepalivedのインストール:
    1. [root@localhost]# mkdir /soft/keepalived && cd /soft/keepalived [root@localhost]# wget <https://www.keepalived.org/software/keepalived-2.2.4.tar.gz> [root@localhost]# tar -zxvf keepalived-2.2.4.tar.gz
  1. Keepalivedの設定ファイルを編集:
    1. [root@localhost]# vi /soft/keepalived/etc/keepalived/keepalived.conf
  1. 主ノードの設定:
    1. vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 121 priority 100 nopreempt advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { check_nginx_pid_restart } virtual_ipaddress { 192.168.12.111 } }
  1. 従ノードの設定:
    1. vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 121 priority 90 nopreempt advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { check_nginx_pid_restart } virtual_ipaddress { 192.168.12.111 } }
  1. Nginxの再起動スクリプトを作成:
    1. [root@localhost]# mkdir /soft/scripts /soft/scripts/keepalived [root@localhost]# touch /soft/scripts/keepalived/check_nginx_pid_restart.sh [root@localhost]# vi /soft/scripts/keepalived/check_nginx_pid_restart.sh #!/bin/sh nginx_number=`ps -C nginx --no-header | wc -l` if [ $nginx_number -eq 0 ]; then /soft/nginx/sbin/nginx -c /soft/nginx/conf/nginx.conf sleep 1 if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then systemctl stop keepalived.service fi fi

パフォーマンス最適化

Nginxのパフォーマンスを最適化するために、以下の設定を行います。

長い接続を有効にする

長い接続を有効にすることで、サーバーとの接続回数を減らし、サーバーの負荷を軽減します。
upstream xxx { keepalive 32; keepalived_requests 100; keepalive_timeout 60s; }

ゼロコピー技術を有効にする

ゼロコピー技術を使用することで、データの転送効率を向上させます。
sendfile on;

ノンディレイと多パケット共送信を有効にする

ノンディレイと多パケット共送信を有効にすることで、データ転送の効率を向上させます。
tcp_nodelay on; tcp_nopush on;

ワーカーのプロセス数を調整する

サーバーのCPUコア数に応じてワーカーのプロセス数を調整します。
worker_processes auto; worker_rlimit_nofile 20000;

CPUアフィニティを有効にする

CPUアフィニティを使用して、各ワーカーを特定のCPUコアにバインドします。
worker_cpu_affinity auto;

epollモデルを使用する

epollモデルを使用することで、Nginxのパフォーマンスを向上させます。
events { use epoll; worker_connections 10240; }
 
 
記事に関する疑問があればお気軽にご連絡ください。