Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nginx 配置详解 #3

Open
dengchengchao opened this issue Dec 14, 2019 · 0 comments
Open

Nginx 配置详解 #3

dengchengchao opened this issue Dec 14, 2019 · 0 comments

Comments

@dengchengchao
Copy link
Owner

dengchengchao commented Dec 14, 2019

Nginx的配置

前面说过Nginx的主要配置文件为conf/nginx.conf

默认配置如下:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
  
 
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

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

上述配置意思后面再详细解读。

首先我们分析Nginx的配置文件的结构:

Nginx配置文件的通用结构为

xxx{           //
       ...     //全局配置
      xxx{     //xxx子模块配置

       }
}

其中,全局配置能够影响子模块配置

由此,我们可以从大模块->包含模块的顺序开始分析。

首先是最外层的配置,Nginx最外层分别又:

  • 全局块: 全局块配置在所有的大括号外,主要用于设置Nginx整体的一些运行配置命令

  • events块: events块主要涉及的到Nginx服务器与用户的网络连接,比如是否允许同时开启多个网络连接,每个worker process可以支持多少个连接数等等

    这一块主要影响Nginx服务器的性能

  • http块: http块主要配置http请求的各种配置,比如代理,缓存,日志等

    这三个块是Nginx配置的主要模块。而每个块中又可以包含子模块。这里主要介绍http块的子模块:

    • server块: server块的配置主要和"虚拟主机"的配置有关。一个server块,对应一个"虚拟主机"

      对于每个虚拟主机,也可以包含自己单独的配置,下面介绍其子模块

      • location块: location块的主要作用Nginx接收到请求后,对虚拟主机的请求再一次细分,有点类似ServletMapping的作用。。

        配置到location块之后,基本就没有其他的什么配置了。

整体来说,Nginx的主要配置的块划分如下所示:

xxx
xxx
http{
    server{
        location{
            
        }
    } 
}

详细配置

需要注意的是,Nginx每条配置都需要以;结尾

全局配置

  • 配置Nginx服务器用户组,只有被设置的用户(用户组)成员才可以启动Nginx

    user [user] [group]

    user nobody nobody; //默认为nobody

  • 配置允许生成的worker process数量

    worker_processes [number] | [auto]

    默认唯一

  • 配置PID文件路径

    pid [filePath]

    注意,filePath同时需要包含文件名

  • 配置错误日志路径以及级别

    error_log [filePath] | [stderr| info | notice | warn | error | crit | alert | emerg]

    此命令可以在http ,server ,location块中单独配置

  • 引入其他配置文件

    include [filePath]

    此配置可以放在任意块中

events

  • 设置网络连接序列化,避免”惊群“效应,使得每个work prcess按顺序接收请求

    accept_mutex [on | off]

    默认为on

  • 设置是否允许worker prcess同时接收多个网络连接

    multi_accept [on | off]

    默认为off

  • 设置事件驱动模型

    use [method]

    method可以选择为:select | poll | kqueue | epoll | rtsig | /dev/poll | eventport

  • 配置最大连接数

    worker_connections [number]

    默认为512

    注意最大连接数包括了所有可能的连接数,不仅仅是前端用户连接的数量

http , server ,location

以下命令可以选择在http, server, location中进行配置,主要都是http的一些参数

  • 配置MIME-Type

    一般默认情况下,Nginx默认定义了一个IME-Type文件,里面配置了默认的IME类型,我们只用将其包含进来即可:

    include mime.types

    此文件中定义了一个默认文件对应的MIME-Type,比如html文件对应text/html

    此外,还可以定义一个默认类型:

    default_type mime-type

    表示当一个都没有在types文件中匹配到的时候,则使用此MIME类型

  • 定义服务器日志

    access_log [filePath] [format]

    access_log记录的是前端访问Nginx的日志。filePath为日志保存的路径,需要精确到名称。format为日志格式,一般使用默认的即可。

    此配置可以定义http块,server块,或者location块中

    可以使用access_log off;指令关闭访问日志

  • 配置sendfile

    sendfile on | off

    sendfile_max_chunk [size]

    sendfile()有点类似0拷贝的文件传输,默认为off

    sendfile_max_chunk用于设置每个worker process每次调用sendfile()传输的数据最大的值,0表示无限制

  • 超时时间

    keepalive_timeout [time] [header_timeout]

    keepalive_timeout表前端用户连接后,保持连接的时间

    time :时间,默认为75s

    header_timeout : 可选项,在应答报文头部的Keep—Alive域设置超时间:keep-Alive:timeout=[timeout]

    示例:keepalive_timeout 120s 100s;

server

  • 配置单链接请求数上限

    keepalive_requests [numbers]

    表示用户成功建立会话之后,用户通过此连接发送请求的数量限制,默认为100,

    此配置还可以配置到location

  • 配置网络监听

    网络监听配置有3中方式

    • 使用IP地址: listen [address] [:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sendbuf=size] [deffered] [bind] [ssl]
    • 使用端口配置:listen [port] [default_server] [setfib=number] [rcvbuf=size] [sendbuf=size] [accept_filter=filter] [deffered] [bind] [ipv6only=on | off ] [ssl]

    下面对上面的参数进行一一解释:

    • address : ip地址,如果是IPv6地址,则需要使用[]括起来。
    • port : 端口号,如果只定义了IP地址,没有定义端口号,则使用80端口
    • path: socket 文件路径
    • default_server : 标识符,将此虚拟主机设置为address:port的默认主机
    • ssl : 设置连接使用SSL模式进行
    • backlog=num : 设置监听函数listen()最多允许num个网络连接处于挂起状态

    一般情况下,其他的标识符不怎么常用。下面列举一些listen的常用方法:

    listen *:80 | *:8000;             #监听所有80端口和8000端口
    listen 192.168.1.10:8000;        #监听指定ip和端口
    listen 192.16.1.10;               #监听指定ip下80端口的链接
    listen 8000;                      #监听8000端口下的所有连接
    listen 192.168.0.1 default_server #监听80端口,并设置为默认虚拟主机处理
  • 配置虚拟主机名

    server_name [name];

    name可以定义多个,以空格隔开,可以使用通配符,但是通配符只能在名称的首段或者尾段。

    如: server_name *.myserver.com www.myserver.*;

    同时,name还可以使用正则表达式,需要以~开头,表明需要使用正则表达式解析

    如:server_name ~^www\d+\.myserver\.com$;

    同时在使用正则表达式的时候,支持使用$1 $2获取捕获变量

    且,对于server_name匹配顺序如下:

    • 准确匹配server_name
    • 通配符在开头匹配server_name成功
    • 通配符在结尾匹配server_name成功
    • 正则表达式匹配server_name成功

    其次,再按照先后顺序进行匹配。

    server_name:也可以通过虚拟IP进行区分,这里不详细描述

  • 配置location

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

    简单介绍下每个前缀的意思:

    例如:location /user/~[\d*]test

    其中,/user/这部分为不包含 正则表达的uri,后面的匹配字符为包含正则的uri

    Nginx会首先找到所有符合不包含正则表达式uri/user/,然后再通过正则进行匹配~[\d*]

    • = :用于标准uri前。要求请求字符串与uri严格匹配,如果匹配成功,则停止继续向下搜索
    • ~ : 用来表示uri包含正则表达式,并且区分大小写
    • ~* : 用于表示uri包含正则表达式,并且不区分大小写
    • ^~: 当uri查找标准uri的时候,成功匹配到该uri时,直接使用该location处理请求

​ 详见: 一文弄懂Nginx的location匹配

  • 配置请求的根目录

    root [path]

    值得注意的是,root是会拼接上url中的path的,例如

    location /data/
    {
        root /location;
    }

    则当请求是/data/index.html的时候,会在/location/data/目录下查找index.html

  • 配置修改location中的uri

    alias [path]

    alias功能和root差不多,不过root是拼接url,但是alias是替换掉路径。

    比如:

    location /data/
    {
        alias /location/test/;
    }

    则当请求是/data/index.html的时候,Nginx会到/location/test/目录下查找index.html文件,注意alias应该以/结尾,而root则没有关系。

  • 设置默认页面

    index [filePath]

  • 设置错误页面

    error_page code [=[response] uri

    • code 错误码
    • response : 替换的错误代码
    • uri : 返回的错误页面

    比如:

    error_page 404 /404.html

    error_page 410 =301 /empty.gif //将错误码修改为301

  • 设置用户白名单

    allow [address] | [CIDR] | all;

    address : 用户的ip地址

    CIDR :客户端的CIDR地址

    all : 表示允许所有用户访问

  • 设置黑名单

    deny [addiress] | [CIDR] | all;

    address : 用户的ip地址

    CIDR :客户端的CIDR地址

    all : 表示禁止所有用户访问


    当白名单和黑名单同时匹配的时候,Nginx会在检索到第一个匹配的名单后,立即停止检索。

    也就是以先配置的为准。

  • 配置Nginx访问密码()

    auth_basic [string | off ]

    string : 开启认证功能,配置验证时的提示信息

    off : 关闭认证功能


    auth_basic_user_file [filePath]

    filePath : 指定密码,比如:

    name1:password1
    name2:password2

到这里Nginx

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant