脚本宝典收集整理的这篇文章主要介绍了Nginx配置文件,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
1.全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2.events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3.http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4.server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5.location块:配置请求的路由,以及各种页面的处理情况。
#使用nginx这个用户运行,更加安全,默认nobody
user nginx;
#pid文件位置
pid logs/nginx.pid;
#指定全局日志输出位置,notice是日志级别
error_log logs/nginx.log notice;
#开启的工作进程数量,和cpu核心数相同即可
worker_processes auto;
#工作进程绑定哪个cpu,或单个工作进程绑定到多个cpu,通常不用配置
#worker_cpu_affinity 01 10;
#这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)一样。
#现在在linux 2.6内核下开启文件打开数为65535
#最好根据测试数据来限定,超过承受能力会导致其它访问很卡,但若限定后,其它访问正常,多出的会禁止访问。
worker_rlimit_nofile 65535;
#每个work进程可以建立的最大的链接数
# 并发限定总数是 worker_processes 和 worker_connections 的乘积
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 2 因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
worker_connections 65535;
#将日志加载到内存,一起写入日志文件。
#max:最大条目数的,如果缓存被占满,采用 LRU 算法将描述符关闭。
#inactive:设置存活时间,默认10s
#min_uses:设置在 inactive 时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是 1 次
#valid:设置检查频率,默认 60s
open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
events {
epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
}
http {
#[日志格式]
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$request_time" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_time" "$content_type"'
'" $request_body"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log info;
#由 ngx_http_rewrite_module 模块提供的。用来记录重写日志的。对于调试重写规则建议开启。
#rewrite_log on;
#[limit限制]
#设置用于保存各种 key(比如当前连接数)的共享内存的参数。 5m 就是 5兆字节,这个值应该被设置的足够大以存储(32K*5) 32byte 状态或者(16K*5) 64byte 状态。
limit_conn_zone $binary_remote_addr zone=addr:5m;
#我们设置的值是 100,也就是说我们允许每一个 IP 地址最多同时打开有 100 个连接。
limit_conn addr 50;
#限速模块,前3M下载时不限速
limit_rate_after 3m;
#限速模块
limit_rate 512k;
#[基础设置]
#禁用ssi
ssi off;
#禁用autoindex 模块
autoindex off;
#媒体类型,标准
include mime.types;
#默认文件类型,默认为text/plain
default_type application/octet-stream;
#隐藏版本号
server_tokens off;
#编码格式
charset UTF-8;
#[信息传输]
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。如果图片显示不正常把这个改成off。
sendfile on;
#必须在sendfile开启模式才有效,告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。
tcp_nopush on;
#必须在sendfile开启模式才有效告诉nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。
tcp_nodelay on;
#[超时设置,单位均为秒]
#客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接,对于后端是php,可以低一些,因为php解析快,java的话要长一些,java解析慢
keepalive_timeout 30;
#设置请求头的超时时间。我们也可以把这个设置低些,如果超过这个时间没有发送任何数据,nginx将返回request time out的错误
client_header_timeout 10;
#设置请求体的超时时间。我们也可以把这个设置低些,超过这个时间没有发送任何数据,和上面一样的错误提示
client_body_timeout 10;
#响应客户端超时时间,服务端给客户端发送数据,如果客户端迟迟不接受没超过以下时间将断开连接
send_timeout 10;
#告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。
reset_timedout_connection on;
#[server_name控制]
#保存服务器名字(server_name www.xx.com这种)的hash表,如果名字太长,就需要将如下值变大为64
server_names_hash_bucket_size 64;
#存储服务器名字的值大小,默认512kb,如果一个server对应多个域名,就要加大此值
server_names_hash_max_size 512;
#[提交缓存]
#nginx 会将整个请求头都放在一个 buffer 里面,这个buffer 的大小通过配置项 client_header_buffer_size 来设置,如果用户的请求头太大,这个 buffer 装不下,那 nginx 就会重新分配一个新的更大的 buffer来装请求头,这个大 buffer 可以通过 large_client_header_buffers 来设置,这个 large_buffer 这一组 buffer,比如配置 4 8k,就是表示有四个 8k 大小的buffer 可以用。
client_header_buffer_size 32k;
#此指令规定了用于读取大型客户端请求头的缓冲区的最大数量和大小。 这些缓冲区仅在缺省缓冲区不足时按需分配。 当处理请求或连接转换到保持活动状态时,释放缓冲区。如下例子:
large_client_header_buffers 4 32k;
#此指令设置NGINX能处理的最大请求主体大小。 如果请求大于指定的大小,则NGINX发回HTTP 413(Request Entity too large)错误。如果在上传大文件,可以将此值设置大一些
client_max_body_size 8m;
#这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
open_file_cache max=100000 inactive=20s;
#这个是指多长时间检查一次缓存的有效信息。
open_file_cache_valid 30s;
#open_file_cache指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。
open_file_cache_min_uses 2;
#指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置
open_file_cache_errors off;
#[压缩方面]
#开启页面压缩
gzip on;
#gzip压缩是要申请临时内存空间的,假设前提是压缩后大小是小于等于压缩前的。例如,如果原始文件大小为10K,那么它超过了8K,所以分配的内存是8 * 2 = 16K;再例如,原始文件大小为18K,很明显16K也是不够的,那么按照 8 * 2 * 2 = 32K的大小申请内存。如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。
gzip_buffers 2 8k;
#进行压缩的原始文件的最小大小值,也就是说如果原始文件小于1K,那么就不会进行压缩了
gzip_min_length 1K;
# 默认值: gzip_http_version 1.1(就是说对HTTP/1.1协议的请求才会进行gzip压缩)
# 识别http的协议版本。由于早期的一些浏览器或者http客户端,可能不支持gzip自解压,用户就会看到乱码,所以做一些判断还是有必要的。
# 注:99.99%的浏览器基本上都支持gzip解压了,所以可以不用设这个值,保持系统默认即可。
# 假设我们使用的是默认值1.1,如果我们使用了proxy_pass进行反向代理,那么nginx和后端的upstream server之间是用HTTP/1.0协议通信的,如果我们使用nginx通过反向代理做Cache Server,而且前端的nginx没有开启gzip,同时,我们后端的nginx上没有设置gzip_http_version为1.0,那么Cache的url将不会进行gzip压缩
gzip_http_version 1.1;
# 默认值:1(建议选择为4)
# gzip压缩比/压缩级别,压缩级别 1-9,级别越高压缩率越大,当然压缩时间也就越长(传输快但比较消耗cpu)。
gzip_comp_level 5;
#需要进行gzip压缩的Content-Type的Header的类型。建议js、text、css、xml、json都要进行压缩;图片就没必要了,gif、jpge文件已经压缩得很好了,就算再压,效果也不好,而且还耗费cpu。
gzip_types text/HTML text/plain application/x-javascript text/css application/xml;
# 禁用IE6的gzip压缩,又是因为杯具的IE6。当然,IE6目前依然广泛的存在,所以这里你也可以设置为“MSIE [1-5].”
# IE6的某些版本对gzip的压缩支持很不好,会造成页面的假死,今天产品的同学就测试出了这个问题后来调试后,发现是对img进行gzip后造成IE6的假死,把对img的gzip压缩去掉后就正常了为了确保其它的IE6版本不出问题,所以建议加上gzip_disable的设置
gzip_disable "msie6";
#[--压缩--]
# 默认值:off
# Nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含"Via"的 header头。
#off - 关闭所有的代理结果数据的压缩
#expired - 启用压缩,如果header头中包含 "Expires" 头信息
#no-cache - 启用压缩,如果header头中包含 "Cache-Control:no-cache" 头信息
#no-store - 启用压缩,如果header头中包含 "Cache-Control:no-store" 头信息
#private - 启用压缩,如果header头中包含 "Cache-Control:private" 头信息
#no_last_modified - 启用压缩,如果header头中不包含 "Last-Modified" 头信息
#no_etag - 启用压缩 ,如果header头中不包含 "ETag" 头信息
#auth - 启用压缩 , 如果header头中包含 "Authorization" 头信息
#any - 无条件启用压缩
gzip_proxied any;
#尽量发送压缩过的静态文件
gzip_static on;
server { #主机字段
listen 80; #监听端口
server_name www.zjswdlt.cn; #域名
location / {
root html; #页面所在目录
index index.html index.htm index.php; #首页文件
}
#error_page 404 /404.html; #404页面
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ /.ht { #禁止访问htxx文件
deny all;
}
}
}
$remote_addr, $http_x_forwarded_for 记录客户端 IP
$remote_user 记录客户端用户名称
$request 记录请求的 URL 和 HTTP Protocol
$status 记录请求状态
$body_bytes_sent 发送给客户端的 Bytes,不包括 Header 的大小;该变数与 Apache mod_log_config 的 "%B" 相容
$bytes_sent 发送给客户端的 总Bytes数
$connection 连接的序列号
$connection_requests 当前通过一个连接获得的请求数量
$msec 日志写入时间。单位为秒,精度是毫秒
$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为"p",否则为"."
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度(包括请求行,请求头和请求正文)
$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个位元组开始,直到把最后一个字元发送给客户端后进行日志写入为止
$time_iso8601 ISO8601标准格式下的本地时间
$time_local 通用日志格式下的本地时间
location可以对访问的URL路径进行解析,将对不同路径的访问请求匹配到不同的规则上。通常将图片请求放到本地,php请求转发给php-fpm解析。
语法规则: location [=|~|~*|^~] /uri/ { … }
= 表示精确匹配,这个优先级也是最高的
^~ 表示 uri 以某个常规字符串开头,理解为匹配 url 路径即可。 nginx 不对 url 做编码,因此请求为
/static/20%/aa,可以被规则^~ /static/ /aa 匹配到(注意是空格)。
~ 表示区分大小写的正则匹配
~* 表示不区分大小写的正则匹配(和上面的唯一区别就是大小写)
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则
/ 通用匹配,任何请求都会匹配到,默认匹配
多个 location 配置的情况下匹配顺序为:
优先级=>^~>
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止
匹配,按当前匹配规则处理请求。
访问www..com/show 或者 www..com/show/ 返回403
location ~ ^/(show|show/)$ {
return 403;
}
if是nginx配置文件中的一个语法,可以用if和nginx的变量来匹配一些东西,让匹配的ip或者是访问的页面做某些限制或跳转。
1.if规则。if 不支持 && 或 || 也不支持嵌套。如果需要利用 && 可以通过设置变量的方式。
正则表达式匹配:
==:等值比较;
~:与指定正则表达式模式匹配时返回“真”,判断匹配与否时区分字符大小写;
~*:与指定正则表达式模式匹配时返回“真”,判断匹配与否时不区分字符大小写;
!~:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时区分字符大小写;
!~*:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时不区分字符大小写;
文件及目录匹配判断:
-f, !-f:判断指定的路径是否为存在且为文件;
-d, !-d:判断指定的路径是否为存在且为目录;
-e, !-e:判断指定的路径是否存在,文件或目录均可;
-x, !-x:判断指定路径的文件是否存在且可执行;
1.需要将固定ip访问的时候,比如内网访问,可以看到一个管理页面,其他ip访问将看到首页
if ( $remote_addr = 192.168.2.148 ) { #匹配访问地址是192.168.2.148的
set $my_ip 1; #将变量my_ip设置为1
}
if ( $my_ip = 1) { #等于1,则访问单独页面
rewrite ^/(.*)$ /one.html;
}
if ( $my_ip != 1) { #若不等于1,则让他访问首页
rewrite ^/(.*)$ /index.html;
}
我们使用了标准 ngx_rewrite 模块的 set 配置指令对变量 $a 进行了赋值操作。特别地,我们把字符串 hello world 赋给了它。
Nginx 变量的创建只能发生在 Nginx 配置加载的时候,或者说 Nginx 启动的时候;而赋值操作则只会发生在请求实际处理的时候。这意味着不创建而直接使用变量会导致启动失败,同时也意味着我们无法在请求处理时动态地创建新的 Nginx 变量。
nginx变量只能在同location生效,局部。
这里我们使用第三方 ngx_echo 模块的 echo 配置指令将 $foo 变量的值作为当前请求的响应体输出。
server {
listen 8080;
location /test {
set $foo hello;
echo "foo: $foo";
}
}
# curl http://127.0.0.1/test
#输出 foo: hello
1.set变量效果范围
location / {
set $a "666";
echo "a: $a" ;
}
location /xx {
echo "a: $a";
}
下图说明,set变量只会在location中进行影响,相当于副本和局部变量
2.变量的传递
location / {
set $a "666";
rewrite ^ /xx ;
}
location /xx {
echo "a: $a"; #若$a后面有字符串,可以用${a}xx 隔开
}
从下图可以看出变量是内部转发到/xx区块,但是变量是传递过去了。不同于301跳转,当前是nginx内部跳转。
3.set顺序,nginx在执行中,先将set都实行一遍,再按echo的顺序echo。
server {
listen 8080;
location /test {
set $a 11;
echo $a;
set $a 55;
echo $a;
}
}
# curl http://127.0.0.1/test
#输出 55
# 55
echo_page可以将访问的状态码返回固定的页面。一般将404访问显示一个特定页面,而不是默认的。
将404页面301跳转到其他主页,用于老的链接跳转到新的页面。
error_page 404 =301 http:/example.com/new/path.html;
1.找不到则将404转发给后端处理
server {
location /images/ {
root /html;
#这里的设置表示如果文件没有找到,不记录这条日志信息,因为后面的location正确处理了,所以没有必要记录
open_file_cache_errors off;
#将404页面转发给后面的location去处理,将$uri也转交给后面
error_page 404 = /fetch$uri;
}
location /fetch/ {
proxy_pass http://backend/;
}
}
return一般用于接收到ip访问或非指定域名访问时会返回指定错误(500)错误,或者用于流量引入至某个网站
重定向
location /test {
return 301 http:/www.52wiki.cn/
}
1.返回404页面
location /test {
return 404
}
以上是脚本宝典为你收集整理的Nginx配置文件全部内容,希望文章能够帮你解决Nginx配置文件所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。