Nginx配置解读

2022-05-20  本文已影响0人  给艺艺一个未来

默认配置

[root@Nginx nginx]# cat  /usr/local/nginx/conf/nginx.conf

#user  nobody; 
worker_processes  1; 

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid; 


events {  
    worker_connections  1024;
}


http {  
    include       mime.types; # 将http响应的文件类型映射成mime.type并写入到http响应头的Content-Type中
    default_type  application/octet-stream; # 字节流,mime.types不存在的文件类型的默认的 mime.type 为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;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    
    server {
        listen       80;
        server_name  localhost;

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

}

配置结构

...     # 全局块

events  # evens 块
{
  ...
}

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

  server  # server 块
  {
     ...  # server 全局块
  }
}


全局块

全局块是配置文件从开始到 events 块之间的一部分内容,主要设置一些影响 Nginx 服务器整体运行的配置。全局块种的配置的作用域是 Nginx 服务器全局。

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

配置允许Nginx服务器用户(组)

格式:

user user [group];

作用:只有被设置的用户或者用户组成员才有权限启动 Nginx 进程,如果是其他用户尝试启动 Nginx 进程,将会报错。这可以确保我们仅在指定用户或用户组下才能启动 Nginx 进程。

举例:

user admin admins;

默认配置:

user nobody nobody;

默认配置或不进行配置,则所有用户均可启动 Nginx 进行。

配置启动的 worker 进程 数量

格式:

worker_processes number | auto;

默认配置:

worker_processes 1;

配置 Nginx 进程 PID 存放路径

Nginx 进程作为系统的守护进程运行,需要在文件种保存当前运行程序的主进程号。Nginx支持对保存主进程号的文件的存放路径和文件名进行自定义配置。
格式:

pid file;

配置错误日志和存放路径

格式:

error_log file | stderr [debug | info | notice | warn | error | crit | alert | emerg];

默认配置:

error_log logs/error.log error;

注意:指定的文件需对于运行 Nginx 进行的用户具有写权限,否则在启动 Nginx 进程时将会报错。

配置文件的引入

将其他 Nginx 配置或者第三方模块的配置引用到当前的主配置文件中。
格式:

include file;

注意:引用的文件要求运行 Nginx 进程的用户对其具有读写权限,并且符合 Nginx 配置文件规定的相关语法和结构。

events 块

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

配置网络连接序列化 & 是否允许同时接收多个网络连接

在《UNIX 网络编程》第 1 卷里提到过 "惊群" 问题,“惊群”意思是:当某一时刻只有一个网络连接到来时,多个睡眠进行会被同时唤醒,但只有一个进程可获得连接。如果每次唤醒的进程数目太多,会影响一部分系统性能。在Nginx服务器的多进程下,就会出现 "惊群" 问题。

Nginx 可对 worker process 接收连接进行序列化,防止多个进程对连接的争抢,该功能通过在events块中配置开启和关闭:

accept_mutex on | off;

默认开启

使用 accept_mutex 的影响

配置事件驱动模型

格式:

use [ select | poll | kqueue | epoll | rtsig | /dev/poll | eventport ]

注意:可以在编译使用 --with-select_module--without-select_module 设置是否强制编译 select 模块到 Nginx 内核;使用 --with-poll_module--without-poll_module 设置是否强制编译 poll 模块到 Nginx 内核。

配置最大连接数

格式:

worker_connection number;

默认值为 512

注意:number 包括所有可能的连接数。number 不能大于操作系统支持打开的最大文件句柄数量。

http 块

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

http 块中可以包含 http 的全局块配置,也可以包含 server 块的局部配置,server 块中又可以进一步包含 location 块。这里暂时先讨论 http 全局块中 不包含 server 块 的配置。

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

配置 mime.type

默认配置:

include mime.type
default_type application/octet-stream;

这里引入了第三方配置文件 mime.type

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    ...
}

default_type mime.type; 配置响应的默认 MIME 类型。mime.type 为 types 块中定义的 MIME-type,如果不加此指令,默认值为 text/plain。在mime.type中找不到文件映射的type时采用 default_type 。浏览器遇到 application/octet-stream 会默认下载该文件而不是展示(播放)该文件 。

mime.types
  1. 发展历史
    早期的电子邮件只能支持ASCII字符集,而且没法添加附件。MIME (Multipurpose Internet Mail Extensions) Type :多用途因特网邮件扩展类型,正是为了解决这个问题而生。通过MIME,可以将不同类型的数据(文本、图片、视频)作为附件放到一封邮件中。

  2. MIME与HTTP协议
    除了支持电子邮件的SMTP协议外,MIME还被其他协议或者程序广泛使用,其中包括HTTP协议也使用 MIME Type。HTTP服务器在发送一份报文主体时,在HTTP报文头部插入解释自身数据类型的MIME头部信息(Content-Type)。客户端接收到这部分有关数据类型的信息时,就能调用相应的程序处理数据。
    例如:GIF图片、FLV视频文件。

  3. Nginx
    Nginx在返回HTTP请求的文件时,根据文件的后缀名来判断这个文件的mime.type,并将mime.type写入HTTP响应的头部的Content-Type字段中。
    例如:
    a. 返回 index.html 时在 Content-Type 中写入 text/html
    b. 返回 xxx.mp3 时在 Content-Type 中写入 audio/mpeg
    ...
    更多mime.type和文件后缀名的映射关系详见 /usr/local/nginx/conf/mime.types

  4. default_type application/octet-stream
    在mime.types中找不到映射关系时采用 default_type 。
    浏览器遇到 application/octet-stream 会默认下载该文件而不是展示(播放)该文件 。

自定义服务日志

在全局块中,介绍了 error_log 配置,其用于配置 Nginx 进程运行时的日志存放和级别。

自定义服务日志:所指的日志与常规的不同,该日志记录 Nginx 服务器提供服务过程应答前端请求的日志。

Nginx 服务器支持对服务日志的格式、大下、输出等进行配置,需要使用两个配置项,分别是 access_log 和 logformat 。

access_log

access_log path [ format [buffer=size] ];

可以在 http 块、server 块、location 块中分别进行配置。默认配置为:

access_log logs/access.log combined;

其中,combinded 为 log_format 默认定义的日志格式串的名称

log_format

log_format name string ...;

举例:

log_format exampleLog '$remote_addr - [$time_local] $request '
                      '$status $body_bytes_sent $http_referer '
                      '$http_user_agent ';

日志:

192.168.1.102 - [31/Oct/2011:20:41:39 +0800] "Get /favicon.ico HTTP/1.1" 404 570 "-" "Mozilla/5.0" (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)"

log_format 只能在 http 块中进行配置。

配置允许 sendfile 方式传输文件

sendfile实际上是 Linux2.0+以后的推出的一个系统调用,sendfile()提供 “零拷贝”,数据可以 ”从磁盘到 内核空间 再到 网络设备“ ,避免数据 “从磁盘到内核空间,(read)再到用户空间,(write)再回到内核空间,再到 网络设备

sendfile 适用于 http 请求的静态资源,提高响应静态资源请求的性能。

sendfile 相关配置有 sendfilesendfile_max_chunk
格式:

sendfile on | off;
sendfile_max_chunk size; #字节数

如果 size 大于 0,那么 Nginx 进程的每个 worker process 每次调用 sendfile() 传输的数据量最大不能超过该值;如果 size 为 0,则无限制。默认值为 0 。

sendfile 相关配置可以在 http 块、server 块 或者 location 块中进行配置。

配置连接超时时间

与用户建立会话连接后,Nginx 服务器可以保持这些连接打开一段时间,配置项 keepalive_timeout 就是用来设置此时间的。

格式为:

keepalive_timeout timeout [header_timeout];

示例:

keepalive_timeout 120s 100s;

该配置项可以在 http块,server 块 或 location 块中配置。

单连接请求数上限

Nginx 服务端和用户端建立会话连接后,用户端通过此连接发送请求。配置项 keepalive_requests 用于限制用户通过某一连接向 Nginx 服务器发送请求的次数。

格式为:

keepalive_requests number;

此配置项还可以配置在 server 块 或 location 块中,默认值为 100。

server

server 块 和 "虚拟主机" 的概念有密切联系。

虚拟主机
虚拟主机,又称虚拟服务器、主机空间或是网页空间,它是一种技术。该技术是为了节省互联网服务器硬件成本而出现的。这里的 "主机" 或 “空间” 是由实体的服务器延伸而来,硬件系统可以基于服务器群,或者单个服务器等提供主机和空间。虚拟主机技术主要应用于 HTTP、FTP 及 EMAIL 等多项服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源。从用户角度来看,一台虚拟主机和一台独立的硬件主机是完全一样的。

在使用 Nginx 服务器提供 Web 服务时,利用虚拟主机的技术就可以避免为每一个要运行的网站提供单独的 Nginx 服务器,也无需为每个网站对应一组 Nginx 进程。虚拟主机技术使得 Nginx 服务器可以在同一服务器上只运行一组 Nginx 进程,就可以运行多个网站。

配置一个 server 块就相当于配置一台 虚拟主机

server 块中也包含自己的全局块,同时包含多个 location 块。在 server 块中,最常见的两个配置项是本虚拟主机的监听配置合本虚拟主机的名称或IP配置。

配置网络监听

监听的配置方法主要有三种:

配置监听的IP地址

listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [accept_filter=filter] [bind] [ssl];

配置监听的端口

listen port [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [accept_filter=filter] [bind] [ssl];

配置 UNIX Domain Socket

listen unix:path [default_server] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [accept_filter=filter] [bind] [ssl];

说明

listen *:80 | *:8000; # 监听所有80端口和8000端口,为默认配置
listen 8000; # 监听具体端口上的所有IP连接,等同于 listen *:8000;
listen 192.168.1.10:8000; # 监听具体的IP和具体端口上的连接
listen 192.168.1.10; # 监听具体IP的所有端口上的连接
listen 192.168.1.10 default_server;

基于名称的虚拟主机配置

虚拟主机指的是该 server 块提供的虚拟主机。在Nginx配置虚拟主机名称,并在DNS服务提供商中配置好DNS(用户也可以配置hosts),用户便可以使用主机名称向此虚拟主机发送请求。Nginx配置主机名称的配置项为 server_name 。

格式:

server_name name ...;

示例:

server_name myserver.com www.myserver.com;

在 name 中可以使用通配符 "*", 但通配符只能用在由三段(由点号"."隔开)字符串组成的名称的首段或尾段,或者由两段(由点号"."隔开)字符串组成的名称的尾段,如:

server_name *.myserver.com www.myserver.*

在 name 中可以使用正则表达式,并使用波浪号 "~" 作为正则表达式字符串的开始标记,以"$" 作为结束,如:

server_name ~^www\d+\.myserver\.com$

其中 :

注意
由于 server_name 的配置,在包含有多个虚拟主机的配置文件中,可能会出现一个名称被多个虚拟主机的 server_name 匹配成功。那么,来自这个名称的请求到底交给哪个虚拟主机处理呢?Nginx 服务器做出如下规定:

基于 IP 的虚拟主机配置

Linux 操作系统支持 IP 别名的添加。匹配基于 IP 的虚拟主机,即为 Nginx 服务器提供的每台虚拟主机配置一个不同的 IP,因此需要将网卡设置为同时能够监听多个 IP 地址。在 Linux 平台中可以使用 ifconfig 工具为同一块网卡添加多个 IP 别名。

假设 eth1 为使用中的网卡,其 IP 值为 192.168.1.3 。现为 eth1 添加两个 IP 别名为 :192.168.1.31 和 192.168.1.32

if config eth1:0 192.168.1.31 netmask 255.255.255.0 up
if config eth1:1 192.168.1.32 netmask 255.255.255.0 up

Nginx基于IP的虚拟主机配置:

...
http
{
  ...
  server
  {
    listen: 80;
    server_name: 192.168.1.31;
  }
  server
  {
    listen: 80;
    server_name: 192.168.1.32;
  }
}

经过以上配置,来自 192.168.1.31 的前端请求将由第一台虚拟主机接收和处理,来自 192.168.1.32 的前端请求将由第二台虚拟主机接收和处理。

location

location 为访问的URI进行配置,为请求的URI提供相应的内容。

语法规则

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

其中,uri 变量是待匹配的请求字符串,可以是不含正则表达的字符串,如 /myserver.php 等; 也可以是包含有正则表达式的字符串,如 .php$ (表示以.php 结尾的 URL)等。

为了叙述方便:暂时约定 不含正则表达式的 uri 为 "标准uri",使用正则表达式的 uri 为 "正则uri" 。

其中,[=|~|~*|^~] 为可选项。

未采用可选项

采用选项
选项解释:

特殊 :

匹配顺序:

  1. 首先匹配 =
  2. 其次匹配 ^~
  3. 按文件中的顺序正则匹配
  4. 通用匹配

匹配成功时停止匹配,按当前匹配的location的配置处理请求。

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

配置请求的跟目录

Web 服务器接收到网络请求之后,首先要在服务端指定目录中寻找请求资源。在 Nginx 服务器中,配置项 root 就是用来配置资源所在的根目录 path
格式:

root path

其中,path 为 Nginx 服务器接收到请求以后查找资源的根目录路径。path 变量中可以包含 Nginx 服务器预设的大多数变量,只有 $document_root 和 $realpath_root 不可以使用。

此指令可以在 http 块、server 块 或者 location 块中配置。由于 Nginx 服务器多数情况下要配置多个 location 块对不同的请求分别做出处理,因此该指令通常在 location 块中进行设置

示例:

location /data/
{
  root location_root_test;
}

当 location 块接收到 "/data/index.html" 的请求时,将在 /location_root_test/data/ 目录下查找 index.html 响应请求。

更改 location 的URI

在location块中,除了使用 root 配置指明请求的静态资源所处的根目录外,还可以使用 alias 配置改变 location 收到的 URI 的请求路径。

格式:

alias path;

示例:

location ~ ^/data/(.+\.(htm|html))$ {
  alias /location_alias_test/other/$1;
}

当 location 块接收到 "/data/index.html" 的请求时,将在 /location_alias_test/other/ 目录下查找 index.html 响应请求。通过 alias 配置,处理请求的根路径从 /data/ 更改为 /location_alias_test/other/

设置网站的默认首页

配置项 index 用于配置网站的默认首页,默认首页的作用:

格式:

index file1 file2 ...;

示例:

location ~ ^/data/(.+)/web$ {
  index index.$1.html index.my1.html index.html;
}

当 location 块收接收到 "/data/location_test/web/"时,匹配成功,它首先将预置变量 $1 置为 ”location_test“, 然后在 /data/location_test/web 路径下按照 index 的配置次序依次寻找 index.location_test.html、index.my1.html 和 index.html,首先找到哪个页面,就使用哪个页面响应请求。

设置网站的错误页面

如果用户端尝试查看网页时遇到问题,服务器会将 HTTP 错误从网站发送到 Web 浏览器。如果无法显示页面,Web 浏览器会显示网站发送的实际错误网页或 Web 浏览器内置的友好错误消息。Nginx 服务器支持自定义错误网页的显示内容。可以通过这一功能在网站发生错误时为用户提供人性化的错误显示页面。

错误代码:

Nginx 服务器设置网站错误页面的配置为 error_page,
格式:

error_page code ... [=[response]] uri

说明:

示例:

error_page 404 /404.html

error_page 403 http://somewebsite.com/forbidden.html;

error_page 410 =302 /empty.gif

error_page 可以在 http 块、server 块 和 location 块中配置。

基于 IP 配置 Nginx 的访问权限

Nginx 配置通过两种途径支持基本访问权限的控制,其中一种是由 HTTP 标准模块 ngx_http_access_module 支持的,其通过 IP 来判断客户端是否拥有对 Nginx 的访问权限。有两个配置项可对访问进行控制:
allow

allow address | CIDR | all;

deny

deny address | CIDR | all;

allow/deny 可以在 http 块、server 块 或者 location 块中配置。在使用这两个指令时,要注意设置位 all 的 用法,例如:

location / {
  deny 192.168.1.1;
  allow 192.168.1.0/24;
  deny all;
}

在上面的配置示例中,首先配置禁止 192.168.1.1 访问 Nginx,然后允许 192.168.1.0/24 访问 Nginx,最后又禁止所有 IP 的访问。
实际上,Nginx 配置在解析的过程中,遇到 deny 或者 allow 是按照顺序对当前客户端的连接进行访问权限检查的。如果遇到匹配的配置时,则停止继续向下搜索相关配置,该匹配的配置是 allow 则允许,是 deny 则拒绝访问。

基于密码配置 Nginx 的访问权限

Nginx 支持 HTTP Basic Authentication 协议的认证。该协议是一种HTTP性质的认证办法,需要识别用户名和密码,认证失败的客户端不拥有访问 Nginx 服务器的权限。该功能由 HTTP 标准模块 ngx_http_auth_basic_module 支持。

auth_basic 开启或者关闭认证功能
格式:

auth_basic string | off;

auth_basic_user_file 设置存储用户名和密码信息的文件路径
格式:

auth_basic_user_file file;

其中,file 为密码文件的绝对路径。密码文件可以是明文或者密码加密后的文件。
明文格式:

name1:password1
name2:password2:comment
name3:password3

密文:加密密码可以使用 crypt() 函数进行密码加密的格式,在 Linux 平台上可以使用 htpasswd 生成。在 PHP 和 Perl 等语言中,也提供 crypt() 函数。使用 htpasswd 的示例:

htpasswd -c -d /nginx/conf/pass_file username

运行后输入密码即可,即会生成加密密码。

配置 proxy 代理

配置 upstream

配置 upstream ,一个upstream需要设置一个名称 upstream_name,这个名称可以在server里面当作proxy主机使用。一个upstream可以设置多个server,通常情况下Nginx会轮询每一个server,从而达到最基本的负载循环效果。
格式:

    upstream upstream_name {
        server server_1     weight=w1 max_fails=f1 fail_timeout=t1;
        server server_2     weight=w2 max_fails=f2 fail_timeout=t2;
        server server_3     backup;
        ...
    }

其中:

示例:


    upstream proxy_test1 {
        server 192.168.254.204:8000     weight=5 max_fails=2 fail_timeout=3;
        server 192.168.254.205:8000     weight=5 max_fails=2 fail_timeout=3;
    }

    upstream proxy_test2 {
        server 192.168.254.206:8080     weight=5 max_fails=2 fail_timeout=3;
        server 192.168.254.207:8080     weight=5 max_fails=2 fail_timeout=3;
        least_conn;
    }

配置 proxy_pass 代理

    location = /test1/ {
        proxy_pass      http://proxy_test1/;
    }

        location = /test2/ {
       proxy_pass       http://proxy_test2/;
       }

更多porxy相关的配置项

    # 当后端web服务器上也配置多个虚拟主机时,需要用该header来区分反向代理哪个主机名。
    proxy_set_header    Host $host;
    # 通过$remote_addr变量获取前端客户真实IP地址。
     proxy_set_header    X-Real-IP $remote_addr;
    # 通过$remote_addr变量获取前端客户真实IP地址。
     proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;

    # 设置缓冲区
    proxy_buffering on;
    # 设置后端服务器的响应头大小,是响应头的缓冲区。
    proxy_buffer_size 4k;
    # 设置缓冲区的数量和大小,nginx从代理的后端服务器获取的响应信息会放置到缓冲区。
    proxy_buffers 8 32k;
    #此设置表示nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据。建议为proxy_buffers中单个缓冲区大小的2倍)
    proxy_busy_buffers_size 64K;
    # 指定当响应内容大于proxy_buffers指定的缓冲区时, 写入硬盘的临时文件的大小。
    proxy_max_temp_file_size 1024m;
    # 一次访问能写入的临时文件的大小,默认是proxy_buffer_size和proxy_buffers中设置的缓冲区大小的2倍。
    proxy_temp_file_write_size 128k;
    # 
    proxy_request_buffering on;
    # 
    proxy_ignore_headers Set-Cookie;
    # 表示与后端服务器连接的超时时间
    proxy_connect_timeout 60s;
    # 表示后端服务器的数据回传时间
    proxy_send_timeout 300;
    # 设置nginx从代理的后端服务器获取信息的时间
    proxy_read_timeout 300s;
上一篇下一篇

猜你喜欢

热点阅读