Nginx配置文件详解

本篇主要对Ngnix默认的配置文件的每一项进行了说明,并添加了一些常用配置及对各模块中的我用到的属性进行了补充说明,之后会不断晚上配置项,详细配置参考Nginx中文网址 点此查看

目录

Nginx配置文件结构

全局块

events块

http块

Nginx常用配置及说明

server块补充

listen

server_name

location

error_page

proxy_pass

http全局块补充

定义MIME-Type

试一下

access.log、error.log 日志

gzip模块设置

其它补充

log_format配置项说明

惊群现象

sendfile


Nginx配置文件结构

...              #全局块
 
events {         #events块
   ...
}
 
http      #http块
{
    ...   #http全局块
    server        #server块
    {
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN]
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}

  

全局块

从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

events块

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。 这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

http块

这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。http 块也可以包括 http全局块、server 块。

Nginx常用配置及说明

###### 全局块 #####
 
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
worker_processes 1; #nginx进程数,建议设置为等于CPU总核心数 默认为1。
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /usr/local/nginx/logs/error.log info;
pid /usr/local/nginx/logs/nginx.pid; #进程pid存放路径
 
###### events块 #####
 
events {
    #accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    #multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport epoll是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll
    #单个进程最大连接数(最大连接数=连接数*进程数)
    worker_connections  1024;
}
  
  
###### http块 #####
 
http
{
     
    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #用来配置Nginx响应前端请求默认的MIME类型 默认default_type text/plain;
    #charset utf-8; #默认编码
 
    #access_log off; #取消服务日志
    # 可自定义日志格式
    #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;
 
 
    client_max_body_size 8m; #设定通过nginx上传文件的大小
 
    #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    sendfile on;
 
    #开启目录列表访问,合适下载服务器,默认关闭。
    autoindex on;
     
    #keepalive_timeout  0; #长连接超时时间,单位是秒
    keepalive_timeout  65;
 
    #gzip模块设置
    #gzip on; #开启gzip压缩输出
 
 
    #负载均衡配置
    upstream mysvr {
      
        #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
        server 192.168.80.121:80 weight=3;
        server 192.168.80.122:80 weight=2;
        server 192.168.80.123:80 backup;  #热备
        server 192.168.80.123:80 down;
    
        #在需要使用负载均衡的server中增加 proxy_pass http://mysvr/;
    }
      
      
      
    #虚拟主机的配置
    server
    {
        listen 80; #监听端口
 
        #域名可以有多个,用空格隔开
        server_name localhost;
         
        #access_log  logs/host.access.log  main;
        error_page 404 /404.html; #配置错误页面(当404时展示404.html页面,配置一个location来跳转到具体页面)
         
 
        location  / {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index  index.html index.htm;  #设置网站的默认首页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 127.0.0.1; #允许的ip          
        }
 
        #配置错误页面转向
        location = /404.html {
            root /home/www/myweb;
            index 404.html;
        } 
    }
}

  

server块补充 配置多个server块时,默认使用的是第一个server。 访问时,如果没有匹配到对应的address:port,则会默认执行的,默认使用的是第一个server,也可以使用 default_server 属性指定哪个server为默认的。

listen

listen port #监听该端口的所有IP连接
listen *:80 | *:8080 #监听所有80端口和8080端口
listen  IP_address:port   #监听指定的地址和端口号
listen  IP_address     #监听指定ip地址所有端口
listen *:8000; 监听指定端口上的连接
listen 8090 default_server

server_name

该指令用于虚拟主机的配置。可以基于名称和IP进行配置。基于名称的虚拟主机配置时规则如下:

1、对于name 来说,可以只有一个名称,也可以有多个名称,中间用空格隔开。

2、使用通配符“*”,但通配符只能用在由三段字符组成的首段或者尾端,或者由两端字符组成的尾端。

3、使用正则表达式,用“~”作为正则表达式字符串的开始标记,“^”和“$”之间为要匹配的内容,“^”表示开头 “$”表示结尾。

server_name 127.0.0.1 # 基于Ip配置

server_name  www.123.com # 基于名称

server_name  www.123.com  www.456.com # 多个空格隔开

server_name *.123.com www.123.* # 使用通配符 

server_name ~^wwwd+.123.com$; # 使用正则表达式

常见的正则表达式

代码说明
^ 匹配搜索字符串开始位置
$ 匹配搜索字符串结束位置
. 匹配除换行符n之外的任何单个字符
  转义字符,将下一个字符标记为特殊字符
[xyz] 字符集,与任意一个指定字符匹配
[a-z] 字符范围,匹配指定范围内的任何字符
w 与以下任意字符匹配 A-Z a-z 0-9 和下划线,等效于[A-Za-z0-9_]
d 数字字符匹配,等效于[0-9]
{n} 正好匹配n次
{n,} 至少匹配n次
{n,m} 匹配至少n次至多m次
* 零次或多次,等效于{0,}
+ 一次或多次,等效于{1,}
? 零次或一次,等效于{0,1}

location

该指令用于匹配 URL。语法如下:

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

  

uri变量是待匹配的请求字符串,可以不包含正则表达式,也可以包含正则表达式,那么nginx服务器在搜索匹配location的时候,是先使用不包含正则表达式进行匹配,找到一个匹配度最高的一个,然后在通过包含正则表达式的进行匹配,如果能匹配到直接访问,匹配不到,就使用刚才匹配度最高的那个location来处理请求。

示例一:不带符号,要求必须以指定模式开始

location /abc

以下访问都是正确的
http://127.0.0.1/abc
http://127.0.0.1/abc?p1=TOM
http://127.0.0.1/abc/
http://127.0.0.1/abcdef

示例二:= : 用于不包含正则表达式的uri前,必须与指定的模式精确匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。

location =/abc

可以匹配到
http://127.0.0.1/abc
http://127.0.0.1/abc?p1=TOM
匹配不到
http://127.0.0.1/abc/
http://127.0.0.1/abcdef

示例三:

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

~*:用于表示 uri 包含正则表达式,并且不区分大小写。

换句话说,如果uri包含了正则表达式,需要用上述两个符合来标识

~*^/abcw$

示例四: ^~: 用于不含正则表达式的 uri 前,功能和不加符号的一致,唯一不同的是,如果模式匹配,那么就停止搜索其他模式了。

server {
        listen       8091;
        server_name  localhost;

        location /abcd {
            default_type text/plain;
            return 200 "abcd success";
        }
        location ~*^/abcw$ {
            default_type text/plain;
            return 200 "success";
        }
    }

我们访问 http://localhost:8091/abcd 后会返回 success

/abcd前加上 ^~再次访问 http://localhost:8091/abcd 后会返回 abcd success

error_page

设置网站的错误页面。

语法error_page code ... [=[response]] uri;
默认值
位置 http、server、location......

当出现对应的响应code后,如何来处理。

举例说明:

(1)可以指定具体跳转的地址

server {
    error_page 404 https://www.baidu.com;
}

(2)可以指定重定向地址

server{
    error_page 404 /50x.html;
    error_page 500 502 503 504 /50x.html;
    location =/50x.html{
        root html;
    }
}

(3)使用location的@符合完成错误信息展示

server{
    error_page 404 @jump_to_error;
    location @jump_to_error {
        default_type text/plain;
        return 404 'Not Found Page...';
    }
}

(4)可选项=[response]的作用是用来将相应代码更改为另外一个

server{
    error_page 404 =200 /50x.html;
    location =/50x.html{
        root html;
    }
}

  

这样的话,当返回404找不到对应的资源的时候,在浏览器上可以看到,最终返回的状态码是200,这块需要注意下,编写error_page后面的内容,404后面需要加空格,200前面不能加空格。

proxy_pass

该指令用于设置被代理服务器的地址。可以是主机名称、IP地址加端口号的形式。语法结构如下:

proxy_pass URL;

URL 为被代理服务器的地址,可以包含传输协议、主机名称或IP地址加端口号,URI等。

proxy_pass  http://www.123.com/uri; 

http全局块补充

定义MIME-Type

浏览器中可以显示的内容有HTML、XML、GIF等文件、媒体等资源,浏览器为了区分这些资源,就需要使用MIMEType。所以说MIME Type是网络资源的媒体类型。Nginx作为web服务器,也需要能够识别前端请求的资源类型。在Nginx的配置文件中与MIME-Type类型定义相关的配置项为include 和 default_type ,所有的MIME-Type可以看下conf目录下的mime.types文件,这里列举几个常用的类型:

超文本标记语言文本  text/html;
普通文本 : text/plain;
Json文件:application/json;
压缩文件.rar  application/octet-stream;

default_type:用来配置Nginx响应前端请求默认的MIME类型。

语法default_type mime-type;
默认值 default_type text/plain;
位置 http、server、location

试一下

有些时候请求某些接口的时候需要返回指定的文本字符串或者json字符串,如果逻辑非常简单或者干脆是固定的字符串,那么可以使用nginx快速实现,这样就不用编写程序响应请求了,可以减少服务器资源占用并且响应性能非常快。

location /get_text {
    #这里也可以设置成text/plain
    default_type text/html;
    return 200 "This is nginx's text";
}

  

我们访问 http://localhost/get_text 就可以直接获取到return的字符串。 

access.log、error.log 日志

Nginx中日志的类型分access.log、error.log。
access.log:用来记录用户所有的访问请求。
error.log:记录nginx本身运行时的错误信息,不会记录用户的访问请求。
Nginx服务器支持对服务日志的格式、大小、输出等进行设置,需要使用到以下两个指令:
access_log:可定义在http, server, location块中。
log_format:只能在http块中

gzip模块设置

    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。
    gzip_vary on;

其它补充

log_format配置项说明

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

  • 1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
  • 2.$remote_user :用来记录客户端用户名称;
  • 3.$time_local : 用来记录访问时间与时区;
  • 4.$request : 用来记录请求的url与http协议;
  • 5.$status : 用来记录请求状态;成功是200;
  • 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
  • 7.$http_referer :用来记录从那个页面链接访问过来的;
  • 8.$http_user_agent :记录客户端浏览器的相关信息;

惊群现象

大致意思是在某一个时刻,客户端发来一个请求连接,Nginx后台是以多进程的工作模式,也就是说有多个worker进程会被同时唤醒,但是最终只会有一个进程可以获取到连接,如果每次唤醒的进程数目太多,就会影响Nginx的整体性能。如果将上述值设置为on(开启状态),将会对多个Nginx进程接收连接进行序列号,一个个来唤醒接收,就防止了多个进程对连接的争抢。

sendfile

用来设置Nginx服务器是否使用sendfile()传输文件,该属性可以大大提高Nginx处理静态资源的性能。

语法sendfile on|off;
默认值 sendfile off;
位置 http、server、location
 
 

  

 

posted @ 2022-09-16 16:28  星火卓越  阅读(330)  评论(0编辑  收藏  举报