nginx 設定ファイルの ドメイン別分割 と 最適化

Webサーバー サイトの構築
nginx 設定ファイル ドメイン別分割 と 最適化
 
複数のドメインで、SSL化やWWWの正規化を行うと、nginx の設定ファイル『default.conf』における「server」ブロックの記述が多くなり、長くて見にくくなってきた。
 
nginxの設定ファイルと、ドメイン別分割設定の概念
 
以下、nginxの設定ファイルの見直しとドメイン別分割を行った記録。
 
 

 

スポンサー リンク

 

 
 
 
 
 
1. Webサーバーの環境とドメイン構成
 
NginxでWebサーバーを構築し、3つのドメインを運用している。
「WordPress」の稼働環境
 
2つのサブディレクトリは、WordPressによるブログサイトで、それぞれ個別に取得したドメイン名になっている。
 
最近、Raspberry Pi や基盤ソフトのアップグレードを行う機会が増え、nginxの設定ファイルを頻繁に調整する必要に迫られる。
 
 
バーチャルホストとは
一台のサーバーで、仮想的に複数のドメインを運用するサーバー技術で、利用するドメインすべてが同じIPアドレスを使用するが、ドメイン名でアクセスできるので、あたかも複数のサーバで運用しているように見える。
 
 
 
 
2. nginxの設定ファイルとファイルの分割
 
nginx.confの、記述構成。
nginx.confの構成
 
nginxの設定ファイルと、ドメイン別分割の概念。
 
【nginx.conf】での【server】ディレクティブ設定を「conf.d」フォルダに外出しにし、且つ、【server】ディレクティブをドメイン名別にする。
 
nginxの設定ファイルと、ドメイン別分割の概念
 
 
【server】ディレクティブ(default.conf)の、記述構成。
serverディレクティブ(default.conf)の、記述構成
 
さらに、【location】ディレクティブを外出しすれば、更なる簡素化と設定の共通化を図ることが出来る。
 
下図は、「sub」フォルダを作成し「wp01」と「wp02」の【location】設定を外出しにした例。
【location】ディレクティブの外出しによる、更なる分割と設定の共通化
 
「wp01」と「wp02」というサブディレクトリーを作成し、それぞれに WordPress をインストールすれば、WordPress を複数:例えばテーマ別に稼働させることが出来る。
 
 
nginx.conf
nginxの起動時に読み込まれるファイルで、
このファイルの設定でnginxを制御する。
 
conf.d
nginx.conf で【include /etc/nginx/conf.d/*.conf】と記述することで、この中にあるバーチャルホスト別の、nginx設定ファイル【.conf】が取込まれる。
 
conf.d/default.conf
nginxをインストールした時点で作成されている、デフォルトの【server設定】ファイル。
default.confから、「バーチャルホスト名.conf」にし、
バーチャルホストごとに、server設定を行うことで、
nginx.confでのバーチャルホスト設定=server定義が外出しされ、且つ、バーチャルホスト別のファイルになるので、管理が容易になる。
 
 
 
3. 設定ファイルの準備
 
デフォルトのファイルを、バーチャルホスト別にコピーし、それぞれを編集する。
cd /etc/nginx/conf.d/
sudo cp default.conf arakan60.conf
sudo cp default.conf arakoki70.conf
sudo cp default.conf mydns.conf
元のファイルをリネームして保存
sudo mv default.conf default.conf_b 
 
参考:設定ファイルを編集した後に使用するコマンド。
sudo nginx -t
sudo nginx -s reload
sudo systemctl restart nginx
 
 
 
4. nginx.confの設定と最適化
 
nginx.conf は上記の構成で、あらゆる項目の設定が可能であるが、httpブロックディレクティブの【server設定】はここには記述せず、「conf.d/default.conf」に外だしにして記述する。
 
nginx.confの編集。
sudo nano /etc/nginx/nginx.conf
 
nginx.confの設定例。
user  nginx;
worker_processes auto;
worker_rlimit_nofile 100000;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections 1024;
    multi_accept on;
    use epoll;
}

http {
    server_tokens off;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    access_log off;
    keepalive_timeout 10;
    client_header_timeout 10;
    client_body_timeout 10;
    reset_timedout_connection on;
    send_timeout 10;
    limit_conn_zone $binary_remote_addr zone=addr:5m;
    limit_conn addr 100;

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

	##
	# SSL Perfect Forward Secrecy(PFS)を有効にする Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	# 安全でない暗号化スイートはサポートしない
	# ssl_ciphers  'ECDH !aNULL !eNULL !SSLv2 !SSLv3';
	ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";

	#HTTP Strict Transport Security --- HSTSの設定
	add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    gzip  on;
    gzip_vary on;
    gzip_proxied any;
    gzip_min_length 1024;
    gzip_comp_level 6;
    gzip_types text/plain
		 text/xml
		 text/css
		 text/javascript
		 image/gif
		 image/png
		 image/jpeg
		 application/javascript
		 application/x-javascript
		 application/json
		 application/xml
		 application/xml+rss
		 application/font-woff
		 application/font-tff
		 application/octet-stream;

    include /etc/nginx/conf.d/*.conf;
}
 
 
nginx.confの最適化のために、追記した項目とその値。

worker_processes auto; - Nginx本体のプロセス数を、autoにする。
worker_rlimit_nofile 100000; - workerプロセスが開ける最大ファイル数。
             too many open files問題の回避。

multi_accept on; - クライアントからのリクエストをできるだけ受け取る。
use epoll; - Linuxカーネル2.6以上の場合はepoll、BSDの場合kqueue。
---------------------------------------------------------------------------------
server_tokens off; - エラー画面でのnginxバージョン番号を非表示にする。
sendfile on; - ハードディスクio処理とsocket-io処理のバランスを取る。
tcp_nopush on; - 一つのデータパッケージに全てのヘッダー情報を含まれる

keepalive_timeout 10; - keep-aliveタイムアウト時間。
client_header_timeout 10; - クライアントタイムアウト時間。
client_body_timeout 10; - クライアントタイムアウト時間。
reset_timedout_connection on; - 非アクティブクライアントの接続をクローズ。
send_timeout 10;- クライアントへの送信タイムアウト。
limit_conn_zone $binary_remote_addr zone=addr:5m; - 各種keyの共有メモリ設定。
limit_conn addr 100; - keyの最大コネクション数。

gzip_comp_level 6; - 圧縮レベル設定、1-9。

 
 
 
5. conf.d/ドメイン名.confの設定
 
【server設定】を、「conf.d/ドメイン名.conf」に外出しにして記述する。
 
conf.d/ドメイン名.conf の編集。
sudo nano /etc/nginx/conf.d/ドメイン名.conf
 
ドメイン名.confの設定例:"arakan60.conf"。
server {
        listen 80;
	server_name www.arakan60.com;
        return 301 https://arakan60.com$request_uri;
}

server {
	listen 443 ssl;
	server_name www.arakan60.com;
	
	# ssl on;
	ssl_certificate /etc/letsencrypt/live/www.arakan60.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/www.arakan60.com/privkey.pem;
	return 301 https://arakan60.com$request_uri;
}

server {
        listen 80;
	server_name arakan60.com;
        return 301 https://arakan60.com$request_uri;
}

server {
	listen 443 ssl;
	server_name arakan60.com;
	root /home/yaopi/www/wordpress;
	index index.htm index.php;
	
	# ssl on;
	ssl_certificate /etc/letsencrypt/live/arakan60.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/arakan60.com/privkey.pem; 

	# デフォルト 60秒を300秒までアップします。
	fastcgi_read_timeout 300; 

	error_page 404 /wp_404.html;
	location = /wp_404.html {
		root /home/yaopi/www/wordpress;
		internal;
	}

	client_max_body_size 500M;  # ←追加

	location / {
		try_files $uri $uri/ /index.php;
	}

	# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
	location ~ \.php$ {
		fastcgi_split_path_info ^(.+\.php)(/.+)$;
		fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
	}

}
 
上記と同じように、全てのドメインについて作成する。
 
 
fastcgi_pass の設定について
TCP か UNIXドメインソケット のどちらで通信するか、
①.【 fastcgi_pass 127.0.0.1:9000; 】
②.【 fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; 】
の、2通りの設定方法がある。
 
php-fpm での設定は、
/etc/php/7.3/fpm/pool.d/www.conf
の listen ディレクティブで定義する。
# TCP
listen = 127.0.0.1:9000
 
# UNIXドメインソケット
listen = /var/run/php/php7.3-fpm.sock
 
上記のどちらを指定しても良いが、nginx 側の設定と合わせる必要がある。
 
 
『default.conf』での「server」ブロックの記述が、ドメイン毎になったので、記述が短く、見易くなった。
 
 
以上。
(2019.12.11)
 

 

スポンサー リンク

 

             

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください