#user nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes 4;
#全局错误日志及PID文件
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#默认pid的保存位置如下,可更改
#pid logs/nginx.pid;
#工作模式及连接数上限
events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
#use epoll;
#单个worker process进程的最大并发链接数
worker_connections 1024;
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
# ulimit -SHn 65535
}
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
#默认的传输文件方式
default_type application/octet-stream;
#设定名称为main的日志格式取代默认的combined格式,$time_iso8601(标准格式2017-01-19T09:10:52+08:00)。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access日志位置和格式, 需要增加http_x_forwarded_for的显示,日志需要定时移除或改名,不支持按天分文件
access_log logs/access.log main;
#缓冲,避免每次都关闭打开日志文件
open_log_file_cache max=1000 inactive=60s valid=60s min_uses=2;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#激活tcp_nopush参数可以允许把httpresponse header和文件的开始放在一个文件里发布,积极的作用是减少网络报文段的数量
tcp_nopush on;
#长连接超时时间,默认是75s
keepalive_timeout 60s;
#激活tcp_nodelay,内核会等待将更多的字节组成一个数据包,从而提高I/O性能
tcp_nodelay on;
#开启gzip压缩
gzip on;
#IE6及以下版本性能太差,不压缩
gzip_disable "MSIE [1-6].";
gzip_min_length 1000;
gzip_buffers 4 16k;
gzip_types text/plain application/x-javascript text/css;
#设定请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#禁止嵌套访问
add_header X-Frame-Options SAMEORIGIN;
#设置httponly
add_header Set-Cookie "HttpOnly=true; max-age=1800";
#限制每个IP只能访问60次/分钟,以及白名单,同时需在location中开启代码
limit_req_zone $binary_remote_addr zone=allips:10m rate=60r/m;
geo $limited{
default 1;
#My IPs
127.0.0.1/32 0;
192.168.0.0/32 0;
}
upstream mywebapp {
#ip_hash负载,如果没加这条指令,nginx会使用默认的round robin负载均衡(指定weight比重)
#ip_hash;
#max_fails表示超时重试的最大次数,当在fail_timeout时间段内重试次数达到上限则标记服务器不可用,将在fail_timeout后取消标记并重新尝试计数。此处超时计算依赖请求的超时时间,即nginx到后端server的请求超时时间设置见server的location /部分
server 127.0.0.1:8888 weight=1 max_fails=1 fail_timeout=30s;
#server 127.0.0.1:7001 weight=1 max_fails=1 fail_timeout=30s;
}
#设定虚拟主机配置,第一个主机为默认主机
#设置默认server防御host头攻击
server {
listen 8100 default_server;
server_name _;
location / {
return 403;
}
}
server {
#访问端口
listen 8100;
server_name 192.168.11.150; #此处必须是用户浏览器内输入的IP或域名
#定义服务器的默认网站根目录位置,可相对/绝对地址,指定了静态文件的存放位置,千万不要写成\
#root D:/bea12/user_projects/domains/base_domain/autodeploy/DefaultWebApp;
root D:/java/tomcat-9.0.10/webapps/root;
#charset koi8-r;
#禁止Scrapy等工具的抓取,HttpClient仍可用
if ($http_user_agent ~* (Scrapy|Curl)) {
return 403;
}
#禁止指定UA及UA为空的访问,会导致一些使用接口没法访问了,因此需要仔细分别
#if ($http_user_agent ~* "WinHttp|WebZIP|FetchURL|node-superagent|java/|FeedDemon|Jullo|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|Java|Feedly|Apache-HttpAsyncClient|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|BOT/0.1|YandexBot|FlightDeckReports|Linguee Bot|^$" ) {
# return 403;
#}
#屏蔽GET|POST|OPTIONS之外的请求方式:delete put trace,貌似trace默认就是返回405
if ($request_method !~* GET|POST|OPTIONS) {
return 403;
}
#location匹配规则:=最先,^~次之,然后按配置出现顺序(建议按请求频率确定顺序),最后是/根通配
#默认请求策略
location / {
#使用限制器,每秒最多30个请求
limit_req zone=allips burst=30 nodelay;
proxy_pass http://mywebapp;
#proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header Cookie $http_cookie;
#nginx与server的连接超时时间(与server线程是否阻塞无关,不是等待后端返回页面的时间),默认值是60s,不能超过75s
proxy_connect_timeout 3;
#nginx发送请求给server的超时时间。超时设置不是为了整个发送期间,而是在两次write操作期间,默认值是60s
#proxy_send_timeout 60s
#nginx会等待多长时间来获得server的响应,这个时间不是获得整个response的时间,而是两次reading操作的时间
#(与server线程是否阻塞有关,应根据server是否有大时长运算调整,同时也要增加keepalive_timeout的时间),默认值是60s
#proxy_read_timeout 60s;
#设置off避免编码转换出现不对的情况
chunked_transfer_encoding off;
#让cookies写在根目录下,这样才不会丢失,如果出现cookies丢失的话
#proxy_cookie_path /examples/ /;
}
#给icon图标响应空白图片,避免读硬盘并记录日志
location ~ /(favicon.ico|apple-touch-icon.png|apple-touch-icon-precomposed.png)$ {
empty_gif;
access_log off;
}
#静态文件缓存,必须设置正确的root,不记录access日志,另外如果静态文件是在其他服务器,应使用反向代理并缓存(见后:location ~ \.php$)
#如果使用了模板引擎等,不要把html\htm设置为静态缓存,否则可以
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|json|css|swf|zip|rar|7z|exe|doc|docx|xls|xlsx|ppt|pptx|cab|eot|otf|fon|font|ttf|ttc|woff|woff2)$ {
expires 7d;
access_log off;
}
#关闭robots.txt不存在时记录日志
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# 不允许访问隐藏文件例如 .htaccess, .htpasswd, .DS_Store (Mac).
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
#404页面
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#错误页面
error_page 500 502 503 504 /50x.html;
#指定50x页面的响应
location = /50x.html {
root html;
}
#指定特定的请求使用反向代理到指定的服务,比如使用验证码
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
#指定特定的请求使用特定服务
#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;
#}
#指定特定的请求拒绝服务,比如禁止访问/web-info/
#location ~ /\.ht {
# deny all;
#}
}
}