初学Nginx,感觉Nginx配置文件中指令以及参数各类繁多,总结成博客备忘,也便广大Linux爱好者学习交流,因为时间原因,总结的不够全面后续会不断完善此博文,笔者水平有限,如有疏漏不妥之处,还请不吝赐教!
以下内容部分参考互联网和 南非蚂蚁(高俊峰)所著的 《高性能Linux服务器构建实战运行监控、性能调优与集群应用》一书,
感谢开源前辈以及Linux先行者提供的宝贵资料,如有侵权之处,请马上通知,本人立即删除;
#user nobody; #指定 Nginx Worker进程运行用户以及用户组,默认由 nobody运行; worker_processes 1; #指定Nginx要开启的进程数,默认情况下是1,如果存在多颗CPU,设置为和CPU同样的数量即可;
# 全局错误日志位置及PID文件位置:
#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid;
events { # 用来设定Nginx的工作模式及连接数上限; worker_connections 1024; 用于定义Nginx每个进程的最大连接数,默认为12024; # 并发总数是 worker_processes 和 worker_connections 的乘积 # 即 max_clients = worker_processes * worker_connections # 进程的最大连接数受Linux系统进程的最大打开 文件数限制,在执行操作系统命令"ulimit -n 65536"后 worker_connections的设置才会生效; } http { include mime.types; # 设定mime类型,类型由mime.type文件定义; default_type application/octet-stream; # 默认类型为二进制流,当文件类型未定义时使用这种方式; }
#定义日志格式:
#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 logs/access.log main; #访问日志记录位置 并使用main格式记录
log_format:Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式,main 为此日志格式名称;
$remote_addr:客户端IP地址
$remote_user:如果需要客户端登陆才能访问,记录客户端使用哪个用户登陆;
$time_local:访问时间与时区;
$request:用户的原始请求URL,与http协议(包含整个请求符);
$status:状态码,成功即为200
$body_bytes_sent:发送给客户端的主体内容大小
$http_referer:从哪个页面链接跳转过来
$http_user_agent:客户端浏览器类型
$http_x_forwarded_for:客户端的IP地址
$remote_addr与$http_x_forwarded_for的区别:
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址;
client_max_body_size 20m; # 允许客户端请求的最大单个文件字节数(通过Nginx上传单个文件大小); client_header_buffer_size 32k; # 指定来自客户端请求头的headerbuffer大小,对于大多数请求1KB缓冲区大小已经足够,如果自定义了消息头或有更大的cookie,可以增加缓冲区大小,此处定义为32KB; large_client_header_buffers 4 32k; # 用来指定客户端请求中较大的消息头缓存最大数量和大小,4代表个数,128K代表大小,最大缓存为4个128KB; # nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取如果设置过小HTTP头/Cookie过大 会报400 错误nginx 400 bad request 求行如果超过buffer,就会报HTTP 414错误(URI Too Long)nginx接受最长的HTTP头部大小必须比其中一个buffer大,否则就会报400的HTTP错误(Bad Request)。
sendfile on; # 开启高效文件传输模式, 指定nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件 # 对于普通应用,必须设为 on, # 如果用来进行下载等应用磁盘IO重负载应用,可设置为 off, # 以平衡磁盘与网络I/O处理速度,降低系统的uptime. tcp_nopush on; # 此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用 tcp_nodelay on; keepalive_timeout 0; keepalive_timeout 65; # 此处将保持时间设置为 65; # 用于设置客户端连接保持活动的超时时间,开启长连接以后,超过这个时间服务器会自动关闭这个连接; client_header_timeout 10; # 设置客户端请求头读取超时时间,如果超过时间客户端还没有发送任何数据,Nginx将返回 "Request time out (408)" 错误; client_body_timeout 10; # 设置客户端请求主体读取超时时间,默认为60。超过这个时间,客户端没有发送任何数据,Nginx将返回 "Request time out (408)"错误;
send_timeout 10; # 用于指定响应客户端的超时时间,超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接; proxy_connect_timeout 90; # 后端服务器连接的超时时间_发起握手等候响应超时时间 proxy_read_timeout 180; # 连接成功后等候后端服务器响应时间其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间) proxy_send_timeout 180; # 后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据 proxy_buffer_size 256k; # 设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小 proxy_buffers 4 256k; # 设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k; # 设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长 proxy_temp_path /data0/proxy_temp_dir;
注意:此下的所有设置只有在编译时安装了 HttpGzip 模块才会被启用:
#gzip on; #gzip_min_length 1k; #gzip_buffers 4 16k; #gzip_http_version 1.1; #gzip_comp_level 2; #gzip_types text/plain application/x-javascript text/css application/xml; #gzip_vary on;
# gzip 用于设置开启或关闭gzip模块,"gzip on"表示 开启gzip压缩;
# gzip_min_length 设置 允许压缩的页面最小字节数,页面字节数从header头的Content-length中获
取,默认值为0,不管页面多大都进行压缩,建议更改成大于1K,不然会越压越大;
# gzip_buffers 表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相
同的内存空间来存储gzip压缩结果;
# gzip_http_version 设置识别HTTP协议版本,默认为1.1,目前大部分浏览器已经支持gzip解压,使
用默认即可;
# gzip_comp_level 指定gzip压缩比,范围1-9 1压缩比最小,处理速度快,9压缩比最大,传输速度
快节约带宽,但处理起来慢,也较消耗CPU资源;
# gzip_types 指定压缩哪些文件,无论是否指定,默认情况下 text/html 类型总会被压缩
# gzip_vary 可以让前端缓存服务器缓存经过gzip压缩的页面;
server{ # 用来标志虚拟主机开始 listen 80; # 指定虚拟主机监听在哪个套接字上; server_name 192.16.12.188 www.nginx.com; # 设置 IP地址或域名,多个域名间用空格分开 index index.html index.htm index.jsp; # 设置 访问的默认首页地址 root /web/www/; # 指定虚拟主机的网页根目录,这个目录可是相对路径,也可是绝对路径; charset gb2312; # 设置 网页默认编码格式; access_log logs/nginx.access.log main; # 设定本虚拟主机的访问日志 }
Nginx地址匹配相当强大,location 支持正则表达式匹配,也支持条件判断匹配,用户可以通过location指定实现Nginx对动静态网页的过滤处理:
匹配方法:
=:精确匹配,把用户请求的URI,与各location匹配
~:正则表达式模式匹配,匹配时区分字符大小写
~*:正则表达式模式匹配,不区分字符大小写
^~:做URI的前半部分匹配,匹配时不检查正则表达式;
匹配规则:
匹配优先级:精确匹配(=)、^~、~ 和 ~*、最后由不带符号的URL进行左侧匹配
当被多个location所匹配时,这些优先级还一样,就会被第一个location所匹配;
此处有三个小例子:
1、通过location指令来对网页URL进行分析处理,~ 代表使用正则表达式 .* 代表以任意开头任意长度,.代表本身的意义,可以是扩号内的任何结尾,也就是说所有扩展名为.gif、.jpg、.jpeg、.png、.bmp、.swf的静态文件都交给Nginx处理;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { root /web/www/www.nginx.com; # 匹配到哪个目录 expries 30d; # 静态文件过期时间 }
2、将upload和html下的所有文件都交给Nginx来处理,前提是upload和html目录包含在/web/www/www.nginx.com目录中
location ~ ^/(upload|html)/ { root /web/www/www.nginx.com; expries 30d; }
3、location 将所有以 .jsp 为后缀的文件都交给本机的 8080 端口处理;
location ~ .*.jsp$ { index index.jsp; proxy_pass http://localhost:8080; }