Nginx

NginxとはオープンソースのWebサーバー
Apacheよりも速い

Nginx公式

nginx -V
実行結果
nginx version: nginx/1.20.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.1.1g FIPS  21 Apr 2020
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-compat --with-debug --with-file-aio --with-google_perftools_module --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_degradation_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_perl_module=dynamic --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-threads --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'

bash: nginx: コマンドが見つかりません
のように表示される場合は、nginxがインストールされていない

nginxをインストールする場合、まずはリポジトリというのを設定する必要がある

ls -l /etc/yum.repos.d | grep 'nginx'

上記のコマンドで結果が表示されたらnginx用のリポジトリが既に設定されている

何も表示されない場合はnginx用のリポジトリがまだ存在していない

vi /etc/yum.repos.d/nginx.repo

/etc/yum.repos.dディレクトリに
nginx.repoというファイルを新規作成

CentOS7の場合

nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

nginx.repoファイルに上記の内容を書き込む

CentOS8の場合

nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ 
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

nginx.repoファイルに上記の内容を書き込む

yum info nginx

上記のコマンドを実行し、nginxのパッケージ情報が表示されればOK

yum install nginx -y

nginxをインストールする

systemctl enable nginx
systemctl start nginx

nginxのサービスを自動起動に設定
nginxのサービスを起動

/usr/share/nginx/html/がデフォルトのドキュメントルートとなっている

ブラウザで
http://IPアドレス
のようなURLへアクセスすると
/usr/share/nginx/html/ディレクトリの
index.htmlファイルが表示される

/etc/nginx/nginx.confがnginxの設定ファイル本体

nginx.confの中に

    include /etc/nginx/conf.d/*.conf;

という記述がある
これの効果により、/etc/nginx/conf.d/ディレクトリに.confの拡張子でファイルを作成すれば、nginxの設定を追加できる

一般的に、1つのサイトに対して、1つの.confを作成する

vi /etc/nginx/conf.d/xxx.conf

xxx.confのようなファイルを新規作成
この中にnginx用の設定を書いていく

example.comというサイトを作ったら、example.com.confというファイルを作り、そこに設定を書く
aaa.comというサイトを作ったら、aaa.com.confというファイルを作り、そこに設定を書く

ファイル名は任意の文字列でOKだが、ドメイン名と一致させておくと分かりやすい

example.com.conf
server {
    listen       80;
    server_name  example.com;
    root         /home/user1/xxx;
    index        index.html;
}

ブラウザでexample.comにアクセスすると、
サーバー上の/home/user1/xxx/index.htmlが表示される

ブラウザでexample.com/aaa.htmlにアクセスすると、
サーバー上の/home/user1/xxx/aaa.htmlが表示される
aaa.htmlというファイルがあればそのまま表示される)

ブラウザでexample.com/bbbにアクセスすると
サーバー上の/home/user1/xxx/bbb/index.htmlが表示される
(ファイル名がない場合はindex.htmlが補完される)


server {
}

の部分を、サーバーディレクティブと呼ぶ

server_nameでドメイン名を指定

rootでドキュメントルート(CentOS上でのディレクトリのパス)を指定
(デフォルトのドキュメントルートは、/usr/share/nginx/html)

indexでインデックスファイル名を指定
(index index.html;と設定した場合
example.comへアクセスすると
example.com/index.htmlへアクセスしたのと同じ効果になる)

vi /etc/nginx/nginx.conf

nginx.confを開く


user  nginx;

のような部分を確認する
(各自の環境によって値が異なる)

user nginx;となっていれば、
ユーザー名がnginxで、グループ名もnginx
(ユーザー名とグループ名が同じときは、グループ名を省略できる)

user httpd www;となっていれば、
ユーザー名がhttpdで、グループ名がwww

ドキュメントルートが/home/user1/exampleの場合
(/etc/nginx/conf.d/example.com.confに以下のような設定をしている場合)

example.com.conf
server {
    root   /home/user1/example;
}

cd /home/user1/example
chown -R nginx:nginx .
find . -type d -exec chmod 700 {} +
find . -type f -exec chmod 600 {} +

ドキュメントルート(/home/user1/example)へ移動

ドキュメントルート以下のディレクトリ・ファイルの所有者をnginx:nginxにする
/etc/nginx/nginx.confuserで指定されたユーザー名:グループ名

ディレクトリのパーミッションを700にする
ファイルのパーミッションを600にする

ドキュメントルートが/home/user1/exampleの場合

chmod o+x /
chmod o+x /home
chmod o+x /home/user1

ドキュメントルートよりも上位の各ディレクトリに対して、othersに実行権限(+x)が必要

この権限がないと、nginxがドキュメントルートへアクセスできない

nginx -t

.confに構文エラーがないかテストするコマンド

エラーがある状態でsystemctl restart nginxをしてしまうと、nginxのサービスがダウンするので注意

systemctl restart nginx

nginxのサービスを再起動する。

.confの設定を書き替えた後は、nginxの再起動が必要

プレフィックス 効果
なし 前方一致
正規表現よりも優先度が低い
^~ 前方一致
正規表現よりも優先度が高い
= 完全一致
~ 正規表現
大文字・小文字を区別する
~* 正規表現
大文字・小文字を区別しない

location競合の例1

location /aaa {
    return 301 http://google.com;
}

location ~ \.php {
    return 301 http://yahoo.co.jp;
}

/aaa/xxx.phpにアクセスした場合、location /aaaにもlocation ~ \.phpにもマッチする。

プレフィックスなしよりも~(正規表現)の方が優先されるので、location ~ \.phpが採用されヤフーへリダイレクトされる

location競合の例2

location ^~ /aaa {
    return 301 http://google.com;
}

location ~ \.php {
    return 301 http://yahoo.co.jp;
}

/aaa/xxx.phpにアクセスした場合、location ^~ /aaaにもlocation ~ \.phpにもマッチする。

^~(前方一致)~(正規表現)より優先されるので、location ^~ /aaaが採用されグーグルへリダイレクトされる

DHE用の鍵を生成

下記のコマンドによりDHE用の鍵(2048ビット)を生成

openssl dhparam 2048 -out /etc/nginx/dhparam2048.pem

-out /etc/nginx/dhparam2048.pemの部分で保存先をしていしているので、コマンド自体はどこのディレクトリから実行してもOK

/etc/nginx/というディレクトリに
dhparam2048.pemというファイルが作成される

dhparam2048.pemには、Diffie-Helmanの鍵交換アルゴリズムで使われる素数が格納されている

sslのプロトコルなどを設定

vi /etc/nginx/nginx.conf

nginx.confを開く

nginx.conf抜粋
    ssl_protocols TLSv1.2 TLSv1.3;

    ssl_dhparam /etc/nginx/dhparam2048.pem;
        
    ssl_prefer_server_ciphers on;
    ssl_ciphers "AES128+ECDHE:AES256+ECDHE:AES128+EDH:AES256+EDH:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4!CAMELLIA!AES128-SHA!AES128-SHA256!AES128-GCM-SHA256:!AES256-GCM-SHA384:!AES256-SHA256:!AES256-SHA!AES256-CCM8!AES256-CCM!AES128-CCM!ARIA128-GCM-SHA256!AES128-CCM8!ARIA256-GCM-SHA384";

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 10m;

nginx.confというファイルの
httpディレクティブの先頭に上記の設定を追加

ssl_dhparamには、先ほど作成したDHE用の鍵ファイルのパス(/etc/nginx/dhparam2048.pem)を指定する

ssl_certificateとssl_certificate_keyを設定

example.com.conf抜粋
server {
    listen       443 ssl http2;

    (中略)

    ssl_certificate      /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;
}

listen443 ssl http2を設定

ssl_certificatefullchain.pemのパスを指定
ssl_certificate_keyprivkey.pemのパスを指定


httpからhttpsへリダイレクト

example.com.conf抜粋
server {
  listen      80;
  server_name example.com;
  return 301 https://example.com$request_uri;
}

server {
    listen       443 ssl http2;
    (中略)
    ssl_certificate      /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;
}

listen 443 ssl http2;serverディレクティブとは別に
listen 80;serverディレクティブをもう1つ追加して
http://example.comから
https://example.com301リダイレクトするように設定

https://www.example.comのようなURLへアクセスしたときに
https://example.comのようなURLへ自動的にリダイレクトさせる

「wwwありのURL」と「wwwなしのURL」が同一のURLになるようにリダイレクトすることをURLの正規化という

example.com.conf
server {
  listen      443 ssl http2;
  server_name example.com www.example.com;

  if ($host ~* www.example.com) {
    return 301 https://example.com$request_uri;
  }
}

listen 443 sslserverディレクティブに
ホスト名がwww.example.comのときだけ、example.com301リダイレクトをする設定を追加


ブラウザで下記4つのURLへアクセス

  • http://example.com
  • http://www.example.com
  • https://example.com
  • https://www.example.com

4つともhttps://example.comに転送されればOK

WordPressの場合は「wwwありのURL」から「wwwなしのURL」へ自動的にリダイレクトされるので
nginxでURL正規化のリダイレクト設定をする必要はない


WordPressの管理画面で
設定一般 を開くと

  • WordPress アドレス (URL)
  • サイトアドレス (URL)

という2つの項目がある

ここに
https://example.comと書いておけば
https://www.example.comというURLでアクセスしても
自動的にhttps://example.comにリダイレクトされる

vi /etc/nginx/conf.d/example.com.conf
example.com.conf
location ^~ /aaa/ {
    return 403;
}

http://example.comのルートディレクトリが/home/user1/xxxだった場合、
/home/user1/xxx/aaa/ディレクトリにあるファイルは非公開になる

vi /etc/nginx/mime.types

/etc/nginx/mime.typesというファイルを確認すると
MIMEタイプ(image/svg+xmlなど)と
拡張子(svg svgzなど)の対応関係が一覧で確認できる

mime.types
types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;

    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;
    image/x-icon                                     ico;
    image/x-jng                                      jng;
    image/x-ms-bmp                                   bmp;

    font/woff                                        woff;
    font/woff2                                       woff2;

    application/java-archive                         jar war ear;
    application/json                                 json;
    application/mac-binhex40                         hqx;
    application/msword                               doc;
    application/pdf                                  pdf;
    application/postscript                           ps eps ai;
    application/rtf                                  rtf;
    application/vnd.apple.mpegurl                    m3u8;
    application/vnd.google-earth.kml+xml             kml;
    application/vnd.google-earth.kmz                 kmz;
    application/vnd.ms-excel                         xls;
    application/vnd.ms-fontobject                    eot;
    application/vnd.ms-powerpoint                    ppt;
    application/vnd.oasis.opendocument.graphics      odg;
    application/vnd.oasis.opendocument.presentation  odp;
    application/vnd.oasis.opendocument.spreadsheet   ods;
    application/vnd.oasis.opendocument.text          odt;
    application/vnd.openxmlformats-officedocument.presentationml.presentation
                                                     pptx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
                                                     xlsx;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
                                                     docx;
    application/vnd.wap.wmlc                         wmlc;
    application/x-7z-compressed                      7z;
    application/x-cocoa                              cco;
    application/x-java-archive-diff                  jardiff;
    application/x-java-jnlp-file                     jnlp;
    application/x-makeself                           run;
    application/x-perl                               pl pm;
    application/x-pilot                              prc pdb;
    application/x-rar-compressed                     rar;
    application/x-redhat-package-manager             rpm;
    application/x-sea                                sea;
    application/x-shockwave-flash                    swf;
    application/x-stuffit                            sit;
    application/x-tcl                                tcl tk;
    application/x-x509-ca-cert                       der pem crt;
    application/x-xpinstall                          xpi;
    application/xhtml+xml                            xhtml;
    application/xspf+xml                             xspf;
    application/zip                                  zip;

    application/octet-stream                         bin exe dll;
    application/octet-stream                         deb;
    application/octet-stream                         dmg;
    application/octet-stream                         iso img;
    application/octet-stream                         msi msp msm;

    audio/midi                                       mid midi kar;
    audio/mpeg                                       mp3;
    audio/ogg                                        ogg;
    audio/x-m4a                                      m4a;
    audio/x-realaudio                                ra;

    video/3gpp                                       3gpp 3gp;
    video/mp2t                                       ts;
    video/mp4                                        mp4;
    video/mpeg                                       mpeg mpg;
    video/quicktime                                  mov;
    video/webm                                       webm;
    video/x-flv                                      flv;
    video/x-m4v                                      m4v;
    video/x-mng                                      mng;
    video/x-ms-asf                                   asx asf;
    video/x-ms-wmv                                   wmv;
    video/x-msvideo                                  avi;
}

/var/log/nginx/access.logというログファイルにnginxのアクセスログが記録されている

これは、/etc/nginx/nginx.confというファイルの中で

nginx.conf抜粋
access_log  /var/log/nginx/access.log  main;

と記述されているため

/var/log/nginx/error.logというログファイルにnginxのエラーが記録されている

これは、/etc/nginx/nginx.confというファイルの中で

nginx.conf抜粋
error_log /var/log/nginx/error.log;

と記述されているため

FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

拡張子が.phpのURLへアクセスすると上記のようなエラーが出る場合

  • ドキュメントルートのパスが間違っている
  • ファイルのパーミッションが間違っている
  • php-fpmの設定が間違っている

などが原因として考えられる

location ~* /(uploads|files)/.*\.php$ {
    deny all;
}

(uploads|files)のように書くと、uploadsまたはfilesという意味になる
()で区切ることでその中をグループ化できる
また、()のなかを$1のような変数で後から参照することができる

location ~* /(?:uploads|files)/.*\.php$ {
    deny all;
}

(?:uploads|files)のように書くと、純粋なグループ化のみを行い、後方参照の効果は発生しなくなる

グループ化と後方参照を使っている場合に、正規表現を修正すると$1$2などのナンバリングがずれる可能性がある
後方参照が不要なものには(?:)でグループ化しておくことで、後方参照のナンバリングが複雑化しにくい

example.com.conf抜粋
server {
    listen      80 default_server;
    server_name example.net www.example.net;
    ...
}

listendefault_serverを書くと、デフォルトサーバーになる
どの.confのどのserver_nameにも一致しないとき、default_serverserverディレクティブが適用される

nginx公式・How nginx processes a request

error.log抜粋
nginx upstream timed out (110: Connection timed out)

/var/log/nginx/error.logに、上記のようなエラーが記録された
タイムアウトまでの時間を変更すると改善される

nginxのタイムアウト値を変更するときは、

  • php
  • php-fpm
  • nginx

を連動して変更する

phpの設定を変更

vi /etc/php.ini
php.ini抜粋
max_execution_time = 300

max_execution_time = 30の部分を
max_execution_time = 300に変更

デフォルトでは30秒でタイムアウトするようになっているが、
300秒(5分)に拡大する

php-fpmの設定を変更

vi /etc/php-fpm.d/www.conf
www.conf
request_terminate_timeout = 300

request_terminate_timeout = 0の部分を
request_terminate_timeout = 300に変更

デフォルトでは0(無制限)になっているが、
phpやnginxに合わせて値を変更する

nginxの設定を変更

vi /etc/nginx/nginx.conf
nginx.conf
fastcgi_buffers      8 128k;
fastcgi_buffer_size  128k;
fastcgi_read_timeout 300;

バッファーの個数とサイズを合わせて設定

nginx公式・Module ngx_http_fastcgi_module

WordPressに画像をアップロードするときなどに
413 Request Entity Too Large

辿ったリンクは期限が切れています。
というエラーが出ることがある

これは、ファイルサイズの制限に引っかかっている

vi /etc/php.ini

POSTデータの最大サイズを変更

php.ini抜粋
;post_max_size = 8M
post_max_size = 20M

post_max_size = 8Mをコメントアウト、
post_max_size = 20Mを追加

1ファイルあたりの最大アップロードサイズを変更

php.ini抜粋
;upload_max_filesize = 2M
upload_max_filesize = 20M

upload_max_filesize = 2Mをコメントアウト、
upload_max_filesize = 20Mを追加

nginx.conf抜粋
    client_max_body_size    20M;
    client_body_buffer_size 128k;

client_max_body_sizeのデフォルト値は1M(1メガバイト)
20Mなら20メガバイト
各自の環境に合わせて数値を設定する

client_body_buffer_sizeのデフォルト値は8k(8キロバイト)
このサイズを超えるリクエストボディを受け取ると一時ファイルに書き込まれる

client_body_buffer_sizeサイズが小さいと、一時ファイルに書き込まれる回数が増えるので動作が遅くなる

nginx公式・Module ngx_http_core_module

vi /etc/nginx/nginx.conf
nginx.conf抜粋
user httpd www;

もし、user httpd www;と書いてあれば
nginxの実行ユーザーはhttpd:www(ユーザー名がhttpdで、グループがwww)

もし、user nginx nginx;と書いてあれば
nginxの実行ユーザーはnginx:nginx(ユーザー名がnginxで、グループがnginx)

user nginx;と書いてあれば
nginxの実行ユーザーはnginx:nginx(ユーザー名がnginxで、グループがnginx)
ユーザー名とグループ名が同じ場合はグループ名の方を省略できる

vi /etc/nginx/fastcgi.conf
fastcgi.conf抜粋
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS         200;

/etc/nginxというディレクトリの
fastcgi.confというファイルに
fastcgi_param REDIRECT_STATUS 200;
という設定が書かれているか確認

PHPをインストールするときのオプションに–enable-force-cgi-redirectを設定した場合は、この設定が必要

nginx公式・PHP FastCGI Example

PHP5.3以降では、–enable-force-cgi-redirectがデフォルトで有効になっている
PHP の Configure オプション

おそらくNginxをインストールした時点で
自動的にfastcgi.confというファイルが作成されて
fastcgi_param REDIRECT_STATUS 200;
という設定もデフォルトであるはず

vi /etc/nginx/fastcgi.conf
fastcgi.conf抜粋
fastcgi_param  HTTPS              $https if_not_empty;

httpsのURLでアクセスすると$httpsの変数にonが入るので
fastcgi_param HTTPS onという設定をしたことになる

httpのURLでアクセスすると$httpsの変数はundefinedなので
if_not_emptyの効果により
fastcgi_param HTTPS $httpsの行は丸ごと無視される

  • 最終更新: 2023/05/24 12:48