Nginx セットアップ
date
Jun 6, 2024
slug
nginxSetup
status
Published
tags
nginx server setup
nginx
server setup
summary
Nginxの動静分離、圧縮、キャッシュ、ブラックリスト・ホワイトリスト、クロスオリジン、高可用性、パフォーマンス最適化に関する設定
type
Post
Nginx動静分離、圧縮、キャッシュ、ブラックリスト・ホワイトリスト、クロスオリジン、高可用性、パフォーマンス最適化...
引言
負荷分散の必要性
初期のビジネスは通常、単一ノードのデプロイメントに基づいていました。ビジネスの成長に伴い、トラフィックも増加し、単一サーバーの性能がビジネスの成長に追いつかなくなり、最終的にシステムが頻繁にダウンし、プロジェクトが利用できなくなるという問題が発生しました。負荷分散技術の導入によるメリットは以下の通りです。
- システムの高可用性:あるノードがダウンした場合、迅速に他のノードにトラフィックを転送できる。
- システムの高性能:複数のサーバーが共同でサービスを提供し、システム全体のスループットを向上させる。
- システムの拡張性:ビジネスが再び成長したり縮小したりする場合に、ノードを追加または削減して柔軟に対応できる。
負荷分散技術の選択肢
負荷分散技術には、ハードウェアとソフトウェアの2つの主要なオプションがあります。一般的なハードウェアロードバランサには、A10やF5などがありますが、これらは高価なため、通常は銀行や国有企業などの大企業で採用されます。
コストを抑えつつ負荷分散を実現したい場合、Nginxのようなソフトウェアベースの負荷分散が選択されます。この記事の重点もソフトウェア層の負荷分散です。
Nginxの概要
Nginxは、現在の主流の負荷分散ソリューションであり、ほとんどのプロジェクトで使用されています。Nginxは軽量で高性能なHTTPリバースプロキシサーバーであり、TCP、UDP、SMTP、HTTPSなどのほとんどのプロトコルをサポートする汎用プロキシサーバーでもあります。
Nginxは、リクエストの分散処理を担当し、各リクエストを適切なサーバーに転送します。Nginxの導入によって、システムのパフォーマンスと安定性が大幅に向上します。
Nginx環境の構築
- Nginxのディレクトリを作成し、そこに移動します:
[root@localhost]# mkdir /soft && mkdir /soft/nginx/ [root@localhost]# cd /soft/nginx/
- Nginxのインストールパッケージをダウンロードします:
[root@localhost]# wget <https://nginx.org/download/nginx-1.21.6.tar.gz>
- Nginxのパッケージを解凍します:
[root@localhost]# tar -xvzf nginx-1.21.6.tar.gz
- 必要な依存ライブラリとパッケージをインストールします:
[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
- Nginxのディレクトリに移動し、設定スクリプトを実行します:
[root@localhost]# cd nginx-1.21.6 [root@localhost]# ./configure --prefix=/soft/nginx/
- Nginxをコンパイルしてインストールします:
[root@localhost]# make && make install
- 設定ファイルを編集します:
[root@localhost]# vi /soft/nginx/conf/nginx.conf
- 設定ファイルの内容を適用し、Nginxを起動します:
[root@localhost]# sbin/nginx -c conf/nginx.conf
- ポート80を開放し、ファイアウォールを更新します:
[root@localhost]# firewall-cmd --zone=public --add-port=80/tcp --permanent [root@localhost]# firewall-cmd --reload
- ブラウザでNginxのIPアドレスを入力してアクセスします:
- Nginxのウェルカムページが表示されれば、インストールは完了です。
Nginxの高度な特性
動静分離
静的コンテンツ(HTML、CSS、JavaScript、画像など)と動的コンテンツ(PHP、Python、Node.jsなど)のリクエストを分離することで、サーバーのパフォーマンスを向上させることができます。
実装方法
- Nginxのディレクトリに
static_resources
ディレクトリを作成します:
mkdir /soft/nginx/static_resources
- プロジェクトの静的リソースを
static_resources
ディレクトリにコピーし、プロジェクトからは削除します。
nginx.conf
ファイルに新しいlocation
ブロックを追加します:
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
ディレクティブを使用します。設定方法
BlocksIP.conf
ファイルに禁止するIPアドレスを追加します:
deny 192.177.12.222; deny 192.177.44.201; deny 127.0.0.0/8;
WhiteIP.conf
ファイルに許可するIPアドレスを追加します:
allow 192.177.12.222; allow 192.177.44.201; allow 127.45.0.0/16; deny all;
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の設定
- Keepalivedのインストール:
[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
- Keepalivedの設定ファイルを編集:
[root@localhost]# vi /soft/keepalived/etc/keepalived/keepalived.conf
- 主ノードの設定:
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 } }
- 従ノードの設定:
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 } }
- Nginxの再起動スクリプトを作成:
[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; }