NGINX 設定ティップス

NGINX設定ファイル

NGINXをリバースプロキシまたはウェブサーバとして使用するための設定ティップス。サーバセキュリティ、ロードバランサーとしての機能も併せ持つため、サーバ導入時には欠かせないオープンソースのサーバアプリです。

リバースプロキシ

ウェブサーバ

ロードバランサー

HTTPベーシック認証によるアクセス制限

Alphabetical index of variables

https://nginx.org/en/docs/varindex.html

try_files

以下の例では、ロケーションで指定したデレクトリ内で、URIで表示された文字列を、まず初めにファイルとして検索、そのファイルが存在しない場合にはフォルダとして検索します。結果が一致した時点でその内容を返し、共に一致しなければ404を返します。

location / {
    try_files $uri $uri/ $uri.html =404;
}

ファイル、フォルダ名共にURIと一致しない場合、以下のようにプロキシーサーバに飛ばすことも出来ます。

location / {
    try_files $uri $uri/ @backend;
}

location @backend {
    proxy_pass http://backend.example.com;
}

Regular Expression正規表現参考

NGINX uses Perl Compatible Regular Expressions (PCRE).

rootデレクティブとaliasディレクティブの違い

http://nginx.org/en/docs/http/ngx_http_core_module.html#alias

rootディレクティブ

location /static/ {
    root /var/www/app/;
    autoindex off;
}

rootで指定したディレクトリにlocationのディレクトリが追加されます。

/var/www/app/static

aliasディレクティブ

location /static/ {
    alias /var/www/app/static/;
    autoindex off;
}

locationのディレクトリがaliasのディレクトリを表します。

/var/www/app/static

FastCGI Params

https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/

/etc/nginx/fastcgi_params
ファイル内で以下設定項目を確認すること。特にphpスクリプトを実行する上で、以下の設定がポイントとなります。(404が返ってきた場合はここを見直します)

fastcgi_param   SCRIPT_FILENAME         $document_root$fastcgi_script_name;
fastcgi_param   QUERY_STRING            $query_string;
fastcgi_param   REQUEST_METHOD          $request_method;
fastcgi_param   CONTENT_TYPE            $content_type;
fastcgi_param   CONTENT_LENGTH          $content_length;

fastcgi_param   SCRIPT_FILENAME         $document_root$fastcgi_script_name;
fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
fastcgi_param   PATH_INFO               $fastcgi_path_info;
fastcgi_param   PATH_TRANSLATED         $document_root$fastcgi_path_info;
fastcgi_param   REQUEST_URI             $request_uri;
fastcgi_param   DOCUMENT_URI            $document_uri;
fastcgi_param   DOCUMENT_ROOT           $document_root;
fastcgi_param   SERVER_PROTOCOL         $server_protocol;

fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;

fastcgi_param   REMOTE_ADDR             $remote_addr;
fastcgi_param   REMOTE_PORT             $remote_port;
fastcgi_param   SERVER_ADDR             $server_addr;
fastcgi_param   SERVER_PORT             $server_port;
fastcgi_param   SERVER_NAME             $server_name;

fastcgi_param   HTTPS                   $https;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS         200;

fastcgi_paramの設定については以下も参考にして下さい。

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
or
fastcgi_param SCRIPT_FILENAME $request_filename;

Example

You get the request /info/ and have the following configuration:

fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$fastcgi_script_name;

SCRIPT_FILENAME would equal /home/www/scripts/php/info/index.php , but using $request_filename it would just be /home/www/scripts/php/info/ .

The configuration of fastcgi_split_path_info is important as well. See here for further help: https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info

ヘッダー読み取りエラー

デフォルトでNginxはアンダースコア"_"を含むヘッダーは読み込まない。
Nginxの設定ファイルに “underscores_in_headers on;” を追加。

underscores_in_headers
https://nginx.org/en/docs/http/ngx_http_core_module.html#underscores_in_headers

Ex)

upstream foo_app {
  server 127.0.0.1:3000;
}

server {
   listen 80;
#  listen [::]:80 default_server ipv6only=on;

   root /home/user/foo/foo_web/public;

   server_name foo.it  www.foo.it;
   underscores_in_headers on;
   client_max_body_size 4g;

   location ~ ^/(assets)/ {
      gzip_static on;
      expires max;
      add_header Cache-Control public;
      }
   location / {
     proxy_set_header  X-Real-IP  $remote_addr;
     proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header  Host $http_host;

     proxy_connect_timeout 300;
     proxy_read_timeout 300;


     proxy_pass_request_headers on;
     proxy_pass http://foo_app;

     }
}

NginxにおけるApacheのgetallheaders()代替案

https://www.php.net/manual/en/function.getallheaders.php#84262

<?php
if (!function_exists('getallheaders'))
{
    function getallheaders()
    {
           $headers = [];
       foreach ($_SERVER as $name => $value)
       {
           if (substr($name, 0, 5) == 'HTTP_')
           {
               $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
           }
       }
       return $headers;
    }
}
?>

HTTP Digest Authentication

https://www.nginx.com/resources/wiki/modules/auth_digest/

標準モジュールではないため、別途インストールが必要。

Nginx: 413 – Request Entity Too Large

/etc/nginx/conf.d/dfault.conf内のlocationブロックで以下指定

client_max_body_size 20M;