Nginx配置
- 头部配置
user nginx nginx; #运行用户,注意nginx目录和网站文件的权限需要统一开放
worker_processes auto; #工作线程
worker_rlimit_nofile 200000; #线程程最大打开文件数
pid logs/nginx.pid; #进程pid文件存放目录
events {
worker_connections 200000; #最大并发数
accept_mutex on; #避免惊群设置,超高并发业务也要测试使用
multi_accept on; #打开同时接受多个新网络连接请求的功能
use epoll; #epoll模型,I/O多路复用
}
- 日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" upstream_addr: "$upstream_addr" upstream_status:"$upstream_status"' '$status $body_bytes_sent $request_time' ---'$upstream_response_time' "$http_x_forwarded_for" ' $request_time $upstream_response_time'; #常规日志
#打印请求参数日志request_values
log_format timed_combined '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'request_values:"$request_body"'
' $request_time $upstream_response_time';
access_log '/usr/local/nginx/logs/access.log' timed_combined; #指定日志格式
- 开启压缩
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/jpeg;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
- SSL证书配置
server{
listen 443 ssl;
server_name test.com;
ssl on;
ssl_certificate /usr/local/nginx/ssl/test.com.crt;
ssl_certificate_key /usr/local/nginx/ssl/test.com.key;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
......
}
禁止直接通过ip访问
#https禁止IP直接访问网站
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /usr/local/nginx/ssl/www.crt; # 允许的网站 ssl证书
ssl_certificate_key /usr/local/nginx/ssl/www.key; #允许的网站ssl证书钥匙
return 500;
}
#禁止直接ip访问
server {
listen 80 default;
return 500;
}
- 强制HTTPS
server {
listen 80;
rewrite ^(.*)$ https://$host$1 permanent;
location /favicon.ico {
return 200;
#access_log off;
}
}
- 开启资源下载配置
location /download {
charset utf-8;
root /data/;
#alias /data/download/; #重定向目录
if ($request_filename ~* ^.*?\.(txt)$){
add_header Content-Disposition 'attachment';
add_header Content-Type: 'APPLICATION/OCTET-STREAM';}
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
- 反向代理
http{
......
upstream test {
#ip_hash;
proxy_set_header Host $http_host;
#server 192.168.1.2:6001 weight=1 max_fails=2 fail_timeout=2s;
server 127.0.0.1:6001 weight=1 max_fails=2 fail_timeout=2s;
check interval=300 rise=2 fall=5 timeout=100;
}
server{
......
location /uc {
proxy_next_upstream off;
client_max_body_size 20m;
proxy_pass http://test;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
......
}
......
}
- 反向代理websocket
location ~/hone/{
proxy_pass http://127.0.0.1:8080;
index dashboard index;
#websocket额外配置开始
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 60s;#l连接超时时间,不能设置太长会浪费连接资源
proxy_read_timeout 500s;#读超时时间
proxy_send_timeout 500s;#写超时时间
#websocket额外配置结束
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 X-Forwarded-Proto $scheme;
}
- 封禁ip配置
#本配置需要在location标签下生效
#这个配置是经过CDN的,如果你是直接访问的,可以用deny这个配置或者直接用系统防火墙
#如果是直接解析,需要取$remote_addr的实际ip
if ($http_x_forwarded_for ~* "47.240.118.202|47.102.147.7") {
#add_header Content-Type text/plain;
#echo "go out!!!"; #如果有echo模块,可以返回指定语句
#rewrite ^(.*) https://api2312.15511515.com/fuck.html; #返回指定页面
#proxy_pass https://api2312.15511515.com/fuck.html;
return 403; #直接返回状态码
break;}
- 指定接口日记格式(过滤post上传图片请求打印的二进制信息)
#需要在location标签下生效
if ($request ~* "qiliuyun"){
#location /dragon-world/upload/qiliuyun
access_log '/usr/local/nginx/logs/access.log' main;
}
- 自定义参数设置
#某些CDN或者高防没有传递真实IP字段的话,需要从$http_x_forwarded_for中切割出真实IP传给后端
#将$http_x_forwarded_for中的第一个ip赋值给$clientRealIp,常用来给后端获取用户真实ip,具体取哪个ip要根据实际情况来设置
map $http_x_forwarded_for $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
}
- 限制IP并发和速率
nginx可以通过ngx_http_limit_conn_module和ngx_http_limit_req_module配置来限制ip在同一时间段的访问次数.
ngx_http_limit_conn_module:该模块用于限制每个定义的密钥的连接数,特别是单个IP地址的连接数.使用limit_conn_zone和limit_conn指令.
ngx_http_limit_req_module:用于限制每一个定义的密钥的请求的处理速率,特别是从一个单一的IP地址的请求的处理速率。使用“泄漏桶”方法进行限制.指令:limit_req_zone和limit_req.
1、在nginx.conf里的http{}里加上如下代码:
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
2、在需要限制并发数和下载带宽的网站配置server{}里加上如下代码:
limit_conn perip 2;
limit_conn perserver 20;
limit_rate 100k;
补充说明下参数:
$binary_remote_addr是限制同一客户端ip地址;
$server_name是限制同一server最大并发数;
limit_conn为限制并发连接数;
limit_rate为限制下载速度;
http {
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;
...
server {
...
limit_req zone=perip burst=5 nodelay; #漏桶数为5个.也就是队列数.nodelay:不启用延迟.
limit_req zone=perserver burst=10; #限制nginx的处理速率为每秒10个
}
http {
#经过高防的话,用$http_x_forwarded_for
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
#定义一个名为one的limit_req_zone用来存储session,大小是10M内存,
#以$binary_remote_addr 为key,限制平均每秒的请求为1个,
#1M能存储16000个状态,rete的值必须为整数,
server {
...
location /search/ {
limit_req zone=one burst=5;
#限制每ip每秒不超过1个请求,漏桶数burst为5,也就是队列.
#nodelay,如果不设置该选项,严格使用平均速率限制请求数,超过的请求被延时处理.
#举个栗子:
#设置rate=20r/s每秒请求数为20个,漏桶数burst为5个,
#brust的意思就是,如果第1秒、2,3,4秒请求为19个,第5秒的请求为25个是被允许的,可以理解为20+5
#但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误.
#如果区域存储空间不足,服务器将返回503(服务临时不可用)错误
#速率在每秒请求中指定(r/s)。如果需要每秒少于一个请求的速率,则以每分钟的请求(r/m)指定。
}