Nginx配置文件详解

admin 2024年12月3日14:14:21评论3 views字数 9529阅读31分45秒阅读模式

Nginx的主配置文件是nginx.conf,配置文件主要一共由三部分组成,分别为全局块,events块和http块。在http块中,又包含http全局块、多个server块。每个server块中,又包含server全局块和多个location块。在同一配置块中嵌套的配置块,各个之间不存在次序关系。

配置文件支持大量可配置的指令,绝大多数指令不是特定属于某一块。同一个指令放在不同层级的块中,其作用域也不一样,一般情况下,高层级块中的指令可以作用于自身所在的块和此块包含的所有低层级块。若某个指令在两个不同层级的块中出现,则采用就近原则,即以较低层级块中的配置为准。即精细化大于全局化,例如某一指令同时出现在http块和server块中,并且配置不同,则应该以server块中的配置为准。

# 全局块user  nobody;worker_processes  1;# events块events {    worker_connections  1024;}# http块http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;    # server块    server {        # server全局块        listen       80;        server_name  192.168.218.132;    # location块        location / {            root   html;            index  index.html index.htm;        }        error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }  # 可以同时存在多个server块  server {    ...  }}

全局块

全局块是默认配置文件到events块之间的一部分内容,主要设置一些影响Nginx服务器整体运行的配置指令,因此,这些指令的作用域是Nginx服务器全局。

通常包括配置运行Nginx服务器的用户(组)、允许生成的worker process数、Nginx进程PID存放路径、日志的存放路径和类型以及配置文件引入等。

user  nobody;  # 指定可以运行Nginx服务的用户和用户组,只能在全局块配置。将user指令注释掉,或可以配置成nobody形式,代表所有用户都可以运行;在Windows上,user指令不生效,如果指定具体用户或用户组将会报警告。[nginx: [warn] "user" is not supported, ignored in D:nginx-1.18.0/conf/nginx.conf:2]worker_processes  1;# 指定工作线程数,可以指定具体的进程数,也可以使用自动模式,该指令只能在全局块配置# worker_process 3; -- 这种情况下会生成一个master进程和4个worker进程。error_log  logs/error.log;error_log  logs/error.log  notice;error_log  logs/error.log  info;# 指定错误日志的路径和日志级别,此指令可以在全局块、http块、server块以及location块中配置,其中debug级别的日志需要编译时使用--with-debug开关。# 日志级别有 [debug | info | notice | warn | error | crit | alert | emerg]pid        logs/nginx.pid;# 指定pid文件存放的路径,这个指令只能在全局块配置。

events块

events块涉及的指令主要影响Nginx服务器与用户的网络连接。常用到的设置包括是否开启对多worker_process下的网络连接进行序列化、是否允许同时接收多个网络连接、选取哪种时间驱动模型处理连接请求,每个worker process可以同时支持的最大连接数等

这一部分指令对Nginx服务器的性能影响较大,在实际配置中应该根据实际情况灵活调整。

events {    worker_connections  1024;    # 设置一个worker process同时开启的最大连接数,当每个进程都超过这个值时不再接受连接,连接进入logback,只能在events块中进行配置    # 这个值不能超过硬件以及系统本身的硬性要求    accept_mutex on | off;    # 当有一个网络连接到来时,多个睡眠进程会被同时唤醒,但只有一个进程进行连接。但是被唤醒的进程数太多也会影响一部分性能。该功能被称为惊群效应。默认开启该功能,只能在events块中进行配置。    # 当开启的时候,将会对多个Nginx进程接收连接进行序列化,防止多个进程对连接的争抢。    multi_accept on | off;    # 如果multi_accept被禁止了,Nginx一个工作进程只能同时接受一个连接。否则,一个工作进程可以同时接受所有的新连接,所有的新连接将会等待排队;默认是off状态,只能在events块配置    # 如果Nginx使用kquene连接方法,那么该指令将会被忽略,因为该方法会报告在等待被接受连接的数量。    use epoll;    # 指定使用哪种网络IO模型,method可以是[select、poll、kqueue、epoll、rtsig、/dev/pool以及eventport],操作系统不一定支持上面所有模型,只能在events中进行配置。}

http块

http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能以及放入第三方模块。

http块中可以包含自己的全局块,也可以包含server块。server块中又可以进一步包含location块,不包含server的部分就可以简单理解为http全局块。

可以在http全局块中配置的指令包括文件引入、MIME-Type、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数上限等。

http {    include       mime.types;    # include用于引入其他的配置文件,上面的mime.types和主配置文件同级目录,所有这里用的是相对路径,但是引入的文件必须符合要求,只能引入能够出现在http块中的文件。    default_type  application/octet-stream;  # 设置默认的MIME类型是application/octet-stream(二进制文件),如果不添加该指令,默认值是text/plain。    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';  # log_format指令,用于自定义日志格式,此指令只能在http块中进行配置    access_log  logs/access.log  main;  # 在全局块中,我们通过errer_log指令配置Nginx进程运行时的日志存放和级别,此处记录Nginx服务器提供服务过程应答前端请求的日志  #access_log path [format [buffer=size]],如果我们要关闭access_log我们可以使用access_log off;或直接注释掉access_log    sendfile        on;    #开启sendfile方式传输文件,可以在http块,server块或location块中进行配置    sendfile_max_chunk 128k;    设置sendfile最大数据量,可以在http,server或location块中配置;若size值大于零,Nginx进程的每个worker process每次调用sendfile()传输的数据量最大不能超过该值;若设置为0,表示无限制,默认为0。    #tcp_nopush     on;    keepalive_timeout  65;  # 配置连接超时时间,此指令可以在http块、server块或location块中配置。与用户建立会话连接后,Nginx服务器可以保持这些连接打开一段时间  # timeout,服务器端对连接的保持时间。默认值为75s;header_timeout,可选项,在应答报文头部的Keep-Alive域设置超时时间:“Keep-Alive:timeout= header_timeout”。报文中的这个指令可以被Mozilla或者Konqueror识别。  # keepalive_timeout timeout [header_timeout]  # 下面配置的含义是,在服务器端保持连接的时间设置为65 s,发给用户端的应答报文头部中Keep-Alive域的超时时间设置为100 s。  # keepalive_timeout 65s 100s    # 配置单连接请求数上限,此指令可以在http块、server块或location块中配置。  # Nginx服务器端和用户端建立会话连接后,用户端通过此连接发送请求。指令keepalive_requests用于限制用户通过某一连接向Nginx服务器发送请求的次数。默认是100  # keepalive_requests 100;

server块

 server {        listen       80;        # listen有三种配置语法,用来指定监听的主机和端口        # 方法一:只监听来自特定IP,请求80端口的请求(不指定端口,默认80)          # listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];        # 方法二:监听来自所有IP,请求指定端口的请求(不指定IP默认所有,也可以用"*"和"0.0.0.0"表示)          # listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];        # 方法三(不常用)          # listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];        #上面后面跟的可选参数分别代表以下含义:          # address:监听的IP地址(请求来源的IP地址),如果是IPv6的地址,需要使用中括号“[]”括起来,比如[fe80::1]等。          # port:端口号,如果只定义了IP地址没有定义端口号,就使用80端口。主要:要是压根没配置listen指令,且nginx以超级用户权限运行,则使用*:80,否则使用*:8000。多个虚拟主机可以同时监听同一个端口,但是server_name需要设置成不一样;          # default_server:假如通过Host没匹配到对应的虚拟主机,则通过默认的虚拟主机处理。          # backlog=number:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在FreeBSD中默认为-1,其他平台默认为511。          # accept_filter=filter,设置监听端口对请求的过滤,被过滤的内容不能被接收和处理。本指令只在FreeBSD和NetBSD 5.0+平台下有效。filter可以设置为dataready或httpready          # bind:标识符,使用独立的bind()处理此address:port;一般情况下,对于端口相同而IP地址不同的多个连接,Nginx服务器将只使用一个监听命令,并使用bind()处理端口相同的所有连接。          # ssl:标识符,设置会话连接使用SSL模式进行,此标识符和Nginx服务器提供的HTTPS服务有关。       server_name  192.168.218.132;    # server_name用于配置虚拟主机的名称,可以只有一个名称,也可以拥有多个,需要用空格隔开;在名称中可以使用通配符"*",但通配符只能用在由三段字符串组成的名称的首段和尾端。    # 由于server_name指令支持使用通配符和正则表达式两种配置名称的方式,因此在包含有多个虚拟主机的配置文件中,可能会出现一个名称被多个虚拟主机的server_name匹配成功。那么,来自这个名称的请求到底要交给哪个虚拟主机处理呢?Nginx服务器做出如下规定:    # 对于匹配方式不同的,按照以下的优先级选择虚拟主机,排在前面的优先处理请求。      # 准确匹配server_name      # 通配符在开始时匹配server_name成功        # 通配符在结尾时匹配server_name成功      # 正则表达式匹配server_name成功    #在以上四种匹配方式中,如果server_name被处于同一优先级的匹配方式多次匹配成功,则首次匹配成功的虚拟主机处理请求。

location块

每个server块中可以包含多个location块。在整个Nginx配置文档中起着重要的作用,而且Nginx服务器在许多功能上的灵活性往往在location指令的配置中体现出来。

location块的主要作用是,基于Nginx服务器接收到的请求字符串(例如, www.example.com/uri-string),对除虚拟主机名称(也可以是IP别名)之外的字符串(前例中“/uri-string”部分)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能都是在这部分实现。许多第三方模块的配置也是在location块中提供功能。

在Nginx的官方文档中定义的location的语法结构为:

location [ = | ~ | ~* | ^~ ] uri { ... }

其中,uri变量是待匹配的请求字符串,可以是不含正则表达的字符串,如/myserver.php等;也可以是包含有正则表达的字符串,如 .php$(表示以.php结尾的URL)等。为了下文叙述方便,我们将不含正则表达的uri称为“标准uri”,使用正则表达式的uri称为“正则uri”。

其中方括号里的部分,是可选项,用来改变请求字符串与 uri 的匹配方式。在介绍四种标识的含义之前,我们需要先了解不添加此选项时,Nginx服务器是如何在server块中搜索并使用location块的uri和请求字符串匹配的。

在不添加此选项时,Nginx服务器首先在server块的多个location块中搜索是否有标准uri和请求字符串匹配,如果有多个可以匹配,就记录匹配度最高的一个。然后,服务器再用location块中的正则uri和请求字符串匹配,当第一个正则uri匹配成功,结束搜索,并使用这个location块处理此请求;如果正则匹配全部失败,就使用刚才记录的匹配度最高的location块处理此请求。

可选项中各个标识的含义:

  • “=”,用于标准uri前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理此请求。

  • “^~”,用于标准uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。

  • “~”,用于表示uri包含正则表达式,并且区分大小写。

  • “~*”,用于表示uri包含正则表达式,并且不区分大小写。注意如果uri包含正则表达式,就必须要使用“~”或者“~*”标识。

我们知道,在浏览器传送URI时对一部分字符进行URL编码,比如空格被编码为“%20”,问号被编码为“%3f”等。“~”有一个特点是,它对uri中的这些符号将会进行编码处理。比如,如果location块收到的URI为“/html/%20/data”,则当Nginx服务器搜索到配置为“~ /html/ /data”的location时,可以匹配成功。

location / {            root   html;            # 这个指令用于设置请求寻找资源的跟目录,此指令可以在http块、server块或者location块中配置。由于使用Nginx服务器多数情况下要配置多个location块对不同的请求分别做出处理,因此该指令通常在location块中进行设置            index  index.html index.htm;            # 默认界面文件,可以自定义文件类型,比如index.php        }

完整配置文件解读

user  nobody;# 定义Nginx运行的用户和用户组为任意用户任意组worker_processes  1;# nginx进程数,一般为CPU总核心数,这里是1。error_log  logs/error.log;# 全局错误日志定义类型#error_log  logs/error.log  notice;#error_log  logs/error.log  info;pid        logs/nginx.pid;# 进程pid文件路径events {    worker_connections  1024;    # 单个进程最大连接数}http {    include       mime.types;    default_type  application/octet-stream;    # 引入MIME类型块,默认为application/octet-stream二进制文件。    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '    #                  '$status $body_bytes_sent "$http_referer" '    #                  '"$http_user_agent" "$http_x_forwarded_for"';    #access_log  logs/access.log  main;    sendfile        on;    #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。    #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。    tcp_nopush     on;  #此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用。    #keepalive_timeout  0;    keepalive_timeout  65;  #  长连接超时时间,单位是秒    gzip  on;  # 开启gzip压缩输出  gzip_min_length 1k;    #最小压缩文件大小    gzip_buffers 4 16k;    #压缩缓冲区    gzip_http_version 1.0;    #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)    gzip_comp_level 2;    #压缩等级    gzip_types text/plain application/x-javascript text/css application/xml;    #压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。    server {        listen       80;  # 监听端口        server_name  192.168.218.132;  # 域名        #charset koi8-r;        #access_log  logs/host.access.log  main;        location / {            root   html;            index  index.html index.htm;        }        error_page  404              /404.html;  # 错误页        # redirect server error pages to the static page /50x.html        # 反向代理服务错误页        error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }        # 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           html;        #    fastcgi_pass   127.0.0.1:9000;        #    fastcgi_index  index.php;        #    fastcgi_param  SCRIPT_FILENAME  /scripts$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;        #}    }    # another virtual host using mix of IP-, name-, and port-based configuration   另外的虚拟主机    #    #server {    #    listen       8000;    #    listen       somename:8080;    #    server_name  somename  alias  another.alias;    #    location / {    #        root   html;    #        index  index.html index.htm;    #    }    #}    # HTTPS server   HTTPS搭建    #    #server {    #    listen       443 ssl;    #    server_name  localhost;    #    ssl_certificate      cert.pem;    #    ssl_certificate_key  cert.key;    #    ssl_session_cache    shared:SSL:1m;    #    ssl_session_timeout  5m;    #    ssl_ciphers  HIGH:!aNULL:!MD5;    #    ssl_prefer_server_ciphers  on;    #    location / {    #        root   html;    #        index  index.html index.htm;    #    }    #}}

参考链接:https://www.cnblogs.com/54chensongxia/p/12938929.html

原文始发于微信公众号(鱼板安全):Nginx配置文件详解

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月3日14:14:21
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Nginx配置文件详解http://cn-sec.com/archives/2492612.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息