Nginx 配置文件结构解析

nginx配置文件路径


不同安装方式,nginx的文件存放路径也有所不同。

源码安装配置文件路径:在安装目录下的conf目录下,比如我的安装目录是/usr/local/nginx,那么他的配置文件就在/usr/local/nginx/conf目录下。

yum安装配置文件路径:在/etc/nginx/目录(主配置文件)与/etc/nginx/conf.d目录下。

nginx配置文件的结构


通常源码安装的nginx的配置文件,会是下面这种结构,yum安装的有细微差异(大致是一样的,只是server是通过include引用的独立配置文件)

                                             

http{

upstream{
 
}

server{
 location xxx{
    if(xxx){
  }
}

location xxx{
 ........
  }

}

server {
......
 }

}

location里面还有if块,一般if块不会出现的太多,它是会在比较复杂配置当中做一些条件的判断。

 一个server可以存在多个location,同样一个http可以存在多个server,一个server里面可以包含多个location。一般只配置一个http,这样就一个实例

对于HTTP块来说里面可能有多个server块。对于每个server块来说,里面可能有多个location块。 

1、main全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

4、server块:配置虚拟主机的相关参数,一个http中可以有多个server

5、location块:配置请求的路由,以及各种页面的处理情况

NginX HTTP核心模块配置说明


 nginx.conf

HTTP 的配置项必须直属于 http 块、 server 块、 location 块、 upstream 块或 if
server可以写在其他文件当中,通过include指令,将其他文件当中的配置包含到nginx.conf当中,使其生效。
当然了你也可以使用其他的配置文件,你启动nginx的时候配置一下。

虚拟主机与请求的分发 :监听端口、主机名称、location设定


文件路径的定义:设置资源路径、设置访问首页、重定向
内存与磁盘资源的分配:包体只存储在磁盘、存储 HTTP 头的内存大小
网络连接的设置:读取 HTTP 头部的超时时间、读取 HTTP 包体的超时时间
MIME 类型的设置:默认 MIME type MIME type 文件扩展映射
对客户端请求的限制:按 HTTP 方法名限制请求、 HTTP 请求包体的最大值
文件操作的优化: sendfile 系统调用、打开文件缓存
对客户端请求的特殊处理:忽略不合法的 HTTP 头部、 DNS 解析地址

解析配置文件


全局配置(设置的指令将影响其他所有设置,一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等)

  • user  nginx;

指定nginx的工作进程的用户及用户组,默认是nobody用户。

[root@localhost ~]# ps -ef | grep nginx
nobody    14303  14302  0 16:01 ?        00:00:00 nginx: worker process

通常而言,会给其定义一个用户。如user nginx,那么nginx就有权限来管理其发布目录。这个用户必须存在

  • worker_processes  8;  --指定工作进程的个数,默认是1个。具体可以根据服务器cpu数量进行设置,比如cpu有4个,可以设置为4。一般来说,worker_processes会设置成CPU个数,如果不知道cpu的数量,可以设置为auto。nginx会自动判断服务器的cpu个数,并设置相应的进程数。(使用lscpu来查看你的cpu的个数)
  • worker_cpu_affinity:为每个进程分配CPU,将八个进程分配给8个CPU,当然也可以写多个,或者将一个进程分配给多个CPU
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
  • worker_rlimit_nofile 65535; 进程的最大打开文件数限制。这样nginx就不会有“too many open files”问题了,最好与ulimit -n的值保持一致。

[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload  --重新加载配置文件可以看到效果,worker进程由nginx来管理,不是由原来的nobody来管理,而且有两个worker进程在工作

[root@localhost ~]# ps -ef | grep nginx
root      14302      1  0 16:01 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     14444  14302  0 17:55 ?        00:00:00 nginx: worker process
nginx     14445  14302  0 17:55 ?        00:00:00 nginx: worker process

master进程和worker进程的关系:master进程是nginx最主要的一个进程。主要是用来接收管理员给其发出的信号。Master下面可以由多个worker进程,可以根据其配置文件生成多个worker进程。worker进程就是用来接收用户的请求,所有进程都可以去抢用户的请求,没有互斥锁。如果多个worker的其中一个进程挂掉了,那么master进程会回收该进程,并生成新的worker进程,是永远保持你配置文件里指定的worker进程数进行工作的。

[root@localhost ~]# ps -ef | grep nginx
root      14302      1  0 16:01 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     14444  14302  0 17:55 ?        00:00:00 nginx: worker process
nginx     14445  14302  0 17:55 ?        00:00:00 nginx: worker process
root      14465  14400  0 18:09 pts/0    00:00:00 grep --color=auto nginx

[root@localhost ~]# kill -9 14444   --可以看到杀死其中的一个worker进程,那么master立马就生成新的worker进程

[root@localhost ~]# ps -ef | grep nginx
root      14302      1  0 16:01 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     14445  14302  0 17:55 ?        00:00:00 nginx: worker process
nginx     14466  14302  0 18:10 ?        00:00:00 nginx: worker process
  • error_log  logs/error.log;   --默认使用这个
#error_log  logs/error.log  notice;  
#error_log  logs/error.log  info;  

设置nginx的错误日志路径,并设置相应的输出级别。如果编译时没有指定编译调试模块,那么 info就是最详细的输出模式了。

如果有编译debug模块,那么debug时最为详细的输出模式。这里设置为默认就好了。

pid        logs/nginx.pid;

指定nginx进程pid的文件路径 ,Nginx进程是作为系统守护进程在进行,需要在某个文件中保存当前运行程序的主进程号,

events {
use epoll;
worker_connections  1024;
multi_accept on
}

multi_acceptoff – A worker process accepts one new connection at a time (the default). If enabled, a worker process accepts all new connections at once.We recommend keeping the default value (off), unless you’re sure there’s a benefit to changing it. Start performance testing with the default value to better measure predictable scale.

multi_accept on:设置是否允许同时接受多个网络连接,只能在events模块设置,Nginx服务器的每个工作进程可以同时接受多个新的网络连接,但是需要在配置文件中配置,此指令默认为关闭,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个。

events :这个指令块用来设置工作进程的工作模式以及每个进程的连接上限。

use :用来指定nginx的工作模式,通常选择epoll,除了epoll,还有select,poll。

worker_connections :定义每个工作进程的最大连接数,默认是1024。

http指令块,即web服务器的相关配置


include: include是一个引用函数   mime.types; 定义数据类型

如果用户请求lutixia.png,服务器上有lutixia.png这个文件,后缀名是png,根据mime.types,这个文件的数据类型应该是image/png,将Content-Type的值设置为image/png,然后发送给客户端

  • default_type application/octet-stream:设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的。此时,用浏览器访问PHP文件就会出现下载窗口。

  •  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;

定义日志文件格式,并默认取名为main,可以自定义该名字。也可以通过添加,删除变量来自定义日志文件的格式,main后面的内容定义了日志的格式。

  • access_log :定义访问日志的存放路径,并且通过引用log_format所定义的main名称引用其输出格式,如果定义了多个日志格式,可以来引用其中一种格式
[root@localhost conf]# tail -f /usr/local/nginx/logs/access.log
192.168.179.99 - - [07/Mar/2020:20:51:30 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
127.0.0.1 - - [07/Mar/2020:21:35:29 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0"
  • sendfile on :用于开启高效文件传输模式。直接将数据包封装在内核缓冲区,然后返给客户,将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞。

tcp_nopush on;

tcp_nodelay on;

  • keepalive_timeout 65 :设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。

HTTP 有一个 KeepAlive 模式,它告诉 webserver 在处理完一个请求后保持这个 TCP 连接的打开状态。若接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。

提示:可以用netstat -ntlpa |grep 80 查看链接状态

[root@localhost ~]# netstat -ntplna | grep 80  --使用浏览器浏览nginx门户网站,然后看到建立连接了

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      14875/nginx: master
tcp        0      0 192.168.179.99:80       192.168.179.4:62065     ESTABLISHED 15340/nginx: worker
[root@localhost ~]# netstat -ntplna | grep 80  --65秒之后再看看,可以看到断开连接了

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      14875/nginx: master
tcp        0      0 192.168.179.99:80       192.168.179.4:62065     TIME_WAIT   -    

  • keepalive_requests 100; 设置nginx在保持连接状态最多能处理的请求数,到达请求数,即使还在保持连接状态时间内,也需要重新连接。

这个值根据生存环境而设定,比如京东的网页,访问首页的请求就100多次了,比如每个图片都是一个资源,都需要请求,所以要根据网页的文件个数来设定。(对于爬虫的程序65秒足够将官网的数据爬完,所以除了定义keepalive_timeout的值之外还可以限制在65秒内可以访问多少次)

  • gzip on :开启压缩功能,减少文件传输大小,节省带宽。
  • gzip_min_length:设置最小的压缩长度,官方设置1K,如果文件大小小于1K,不进行压缩,大于1K就需要压缩gzip_min_length 1k;(当返回内容大于此值时才会使用gzip进行压缩,以K为单位,当值为0时,所有页面都进行压缩。)
  • gzip_types:压缩的类型,设置需要压缩的MIME类型,如果不在设置类型范围内的请求不进行压缩。图片视频一般是已经压缩了的,再压缩效果也不是很大,所以需要压缩的格式为XML格式。gizp_types text/plain text/xml;(将普通文件和XML文件进行压缩)
[root@localhost epel-source]# ls -lh /var/cache/yum/x86_64/7/epel/metalink.xml -rw-r--r-- 1 root root 8.8K Mar  8 10:48 /var/cache/yum/x86_64/7/epel/metalink.xml   --将.xm文件拷贝到nginx的发布目录下面去,大小为8.8K
[root@localhost epel-source]# cp /var/cache/yum/x86_64/7/epel/metalink.xml /usr/local/nginx/html/

然后打开浏览器去访问.xml文件,可以看到压缩后只有2.1K,可以看到压缩了四分之一

  • gzip_comp_level 3; 压缩级别,默认是1,一般设置为3

server指令块:用于定义虚拟主机的,指令主要用于指定主机和端口


一个server表示一个网站

  • server :用来定义虚拟主机
  • listen :设置监听端口,默认为80端口,端口可以根据需要修改为8080
  • server_name :网站域名,多个域名通过逗号隔开,默认是localhost,可以修改为www.lutixia.com;
[root@localhost ~]# netstat -tpln | grep 8080
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      14875/nginx: master

测试一下(端口8080 域名 www.lutixia.com)

修改windows C:\Windows\System32\drivers\etc下的hosts文件,用来解析域名

加上这一行   192.168.179.99  www.lutixia.com  

如果要解析多个域名 192.168.179.99  www.lutixia1.com  www.lutixia2.com  www.lutixia3.com

可以看到访问成功了!

  • charset :设置网页的默认编码格式,一般设置为charset utf-8;
  • access_log :指定该虚拟主机的独立访问日志,会覆盖前面的全局配置日志文件。如果有有多个虚拟主机,那么每个虚拟主机都需要配置自己的access_log
  • access_log  logs/lutixia.access.log  main;  --如果这样配置,那么就会覆盖全局的日志文件,这个引用main是前面定义的日志格式
[root@www ~]# ls /usr/local/nginx/logs/
access.log  error.log  lutixia.access.log  nginx.pid


[root@www logs]# tail -1f /usr/local/nginx/logs/lutixia.access.log
192.168.179.4 - - [08/Mar/2020:20:08:58 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36" "-"

location指令块:配置请求的路由,以及各种页面的处理情况


location / {
            root   html;
            index  index.html index.htm;

        }

location:来定义资源路径,默认是直接给一个/根目录,所有资源都从根目录下去找,这个根目录就是发布目录

  • index :设置默认的索引文件
  • error_page :定义访问错误返回的页面,凡是状态码是500 502 503 504 都会返回这个页面。

[root@www html]# vim /usr/local/nginx/html/404.html  --这个error page得自己去定义

[root@www html]# cat /usr/local/nginx/html/404.html

"this is error page,file not found!"

error_page  404     =200              /404.html; --定义返回的状态码为200

error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;           }

这是第二种定义找不到页面的方法,其实和上面的error_page  404     =200              /404.html是一样的,上面可以写成

 error_page  404     =200              /404.html;

   location=/404.html{

      root html;  --这里的root html代表根目录是html,这里的root不是root用户,是代表根目录符号/

}

error_page  404     =200              /404.html;

   location=/404.html{

      root  /data/;  --root /data/表示根目录为绝对路径/data/,那么必须保证/data/下有404.html

}

root /data/表示根目录为绝对路径/data/

还是使用第一种最直观 error_page  404     =200              /404.html; 

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/104784252#comments_28699077