环境:centos7
安装:yum install nginx
打开 Nginx 配置文件 /etc/nginx/nginx.conf
.
配置文件结构
包含 全局块,events块和http块(http块包含http全局块和多个server块-server块又包含server全局块和location块)
另外:外层的指令可以作用于自身的块和此块中的所有低层级块,并且还遵循低级优于高级,类似于Java中的全局变量和局部变量。
一、全局配置
user nginx;
#设置运行用户,当运行NGINX时,进程所使用的用户,则进程拥有该用户对文件或目录的操作权限。
worker_processes 4;
#设置工作进程数量,一般情况下工作进程数等于CPU核心数。
worker_cpu_affinity 0001 0010 0100 1000;
#设置工作进程绑定CPU核心,一个工作进程使用一个CPU核心,可以减少进程频繁切换导致CPU处理所导致的资源损
#耗。"0001"四位数表示CPU有四个核心,"1"在第几位表示使用第几个核心。
worker_rlimit_nofile 102400;
#设置每个工作进程可同时打开的文件描述符数量。在Linux系统中默认情况下为"1024",我们可以通过
#"ulimit -a |grep 'open files'"命令查看,设置此值可突破并发文件数量限制。
error_log /var/log/nginx/error.log error;
#设置错误日志文件路径,可设置错误日志记录的级别。
#错误日志级别有:
# debug 调试,将记录详细的大量调试信息,适合开发人员开启
# info 信息,记录更多的通知信息,不重要的
# notice 通知,记录通知信息,不重要的
# warn 警告,记录警告信息
# error 错误,记录错误信息
# crit 严重,只记录非常严重的错误信息
pid /run/nginx.pid;
#设置进程文件路径,运行NGINX会生成一个PID进程文件到指定路径,用于保证进程持久化运行。
include /usr/share/nginx/modules/*.conf;
#设置包含的其他配置文件,一些加载NGINX动态模块相关配置文件,由"load_moule"指令控制动态模块的加载。
1)配置运行Nginx用户组 只能在全局块中配置
语法格式: user username [group]
username
:表示可以运行Nginx服务器的用户,group可选项表示运行Nginx服务器的用户组;只有被设置了用户或者用户组的成员才有权限启动Nginx进程。如果非这些用户就无法启动,还会报错;
如果想所有的用户都可以启动这可以把当前行注释掉,或者使用user nobody
(默认是注释掉的)
2)配置worker_process 只能在全局块中配置
这个受软件,操作系统本身,还有硬件本身等制约,一般和cpu数量相等;
语法格式:worker_process number | auto
number:指定Nginx进程最多可以产生的worker process数量,默认配置是1
auto:设置此值,Nginx进程将自动检测
当我们启动nginx,后使用ps -ef | grep nginx 可以看到除了master的nginx 还有相对应设置数量的worker process。
3)配置Nginx进程PID存放路径。指令pid 只能在全局块中配置
语法: pid file
file是指定存放路径和文件名称,默认是logs/nginx.pid。可以放相对和绝对路径。
4)配置错误日志的存放路径 ,指令error_log ,可以在全局块、http块、server块、以及location块中配置
语法 error_log file/stderr [debug | info | notice | warn | error | crit | alert | emerg] ;
‘[]’:表示可选 ,‘|’ 表示或者
file表示文件 ; stderr 表示输出文件名称 ,后面[]中表示数据的日志级别,当设置某一个级别后,比这一级别高的都会被记录下来,比如设置warn后| error | crit | alert | emerg都会被记录下来。默认是error_log logs/error.log error; 指定文件当前用户需要有写权限
5)配置文件的引入,指令include 可以在配置文件的任何地方配置
当我们需要其他Nginx的配置以及第三方模块的配置引用到当前的主配置文件中时候就可以使用这个指令
语法 include file
file表示要引入的配置文件,支持相对路径,引入的文件对当前用户需要写权限
二、事件配置
events {
worker_connections 102400;
#设置每个Worker进程可处理的并发连接数量,可根据需求合理配置此值。建议
#与"worker_rlimit_nofile"指令的值一致或更小。
}
1)设置网络连接序列化 只能在events块设置
这个是是否开启“惊群”,当某一时刻请求到来是否唤醒多个睡眠的进程
语法:accept_mutext on | off
默认是on状态,
2)设置是否允许同时接收多个网络连接 只能在events块设置
每一个worker process都有能力接受多个新到达的网络连接。但是需要设置如下指令
语法:multi_accept on | off
默认是off状态,即一个work process一次只能接受一个到达的网络连接
3)事件驱动模型进行消息处理 只能在events块设置
用来处理网络消息,method选择了理性有select,poll,kqueue,epoll,rtsig,/dev/poll,eventport
语法: user method;
也可以在编译的时候通过--with-select-module,--without-select-modules设置是否强制编译select模块到Nginx内核
4)配置最大连接数 只能在events块设置
用来开启work process 的最大连接数
语法:worker_connections number
默认值是1024,另外这里的number不仅仅包含所有和前端的连接数,是包含所有的连接数,另外这里的number是不能操作操作系统支持打开的最大文件句柄数量
三、HTTP配置
http {
include /etc/nginx/mime.types;
#设置还包含其他配置文件,“mime.types”文件,记录MIME类型与文件后缀的映射关系,MIME类型是互联网媒
#体类型的缩写。所以该文件是用于WEB服务可以识别的、允许用户上传的这些后缀相关的媒体文件。
default_type text/plain;
#设置默认MIME类型,当用户上传一个文件,非“mime.types”文件中记录的后缀文件时的处理方式,则将该文
#件识别默认指定MIME类型的文件,"text/plain"表示将会保存为".txt"格式的文件。
types_hash_max_size 2048;
#设置类型哈希表的大小,单位为字节。用于将MIME类型的数据通过哈希后缓存到内存中,以提高对MIME类型映
#射表的读取效率。
charset UTF-8;
#设置字符集编码,防止NGINX对于中文返回的显示乱码。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#定义日志格式,“main”表示该日志格式名,用于下方“access_log”访问日志中调用
# $remote_addr 远程访问地址
# $remote_user 远程访问用户
# $time_local 访问时间
# $request 请求的URL与HTTP协议
# $status 请求状态,成功为200
# $body_bytes_sent 发送给客户端文件主机内容大小
# $http_referer 从哪个页面连接访问过来的
# $http_user_agent 客户端浏览器的相关信息
# $http_x_forwarded_for 远程访问地址,与remote_addr相同
sendfile on;
#启用或禁用"sendfile()"函数的调用,"on" or "off","on"表示启用,"off"表示禁用。当线程响应
#时,"sendfile()"函数会报告线程数据不在内存中而是在硬盘中,则线程直接去硬盘拿到响应数据直接传送
#给用户,而无需调用内存去硬盘拿响应数据,省去了调用内存的步骤,在小型WEB项目中可以提高请求响应效
#率,若是重量级WEB项目,为了平衡磁盘IO则不建议开启。我们也可以将此指令称之为高效传输模式。
tcp_nopush on;
#启用或禁用TCP_NOPUSH套接字选项,"on" or "off","on"表示启用,启用此项的前提是必须开
#启"sendfile","off"表示禁用。有时候在传输一个响应数据时,可能会产生多个小块数据包传出,可能这个
#小块数据包头部大小为30字节,而真正数据信息只有1字节,在高并发环境下会导致网络拥塞、带宽不够用问
#题。开启此项则传出的数据包会积累一下在传出,可以防止网络拥塞,减少带宽的占用。
tcp_nodelay on;
#启用或禁用TCP_NODELAY套接字选项,"on" or "off","on"表示启用,"off"表示禁用。此项与
#"tcp_nopush"的功能刚好相反,若开启此项则对于小块数据包不等待立即传输,有时候一个WEB应用期望发
#送小块数据时,则建议开启,当“tcp_nopush”和“tcp_nodelay”同时开启时,NGINX会平衡这两个功能的使
#用。
keepalive_timeout 75s;
#设置保持客户端连接活跃状态的超时时间,单位为秒。
send_timeout 60s;
#设置服务器将响应发送给客户端的超时时间,单位为秒。
include /etc/nginx/conf.d/*.conf;
#设置还包含其他配置文件,我们可以将一些其他配置分离到另外一个文件中处理,避免主配置文件因为配置太
#多导致混乱不方便管理,比如下面的"server {}",在NGINX中我们可以配置多个"server {}"则我们可以将
#每个"server {}"分离到另外一个配置文件中,即一个配置文件对应一个WEB站点。
server {
...
}
}
1)定义MIME-Type ,默认如下 可以在http块,server和location块配置
2)自定义服务日志
这个是记录Nginx服务器提供服务过程应答前端请求的日志,我们用服务日志和之前的error_log加以区分。Nginx服务器支持对服务日志的格式、大小、输出等进行配置,需要使用两个指令,分别是access_log和log_format
a: access_log指令语法:access_log path [format []buffer=size] 可以在http块,server块和location块中配置
path:配置服务日志的文件存放的路径和名称
format:可选项,自定义服务日志的格式字符串,也可以通过“格式串的名称,使用log_format指令定义好的格式,格式串的名称在log_format中定义
size:配置临时存放日志的内存缓存区大小;
如果要取消服务日志的功能使用 accesss_log off;
access_log和log_format是联合使用的。
3)配置文件允许sendfile方式传输文件 指令都可以在http块,server块和location块中配置
a: 语法 sendfile on | off
另外可以设置传输的大小
b: 语法:sendfile_max_chunk size;
如果size值大于0,Nginx进程的每一个worker process每次调用sendfile()传输的数据量最大不能超过这个值如果设置为0,则不限制。默认0;
4)配置连接超时时间 指令都可以在http块,server块和location块中配置
和用户建立会话连接后,Nginx服务可以保持连接打开一段时间,指令keepalive_timeout用来设置整个时间
语法:keepalive_timeout timeout [header_timeout]
timeout:表示服务端对连接保持的时间。默认是75秒
header_timeout:可选项,在应答报文头部的Keep_Alive域设置超时时间,
5)单链接请求数上限 指令都可以在http块,server块和location块中配置
Nginx服务器和用户端建立会话连接后,用户通过此链接发送请求,指令keepalive_requests用于限制用户通过某一个连接向Nginx服务器发送请求的次数。默认值是100
语法:keepalive_requests number:
四、Server配置
#==WEB站点配置==#
server {
listen 80 default_server;
#设置监听IPV4的地址与端口,地址为空表示监听所有,“default_server”即将此server设置为默认服务器,
#default_server: 如果没有设置这个参数,那么将会以在nginx.conf中找到的第一个server块作为默认server块
listen [::]:80 default_server;
#设置监听IPV6的地址与端口。
server_name static.test.com;
#设置域名绑定,绑定一个域名。
access_log /var/log/nginx/static_access.log main;
#设置访问日志文件路径,用于记录每个访问请求,“main”调用上面日志格式
location / {
...
}
error_page 404 /404.html;
#当匹配到响应代码,则将请求重定向到指定的URI。
location = /40x.html {
#匹配上面重定向的URI,则呈现相关响应代码的会呈现给用户的内容。若"{}"为空则返回默认页面。
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
1)配置网络监听
配置监听使用指令listen,方式有三种
方式一:监听IP地址,
语法:listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferrred] [accept_filter=filter] [bind] [ssl];
方式二:监听端口,
语法:listen port [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferrred] [bind] [ipv6only= on | off] [ssl];
方式三:配置UNIX Domain Socket(在原有Socket框架上发展起来的IPC机制)
语法:listen unix:path [default_server] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferrred] [bind] [ssl];
address
: IP地址,如果是IPv6的地址,需要使用“[]”括起来,比如[fe22::1]等port
:端口号,如果只定义了IP地址 没有定义端口号,就使用80端口path
: socket文件的路径,例/var/run/nginx.sock等default_server
: 标识符,将此虚拟主机设置为address:port的默认主机sertfib=number
: 使用这变量监听socket关联的路由表,目前只对FreddBSD起作用,不常用backlog=nubmer
: 设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在FreeBSD中默认是-1,其他平台默认是511rcvbuf=size
: 设置监听socket接受缓冲区的大小sndbuf=size
: 设置监听socket发送缓冲区的大小deferred
: 标识符,将accept()设置为Deferred模式accept_filter=filter
: 设置监听端口对请求的过滤,被过滤内容是不能被接受和处理。这个指令只在FreeBSD和NetBSD5.0+平台有效,filter可以设置为dataready或者httpreadybind
: 表示符,使用独立的bind()处理此address:port,一般情况下,对于端口相同而IP地址不相同的多个连接,Nginx服务将只能使用一个监听命令,并使用bind()处理端口相同的所有连接ssl
:标识符,设置会话连接使用SSL模式进行,此标识符和Nginx服务器提供的HTTPS服务相关
常用例子:
listen 123.22.3.10:8000; //监听具体的IP和具体端口上的连接
listen 123.22.3.10; //监听具体Ip的所有端口的连接
listen 8000; //监听具体端口上所有IP的连接,等同与 listen *:8000;
listen 123.22.3.10:8000 default_server backlog=1024; //设置123.22.3.10的连接请求默认由虚拟主机处理,并且允许最多1024网络连接出去挂起状态。
2)基于名称的虚拟主机配置
这里的主机指用server块对外提供的虚拟主机,设置了主机的名称并配置好了DNS,用户就可以使用这个名称向此虚拟主机发送请求了。配置注解名称的指令:
语法: server_name name...; //name 可以多个,中间用空格并列
例如:
server_name vison.com ws.vison.com; //这里有两个虚拟机名称,Nginx规定第一个为此虚拟机主要的名称
3) 基于IP的虚拟主机配置
和基于名称的虚拟配置相同,也是使用server_name配置
例如: server_name 122.12.3.6;
五、location配置
location / {
#设置访问位置(URI),即用户访问的URL的尾部部分。当匹配到请求的URI时,则呈现由"{ }"中定义的
#内容。location指令针对于匹配URI可以嵌入正则表达式,实现一些高级应用,详细用法请参考《HTTP
#配置高级指令》。
root /usr/share/nginx/html;
#设置WEB应用根目录。
index index.html;
#设置默认首页文件,当用户访问域名或IP地址是自动索引呈现该文件中的内容,该文件在若为相对路
#径则会在WEB应用根目录下。
}
1)location指令配置
这个location的值是匹配请求连接中的URI
语法格式: location [= | ~ | ~* | ^~] uri { ... }
a)uri表示待匹配的请求字符,可以是正则或者不是正则字符例如:vison.action 表示标准uri
b) “[]”中括号中的是可选项,用来改变请求字符串和uri的匹配方式,
这里有四种:
“=” 用于标准的uri(没有使用正则表达式等)前,要求请求字符串和uri严格匹配,如果匹配成功就停止搜索并立即处理请求
“~” 用于表示uri包含正则表达式,并且区分大小写
“~*”,用于表示uri包含正则表达式,并且不区分大小写 ,
注意:如果包含uri正则表达式,必须使用“~” 或者 “~*” 标识
“^~” ,用于标准uri(没有使用正则表达式),要求Nginx服务器找到表示uri和请求字符串匹配度最高的location后,立即使用location处理请求,而不使用location块中的正则uri和请求字符串做匹配。
注意:
浏览器在传送uri的时候会对部分字符url编码,例如空格编码为“%20”,问好编码为“%3f”等,“~”它可以对这些符号进行编码处理。例如如果URI为“/html/%20/data”,则当Nginx可以收到配置“~ /html/ /data” 同样也是匹配成功的。
2)配置请求的根目录 这个通常是在location块中的配置
这个通常是在location块中的配置,当web服务器接受到网络请求之后,首先需要在服务器端指定目录中寻找请求资源,在Nginx服务器中,指令root就是用来配置这个根目录的。
语法:root path;
其中path为Nginx服务器接收到请求以后查找资源的根目录路径,path变量中可以包含Nginx服务器预设的大多数变量,只用$document_root和$realpath_root不可以使用。
例如:
location /data/ {undefined
root /locationtest1
}
当location块接收到"/data/index.html" 请求后,将在nginx的“/locationtest1/data/”目录下找到 index.html响应请求。
3)更改location的uri --转发
在location块中,除了使用root指令指明处理根目录,还可以使用alias指令改变location接受到的URI的请求路径
语法:alias path;
path:这个就为修改后的根路径,同样这个变量可以包含除了$document_root和$realpath_root的变量。
例如:
location ~ ^/data/(.+.(htm|html))${undefined
alias /locationtest1/other/$1;
}
// 当location块接收到“/data/index.html”的请求时,匹配到alias指令的配置,Nginx服务器将到“locationtest1/other”目录下找到index.html并响应请求,可以看到,通过alias指令的配置,根路径已经从/data/ 更改为locationtest1/other了。
4) 设置网站的默认首页
指令index用来设置网站默认首页、一般有两个作用:
一是:用户在发出请求网站时,请求地址可以不写首页名称
二是:可以对一个请求,根据请求内容而设置不同的首页
语法:index file … ;
file变量可以包含多个文件,中间用空格隔开也可以包含其他变量,默认使用 "index.html";
例子:
location ~ ^ /data/(.+)/web/${undefined
index index.$1.html index.m1.html index.html
}
//当location匹配到“/data/locationtest/web” 时,匹配成功,$1的值就为“locationtest”,那么就会依次寻找这个页面下的 index.locationtest.html index.m1.html index.html ,先找到那个就返回那个。
5) 设置网站的错误网页 可以在http块,server块和location块中配置
如果用户尝试查看某一个网页出现错误时,我们要返回Http错误网页,用我们自定义的网页显得更人性化。
- HTTP 2XX表示请求正常
- HTTP 3XX表示网站重定向
- HTTP 4XX表示客户端出现错误
- HTTP 5XX 表示服务端出现错误。
nginx在设置网站错误页面的指令为error_page。
语法: error_page code … [=[response] ] uri;
code:表示要处理的HTTP错误代码,
response:可选项,将code指定的错误代码转换为新的错误代码response
uri,错误页面的路径或者网址地址,如果设置为路径,则是以Nginx服务器安装路径下的html目录为根路径的相对地址,如果设置为网址,nginx服务器会直接访问该网址获取错误页面,并返回给用户端
例如
error_page 404 /404.html //通过 Nginx安装路径/html/404.html 响应404错误
error_page 404 http:/somewebsite.com //出现404错误,直接响应这个连接
error_page 410=310 /empty.gif //当产生410HTTP消息时,使用Nginx安装路径/html/empty.gif 返回用户端310消息
如果需要更改error_page 默认的安装路径,怎么修改呢,那么就需要添加location就可以了。
例如:
location /404.html{undefined
root /myserver/errorpages/
}
//首先捕获到“/404.html页面”请求,然后将请求定向到新的路径下面
6)基于IP配置Nginx的访问权限 可以在http块,server块和location块中配置
Nginx配置通过两种途径支持基本访问权限控制,其中一种是由HTTP标准模块ngx_http_access_module支持的,其通过IP来判断客户端是否拥有对Nginx的访问权限,
- a) allow指令,用于设置允许访问Nginx的客户端IP,
语法: allow address | CIDR | all ;
address:表示允许访问的客户端IP,不支持同时设置多个,如果需要多个IP,那么需要重复使用allow命令
CIDR:允许访问的客户端的CIDR地址,如果202.80.18.22/25,前面的32位IP地址,后面“/25”代表该IP地址中前25位网络部分,其余位表示主机部分。
all:代表允许所有客户端访问。
从Nginx 0.8.22 该命令也支持IPv6地址。例如:allow 2301:333:e000::8001;
- b) 另一个指令是deny,作用刚好和allow相反,用来禁止访问Nginx的IP
语法: deny address | CIDR | all ;
OTHER
修改好配置后,必须重启Nginx,可以执行命令
systemctl restart nginx
如果启动报错, 可以打开 /var/log/nginx/error.log
查看nginx的错误日志文件。
参考引用
Nginx 之四 nginx.conf配置文件详解_Visonws的博客-CSDN博客_nginx.conf文件
(最全篇)nginx.conf配置文件详解_皮卡丘的猫的专栏-CSDN博客_nginx配置conf
nginx 主运行配置详解(nginx.conf) - Network-Ren - 博客园