Nginx装置配置详解

Nginx简介

Nginx(“engine x”)是一款高性能的Web服务器和反向代理服务器,它采纳事件驱动的异步构造,具备内存占用少、稳定性高、可能解决大量的并发申请,具备高效和低资源耗费的特点。 Nginx经常被用作Web服务器、负载均衡器、反向代理和缓存服务器等。

Nginx装置

在Ubuntu中,装置Nginx步骤如下:

  1. 更新软件源

能够通过运行以下命令更新软件源:

sudo apt-get update# 在CentOS中# sudo yum install epel-release
  1. 装置Nginx

装置Nginx服务器能够通过以下命令:

sudo apt-get install nginx# 在CentOS中# sudo yum install nginx
  1. 查看Nginx是否正确装置

运行以下命令能够查看Nginx是否正确装置:

# 查看nginx版本号nginx -v# 查看nginx版本号以及其余配置参数,蕴含装置、配置文件门路以及内置模块等信息nginx -V

如果可能输入Nginx的版本号,则示意Nginx曾经正确装置。

默认状况下,Nginx的装置门路为/usr/share/nginx,Nginx的配置文件门路为/etc/nginx/nginx.conf

  1. nginx帮忙手册命令以及常用命令
# 查看nginx帮忙文档nginx -h# 在Linux零碎中,能够应用man命令查看nginx具体帮忙文档man nginx# 检测nginx配置文件语法是否正确nginx -t# 检测nginx配置文件语法是否正确,并把nginx配置文件信息输入到屏幕nginx -T# 设置nginx应用的配置文件(默认应用:/usr/local/etc/nginx/nginx.conf)nginx -c nginx_file.conf# 向nginx主过程发送信号,stop, quit, reopen, reloadnginx -s stop # 进行Nginx过程nginx -s quit # 疾速进行Nginx过程,但容许实现曾经承受的连贯申请nginx -s reopen # 从新关上日志文件# 与stop不同,reload不会齐全进行Nginx过程,而是平滑地从新加载配置文件,并在新的工作过程中对已有的连贯进行服务,可在不进行服务的状况下实现动静更新配置nginx -s reload 

区别:

stop和quit都是进行Nginx过程,但quit容许之前承受的连贯持续实现,而stop则会强制终止所有连贯。
reload会重载Nginx的配置文件,并启动新的worker过程,新的worker过程会用新的配置从新跑,旧的worker过程会持续解决旧有的连贯,新配置失效后,新的连贯会从新的worker过程解决,而reopen是从新关上日志文件,在日志文件较大的时候,不便日志切割。

全局内置指令和变量

Nginx罕用的全局指令

  1. user:指定Nginx所应用的零碎用户和用户组,默认为nobody;
  2. worker_processes:指定Nginx工作过程的数量,默认为1;
  3. worker_cpu_affinity:指定每个worker过程绑定的CPU外围;
  4. worker_rlimit_nofile:指定每个worker过程容许关上的最大文件数;
  5. pid:指定Nginx过程号寄存的地位,默认为/var/run/nginx.pid;
  6. access_log:指定Nginx拜访日志寄存的地位和格局;
  7. error_log:指定Nginx谬误日志寄存的地位和格局,罕用的格局有debuginfonoticewarnerrorcrit
  8. events:指定Nginx事件模块的配置,常见的配置包含worker_connections(最大连接数)和useepollkqueue,以及其余一些事件模块配置;
  9. http:指定Nginx HTTP模块的配置,包含server_names_hash_max_size(域名哈希表的最大尺寸)、server_names_hash_bucket_size(每个哈希桶的大小)、client_max_body_size(前端客户端传输的最大申请体大小)等等;
  10. server:指定Nginx所有server块的配置,包含listen(服务器监听端口)、server_name(服务器域名)、access_log(拜访日志门路和格局)等等。
  11. keepalive_timeout:指定HTTP keep-alive连贯超时工夫。
  12. multi_accept:一个申请是否可能被多个 worker 解决。
  13. gzip:是否启用gzip压缩传输;
  14. ssl:开启SSL反对;
  15. use:增加 nginx 模块;

更多配置信息详见官网文档:https://nginx.org/en/docs/
更多指令详见官网文档:https://nginx.org/en/docs/dirindex.html

nginx罕用的内置变量

  1. $request_method:所应用的 HTTP 申请办法,如 GET、POST、PUT、DELETE、HEAD 等。
  2. $host: 申请的主机名。
  3. $http_referer: 申请的 HTTP referer 头部字段。
  4. $http_user_agent: 申请的 User-Agent 头部字段。
  5. $remote_addr: 客户端的 IP 地址。
  6. $request_body: 申请主体的内容。
  7. $request_uri: 申请的 URI 包含参数局部。
  8. $args: 申请中的参数局部,同$query_string
  9. $scheme: 申请应用的协定,比方 http 或 https。
  10. $server_name: Nginx 配置中以后虚拟主机的名称。
  11. $server_port: Nginx 监听的端口号。

通过应用这些内置变量,能够不便地在Nginx配置中进行动静参数配置、申请头部字段获取等操作。同时,还能够像应用任何其余Nginx变量一样,将它们与各种指令(如if、set、map)联合应用。

以下是Nginx中罕用的一些内置变量及其阐明:

  1. $request_method:所应用的 HTTP 申请办法,如 GET、POST、PUT、DELETE、HEAD 等。

示例:

if ($request_method = POST) {    return 405;}
  1. $host:申请头中的主机名,通常用于虚拟主机配置。

示例:

server {    listen 80;    server_name example.com;    location / {        proxy_pass http://backend;    }}
  1. $scheme:申请应用的协定,如 http 或 https。

示例:

if ($scheme = http) {    return 301 https://$server_name$request_uri;}
  1. $request_uri:申请的残缺 URI,包含参数。

示例:

location ~ \.php$ {    fastcgi_pass backend;    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;    fastcgi_param QUERY_STRING $query_string;}
  1. $remote_addr:客户端的IP地址。

示例:

geo $blocked_country {    default no;    include /etc/nginx/conf.d/blocked_country.txt;}server {    if ($blocked_country) {        return 403;    }}
  1. $args:申请参数局部的字符串。

示例:

location /search/ {    if ($args ~* "q=(.*)") {        set $query $1;    }    proxy_pass http://backend/search?q=$query;}
  1. $http_referer:HTTP 申请头中的 referer 字段,示意从哪个网页链接过去。

示例:

if ($http_referer ~* (spamdomain.com|adsite.com)) {    return 403;}
  1. $http_user_agent:HTTP 申请头中的 User-Agent 字段,示意发动申请的客户端应用的浏览器。

示例:

if ($http_user_agent ~* "MSIE [1-6]\.") {    return 403;}
  1. $server_name:配置文件中定义的以后虚拟主机名称。

示例:

server {    listen 80;    server_name example.com;    location / {        root /var/www/example.com;    }}
  1. $server_addr:Nginx 监听的 IP 地址。

示例:

server {    listen 127.0.0.1:8080;    server_name example.com;    location / {        proxy_pass http://backend;    }}

这些内置变量的具体阐明和应用办法能够在官网文档中找到。
更多内置变量详见官网文档:https://nginx.org/en/docs/varindex.html

set具体用法

上面是nginx配置自定义变量的具体用法和代码示例:

它的语法为:

set $variable value;

其中,$variable为变量名,value为变量值,能够是文本、数字、表达式等等。set指令能够在http、server、location、if等块中应用。

须要留神的是,set指令只在以后上下文中利用。如果在 http 上下文中设置变量,则它将在整个 Nginx 配置中应用。然而,在 server 和 location 上下文等细分上下文中设置的变量仅在该上下文中应用。变量值的计算是在每个申请中进行的,因而能够在 Nginx 配置中动静地设置变量。此外,您还能够应用nginx的内置变量,例如$uri$request_method等,将它们与自定义变量一起应用来构建更简单的变量。

  1. 定义参数变量:

应用set关键字定义参数变量,例如:

http {    #定义全局参数变量    set $var "/path/to/some/file.txt";    ...}
  1. 应用参数变量:

在配置文件中能够应用$符号援用参数变量,例如:

location / {    ...    #应用参数变量    rewrite ^(.*)$ $var;    ...}
  1. 参数变量与字符串拼接:

能够应用concat函数将参数变量和字符串拼接起来,例如:

http {    #定义全局参数变量    set $base_url "https://example.com/";    ...}location / {    ...    #将参数变量和字符串拼接起来    set $img_url "/img/";    set $full_path "${base_url}$(uri)${img_url}";    ...}
  1. 参数变量与正则表达式:

能够应用参数变量与正则表达式一起应用,例如:

location ~* \.(jpeg|jpg|png)$ {    ...    #将匹配的文件类型保留到参数变量中    set $img_type $1;    ...}
  1. 从申请中提取变量值:
set $my_var $arg_var;

这样就从申请的参数中提取了名为arg_var的变量,并将其值赋给$my_var。

  1. 应用表达式计算变量值:
set $my_var 10;set $my_var2 20;set $my_var3 $my_var+$my_var2;

这样就定义了三个变量,$my_var的值为10,$my_var2的值为20,$my_var3的值为它们的和30。

  1. 应用map模块设置匹配规定:
map $uri $my_var {    /page1.html "This is page 1.";    /page2.html "This is page 2.";    default "This page does not exist.";}set $my_var2 $my_var;

这样就应用map模块给$uri变量匹配规定,如果匹配到了/page1.html,则$my_var的值为"This is page 1.",否则如果匹配到了/page2.html,则$my_var的值为"This is page 2.",否则如果没有匹配到任何规定,则$my_var的值为"This page does not exist."。在set指令中,咱们能够应用$my_var来援用这个变量。

通过应用参数变量的形式,咱们能够大大简化和优化配置文件中的反复代码和硬编码。上面是一个例子:

http {    #定义全局参数变量    set $base_url "https://example.com/";    set $img_url "/img/";    ...}server {    listen 80;    server_name example.com;    #将申请重定向到默认的ssl端口    return 301 https://$server_name$request_uri;}server {    listen 443 ssl;    server_name example.com;    ...    location / {        #将申请代理到指定的upstream服务器,并应用参数变量        proxy_pass ${base_url}upstream;        ...    }    location ~* \.(jpeg|jpg|png)$ {        #将匹配的文件类型保留到参数变量中,并应用参数变量        set $img_type $1;        ...        add_header Content-Disposition "attachment; filename=${img_type}";        ...    }}

须要留神的是,因为应用set指令会减少Nginx的计算累赘,因而在配置中不应滥用。若应用适度,可能会导致性能降落或援用其余问题。
总的来说,Nginx的set指令能够用于创立自定义变量,将多个变量组合到一起生成一个新的变量,从而简化配置文件。应用时该当依据具体情况审慎应用。

map具体用法

Nginx map指令用于依据一个或多个变量的值生成映射关系。它能够将一组固定的键值对组合为一个映射表,并在申请达到时应用以后申请的变量值来查找相应的映射值,并将其赋予一个新的变量。通过应用map指令,能够在解决申请之前将简单的信息逻辑转换为简略的键值对。

map指令的语法如下:

map $variable {     key value;     key value;    ...    default value;}

其中,$variable是用于查找对应映射值的变量名。{}内用于定义键值对,每个键值对占一行,其中key为要匹配的值,value为匹配胜利后要赋予变量的值。最初必须定义一个default值,当所有key查看结束后,如果没有匹配到任何值,则会应用default值。

上面是一个map指令的例子:

map $request_uri $my_variable {    "/foo"    "foo";    "/bar"    "bar";    "/baz"    "baz";    default   "nothing";}

在这个例子中,由$request_uri指定要匹配的变量名,当$request_uri的值为"/foo"、"/bar"、"/baz"时,它们的值将被映射为相应的"foo"、"bar"、"baz"字符串,并赋予$my_variable变量。在所有匹配失败的状况下,$my_variable的默认值为"nothing"。

map指令反对一些高级个性,例如能够应用正则表达式匹配变量值,应用命名分组;还能够应用include语句蕴含内部文件,从而不便地组织映射表内容。

须要留神的是,因为map指令会减少Nginx的计算累赘,因而在理论应用中,应留神尽量优化映射表和防止应用适度。此外,map指令只能在http、server和location块内应用,并且只有第一次应用时能力定义映射表。

总的来说,Nginx的map指令能够依据一个或多个变量的值生成映射关系,将简单信息逻辑转换为简略的键值对。应用时该当留神优化映射表和防止应用适度。

events模块详解

nginx中的events块是一个必须的块,用于配置全局的事件模型和一些零碎相干的参数。上面是一个events块的示例代码和注解:

events {  # 设置worker过程数,倡议设置为CPU个数的倍数  worker_processes 4;  # 每个worker过程连贯的最大数  worker_connections 1024;  # 应用epoll事件模型,也能够应用kqueue、eventport等  use epoll;  # 每个epoll调用可解决的最大连接数,设为on能够进步性能  multi_accept on;}

其中,正文局部为对应的配置项和解释。须要留神的是,events块中的参数并不是可选的,必须设置。上面是一些须要留神的要点:

  1. worker_processes

该参数示意nginx要开启多少个worker过程。倡议将其设置为CPU个数的倍数,以充分利用零碎的多核性能。

  1. worker_connections

该参数示意每个worker过程能够同时解决的最大连接数。个别倡议将其设置为最大并发申请数。

  1. use

该参数示意要应用哪种事件模型。罕用的包含epoll、kqueue、eventport等。默认为select。

epoll是Linux零碎中的一个事件驱动机制,当有IO事件产生时,它会告诉应用程序,从而缩小了不必要的轮询,并进步了性能。
而eventport是Solaris中的一种事件机制。无论是epoll还是eventport,它们都是异步I/O的外围组成部分。

  1. multi_accept

该参数示意每个epoll调用能够同时解决的最大连接数。如果设为on,能够进步性能。

总之,正确地配置events块对于保障nginx的稳固、高性能运行十分重要。

http模块详解

在nginx的配置文件中,http块是最顶层的块,用于配置HTTP协定相干的选项和指令。上面是http块的用法、示例代码和注解:

用法:

http {    // 根本配置指令    ...    server {    // server块配置        // server块外部配置指令        ...    }}

示例代码:

http {    # 配置HTTP服务器    # 定义日志格局    log_format access '$remote_addr - $remote_user [$time_local] '                      '"$request" $status $body_bytes_sent '                      '"$http_referer" "$http_user_agent"';    # 配置HTTP申请头和HTTP响应头    include mime.types;    default_type application/octet-stream;    server_tokens off;    # 开启gzip压缩    gzip on;    # 配置HTTP申请限度    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;    # 配置HTTP缓存    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;    proxy_cache_key "$scheme$request_method$host$request_uri";        # 配置HTTP反向代理    upstream backend {        server 127.0.0.1:8000;        server 127.0.0.1:8001;    }    server {        listen 80;        server_name example.com;        location / {            proxy_pass http://backend;            proxy_cache my_cache;            proxy_set_header Host $host;            proxy_set_header X-Real-IP $remote_addr;            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;            limit_req zone=one burst=10 nodelay;        }    }    # 配置HTTP服务器的其余选项    keepalive_timeout 65;}

注解:

  • include 用来引入其余配置文件,此处引入了mimetypes.types文件,用于设置HTTP申请头和HTTP响应头。
  • default_type 用来设置默认的mime类型,如果在mimetypes.types文件中找不到对应的类型,则会应用此处设置的类型。
  • server_tokens 用来管制是否将nginx的版本信息在HTTP响应头中显示,此处为敞开。
  • gzip:开启gzip压缩,减小传输文件大小,进步文件传输速度。
  • limit_req_zone 用来设置申请限度,该例子中设置了一个一秒钟只能有一次申请的限度。
  • proxy_cache_path 用于配置缓存目录和相干参数。
  • upstream 定义了一个upstream的集群,用于反向代理。
  • server 定义了一个HTTP服务器,监听80端口,并将指定的域名与upstream集群关联起来。
  • proxy_pass 配置反向代理,将申请转发到指定服务器。
  • proxy_cache 用于指定应用的缓存zone。
  • proxy_set_header 用于设置HTTP申请头。
  • limit_req 用于限度申请频率,该例子中设置了限度为一秒钟最多解决10个申请,超过则回绝解决。
  • root:指定网站的根目录。
  • index:指定默认拜访的页面。
  • location:针对特定的URI,能够配置子句,如try_files、proxy_set_header、proxy_pass等。其中用/示意网站的根门路,默认不须要配置。

除了以上配置选项,http块还反对其余选项,如ssl等。配置http块后,须要通过nginx -t命令查看配置文件是否正确,并通过nginx -s reload命令从新加载配置文件。

server模块详解

在Nginx的配置文件中,server块用于定义一个虚拟主机(Virtual Host),它蕴含了该虚拟主机所须要的所有配置信息,例如监听的端口、域名、TLS证书、反向代理等等。

示例代码:

server {    listen       80;  # 监听端口    server_name  example.com;  # 域名    root         /var/www/example.com;  # 网站根目录    index        index.html index.htm;  # 默认文档    location / {        try_files $uri $uri/ /index.html;  # 申请的资源不存在时,返回index.html页面    }    location /images/ {        deny all;  # 禁止内部间接拜访该目录下的文件    }    location /api/ {        proxy_pass http://127.0.0.1:8000;  # 将/api/申请反向代理到本地的8000端口    }    error_page  404              /404.html;    error_page  500 502 503 504  /50x.html;    location = /50x.html {        root   /usr/share/nginx/html;    }    location ~ \.(gif|jpg|png)$ {        expires 1d;  # 图片缓存工夫为1天    }}

注解:

  1. listen:定义该虚拟主机监听的端口,多个端口能够用空格分隔。例如listen 80;示意该虚拟主机监听端口为80。
  2. server_name:定义该虚拟主机对应的域名。例如server_name example.com;示意该虚拟主机应答申请的域名为example.com。
  3. root:定义该虚拟主机的网站根目录。例如root /var/www/example.com;示意该虚拟主机对应的站点根目录为/var/www/example.com。
  4. index:定义该虚拟主机的默认文档。例如index index.html index.htm;示意该虚拟主机默认显示index.html或index.htm页面。
  5. location:定义该虚拟主机对申请的URL门路匹配规定和配置信息。
  6. try_files:在以后location中匹配的所有URI都无奈找到时,Nginx会一次尝试它们,解决第一个匹配并未在文件系统上找到的 URI。
  7. deny all:禁止内部间接拜访该目录下的文件。
  8. proxy_pass:将申请反向代理到本地的具体端口。例如proxy_pass http://127.0.0.1:8000;示意该虚拟主机对/api/申请的反向代理到本机的8000端口。
  9. error_page:定义谬误页面,例如404.html和50x.html。
  10. location = /50x.html:匹配URL门路为/50x.html的申请,返回/usr/share/nginx/html目录下的50x.html页面。
  11. expires:定义该虚拟主机的缓存工夫。例如expires 1d;示意该虚拟主机对图片的缓存工夫为1天。

在Nginx的配置文件中,能够有多个server块,每个块都对应一个虚拟主机。当有申请达到Nginx时,Nginx会依据申请所指定的域名,找到对应的server块,并将申请转发到该虚拟主机配置所指定的解决形式。

root和alias的区别

rootalias 都是 Nginx 中用来指定动态文件根目录的指令,但它们的用法和成果是不同的。

root

root 指令用于指定 Nginx 服务器的主机根目录,即动态文件寄存的根目录,例如:

server {    listen 80;    server_name example.com;    root /var/www/html;    ...}

下面的配置中,拜访 example.com 的申请会被映射到 /var/www/html 目录,Nginx 会在该目录下寻找网站须要的动态资源。

如果 URL 中蕴含门路,Nginx 会将门路追加到 root 指定的根目录前面。例如,申请 http://example.com/static/img/logo.png 会被映射到 /var/www/html/static/img/logo.png 文件。

alias

alias 指令用于指定某个 URI 映射到服务器本地的一个理论门路,例如:

location /static/ {    alias /var/www/static/;    ...}

下面的规定将所有以 /static/ 结尾的申请映射到 /var/www/static/ 目录下,例如申请 http://example.com/static/img/logo.png 会被映射到 /var/www/static/img/logo.png 文件。

注意事项

应用 root 指令时,URI 中的门路会被增加到指定的根目录前面,并作为拜访文件的残缺门路。因而,你须要确保每个目录都存在于正确的地位,否则会呈现404谬误。

应用 alias 指令时,URI 中的局部门路会被替换成理论的文件门路,因而你须要确保别名门路的设置是正确的,否则会呈现404谬误。此外,在应用 alias 指令时,还须要留神上面一些事项:

  • alias 门路开端肯定要加上 /,否则可能呈现404谬误。
  • 须要批改 location 块内的 try_files 指令,指定正确的文件拜访门路。
  • 应用 alias 指令时,相对路径和绝对路径的行为是不同的。如果 alias 门路是到下级目录或者相对路径,那么就须要在指令开端加上斜杠(/)。

root 不同的是,应用 alias 指令能够将 URI 指向任意目录,而不仅仅是指向 root 指定的根目录。同时,应用 alias 指令也能够防止 URI 门路与服务器门路的混同问题。

总之,rootalias 都是用于指定动态文件根目录的指令,但它们的区别在于 root 只有一个根目录,而 alias 能够为不同 URI 指向不同的目录,并且在解决带有门路的 URI 时,两者的行为也是不同的。通过应用 alias 指令,能够轻松为不同的 URI 指向不同的目录,进步 Nginx 的灵活性和扩展性。

location模块详解

Nginx中的location指令用于匹配URI,以便可能在不同的配置块中利用不同的指令集。在location中应用不同的匹配规定可能达到不同的目标,比方反向代理、负载平衡、动态资源解决等。

以下是location指令的语法格局:

location [辨别大小写][ = | ~ | ~* | ^~ ] uri {    ...}

其中:

  • 准确匹配:在location指令的URI后面应用“=”,示意准确匹配:
location = /login {    ...}
  • 前缀匹配:在location指令的URI后面应用“^~”,示意前缀匹配:
location ^~ /images/ {    ...}
  • 辨别大小写:在location指令的URI后面应用“~”,示意辨别大小写:
location ~ /blog {    ...}
  • 不辨别大小写:在location指令的URI后面应用“~*”,示意不辨别大小写:
  location ~* \.(gif|jpg|jpeg)$ {    ...}

上面别离给出这些不同匹配规定的阐明正文、示例代码以及优先级。

准确匹配

准确匹配应用“=”符号,示意只有URI齐全匹配时才会执行指定的location块中的指令,这种形式的匹配优先级最高。

示例代码:

location = /login {    proxy_pass http://127.0.0.1:8080/login;}

此时,只有URI为“/login”的申请才会被匹配到这个location块中。

前缀匹配

前缀匹配应用“^~”符号,示意只有当URI以指定的前缀结尾时才会执行指定的location块中的指令,这种形式的匹配优先级比正则匹配高。

示例代码:

location ^~ /static/ {    root /var/www;}

此时,所有以“/static/”结尾的URI都将被匹配到这个location块中。

正则匹配(辨别大小写)

辨别大小写的正则匹配应用“~”符号,示意只有合乎正则表达式的URI才会被匹配到这个location块中。

示例代码:

location ~ /blog/post/\d+ {    root /var/www/blog/;}

此时,所有形如“/blog/post/”+一个或多个数字的URI都将被匹配到这个location块中。

正则匹配(不辨别大小写)

不辨别大小写的正则匹配应用“~*”符号,示意只有合乎正则表达式的URI才会被匹配到这个location块中,这种形式的匹配优先级最低。

示例代码:

location ~* \.(gif|jpg|jpeg)$ {    root /var/www/images/;}

此时,所有以“gif”、“jpg”或“jpeg”结尾的URI都将被匹配到这个location块中。

最优匹配

location / {    # 此处为默认匹配规定,将所有无奈匹配到以上 URI 的申请均指向 index.html    try_files $uri $uri/ /index.html;}

总结:

location模块是Nginx用来匹配URL门路的模块之一,其匹配规定和优先级如下:

  1. 准确匹配:当location模块的模式为一个残缺的URI时,只有齐全匹配该URI时才会执行该location块中的指令,其优先级最高。
  2. 前缀匹配:如果location块的模式没有以“= ”开始,而是以"^~"或者“/”开始,则示意该location块的模式为一个前缀字符串。当申请的URI与该前缀字符串匹配时,将会执行该location块中的指令,如果URI匹配多个前缀字符串,则抉择最长匹配的前缀字符串,其优先级次于准确匹配。
  3. 正则匹配:当location块的模式为一个正则表达式时,如果申请的URI与该正则表达式匹配,则会执行该location块中的指令。如果多个location块的正则表达式都能匹配申请的URI,则抉择第一个匹配胜利的location块,其优先级低于前缀匹配。
  4. 最优匹配:当location块的模式为“/”时,示意匹配所有申请,然而其优先级最低,只有当后面的三种匹配形式都无奈匹配该申请时,才会执行该location块中的指令。

须要留神的是,如果多个location块都匹配以后申请的URI,那么只会执行其中优先级最高的那个location块中的指令;如果两个location块的优先级相等,则抉择后面的location块。

能够看出,Nginx的location指令能够通过不同的匹配规定,实现对不同URI的解决。匹配规定之间的优先级是从高到低的准确匹配 > 前缀匹配 > 正则匹配(辨别大小写)> 正则匹配(不辨别大小写)> 最优匹配最初。依据不同的需要进行抉择,能够最大限度地进步Nginx的性能和效率。

proxy模块

在Nginx中应用proxy模块能够实现反向代理的性能,行将客户端的申请转发到后端服务器进行解决,并将后端服务器返回的响应返回给客户端。

proxy模块提供了以下罕用的指令:

  • proxy_pass:设置反向代理的指标服务器地址,能够是IP地址或域名,反对http、https、fastcgi、uwsgi、scgi等协定。实现反向代理的外围指令。
  • proxy_set_header:设置向后端服务器发送的HTTP申请头信息。能够设置多个header信息,如Host、User-Agent、Referer等。
  • proxy_connect_timeout:设置连贯后端服务器的超时工夫。
  • proxy_read_timeout:设置从后端服务器读取响应数据的超时工夫。
  • proxy_send_timeout:设置向后端服务器发送申请的超时工夫。
  • proxy_buffering:开启或敞开代理服务器对后端服务器的响应缓存。如果开启,则须要配合proxy_buffer_size和proxy_buffers指令来管制缓存大小。
  • proxy_cache:开启或敞开代理服务器对后端服务器响应的缓存。如果开启,则须要配合proxy_cache_path指令来设置缓存门路和缓存参数。
  • proxy_redirect:配置代理服务器对后端服务器响应的重定向规定。

上面是一个简略的反向代理示例,将客户端申请转发到后端服务器进行解决,而后将后端服务器返回的响应返回给客户端:

server {    listen       80;    server_name  example.com;    location /api {        proxy_pass http://backend_server;        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    }}
  • 通过listen指令设置端口号为80。
  • 通过server_name指令设置主机名为example.com。
  • 通过location指令匹配申请的uri为/api,并将这个uri转发到后端服务器http://backend_server进行解决。
  • 通过proxy_set_header指令,将客户端的Host、X-Real-IP、X-Forwarded-For信息发送给后端服务器。
  • 留神:如果你的代理服务器没有权限拜访到后端服务器,nginx将返回502 Bad Gateway 或者504 Gateway Timeout 谬误。此时须要查看代理服务器是否与后端服务器的网络环境通顺。

upstream模块

在 Nginx 配置文件中,upstream 模块用于定义一组后端服务或服务器的列表,能够用来负载平衡和故障转移。以下是upstream配置块的示例代码以及注解:

upstream backend {    # 定义一组名为backend的后端服务器列表    server 127.0.0.1:8080;    server 127.0.0.1:8081;    server 127.0.0.1:8082;    # 默认的算法为轮询,其余算法包含ip_hash、random、least_conn和hash等    # ip_hash:依据客户端IP地址进行哈希的负载平衡算法;    # keepalive:启用长连贯,进步传输效率;    # max_fails:示意最大失败次数;    # fail_timeout:示意断开连接的工夫距离;    # backup:示意备用服务器。    # 对于各个算法的具体阐明能够参考官网文档:http://nginx.org/en/docs/http/ngx_http_upstream_module.html    # 也能够在server配置中独自指定,如:server backend1 weight=5 max_fails=3 fail_timeout=10s;    # 其中weight示意权重,max_fails和fail_timeout用于故障转移的判断,weight越大的后端服务器,获取的申请越多    # max_fails示意在fail_timeout工夫内呈现的最大失败次数    # fail_timeout示意在被标记为失败之前的工夫,呈现的最大失败次数,当一个后端服务器被标记为失败时,不再把申请负载给它,直到过了fail_timeout工夫,如果一个后端服务器被标记为失败,然而在fail_timeout工夫内又复原了失常那么它将从新参加负载平衡    # 如果所用的算法是ip_hash,则会依据客户端IP地址的HASH值来抉择后端服务器,这样能够保障同一客户端的申请会被转发到同一台后端服务器上    # 主动发现的机制:增加了一个新的后端服务器或失去分割的服务器在指定工夫内主动被删除,默认值:10秒    # 还有一个keepalive机制,用于复用后端连贯,缩小建设连贯的开销    # 能够在http块中定义默认的参数    # keepalive 8;    # keepalive_timeout示意放弃连接时间(默认75秒)    # keepalive_requests示意单个连贯最大申请数(默认100)    # 这些参数能够通过nginx -V命令查看    # 能够为每个upstream块独自指定一组参数    # 如:upstream backend {    #          keepalive 64;    #          keepalive_timeout 65s;    #          keepalive_requests 100;    #      }    # 如果没有指定,则沿用http块中的参数}

在理论利用中,咱们能够通过在 server 配置中援用 upstream 名称来应用下面定义的后端服务器列表,实现负载平衡和故障转移。

示例代码:

http {    upstream backend {        server 127.0.0.1:8080;        server 127.0.0.1:8081;        server 127.0.0.1:8082;    }     server {        listen       80;        server_name  localhost;         location / {            proxy_pass  http://backend;            # 将客户端的申请转发到backend定义的一组后端服务器中的一个            # 如果其中某个后端服务器标记为失败,则会抉择其余可用的后端服务器        }    }}

rewrite指令详解

在Nginx中,rewrite块是一种用于重写URL的指令。它能够让URL匹配一个正则表达式,并依照肯定规定重写URL。上面是rewrite块的具体用法、示例代码和注解。

语法

rewrite regex replacement [flag];

regex:正则表达式,用于匹配须要被重写的URL。

replacement:重写规定,在匹配胜利后,将被替换的URL。

flag:可选的标记,用于指定rewrite行为的不同方面。

示例代码

location /new-location/ {  rewrite ^/new-location/(.*)$ /old-location/$1 break;}

这段代码中,定义了一个名为 /new-location/ 的 location 块,用于对该页面的申请进行解决。其中,应用了 rewrite 指令对申请的 URI 进行了批改。

^/new-location/(.*)$ 示意应用正则表达式匹配 URI,其中 ^$ 示意匹配起始和完结地位,/new-location/ 示意匹配 URI 的结尾局部,(.*) 示意匹配 URI 的其余部分,并将匹配后果存储在变量 $1 中。

/old-location/$1 示意将匹配到的 URI 的其余部分增加在 /old-location/ 后,后果作为批改后的 URI。

break 参数示意在重写 URI 之后进行解决以后申请,不再继续执行上面的 location 指令。

因而,对于申请 /new-location/path/to/resource,会被重写为 /old-location/path/to/resource

须要留神的是,rewrite 指令能够呈现在 server、location 等块中,也能够应用 flag 参数来管制重写行为,如 last、redirect 等。其中,last 示意在进行 URI 重写之后,从新开始新一轮的 URI 解决,而 redirect 示意将这个申请重定向到另一个 URL。

rewrite可选参数详解

在nginx的rewrite模块中,有几个罕用的参数,包含:

  • break:进行执行以后的rewrite指令集,而后开始执行下一个指令集;
  • last:进行执行以后的rewrite指令集,而后从新执行nginx的location匹配;
  • redirect:发送302长期重定向状态码;
  • permanent:发送301永恒重定向状态码。

上面咱们解释一下它们之间的区别:

  • break:进行执行以后的rewrite指令集,然而不对uri进行重定向,nginx将继续执行下一条指令。应用这个指令通常是为了避免uri被重写屡次。
    示例代码:
location /admin/ {  rewrite ^(/admin)(.*)$ $1/index.html break;  proxy_pass http://backend/;}

在这个例子中,如果uri匹配到/admin/,则将/admin/重写为/admin/index.html,而后继续执行proxy_pass指令。

  • last:进行执行以后的rewrite指令集,从新执行nginx的location匹配,即再次进入location块中查找匹配的uri,并将uri放入到新的指令集中执行。应用这个指令能够实现在rewrite过程中动静扭转uri或指定新的location解决申请。
    示例代码:
location /old/ {  rewrite ^/old/(.*)$ /new/$1 last;}location /new/ {  proxy_pass http://backend/;}

在这个例子中,如果uri匹配到/old/,则将/old/后的内容重写为/new/后的内容,而后从新匹配uri,进入到/new/的location块中持续解决申请。

  • redirect:发送302长期重定向状态码,将客户端的申请重定向到新的uri,客户端会发送新的申请。应用这个指令能够实现uri重定向,但不会扭转浏览器的地址栏。
    示例代码:
rewrite ^/login$ /user/login.html redirect;

在这个例子中,如果uri匹配到/login,将发送302长期重定向状态码,将客户端重定向到/user/login.html

  • permanent:发送301永恒重定向状态码,将客户端的申请永恒重定向到新的uri,客户端会发送新的申请。应用这个指令能够实现uri重定向,并且会扭转浏览器的地址栏。
    示例代码:
rewrite ^/old/(.*)$ /new/$1 permanent;

在这个例子中,如果uri匹配到/old/前面跟着任意字符,将发送301永恒重定向状态码,将客户端重定向到/new/前面跟着同样的任意字符。

access模块

nginx access模块用于管制客户端申请的拜访权限。通过配置,能够限度只有指定的IP地址或CIDR的申请才可能被解决,而其它申请则会被回绝。

该模块的用法非常灵活,能够在全局作用域、server作用域或location作用域下应用。以下是具体的用法说明:

全局作用域

在nginx配置文件的全局作用域中应用access模块,会将其作用于所有server模块和location模块。示例代码如下:

http {    ...    # 访问控制配置    include /path/to/access.conf;    ...}

其中,access.conf是一个独自的配置文件,该文件中蕴含了一些access模块的具体配置。在这个文件中,能够应用allow和deny指令来进行IP地址的访问控制。

server作用域

在server作用域中应用access模块,能够针对指定的server块进行访问控制。示例代码如下:

server {    listen 80;    server_name example.com;    ...    # 访问控制配置    allow 192.168.1.0/24;    deny all;    ...}

在这个配置中,只有192.168.1.0/24网段的IP地址能够拜访example.com域名下的资源,其它IP地址则会被回绝。

location作用域

在location作用域中应用access模块,能够针对特定的URL门路进行访问控制。示例代码如下:

location /admin/ {    # 访问控制配置    allow 192.168.1.100;    deny all;    ...}

在这个配置中,只有192.168.1.100的IP地址能够拜访/admin/门路下的资源,其它IP地址则会被回绝。

基于以上示例代码,上面具体解释access模块中各个指令的含意和用法:

allow指令

allow指令示意容许指定的IP地址或CIDR进行拜访。该指令能够配置多个IP地址或CIDR,用空格隔开。示例代码如下:

allow 192.168.1.100;allow 10.0.0.0/24;

以上配置示意容许192.168.1.100和10.0.0.0/24网段下的IP地址进行拜访。

须要留神的是,如果同时配置了多个allow指令,那么所有指令的成果会叠加。也就是说,如果有任意一个allow指令容许了该IP拜访,那么该IP就能够拜访资源。

deny指令

deny指令示意禁止指定的IP地址或CIDR进行拜访。该指令的用法和allow指令相似,示例代码如下:

deny 192.168.1.0/24;deny 10.0.0.100;

以上配置示意禁止192.168.1.0/24网段下的IP地址和10.0.0.100的IP地址进行拜访。

须要留神的是,deny指令的优先级高于allow指令。也就是说,如果一个IP地址既合乎allow指令的配置,又合乎deny指令的配置,那么该IP地址将被回绝拜访。

all指令

all指令示意容许或禁止所有IP地址进行拜访。该指令和allow和deny指令搭配应用,示例代码如下:

allow all;den all;

以上配置别离示意容许或禁止所有IP地址进行拜访。

须要留神的是,all指令在deny指令中的优先级高于allow指令。也就是说,如果同时配置了allow all和deny all指令,那么所有IP地址都会被回绝拜访。

综上所述,access模块是nginx中十分罕用的一个模块,能够帮忙管理员实现灵便的拜访控制策略。须要依据理论场景进行配置,具体应用时请参考以上示例代码。

include模块

在Nginx的配置文件中,include模块能够让咱们将多个配置文件离开治理,便于浏览和保护。上面是include模块的具体用法、示例代码以及注解:

  1. 用法:蕴含指定的文件,实现配置文件的模块化治理。
#示例配置代码http {    include /etc/nginx/mime.types;    include /etc/nginx/conf.d/*.conf;}

应用 include 引入的文件格式要求和 nginx 配置文件格式统一,即每条指令以分号结尾,每段配置以大括号突围。同时,须要留神防止在 included 文件中反复定义已有的指令,免得引起配置不统一的问题。

  1. 示例代码:

咱们的Nginx服务器可能须要配置多个虚拟主机,并且每个虚拟主机都有一些独特的配置,同时还有针对不同虚拟主机的独特的配置。这时能够应用include模块来将独特的配置和不同的配置离开治理。

例如,咱们能够将独特的配置放在一个文件中,比方common.conf:

# common.conflisten 80;location / {    try_files $uri $uri/ =404;}

接着,在每个虚拟主机的配置文件中,咱们能够应用include指令来引入common.conf,而后再进行独特的配置:

# site1.confserver {    server_name site1.com;    include common.conf;    location / {        proxy_pass http://127.0.0.1:8080;    }}# site2.confserver {    server_name site2.com;    include common.conf;    root /var/www/site2;    index index.html;}

在这个配置中,咱们通过include指令将common.conf引入到每个虚拟主机的配置文件中,从而防止了反复的配置。同时,咱们还能够在不同的配置文件中增加独特的配置,确保不同的虚拟主机可能依照本人的需要工作。

  1. 注解:

在下面的例子中,咱们能够发现include指令同样能够用来引入Nginx的其余配置文件,比方mime.types(定义MIME类型)、fastcgi.conf(定义FastCGI参数)等。应用include模块能够让咱们更不便地治理Nginx的配置文件,而不须要将所有的配置都写在同一个文件中,从而大大提高了可读性和可维护性。

ssl模块

nginx的ssl模块用于启用HTTPS协定,配置SSL/TLS加密,以爱护网站的安全性。以下是ssl模块的具体用法、示例代码和注解:

# 配置nginx应用的SSL证书和私钥ssl_certificate /path/to/ssl.crt;ssl_certificate_key /path/to/ssl.key;# 配置ssl协定和加密算法ssl_protocols TLSv1.2 TLSv1.3; # 指定反对的TLS/SSL协定版本ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384; # 配置加密算法ssl_prefer_server_ciphers on; # 指定应用服务器端抉择的加密算法# 配置SSL会话缓存ssl_session_cache shared:SSL:10m; # 指定缓存大小和名称ssl_session_timeout 5m; # 指定缓存过期工夫# 配置ssl平安相干选项ssl_stapling on; # 开启OCSP状态响应ssl_stapling_verify on; # 验证OCSP响应的有效性ssl_trusted_certificate /path/to/trust.crt; # 配置CA证书用于验证客户端证书# 配置ssl代理相干选项proxy_ssl_server_name on; # 开启SSL Server Name Indicationproxy_ssl_session_reuse on; # 开启SSL会话重用proxy_ssl_protocols TLSv1.2 TLSv1.3; # 配置反对的协定版本# 配置ssl客户端证书认证ssl_client_certificate /path/to/ca.crt; # 配置CA证书ssl_verify_client on; # 开启客户端证书认证ssl_verify_depth 2; # 配置验证链最大深度# 配置ssl限速limit_rate 100k; # 指定限速速率limit_rate_after 5m; # 指定限速开始工夫

注解:

  • ssl_certificate和ssl_certificate_key别离配置SSL证书和私钥。
  • ssl_protocols和ssl_ciphers:别离配置反对的SSL/TLS协定版本和加密算法。
  • ssl_prefer_server_ciphers指定是否应用服务器端抉择的加密算法。
  • ssl_session_cache和ssl_session_timeout别离配置SSL会话缓存大小和过期工夫。
  • ssl_stapling开启OCSP状态响应,ssl_stapling_verify验证OCSP响应的有效性。
  • ssl_trusted_certificate配置CA证书用于验证客户端证书。
  • proxy_ssl_server_name开启SSL Server Name Indication(SNI),proxy_ssl_session_reuse开启SSL会话重用,proxy_ssl_protocols配置反对的协定版本。
  • ssl_client_certificate配置CA证书,ssl_verify_client开启客户端证书认证,ssl_verify_depth配置验证链的最大深度。
  • limit_rate和limit_rate_after配置SSL限速。

gzip模块

在nginx的配置文件中,能够应用gzip模块来开启gzip压缩性能,从而缩小传输数据的大小,晋升网站的性能和响应速度。

以下是几个gzip参数的阐明

  • gzip_types:指定须要应用gzip算法压缩的MIME类型,默认是"text/html"。
  • gzip_vary:通知代理服务器应用gzip压缩之后,要增加Vary: Accept-Encoding头信息。
  • gzip_proxied:指定启用gzip压缩的申请类型。
  • gzip_comp_level:指定gzip压缩的级别,压缩级别越高,压缩比例越高,耗时也会相应变长,范畴是1-9(9最高)。
  • gzip_buffers:设置压缩缓冲区数量和大小。
  • gzip_http_version:指定响应的最小HTTP版本,如果比该版本低则不启用压缩。
  • gzip_disable:禁用用户代理,如某些旧版Internet Explorer浏览器,不反对gzip压缩。

具体的用法如下

gzip on;gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;gzip_min_length 1024;

其中,gzip指令开启gzip压缩性能,gzip_types指令指定须要压缩的文件类型,gzip_min_length指令指定了最小压缩文件大小。须要留神的是,gzip_types指令中指定的文件类型必须是MIME类型,格局为type/subtype,多个文件类型之间用空格分隔。

上面是一个具体的示例代码:

http {    gzip on;    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;    gzip_min_length 1024;    ...}

上述代码中,咱们开启了gzip压缩,并指定了须要压缩的文件类型。对于大小小于1024字节的文件,nginx不会进行gzip压缩。

测试gzip模块

能够应用curl命令来测试gzip模块是否失效。具体命令是:

curl -I -H "Accept-Encoding: gzip" http://example.com

该命令将显示HTTP响应头信息,包含Content-Encoding:gzip头,示意曾经通过gzip压缩。

须要留神的是,开启gzip压缩性能须要耗费肯定的CPU资源。因而,个别状况下倡议只针对一些体积较大的动态资源进行gzip压缩,以晋升性能和响应速度。同时,也须要留神gzip压缩并不是实用于所有状况,例如图片、音视频等二进制文件可能并不适宜压缩。因而,在应用gzip压缩时,须要依据具体情况进行调整和优化。

geo模块

NGINX Geo模块是用于解决IP地址和地理位置信息的模块,该模块可能依据IP地址的地理位置进行条件分支管制,以便实现不同的申请转发、限度拜访等性能。上面是一些示例代码:

  1. 依据地理位置进行申请转发
# 定义一个geo变量,用来匹配地址对应的地理位置,并调配一个默认值geo $region {   default unknown;   192.168.1.0/24 local;   172.16.0.0/12 internal;   10.0.0.0/8 internal;   180.169.0.0/16 china;   192.168.0.0/16 lan;}server {   listen 80;   server_name example.com;   location / {       # 依据$region匹配胜利的值,进行条件判断并进行相应的申请转发       if ($region = china) {           proxy_pass http://china_servers;       }       if ($region = internal) {           proxy_pass http://internal_servers;       }       if ($region = local) {           proxy_pass http://local_servers;       }       proxy_pass http://default_servers;   }}
  1. 依据地理位置限度拜访
# 定义一个geo变量,用来匹配白名单的IP地址,调配一个默认值为0geo $white_list {    default 0;    180.169.0.0/16 1;}server {    listen 80;    server_name example.com;    # 如果$white_list匹配胜利,则返回403错误信息,否则失常进行申请解决    if ($white_list) {        return 403;    }}

以上示例代码均是简略的示例,理论利用中还须要联合具体场景灵活运用。

总结

本文具体的介绍了nginx的装置、罕用模块的配置以及具体用法,心愿各位小伙伴看完这篇文章当前都能纯熟应用nginx配置,如这篇文章对你有帮忙,欢送点赞珍藏关注三连,以资鼓励,谢谢!

本文由mdnice多平台公布