NGINX常用配置

  • 2020 年 07 月 19 日
  • 539
  • 871 字
  • 暂无评论

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)指定。 
        
}



—— 暂无评论 ——

OωO