nginx other modules

最後更新: 2019-05-09

 

介紹

所有 nginx 的 3 party module list

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

目錄

常用的 module

3rdPartyModules

 


Check 本地的 nginx 支援什麼 Modules

 

nginx -V

nginx version: nginx/1.14.2
configure arguments: ... 
--modules-path=/usr/lib/nginx/modules
...
--with-http_ssl_module
...
--add-dynamic-module=/build/nginx-tBUzFN/nginx-1.14.2/debian/modules/http-auth-pam
...

 


ngx_http_stub_status_module

 

Setting

location /status {
  stub_status     on;
  allow           x.x.x.x;   # x.x.x.x = monitoring system
  deny            all;
}

Output:

Active connections: 4 
server accepts handled requests
 41 41 93 
Reading: 0 Writing: 2 Waiting: 2 

 

  • Active connections - number of active client connections(including Waiting connections)

 

  • accepts(Total)
  • handled(Total) - value is the same as accepts unless some resource limits have been reached
  • requests(Total)

 

  • reading - nginx reads request header
  • writing - nginx is writing the response back to the client
  • waiting - "active - (reading + writing)"

 


ngx_http_log_module

 

Setting

  • access_log
  • log_format

 * error_log 不是由 ngx_http_log_module 提供

Syntax:

access_log

    access_log path [ format [ buffer = size [ flush = time ]]]
    access_log path format gzip[= [ buffer = size ] [ flush = time ]
    access_log off

    Default:     logs/access.log combined

log_format

usage: log_format name string

e.g. log_format

log_format apache
    '$remote_addr - $remote_user [$time_local] '
    '"$request" $status $body_bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$http_cookie"';
    
log_format full
    '$remote_addr $remote_user [$time_local] '
    '"$host"->$proxy_host->$upstream_addr '
    '"$request" $status($upstream_status) '
    '$bytes_sent/$gzip_ratio($sent_http_content_type) '
    '$request_time($upstream_response_time)';
    
log_format perf
    '$request_time($upstream_response_time) '
    '$bytes_sent/$gzip_ratio($sent_http_content_type) '
    '$status "$upstream_addr$uri"';
    
log_format gzip
    '$bytes_sent/$gzip_ratio($sent_http_content_type) '
    '[$http_accept_encoding]"$http_user_agent"';

log_format redirect
    '$time_local $redir_match $redir_action $redir_url';

log_format cache_status '[$time_local] "$request"  $upstream_cache_status';

e.g. access_log

#access_log off;
access_log            /var/log/nginx/access.log       apache;
#access_log           /var/log/nginx/access-full.log  full;
access_log            /var/log/nginx/access-perf.log  perf;
#access_log           /var/log/nginx/access-gzip.log  gzip;
access_log            /var/log/nginx/cache.log        cache_status;

cache_status output:

[25/Jan/2014:16:09:12 +0000] "GET /node/103 HTTP/1.0"  MISS
[25/Jan/2014:16:09:13 +0000] "GET /guestbook HTTP/1.0"  MISS
[25/Jan/2014:16:09:14 +0000] "GET /comment/reply/103 HTTP/1.0"  MISS

buffer & flush 設定

# 儲夠 64k 或 每 5 秒寫 1 次 log

access_log  /var/log/tengine/myserver/cache.log cache_status buffer=64k flush=5;

if 的設定

map $status $loggable {
    ~^[23]  0;
    default 1;
}

access_log /path/to/access.log combined if=$loggable;

我的 Proxy log

log_format cache_status '[$time_local] "$remote_addr" '
                        '"$request" $status $upstream_cache_status '
                        '* $request_time $bytes_sent "$gzip_ratio"';

Variables

$request_time

request processing time in seconds with a milliseconds resolution;

time elapsed between the first bytes were read from the client and the log write after the last bytes were sent to the client  

$bytes_sent

the number of bytes sent to a client

$status

Status code. i.e. 200

header to client

Header lines sent to a client have the prefix "sent_http_",

for example, $sent_http_connection

error_log

# stop error log ("error_log off;" 這是唔 work 的, 沒有 off 這設定)

error_log   /dev/null   crit;

 


ngx_http_degradation_module

 

Compile

--with-http_degradation_module

# Allows returning an error when a memory size exceeds the defined value.

# to be inserted at the http block level
degradation sbrk=500m;
degrade 204;

 


HttpRewriteModule

 

return

Stops processing and returns the specified code to a client.

return code [ text ]

return code URL

return URL

i.e.

return (301 | 302 | 303 | 307) url;

return (1xx | 2xx | 4xx | 5xx) ["text"];

set

# Sets a value for the specified variable

# The value can contain text, variables ( can't set the value of a $http_xxx header )

set variable value

rewrite_log

# Default: off

# information about rewrites to the error log at notice level.

rewrite_log on

break

Continue processing within the current location block but do not process any more rewrite directives.

if

pattern matching with regular expressions

~                 performs a case-sensitive match
~*               performs a case-insensitive match
!                  mean the opposite
-f or !-f        existence of a file using the
-d or !-d       existence of a directory using
-e or !-e       existence of a file, directory or symbolic link

rewrite

Capture elements (using PCRE regular expressions) in the original URL, return redirects

 * the rewrite directive does not necessarily halt NGINX’s processing of the request as return does

# rewrite the URL only if it matches the specified regular expression

rewrite regex URL [flag];

e.g.

if ($scheme = "http") {
    rewrite ^ https://$http_host$request_uri permanent; 
}
server {
    ...
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
    rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  last;
    return  403;
    ...
}

last: it tells NGINX to skip any subsequent Rewrite-module directives in the current block

try_files

NGINX checks for the existence of the "files" and "directories" in order

and serves the first one it finds.

If none => redirect to the URI defined by the final element (uri).

try_files file … uri;

i.e.

location /images/ {
    try_files $uri $uri/ /images/default.gif;
}

location = /images/default.gif {
    expires 30s;
}

 


HttpHeadersModule

 

# Default: off, prevents changes to the Expires and Cache-Control headers.

# max: Expires header to 31 December 2037 23:59:59 GMT, Cache-Control max-age to 10 years.

expires       24h;

# Cache-Control: no-cache

expires       -1;

add_header    Cache-Control  private;

 


ngx_http_autoindex_module

 

 

# Default: off

autoindex on;

# accurately (in bytes), or rounded (KB, MB or GB),
# Default:  on

autoindex_exact_size on;

# Default is "off" (GMT time)

autoindex_localtime on;

用外觀較好的 themes -  autoindex.html

Homepage: https://github.com/phuslu/phuslu.github.io

# mkdir -p /home/seafile/clients_software
# cd /home/seafile/clients_software
# wget https://phuslu.github.io/autoindex.html -O .autoindex.html

location /clients {
    autoindex_localtime on;
    autoindex           on;
    alias               /home/seafile/clients_software;
    add_after_body      /clients/autoindex.html;
}

hide files from autoindex

.autoindex.html

OR

Fancy Index Module

 


ngx_http_charset_module

 

# “Content-Type” response header field.
charset UTF-8;

 


ngx_http_map_module

 

Creates a new variable whose value depends on values of one or more of the source variables (first parameter)

Usage:

map string $variable { ... }

P.S.

Context: http

regular expression:

"~"           case-sensitive matching,
"~*"         case-insensitive matching.

e.g.

當 $request_method 是 PURGE 時會把 $purge_method 設定成 $purge_allowed

map $request_method $purge_method {
    PURGE   $purge_allowed;
    default 0;
}

 


ngx_http_geo_module

 

creates variables with values depending on the client IP address

Syntax: geo [$address] $variable { ... }

By default, the address is taken from the $remote_addr variable

geo $geo {
    default        0;
    127.0.0.1      2;
    10.1.0.0/16    1;
}

Opts

ranges

indicates that addresses are specified as ranges
This parameter should be the first.

Format: 10.1.0.0-10.1.255.255

include

includes a file with addresses and values.

proxy

Defines trusted addresses
When a request comes from a trusted address,
    an address from the “X-Forwarded-For” request header field will be used instead.

Example

?.conf

geo $country {
    ranges;
    default        ZZ;
    include        conf/geo.conf;
}

conf/geo.conf;

127.0.0.0/24              US;
10.1.0.0-10.1.255.255     RU;

 



ngx_http_fancyindex_module

 

Install

fancyindex module (nginx-extras)

https://github.com/aperezdc/ngx-fancyindex

wget https://github.com/aperezdc/ngx-fancyindex/archive/v0.4.3.zip -O ngx-fancyindex-v0.4.3.zip

./configure --prefix=/opt/nginx \
 ...
 --with-http_addition_module \
 --add-dynamic-module=/usr/src/nginx/ngx-fancyindex-0.4.3

make

make install

Config

[1] nginx.conf

load_module "modules/ngx_http_fancyindex_module.so";

[2] sites-enabled/proxy_www

...
location / {
  fancyindex on;              # Enable fancy indexes
  fancyindex_exact_size off;  # Output human-readable file sizes
  fancyindex_hide_symlinks on;
  fancyindex_localtime on;

  #autoindex on;
  #autoindex_localtime on;
  #gzip_static on;
}
...

Nginx-FancyIndex-Theme

git clone https://github.com/artyuum/Nginx-FancyIndex-Theme.git /etc/nginx/fancyindex_theme

location /  {
    fancyindex on;
    fancyindex_header "/fancyindex_theme/header.html";
    fancyindex_ignore "/fancyindex_theme";
}

location ^~ /fancyindex_theme {
    alias /etc/nginx/fancyindex_theme;
    try_files $uri $uri/ =404;
}