参考资料:
写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。
nginx.conf配置示例如下:
#运行用户
#user somebody;
#设置工作进程数,通常设置成和cpu的数量相等
worker_processes 1;
#全局错误日志,按照级别划分成error、notice、info三个日志
error_log D:/Tools/nginx-1.10.1/logs/error.log;
error_log D:/Tools/nginx-1.10.1/logs/notice.log notice;
error_log D:/Tools/nginx-1.10.1/logs/info.log info;
#PID文件,记录当前启动的nginx的进程ID(注意,这里是记录的master进程,只能有一个)
pid D:/Tools/nginx-1.10.1/logs/nginx.pid;
#工作模式及连接数上限
events {
worker_connections 1024; #单个后台worker process进程的最大并发链接数
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#导入其他文件中定义的配置
include D:/Tools/nginx-1.10.1/conf/mime.types;
#设置响应类型
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路径
access_log D:/Tools/nginx-1.10.1/logs/access.log main;
rewrite_log on;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(零拷贝)来输出文件,对于普通应用,
sendfile on;
#sendfile打开时才可启用,开启缓冲池,当缓冲池满后才进行传输
tcp_nopush on;
#连接超时时间
keepalive_timeout 120;
#keepalive开启时才可启用,当有数据时立即发送,不进行缓冲
tcp_nodelay on;
#gzip压缩开关
#gzip on;
#设定反向代理实际的服务器列表
upstream zp_server1{
server 127.0.0.1:8089;
}
#HTTP服务器
server {
#监听80端口,80端口是知名端口号,用于HTTP协议
listen 80;
#定义使用www.xx.com访问
server_name www.helloworld.com;
#首页
index index.html
#指向webapp的目录
root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp;
#编码格式
charset utf-8;
#nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_connect_timeout 180;
#被代理服务器回传数据给nginx超时时间(后端服务器回传数据的时间)
proxy_send_timeout 180;
#nginx等候等待被代理服务器响应时间(即后端服务器处理请求的时间)
proxy_read_timeout 180;
#在响应头中增加以下响应属性
proxy_set_header Host $host;
proxy_set_header X-Forwarder-For $remote_addr;
#反向代理的路径(和upstream绑定),location 后面设置映射的路径
location / {
proxy_pass http://zp_server1;
}
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp\views;
#设置过期时间
expires 30d;
}
#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
#禁止访问 .htxxx 文件
location ~ /\.ht {
deny all;
}
#错误处理页面(可选择性配置)
#error_page 404 /404.html;
#error_page 500 502 503 504 /50x.html;
#location = /50x.html {
# root html;
#}
}
}
一、静态资源优化
正常情况下,服务端获取文件资源,需要应用程序发起read()指令,操作系统由用户态进入内核态,将文件资源cpoy到内核缓冲区后,再返回给应用程序。然后再由应用程序通过write()指令将文件资源copy到内核态中socket缓冲区,最后返回给客户端浏览器。
在上面的情况中,我们发现,获取一次文件资源需要两次由用户态进入内核态,且需需要多次copy文件资源,将其从内核缓存区复制到应用程序缓冲区,再写回内核态中的socket缓冲区。这样的过程无疑是复杂的,Linux为我们提供了sendfile函数来优化整个过程,内核缓冲区直接将文件资源发送给socket缓冲区,避免了再与用户态的2次交互过程。在nginx中可以使用sendfile on来打开该功能。
二、日志格式
#配置日志格式
log_format main '[$remote_addr] - [$remote_user] [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
$time_local
:本地时间$remote_addr
:请求客户端IP
地址$request_method
:请求方法$request_uri
:请求的URL
,不带有请求的参数$uri
:请求的URL
,带有请求的参数$request_time
:请求处理时间,即响应时间$status
:返回状态$body_bytes_sent
:发送body
大小$geoip2_data_country_name
:请求所属的国家$geoip2_data_subdivisions_name
:请求所属的省份或地区$geoip2_data_city_name
:请求所属的城市$http_referer
:请求来自于何处,例如从百度跳转过来$upstream_addr
:请求转发的后端服务器地址$upstream_response_time
:后端服务器响应的时间$http_user_agent
:访问客户端信息,可以获取到请求浏览器版本信息等$http_x_forwarded_for
:请求经过的代理信息
三、后端健康检查
集群环境下有时后端服务器可能会出现问题,希望在出现问题后将问题服务器剔除服务器加载列表,此时就需要后端健康检查控件的需要,配置后端健康检查控件的支持需要在upstream中加入如下配置
upstream cluster {
# simple round-robin
server 192.168.0.1:80;
server 192.168.0.2:80;
check interval=3000 rise=2 fall=5 timeout=1000 type=tcp;
}
如上配置即可实现针对upstream中每一个server执行健康检查操作,每个三秒钟对后端发起一次检测,检测后端的80端口,如果后端在1s内不给出响应,连续5次出现不响应的情况,则将该机器踢出可用服务器列表中,如果后期连续检测两次该服务器正确的响应了,则重新将该服务器调度至服务器可用列表中。
如果希望采用http的检测方式,可以使用如下配置
upstream cluster {
# simple round-robin
server 192.168.0.1:80;
server 192.168.0.2:80;
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "GET /intelliq-web/index/home HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
其中在check_http_send中配置的GET /intelliq-web/index/home HTTP/1.0\r\n\r\n,表示在检查时向后端发送/intelliq-web/index/home请求,以此判断后端是否正常,如果后端返回2xx和3xx则表示是存活的。