インストール - NginX(SUSE)
概要
NginXとは、Apacheと並ぶWebサーバソフトウェアの1つであり、処理速度や機能面で注目を集めている。
NginXのメリットを、以下に示す。
- 高速である。
- 大量処理が得意である。
- Webサイトの利用を向上させる機能が豊富である。
- 設定が容易である。
Webサーバに同時に複数のアクセスがあった場合、下表に示すように動作の違いがある。
Apache 2 | NginX | |
---|---|---|
同時・複数アクセスへの対処方法 | 1アクセスに対して、1つの対応 | 複数のアクセスに対して、1つの対応にまとまる |
アクセス急増時のサーバへの負荷 | 一気に負荷が増す | アクセスに比例して負荷は急激に増えない |
その結果のWebサーバの挙動 | 動作が遅くなり、ダウンしやすくなる | 処理速度を維持して、ダウンしにくい |
例えば、Webサーバの負担を軽くして処理速度を上げる手段として、リバースプロキシやロードバランサー等があり、これらを実現する場合、Nginxが向いている。
NginXのデメリットを、以下に示す。
- 大量の動的コンテンツの処理に不向き
- 一般的には、大量の動的コンテンツの公開(動画を中心としたWebサイト等)には向かないことがNginXのデメリットとして挙げられる。
- ただし、比較的小規模のWebサイトを運営する場合は、それほど神経質にならなくてもよい。
- 機能追加のしやすさ
- 専用のモジュールを追加することにより、Nginxも機能を拡張することができる。
- ただし、Apacheの方が、実装方法について比較的充実し、情報が豊富でわかりやすい。
- Apache モジュール一覧
- https://httpd.apache.org/docs/trunk/ja/mod/
- NGINX 3rd Party Modules
- https://www.nginx.com/resources/wiki/modules/
- 初心者向けの設定情報の少なさ
- 設定等の情報が少ない。
<yjshopping seller_id="dss">nginx実践ガイド IT技術者のための現場ノウハウ</yjshopping> |
<yjshopping seller_id="windybooks">nginx実践入門</yjshopping> |
<yjshopping seller_id="magicdoor">Nginx HTTP Server</yjshopping> |
NginXのインストール方法
パッケージ管理システムからインストール
まず、システムの更新を行う。
sudo zypper update
次に、NginXをインストールする。
NginXは、CentOSやSUSEの公式リポジトリからインストールできる。
ただし、常に最新バージョンが提供されるとは限らない。
sudo zypper install nginx
NginXサービスを自動起動する。
sudo systemctl enable nginx
NginXを開始する。
sudo systemctl start nginx
NginXのステータスを確認する場合は、次のコマンドを実行する。
sudo sytemctl status nginx
ソースコードからインストール
NginXのビルドに必要なライブラリをインストールする。
sudo zypper install libxslt-devel pcre2-devel gd-devel sudo zypper install kernel-source kernel-devel # AIOを使用する場合
必要ならば、OpenSSLの公式Webサイトにアクセスして、OpenSSL(1.X.Y)のソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf openssl-<バージョン>
NginXの公式Webサイトにアクセスして、NginXのソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf nginx-<バージョン>.tar.xz cd nginx-<バージョン>
NginXをビルドおよびインストールする。
NginXのビルドにおいて、ビルドディレクトリを作成すると失敗することに注意する。
export NGINX_DIR=<NginXのインストールディレクトリ> ./configure \ --prefix=$NGINX_DIR \ --sbin-path=$NGINX_DIR/sbin/nginx \ --conf-path=$NGINX_DIR/etc/nginx.conf \ --pid-path=$NGINX_DIR/nginx.pid \ --modules-path=$NGINX_DIR/modules/ \ --error-log-path=$NGINX_DIR/log/error.log \ --http-log-path=$NGINX_DIR/log/access.log \ --lock-path=$NGINX_DIR/nginx.lock \ --http-client-body-temp-path=$NGINX_DIR/tmp/ \ --http-proxy-temp-path=$NGINX_DIR/proxy/ \ --http-fastcgi-temp-path=$NGINX_DIR/fastcgi/ \ --http-uwsgi-temp-path=$NGINX_DIR/uwsgi/ \ --http-scgi-temp-path=$NGINX_DIR/scgi/ \ --with-perl_modules_path=$NGINX_DIR/Perl \ --with-threads --with-file-aio --with-pcre --with-pcre-jit \ --with-http_v2_module --with-http_ssl_module --with-http_addition_module --with-http_realip_module \ --with-http_xslt_module --with-http_xslt_module=dynamic \ --with-http_image_filter_module --with-http_image_filter_module=dynamic --with-http_dav_module --with-http_mp4_module --with-http_flv_module \ --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_degradation_module --with-http_slice_module \ --with-http_auth_request_module --with-http_secure_link_module --with-http_stub_status_module --with-http_sub_module \ --with-http_perl_module --with-http_perl_module=dynamic \ --with-mail --with-mail=dynamic --with-mail_ssl_module \ --with-stream=dynamic --with-stream_ssl_module --with-stream_realip_module --with-stream_ssl_preread_module \ --with-compat \ --with-cc=/usr/bin/gcc --with-cpp=/usr/bin/g++ \ --user=<任意のユーザ名> \ # 任意のユーザ名 例.nginx --group=<任意のグループ名> # 任意のグループ名 例.nginx # 不要の可能性あり --without-poll_module --without-select_module --with-ipv6 # OpenSSLを手動で設定する場合に記述する --with-openssl=<上記でダウンロードおよび解凍したOpenSSLのソースコードのトップディレクトリ> # 以下の設定はAIOを使用する場合に記述する --with-cc-opt='-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchron ous-unwind-tables -fstack-clash-protection -g -fPIC -D_GNU_SOURCE' \ --with-ld-opt='-Wl,-z,relro,-z,now -pie' make -j $(nproc) make install
configureスクリプト実行時において、--user=<ユーザ名>
および--group=<グループ名>
を付加した場合、それぞれユーザとグループを作成する必要がある。
sudo useradd --system --no-create-home --user-group --shell /sbin/nologin nginx
Systemdサービスユニットを作成しない場合、NginXを開始するには、以下のコマンドを実行する。
cd <NginXのインストールディレクトリ>/sbin sudo ./nginx
Systemdサービスユニットを作成しない場合、NginXを停止するには、以下のコマンドを実行する。
- 方法 1
cd <NginXのインストールディレクトリ>/sbin
sudo ./nginx -s stop
- または
sudo ./nginx -s quit
- 方法 2
- まず、NginXのプロセスIDを確認する。
ps aux | grep -i nginx
- NginXを停止する。
sudo kill <プロセスID 1> <プロセスID 2>
Systemdサービスユニットを作成しない場合、NginXを再起動するには、以下のコマンドを実行する。
cd <NginXのインストールディレクトリ>/sbin sudo ./nginx -s reload # または sudo ./nginx -s reopen
Systemdサービスユニットを作成する場合、/etc/systemd/systemディレクトリに、以下に示すような内容で作成する。
sudo vi /etc/systemd/system/nginx.service
# /etc/systemd/system/nginx.serviceファイル [Unit] Description=The nginx HTTP and reverse proxy server After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] PIDFile=/<NginXのインストールディレクトリ>/nginx.pid ExecStartPre=/<NginXのインストールディレクトリ>/sbin/nginx -t ExecStart=/<NginXのインストールディレクトリ>/sbin/nginx -g "daemon off;" ExecReload=/bin/kill -s HUP $MAINPID KillSignal=SIGQUIT TimeoutStopSec=5 KillMode=mixed PrivateTmp=true # added automatically, for details please see # https://en.opensuse.org/openSUSE:Security_Features#Systemd_hardening_effort ProtectSystem=full #ProtectHome=read-only PrivateDevices=true ProtectHostname=true ProtectClock=true ProtectKernelTunables=true ProtectKernelModules=true ProtectKernelLogs=true ProtectControlGroups=true RestrictRealtime=true # end of automatic additions [Install] WantedBy=multi-user.target
NginXを開始する。
sudo systemctl start nginx
NginXを停止する。
sudo systemctl stop nginx
NginXを再起動する。
sudo systemctl restart nginx
NginXを自動起動する。
sudo systemctl enable nginx
NginXの設定ファイルの内容を変更した時、変更を反映させるためにNginXを再読み込みする。
sudo systemctl reload nginx
ファイアウォールの設定
次に、ファイアウォール設定にいくつかの変更を加えて、httpサービスを許可する。
sudo firewall-cmd --add-port=80/tcp --permanent sudo firewall-cmd --reload
Nginxのテスト
Nginxが正しく実行されていることを確認する。
これを行うには、htmlファイルを作成し、それをNginxのルートディレクトリに配置する必要がある。
テキストエディタで以下のファイルを作成する。
sudo nano /srv/www/htdocs/index.html <html> <body> <h1>Welcome to osradar</h1> </body> </html>
最後に、Webブラウザを開き、http://localhost/ にアクセスして、これが表示されるか確認する。
NginX上でPHP-FPM(PHP 7 / 8)の有効化
NginXにはPHPモジュールが無いため、CGIによりプログラムを動作させている。
PHPをNginX上で動作させるためには、PHP-FPM(PHP-FastCGI Process Manager)に対して、設定を行う必要がある。
必要な場合、PHP-FPMのソケットファイルを配置するディレクトリを作成する。
mkdir /<PHPのインストールディレクトリ>/var/run/php-fpm
PHP-FPMの構成ディレクトリ(/etc/php7/fpm)にあるphp-fpm.confファイルのerror_logキーを以下のように編集する。
# PHP 7 sudo cp /etc/php7/fpm/php-fpm.conf.default /etc/php7/fpm/php-fpm.conf # PHP 8 sudo cp /etc/php8/fpm/php-fpm.conf.default /etc/php8/fpm/php-fpm.conf
# PHP 7 sudo vi /etc/php7/fpm/php-fpm.conf # PHP 8 sudo vi /etc/php8/fpm/php-fpm.conf
# /etc/php7/fpm/php-fpm.confファイル または /etc/php8/fpm/php-fpm.confファイル error_log = /var/log/php-fpm.log
次に、www.conf構成ファイルで構成済みプールの正しい設定を定義する。
# PHP 7 sudo cp /etc/php7/fpm/php-fpm.d/www.conf.default /etc/php7/fpm/php-fpm.d/www.conf # PHP 8 sudo cp /etc/php8/fpm/php-fpm.d/www.conf.default /etc/php8/fpm/php-fpm.d/www.conf
# PHP 7 sudo vi /etc/php7/fpm/php-fpm.d/www.conf # PHP 8 sudo vi /etc/php8/fpm/php-fpm.d/www.conf
# /etc/php7/fpm/php-fpm.d/www.confファイル または /etc/php8/fpm/php-fpm.d/www.confファイル user = <Nginxの実行ユーザ名 (例. nginx)> group = <Nginxの実行グループ名 (例. nginx)> listen = <nginx.confファイルで設定したfastcgi_passの値 (例. /var/run/php-fpm/php-fpm.sock)> listen.owner = <PHP-FPMの実行ユーザ名 (例. nginx)> listen.group = <PHP-FPMの実行グループ名 (例. nginx)>
次に、/etc/php7/cli/php.iniファイル、または、/etc/php8/cli/php.iniファイルを作成・編集する。
# PHP 7 sudo vi /etc/php7/cli/php.ini # PHP 8 sudo vi /etc/php8/cli/php.ini
# /etc/php7/cli/php.iniファイル または /etc/php8/cli/php.iniファイル cgi.fix_pathinfo=0
----- ここは不要かも? -----
次に、/etc/php7/fpm/php.iniファイルを作成・編集する。
php.iniファイルをコピーして、php.iniファイルのcgi.fixキーを編集する。
sudo cp /etc/php7/cli/php.ini /etc/php7/fpm/
sudo vi /etc/php7/fpm/php.ini # /etc/php7/fpm/php.iniファイル cgi.fix_pathinfo=0
そして、/etc/php7/fpm/php.iniファイルをPHP構成ディレクトリにコピーする。
sudo cp /etc/php7/fpm/php.ini /etc/php7/conf.d/
----- ここまで -----
NginXの設定
NginXを構成するため、NginXの設定ファイルであるnginx.confファイルを、以下に示すような内容で編集する。
# パッケージ管理システムからインストールしている場合 sudo vi /etc/nginx/nginx.conf # ソースコードからインストールしている場合 sudo vi /<Nginxのインストールディレクトリ>/etc/nginx.conf
# nginx.confファイル
http {
# ...略
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log <アクセスログファイルのフルパス>;
# 例1. log/localhost.log;
# 例2. /srv/www/htdoc/log/localhost.log;
location / {
root <ドキュメントルートのパス(絶対パスまたは相対パス)>;
# 例1. html;
# 例2. /srv/www/htdoc;
index index.php index.html index.htm;
}
error_page 404 /404.html;
location = /404.html {
root <ドキュメントルートのパス(絶対パスまたは相対パス)>;
# 例1. html;
# 例2. /srv/www/htdoc;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root <ドキュメントルートのパス(絶対パスまたは相対パス)>;
# 例1. html;
# 例2. /srv/www/htdoc;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root <ドキュメントルートのパス(絶対パスまたは相対パス)>;
# # 例1. html;
# # 例2. /srv/www/htdoc;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# このセクションは、NginXからPHP-FPMの通信は
# Unixドメインソケット通信でlistenしているFastCGIサーバにPHPスクリプトを渡すために使用される
location ~ \.php$
{
root <ドキュメントルートのパス(絶対パスまたは相対パス)>;
# 例1. html;
# 例2. /srv/www/htdoc;
fastcgi_pass <PHP-FPMのソケットファイルのフルパス>;
# 例1. unix:/<PHPのインストールディレクトリ>/var/run/php-fpm.sock;
# 例2. unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# ...略
}
NginXおよびPHP-FPMを起動する。
sudo systemctl restart nginx php-fpm
Webブラウザを起動した後、http://localhost/index.php にアクセスして、正常に表示されるか確認する。
仮想ホストの構築
NginXの設定ファイルを編集する。
# パッケージ管理システムからインストールしている場合 sudo vi /etc/nginx/nginx.conf # ソースコードからインストールしている場合 sudo vi /<Nginxのインストールディレクトリ>/etc/nginx.conf
# nginx.confファイル
http {
# ...略
server {
listen <ポート番号 例. 80>;
server_name <ドメイン名 例. virtualhost01> alias <ドメイン名 例. virtualhost01>.alias;
access_log <ログファイルのフルパス>
# 例. log/vhost.access.log;
error_page 404 /404.html;
location = /404.html {
root <仮想ホストのドキュメントルート>;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root <仮想ホストのドキュメントルート>;
}
location / {
root <仮想ホストのドキュメントルート>;
index index.php index.html index.htm;
}
# このセクションは、NginxからPHP-FPMの通信はUnixドメインソケット通信でlistenしているFastCGIサーバにPHPスクリプトを渡すために使用される
location ~ \.php$
{
root <仮想ホストのドキュメントルート>;
fastcgi_pass unix:<PHP-FPMのソケットのパス>;
# 例1. unix:/var/run/php-fpm/php-fpm.sock;
# 例2. unix:/home/user/PHP/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# proxy_pass http://127.0.0.1;
}
}
# ...略
}
また、仮想ホストの設定を、/etc/nginx/vhost.dディレクトリ、または、/<NginXのインストールディレクトリ>/etc/vhosts.dディレクトリに配置してもよい。
# パッケージ管理システムからインストールしている場合 sudo vi /etc/nginx/vhost.d/vhost1.conf # ソースコードからインストールしている場合 sudo vi /<Nginxのインストールディレクトリ>/etc/vhost.d/vhost1.conf
# vhost1.confファイル
server {
listen <ポート番号 例. 80>;
server_name <ドメイン名 例. virtualhost01> alias <ドメイン名 例. virtualhost01>.alias;
access_log <ログファイルのフルパス>
# 例. log/vhost.access.log;
error_page 404 /404.html;
location = /404.html {
root <仮想ホストのドキュメントルート>;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root <仮想ホストのドキュメントルート>;
}
location / {
root <仮想ホストのドキュメントルート>;
index index.php index.html index.htm;
}
# このセクションは、NginxからPHP-FPMの通信はUnixドメインソケット通信でlistenしているFastCGIサーバにPHPスクリプトを渡すために使用される
location ~ \.php$
{
root <仮想ホストのドキュメントルート>;
fastcgi_pass unix:<PHP-FPMのソケットのパス>;
# 例1. unix:/var/run/php-fpm/php-fpm.sock;
# 例2. unix:/home/user/PHP/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# proxy_pass http://127.0.0.1;
}
}
上記で作成した仮想ホストの設定ファイルを読み込むため、NginXの設定ファイルを編集する。
# パッケージ管理システムからインストールしている場合 sudo vi /etc/nginx/nginx.conf # ソースコードからインストールしている場合 sudo vi /<Nginxのインストールディレクトリ>/etc/nginx.conf
# nginx.confファイル
http {
# ...略
include /<NginXのvhost.dディレクトリのフルパス>/*.conf
# 例1. /etc/nginx/vhosts.d/*.conf;
# 例2. /<NginXのインストールディレクトリ>/etc/vhosts.d/*.conf;
server {
# ...略
}
# ...略
}
仮想ホストにアクセスできるようにするため、/etc/hostsファイルに仮想ホスト名と対応するIPアドレスを追記する。
sudo vi /etc/hosts
# /etc/hostsファイル <仮想ホストで使用するIPアドレス> <仮想ホスト名>
NginXとPHP-FPMを起動する。
sudo systemctl start php-fpm sudo systemctl start nginx
ログフォーマット
Apache2 | NginX | 説明 |
---|---|---|
%a | $remote_addr | リモートIPアドレス |
%A | $server_addr | ローカルIPアドレス |
%b | $body_bytes_sent | レスポンスのバイト数(HTTPヘッダは除く) CLF書式において、0の時は-(ハイフン)になる。 |
%B | $body_bytes_sent | レスポンスのバイト数(HTTPヘッダは除く) |
%D | - | リクエストを処理するのに掛かった時間(マイクロ秒単位) |
%f | $request_filename | リクエストされたファイル名 |
%h | - | リモートホスト名 |
%H | $server_protocol | リクエストプロトコル名 |
%K | - | keepaliveのコネクション数 |
%l | - | リモートログ名 |
%m | $request_method | リクエストメソッド(GET) |
%p | $server_port | リクエストを受けたポート番号 |
%P | $pid | 子プロセスID |
%q | $query_string | クエリ文字列 例. http://example.com/test.php?id=12345 -> ?id=12345
|
%r | $request | リクエストの最初の行 基本的には、%m %U$q %Hとした設定と同様 |
%s | $status | ステータスコード |
%t | $time_local | リクエストを受け付けた日時 [11/Aug/2017:12:34:56 +0900] |
%{format}t | - | format で与えられた書式による時刻
|
%T | $request_time | リクエストを受けてから応答するまでの処理時間(秒) %Dの秒数バージョン |
%u | $remote_user | リモートユーザ名 |
%U | $request_uri | リクエストされたパス |
%v | $server_name | サーバのServerNameの値 |
%V | $server_name | UseCanonicalNameで指定されたサーバ名 |
%X | $request_completion | 応答が完了したときの接続ステータス 書式 : aborted + = kept alive - = closed |
%I | $request_length | リクエストとヘッダを含む受け取ったバイト数 |
%O | $bytes_sent | ヘッダを含むサーバから送信されたバイト数 |
%{Referer}i | $http_referer | リファラー |
%{User-Agent}i | $http_user_agent | ユーザエージェント名 |
ログフォーマット | 説明 |
---|---|
$args | リクエスト行の引数 |
$binary_remote_addr | $remote_addrのバイナリ出力 |
$connection | コネクションのシリアル番号 |
$connection_requests | コネクションを経由した現在のリクエスト数 |
$content_length | Content-Lengthのリクエストヘッダフィールド Content-Lengthとは、HTTPヘッダの項目であり、渡すデータのサイズが入っている。 |
$content_type | Content-Typeのリクエストヘッダフィールド Content-Typeとは、ヘッダで最も一般的に用いられる項目の1つであり、 ボディ部に積載したデータの種類や形式(メディアタイプ)を指定する。 主に、サーバがクライアントに送信するHTTPレスポンスの中で送信データの形式を伝えるために用いるが、 クライアントがフォームなどから送信するPOSTデータの形式を知らせるのにも用いられる。 |
$document_root | 現在のリクエストに対するルートディレクティブおよびエイリアスディレクティブの値 |
$document_uri | $uriと同じ |
$host | サーバホスト名 |
$hostname | ホスト名 |
$https | 接続がSSLモードで動作している場合は"on"、それ以外の場合は空文字列となる。 |
$limit_rate | この変数を設定することにより、応答速度制限を行うことができる。 |
$msec | 現在の時刻をミリ秒単位で表示する。 |
$nginx_version | NginXのバージョン |
$pipe | リクエストがパイプライン化されている場合は"p"、それ以外の場合は"." |
$proxy_protocol_addr | Proxyプロトコルヘッダからのクライアントアドレスを表示する。 それ以外は空文字列となる。 |
$realpath_root | $document_rootの実パス名 |
$remote_port | クライアントのポート番号を表示する、 |
$request_body | リクエストボディを表示する。 |
$request_body_file | リクエストボディを格納した一時ファイル名を表示する。 |
$scheme | http |
$sent_http_name | 任意のレスポンスヘッダフィールドを表示する。 |
$time_iso8601 | ローカルタイム(ISO 8601標準)を表示する。 |
NginXのその他の設定
- tcp_nodelay
- 小さなパケットを大きなパケットに合成して、帯域幅の利用率を向上させる。(nagleアルゴリズム)
- TCPプロトコルでは、アプリケーション層のデータが非常に少なく(1バイト程度)、かつ、トランスポート層のオーバーヘッドが40バイト(IPヘッダ20バイト + TCPヘッダ20バイト)にもなる現象がある。
- この場合、送信データの多くは制御パケットであるため、帯域消費量が増加して、帯域利用率が悪くなる。
- この問題を解決するため、新規に生成されたパケットは送信データが確認されるまで、あるいは、相手側からの確認応答があるまで、
- 1MSSに切り上げる、または、確認応答があるまで待った後にタイムアウトまで送信する。
- ネットワークの輻輳を避けるため、TCPスタックは0.2秒(Unixの実装の値)までデータを待つメカニズムを実装しており、小さすぎるパケットを送信することはない。
- ただし、ネットワーク上でデータをストリーミングする必要がある場合、逆効果になる可能性がある。
- ファイル転送を行う場合、転送するごとにクライアント側で0.2秒の遅延を発生させるからである。
- tcp_nopush
- この設定は、
sendfile
関数が使用する時にのみ動作する。 - 遅延を最適化する代わりに、1度に送信するデータ量を最適化する。(tcp_nodelayとは逆の働きをする)
- Linuxにおいては、TCPスタックのTCP_CORKを有効にする。
- TCP_CORKは、パケットがMSSに到達するまでデータをブロックするものである。
- これは、MTUからIPヘッダの40バイト、または、60バイトを引いた値に等しい。
- この設定は、
エラー関連
test failed
Webサイトにアクセスする時、"test failed"というエラーメッセージが表示される場合がある。
これは、NginXの初期設定ではIPv4とIPv6をリッスンするが、使用しているWebサーバがIPv6をサポートしていない場合に起きる。
nginx.confファイルにおいて、IPv6を使用しないように設定する。
vi nginx.conf
# nginx.confファイル # 編集前 listen [::]:80 default_server; # 編集後 # listen [::]:80 default_server;
NginXを再読み込みする。
sudo systemctl reload nginx
HTTPS(SSL)の設定
CSRについて
CSR(Certificate Signing Request)とは、証明書発行要求といい、認証局に対して行う、認証局の秘密鍵で署名してもらうためのリクエストのことである。
CSRの中身を確認するためには、req
コマンドに-text
オプションを付加することで確認できる。
openssl req -text -in <サーバ証明書のファイル名>.csr # 出力例 Certificate Request: Data: Version: 0 (0x0) Subject: C=JP, ST=TOKYO, L=KAWASAKI, O=Kaisha, OU=Busho, CN=common.name Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) (省略) Signature Algorithm: sha256WithRSAEncryption (省略)
上記の出力例において、[Signature Algorithm]項目は、sha256WithRSAEncryptionである。
SHA-1は解読されるリスクが高まっているため、今後作成するものはSHA-2とするべきである。
SHA-2には、SHA-224、SHA-256、SHA-384、SHA-512の4種類がある。
SHA-512が最も安全性が高いが、クライアント端末側がSHA-512に対応している必要がある。
自己証明書の発行(サーバ側)
秘密鍵を作成する。
openssl genrsa -out <秘密鍵のファイル名>.key 2048
作成した秘密鍵を使用して、CSRを作成する。
openssl req -sha256 -new -subj "/C=JP/ST=Tokyo/L=Tokyo City/O=Company Name/OU=Department/CN=*.<ドメイン名>" -key <秘密鍵のファイル名>.key -out <CSRのファイル名>.csr
作成したCSRに署名を行って、サーバ証明書を発行する。
<サーバ証明書のファイル名>.csrファイルは、サーバ証明書を発行するためのファイルのため、削除してもよい。
openssl x509 -sha256 -req -days <証明書の有効日数 例. 3650> -in <CSRのファイル名>.csr -signkey <秘密鍵のファイル名>.key -out <サーバ証明書のファイル名>.crt
秘密鍵のファイルのアクセス権限を変更する。
chmod 400 <秘密鍵のファイル名>.key
Webサーバに設置するものは、秘密鍵(.key拡張子)とサーバ証明書(.crt拡張子)の2つである。
SSLを有効にするため、NginXの設定ファイルを編集する。
# パッケージ管理システムからインストールしている場合 sudo vi /etc/nginx/nginx.conf # ソースコードからインストールしている場合 sudo vi /<Nginxのインストールディレクトリ>/etc/nginx.conf
# HTTPS server
server {
listen 443 ssl; # HTTP/2を有効にする場合は、http2と追記する
server_name <ホスト名またはIPアドレスまたはドメイン名>;
# サーバ証明書および中間証明書のファイルの指定
ssl_certificate <サーバ証明書のファイルのフルパス>;
# 秘密鍵の指定
ssl_certificate_key <秘密鍵のファイルのフルパス>;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root <ドキュメントルートのパス(絶対パスまたは相対パス)>;
index index.html index.htm;
}
}
ロードバランサにSSL証明書を設置して、SSL接続を終端することもできる。
その場合、サーバ証明書は1つ用意して、ロードバランサからWebサーバまでの通信はhttpとなる。(httpsでも可能であるが、httpの方が負荷が軽いため)
httpを使用するメリットとして、Webサーバで受けるアクセスがhttpとなるので負荷が減るためである。(暗号化された通信を複合するために、SSLの接続を受けるのは負荷が掛かる)
自己証明書の発行(クライアント側)
秘密鍵を作成する。
openssl genrsa -out <秘密鍵のファイル名>.key 2048
作成した秘密鍵を使用して、クライアント側のCSRを作成する。
openssl req -sha256 -new -subj "/C=JP/ST=Tokyo/L=Tokyo City/O=Company Name/OU=Department/CN=*.<ドメイン名>" \ -key <秘密鍵のファイル名>.key -out <CSRのファイル名>.csr
作成したCSRに署名を行って、サーバ証明書を発行する。
<サーバ証明書のファイル名>.csrファイルは、サーバ証明書を発行するためのファイルのため、削除してもよい。
openssl x509 -sha256 -req -days <証明書の有効日数 例. 3650> -in <CSRのファイル名>.csr -signkey <秘密鍵のファイル名>.key -out <サーバ証明書のファイル名>.crt
クライアントPCがWindowsの場合、Windows PCにインポートするには、サーバ証明書のファイル(.crt拡張子)をpkcs12形式に変換する必要がある。
openssl pkcs12 -export -inkey <秘密鍵のファイル名>.key -in <サーバ証明書のファイル名>.crt \ -out <クライアント側にインポートするサーバ証明書のファイル名>.p12 -name <任意の識別子名>
秘密鍵のファイルのアクセス権限を変更する。
chmod 400 <秘密鍵のファイル名>.key
CSRファイルは、サーバ証明書を発行するためのファイルであるため、削除してもよい。
サーバに設置するものは、サーバ証明書のファイル(.crt拡張子)と秘密鍵(.key拡張子)の2つである。
Windows PCへ配布するものは、pkcs12形式に変換したクライアント側のサーバ証明書のファイル(.p12拡張子)である。
Windows PCへクライアント側のサーバ証明書のファイル(.p12拡張子)をインポートする場合、ファイルを実行することによりインポート画面が起動するため、
インポート画面に沿って、サーバ証明書のファイル(.p12拡張子)をインポートする。
Xdebugの設定
PHP-FPMの初期設定では、9000番ポートを使用している。
もし、古いバージョンのXdebug(バージョン2.x)を使用している場合、デフォルトのデバッグポートは9000番ポートを使用しているため、競合が発生する。
そのため、古いバージョンのXdebug(バージョン2.x)を使用する場合は、Xdebugのデバッグポートを変更する必要がある。
# PHP 7の場合 sudo vi /etc/php7/conf.d/xdebug.ini # PHP 8の場合 sudo vi /etc/php8/conf.d/xdebug.ini # ソースコードからPHPをインストールしている場合 vi /<PHPのインストールディレクトリ>/etc/php.ini
# xdebug.iniファイル または php.iniファイル xdebug.remote_port=<9000以外の値 例. 9003>
NginXとPHP-FPMを再起動する。
sudo systemctl restart nginx php-fpm