# 全局配置
# 指定可以运行nginx服务的用户和用户组,只能在全局块配置
#user [user] [group]
# 注释user指令或配置为nobody表示所有用户都可运行
# user指令在Windows上不生效,配置此项会生成警告
#user nobody;
# Nginx 进程数,一般设置为和CPU核心数一样;支持的配置项为:number | auto
# 如下配置进程数为:1个master,1个worker
worker_processes 1;
# Nginx 错误日志级别及存放路径
# debug 级别日志需要编译时使用 --with-debug 开启
#error_log [path] [debug | info | notice | warn | error | crit | alert | emerg]
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# Nginx 服务启动时的 pid 存放位置
#pid logs/nginx.pid;
# event配置:主要影响Nginx服务器与用户的网络连接。对Nginx服务器的性能影响较大,需根据实际情况灵活调整
events {
# 当某一时刻只有一个网络连接到来时,多个睡眠进程会被同时唤醒,但只有一个进程可获得连接。如果每次唤醒的进程数目太多,会影响一部分系统性能。在Nginx服务器的多进程下,就有可能出现这样的问题。
# 开启的时候,将会对多个Nginx进程接收连接进行序列化,防止多个进程对连接的争抢
# 默认是开启状态,只能在events块中进行配置
# accept_mutex on | off;
# 如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的连接。否则,一个工作进程可以同时接受所有的新连接。
# 如果nginx使用kqueue连接方法,那么这条指令会被忽略,因为这个方法会报告在等待被接受的新连接的数量。
# 默认是off状态,只能在event块配置
# multi_accept on | off;
# 指定使用哪种网络IO模型,method可选择的内容有:select、poll、kqueue、epoll、rtsig、/dev/poll以及eventport,一般操作系统不是支持上面的所有模型。
# 只能在events块中进行配置
# use method
# use epoll;
# 设置允许每一个worker process同时开启的最大连接数,当每个工作进程接受的连接数超过这个值时将不再接收连接
# 当所有的工作进程都接收满时,连接进入logback,logback满后连接被拒绝
# 只能在events块中进行配置
# 注意:这个值不能超过系统支持打开的最大文件数,也不能超过单个进程支持打开的最大文件数,具体可以参考这篇文章:https://cloud.tencent.com/developer/article/1114773
worker_connections 1024;
}
# http配置,使用最多的部分。代理、缓存、日志定义等绝大多数功能和第三方模块都在这里配置
http {
# http 全局块
# 常用的浏览器中,可以显示的内容有HTML、XML、GIF及Flash等种类繁多的文本、媒体等资源,浏览器为区分这些资源,需要使用MIME Type。换言之,MIME Type是网络资源的媒体类型。Nginx服务器作为Web服务器,必须能够识别前端请求的资源类型。
# include指令,用于包含其他的配置文件,可以放在配置文件的任何地方,但是要注意你包含进来的配置文件一定符合配置规范,比如说你include进来的配置是worker_processes指令的配置,而你将这个指令包含到了http块中,着肯定是不行的,上面已经介绍过worker_processes指令只能在全局块中。
# 下面的指令将mime.types包含进来,mime.types和nginx.conf同级目录,不同级的话需要指定具体路径
include mime.types;
# 配置默认文件类型,如果不加此指令,默认值为text/plain。
# 此指令还可以在http块、server块或者location块中进行配置。
default_type application/octet-stream;
# 日志格式预定义,其他地方可引用;只能在http块中进行配置
#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配置,此指令可以在http块、server块或者location块中进行设置
# 记录Nginx服务器提供服务过程中应答前端请求的日志
# access_log path [format [buffer=size]]
# 如果你要关闭access_log,你可以使用下面的命令
# access_log off;
#access_log logs/access.log main;
# 开启高效传输模式,可以在http块、server块或者location块中进行配置
sendfile on;
# 设置sendfile最大数据量,此指令可以在http块、server块或location块中配置
# sendfile_max_chunk size;
# 其中,size值如果大于0,Nginx进程的每个worker process每次调用sendfile()传输的数据量最大不能超过这个值(这里是128k,所以每次不能超过128k);如果设置为0,则无限制。默认值为0。
# sendfile_max_chunk 128k;
# 减少网络报文数量
#tcp_nopush on;
# 配置连接超时时间,此指令可以在http块、server块或location块中配置。
# 与用户建立会话连接后,Nginx服务器可以保持这些连接打开一段时间
# timeout,服务器端对连接的保持时间。默认值为75s;header_timeout,可选项,在应答报文头部的Keep-Alive域设置超时时间:“Keep-Alive:timeout= header_timeout”。报文中的这个指令可以被Mozilla或者Konqueror识别。
# keepalive_timeout timeout [header_timeout]
# 下面配置的含义是,在服务器端保持连接的时间设置为120s,发给用户端的应答报文头部中Keep-Alive域的超时时间设置为100s。
# keepalive_timeout 120s 100s
#keepalive_timeout 0;
keepalive_timeout 65;
# 配置单连接请求数上限,此指令可以在http块、server块或location块中配置。
# Nginx服务器端和用户端建立会话连接后,用户端通过此连接发送请求。指令keepalive_requests用于限制用户通过某一连接向Nginx服务器发送请求的次数。默认是100
# keepalive_requests number;
# 是否开启压缩。开启后,可以看到http响应头的Content-Encoding值为gzip
#gzip on;
# 可以包含多个 server 块
server {
# 有三种配置方法
# 第一种
# listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
# 第二种
# listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
# 第三种(可以不用重点关注)
# listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
# 只监听来自127.0.0.1这个IP,请求8000端口的请求
# listen 127.0.0.1:8000;
# 只监听来自127.0.0.1这个IP,请求80端口的请求(不指定端口,默认80)
# listen 127.0.0.1;
# 监听来自所有IP,请求8000端口的请求
# listen 8000;
# 监听来自所有IP,请求8000端口的请求
# listen *:8000;
# 只监听来自127.0.0.1这个IP,请求8000端口的请求
# listen localhost:8000;
# 配置项参数见说明
# listen指令的使用看起来比较复杂,但其实在一般的使用过程中,相对来说比较简单,并不会进行太复杂的配置
# 监听的端口
listen 8081;
# 虚拟主机的名称,多个名称使用空格隔开
# 在name 中可以使用通配符“*”,但通配符只能用在由三段字符串组成的名称的首段或尾段,或者由两段字符串组成的名称的尾段
# server_name myserver.* *.myserver.com
# name配置支持正则表达式。优先级说明:
# ① 准确匹配server_name
# ② 通配符在开始时匹配server_name成功
# ③ 通配符在结尾时匹配server_name成功
# ④ 正则表达式匹配server_name成功
# 如果server_name被处于同一优先级的匹配方式多次匹配成功,则首次匹配成功的虚拟主机处理请求
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
# 可以包含多个 location,location 指令用于匹配 uri
# 基于Nginx服务器接收到的请求字符串(server_name/uri-string),对除虚拟主机名称(也可以是IP别名)之外的字符串(/uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能都是在这部分实现。许多第三方模块的配置也是在location块中提供功能
# location [ = | ~ | ~* | ^~ ] uri { ... }
# 可选项说明
# = 用于标准uri前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理此请求
# ~ 用于表示uri包含正则表达式,并且区分大小写。会对uri中的符号进行编码处理
# ~* 用于标准uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配
# ^~ 用于表示uri包含正则表达式,并且不区分大小写。注意如果uri包含正则表达式,就必须要使用“~”或者“~*”标识
# 匹配规则(不添加可选项时)
# 1、在server块的多个location块中搜索是否有标准uri和请求字符串匹配,如果有多个可以匹配,就记录匹配度最高的一个
# 2、用location块中的正则uri和请求字符串匹配,当第一个正则uri匹配成功,结束搜索,并使用这个location块处理此请求
# 3、如果正则匹配全部失败,就使用刚才记录的匹配度最高的location块处理此请求
location / {
# 网站根目录
root html;
# 默认首页文件
index index.html index.htm;
# 禁止访问的IP地址,可以为 all
# deny 10.148.229.83;
# 允许访问的IP地址,可以为 all
# allow 10.148.229.83;
}
# 404 页面配置
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
# 50x 页面配置
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;
# }
#}
}
- listen配置说明
- address:监听的IP地址(请求来源的IP地址),如果是IPv6的地址,需要使用中括号“[]”括起来,比如[fe80::1]等
- port:端口号,如果只定义了IP地址没有定义端口号,就使用80端口。这边需要做个说明:要是你压根没配置listen指令,那么那么如果nginx以超级用户权限运行,则使用*:80,否则使用*:8000。多个虚拟主机可以同时监听同一个端口,但是server_name需要设置成不一样
- default_server:假如通过Host没匹配到对应的虚拟主机,则通过这台虚拟主机处理。具体的可以参考这篇文章,写的不错
- backlog=number:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在FreeBSD中默认为-1,其他平台默认为511
- accept_filter=filter,设置监听端口对请求的过滤,被过滤的内容不能被接收和处理。本指令只在FreeBSD和NetBSD 5.0+平台下有效。filter可以设置为dataready或httpready,感兴趣的读者可以参阅Nginx的官方文档
- bind:标识符,使用独立的bind()处理此address:port;一般情况下,对于端口相同而IP地址不同的多个连接,Nginx服务器将只使用一个监听命令,并使用bind()处理端口相同的所有连接
- ssl:标识符,设置会话连接使用SSL模式进行,此标识符和Nginx服务器提供的HTTPS服务有关
参考地址:Nginx配置文件详解