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模块开发与架构解析》这本书,本文只是做学习笔记记录而已,如有侵权,联系我删除文章。