Nginx的常用配置

Nginx的常用配置

在介绍nginx的配置之前,先简单说下nginx在linux系统的安装,按照以下步骤就可以安装成功

nginx的下载地址:https://nginx.org/en/download.html

执行:yum -y install gcc gcc-c++ automake autoconf libtool make

安装pcre: yum -y install pcre pcre-devel

安装zlib:yum -y install zlib zlib-devel

安装openssl :yum -y install openssl openssl-devel

解压:tar -zvxf nginx-1.20.2.tar.gz

进入nginx根目录: cd /usr/local/nginx/nginx-1.20.2

执行:**./configure **

编译:make

安装:**make install **

执行:cd /usr/local/nginx/sbin

启动nginx服务:**./nginx **

关闭nginx服务:./nginx -s stop

重启nginx服务:./nginx -s reload

检测配置文件:nginx -t -c ~/youSite.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;
        }
    }
}
块配置项

上面代码中events,http,sever,location等都是块配置项。块配置项可以嵌套。内层块直接继承外层块,当内外层块中的配置发生冲突时,以内层块的配置为准。

配置项的语法格式
配置项名
   配置项值
      1 配置项值
      2 ...
      ;

注意:每行配置的结尾需要加上分号

Nginx worker进程个数

语法: worker_processes number;

默认: worker_processes 1;

正常配置:有多少CPU内核就应该配置多少个进程。

每个worker的最大连接数

语法: worker_connections number;

用HTTP核心模块配置一个静态Web服务器

监听端口

语法: listen address:port[default(deprecated in 0.8.21)|default_server|

默认: listen 80;

配置块:sever

在listen后可以只加IP地址、端口或主机名

主机名称

语法: server_name name[…];

默认: server_name “”;

配置块:sever

使用server_name配置项针对特定Host域名的请求提供不同的服务,server_name 配置值可以为IP地址

server_names_hash_bucket_size

语法: server_names_hash_bucket_size size;

默认: server_names_hash_bucket_size 32|64|128;

配置块: http、server、location

为了提高快速寻找到相应server name的能力,Nginx使用散列表来存储server name。server_names_hash_bucket_size设置了每个散列桶占用的内存大小

server_names_hash_max_size

语法: server_names_hash_max_size size;

默认: server_names_hash_max_size 512;

配置块: http、server、location

server_names_hash_max_size越大,消耗的内存就越多,但散列key的冲突率则会降低,检索速度也更快。

server_names_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能增高。

重定向主机名称的处理

语法: server_name_in_redirect on|off;

默认: server_name_in_redirect on;

配置块: http、server、location

在使用on打开时,表示在重定向请求时会使用server_name里配置的第一个主机名代替原先请求中的Host头部,

而使用off关闭时,表示在重定向请求时使用请求本身的Host头部。

location

语法: location[=||*|^~|@]/uri/{…}

配置块: server

location会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择location{}块中的配置来处理用户请求。当然,匹配方式是多样的,下面介绍location的匹配规则。

=表示把URI作为字符串,以便与参数中的uri做完全匹配
location = / {#只有当用户请求是/时,才会使用该location下的配置
		…
	}
~表示匹配URI时是字母大小写敏感的。
~*表示匹配URI时忽略字母大小写问题。
^~表示匹配URI时只需要其前半部分与uri参数匹配即可
location ^~ images {# 以images开始的请求都会匹配上
		…
	}
在uri参数里是可以用正则表达式的
location ~* \.(gif|jpg|jpeg)$ {# 匹配以.gif、.jpg、.jpeg结尾的请求
		…
	}
/ 表示匹配所有请求
location / {# /可以匹配所有请求
		…
	}

文件路径的定义(常用)

以root方式设置资源路径

语法: root path;

默认: root html;

配置块: http、server、location、if

定义资源文件相对于HTTP请求的根目录。

在下面的配置中,如果有一个请求的URI是/download/index/test.html,那么Web服务器将会返回服务器上optwebhtmldownload/index/test.html文件的内容。

location /download/ {
	root optwebhtml;
}
以alias方式设置资源路径

语法: alias path;

配置块: location

alias也是用来设置文件资源路径的,它与root的不同点主要在于如何解读紧跟location后面的uri参数,这将会致使alias与root以不同的方式将用户请求映射到真正的磁盘文件上。如果有一个请求的URI是/download/image/avator.jpg,用户实际想访问的文件在usrlocal/usr/image/avator.jpg,那么想要使用alias来进行设置的话,可以采用如下方式:

location /download/image {
	alias /usr/image/;
}

如果使用root设置,那么语句如下所示,而访问的URI则变成/image/avator.jpg:

location /image {
	root /usr/;
}

alias后面还可以添加正则表达式,请求在访问/test/nginx.conf时,Nginx会返回usrlocal/nginx/conf/nginx.conf文件中的内容

location ~ ^/test/(\w+)\.(\w+)$ {
	alias usrlocal/nginx/$2/$1.$2;
}
访问首页

语法: index file…;

默认: index index.html;

配置块: http、server、location

index后可以跟多个文件参数,Nginx将会按照顺序来访问这些文件,例如:

Nginx首先会尝试访问path/index.php文件,如果可以访问,就直接返回文件内容结束请求,否则再试图返回pathhtmlindex.php文件的内容,依此类推。

location {
    root path;
    index index.html htmlindex.php /index.php;
}
根据HTTP返回码重定向页面

语法: error_page code[code…][=|=answer-code]uri|@named_location

配置块: http、server、location、if

当对于某个请求返回错误码时,如果匹配上了error_page中设置的code,则重定向到新的URI中。例如:

error_page 404 404.html;
error_page 502 503 504 50x.html;
error_page 403 http://example.com/forbidden.html;
error_page 404 = @fetch;

如果不想修改URI,只是想让这样的请求重定向到另一个location中进行处理,那么可以这样设置,返回404的请求会被反向代理到http://backend 上游服务器中处理。

location / (
	error_page 404 @fallback;
)
location @fallback (
	proxy_pass http://backend;
)
try_files

语法: try_files path1[path2]uri;

配置块: server、location

try_files后要跟若干路径,如path1 path2…,而且最后必须要有uri参数,意义如下:尝试按照顺序访问每一个path,如果可以有效地读取,就直接向用户返回这个path对应的文件结束请求,否则继续向下访问。如果所有的path都找不到有效的文件,就重定向到最后的参数uri上。因此,最后这个参数uri必须存在,而且它应该是可以有效重定向的。例如:

try_files systemmaintenance.html $uri $uri/index.html $uri.html @other;
location @other {
    proxy_pass http://backend;
}

内存及磁盘资源的分配

HTTP包体只存储到磁盘文件中

语法: client_body_in_file_only on|clean|off;

默认: client_body_in_file_only off;

配置块: http、server、location

当值为非off时,用户请求中的HTTP包体一律存储到磁盘文件中,即使只有0字节也会存储为文件。当请求结束时,如果配置为on,则这个文件不会被删除(该配置一般用于调试、定位问题),但如果配置为clean,则会删除该文件。

HTTP包体尽量写入到一个内存buffer中

语法: client_body_in_single_buffer on|off;

默认: client_body_in_single_buffer off;

配置块: http、server、location

用户请求中的HTTP包体一律存储到内存buffer中。当然,如果HTTP包体的大小超过了client_body_buffer_size设置的值,包体还是会写入到磁盘文件中。

存储HTTP头部的内存buffer大小

语法: client_header_buffer_size size;

默认: client_header_buffer_size 1k;

配置块: http、server

上面配置项定义了正常情况下Nginx接收用户请求中HTTP header部分(包括HTTP行和HTTP头部)时分配的内存buffer大小。有时,请求中的HTTP header部分可能会超过这个大小,这时large_client_header_buffers定义的buffer将会生效。

存储超大HTTP头部的内存buffer大小

语法: large_client_header_buffers number size;

默认: large_client_header_buffers 48k;

配置块: http、server

定义了Nginx接收一个超大HTTP头部请求的buffer个数和每个buffer的大小。如果HTTP请求行(如GET/index HTTP/1.1)的大小超过上面的单个buffer,则返回"Request URI too large"(414)。请求中一般会有许多header,每一个header的大小也不能超过单个buffer的大小,否则会返回"Bad request"(400)。当然,请求行和请求头部的总和也不可以超过buffer个数*buffer大小。

存储HTTP包体的内存buffer大小

语法: client_body_buffer_size size;

默认: client_body_buffer_size 8k/16k;

配置块: http、server、location

上面配置项定义了Nginx接收HTTP包体的内存缓冲区大小。也就是说,HTTP包体会先接收到指定的这块缓存中,之后才决定是否写入磁盘。如果用户请求中含有HTTP头部Content-Length,并且其标识的长度小于定义的buffer大小,那么Nginx会自动降低本次请求所使用的内存buffer,以降低内存消耗。

网络连接的设置

读取HTTP头部的超时时间

语法: client_header_timeout time(默认单位:秒)

默认: client_header_timeout 60;

配置块: http、server、location

客户端与服务器建立连接后将开始接收HTTP头部,在这个过程中,如果在一个时间间隔(超时时间)内没有读取到客户端发来的字节,则认为超时,并向客户端返回408(“Request timed out”)响应

读取HTTP包体的超时时间

语法: client_body_timeout time(默认单位:秒);

默认: client_body_timeout 60;

配置块: http、server、location

发送响应的超时时间

语法: send_timeout time;

默认: send_timeout 60;

配置块: http、server、location

这个超时时间是发送响应的超时时间,即Nginx服务器向客户端发送了数据包,但客户端一直没有去接收这个数据包。如果某个连接超过send_timeout定义的超时时间,那么Nginx将会关闭这个连接

keepalive超时时间

语法: keepalive_timeout time(默认单位:秒);

默认: keepalive_timeout 75;

配置块: http、server、location

一个keepalive连接在闲置超过一定时间后(默认的是75秒),服务器和浏览器都会去关闭这个连接。当然,keepalive_timeout配置项是用来约束Nginx服务器的,Nginx也会按照规范把这个时间传给浏览器,但每个浏览器对待keepalive的策略有可能是不同的。

一个keepalive长连接上允许承载的请求最大数

语法: keepalive_requests n;

默认: keepalive_requests 100;

配置块: http、server、location

一个keepalive连接上默认最多只能发送100个请求

对客户端请求的限制

按HTTP方法名限制用户请求

语法: limit_except method…{…}

配置块: location

Nginx通过limit_except后面指定的方法名来限制用户请求。方法名可取值包括:GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、PROPFIND、PROPPATCH、LOCK、UNLOCK或者PATCH。例如:

limit_except GET {
    allow 192.168.1.0/32;
    deny all;
}

注意;允许GET方法就意味着也允许HEAD方法。因此,这段代码表示的是禁止GET方法和HEAD方法,但其他HTTP方法是允许的。

HTTP请求包体的最大值

语法: client_max_body_size size;

默认: client_max_body_size 1m;

配置块: http、server、location

浏览器在发送含有较大HTTP包体的请求时,其头部会有一个Content-Length字段,client_max_body_size是用来限制Content-Length所示值的大小的。因此,这个限制包体的配置非常有用处,因为不用等Nginx接收完所有的HTTP包体——这有可能消耗很长时间——就可以告诉用户请求过大不被接受。例如,用户试图上传一个10GB的文件,Nginx在收完包头后,发现Content-Length超过client_max_body_size定义的值,就直接发送413(“Request EntityToo Large”)响应给客户端。

对请求的限速

语法: limit_rate speed;

默认: limit_rate 0;

配置块: http、server、location、if

此配置是对客户端请求限制每秒传输的字节数。speed可以使用2.2.4节中提到的多种单位,默认参数为0,表示不限速。针对不同的客户端,可以用$limit_rate参数执行不同的限速策略。例如:

server {
    if ($slow) {
    	set $limit_rate 4k;
    }
}
limit_rate_after

语法: limit_rate_after time;

默认: limit_rate_after 1m;

配置块: http、server、location、if

此配置表示Nginx向客户端发送的响应长度超过limit_rate_after后才开始限速。例如:

limit_rate_after 1m;
limit_rate 100k;

用HTTP proxy module配置一个反向代理服务器

在这里插入图片描述

​ Nginx作为反向代理服务器时转发请求的流程

反向代理的基本配置

proxy_pass

语法: proxy_pass URL;

配置块: location、if

此配置项将当前请求反向代理到URL参数指定的服务器上,

URL可以是主机名或IP地址加端口的形式

proxy_pass http://localhost:8000/uri/;

还可以如上节负载均衡中所示,直接使用upstream块

upstream backend {
	…
}
server {
    location / {
        proxy_pass http://backend;
    }
}

可以把HTTP转换成更安全的HTTPS

proxy_pass https://192.168.0.1;

负载均衡的基本配置

upstream块

语法: upstream name{…}

配置块: http

upstream块定义了一个上游服务器的集群,便于反向代理中的proxy_pass使用。例如:

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}
server {
        location / {
        proxy_pass http://backend;
    }
}
sever

语法: server name[parameters];

配置块: upstream

server配置项指定了一台上游服务器的名字,这个名字可以是域名、IP地址端口、UNIX句柄等,在其后还可以跟下列参数。

weight=number:设置向这台上游服务器转发的权重,默认为1。

upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;
}
ip_hash

语法: ip_hash;

配置块: upstream

根据客户端的IP地址计算出一个key,将key按照upstream集群里的上游服务器数量进行取模,然后以取模后的结果把请求转发到相应的上游服务器中。这样就确保了同一个客户端的请求只会转发到指定的上游服务器中

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
    server backend4.example.com;
}

本文内容均来源于《深入理解Nginx模块开发与架构解析》这本书,本文只是做学习笔记记录而已,如有侵权,联系我删除文章。

猜你喜欢

转载自blog.csdn.net/qq798867485/article/details/131186829
今日推荐