欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

nginx从入门到实战(一)

程序员文章站 2022-03-19 23:45:55
...

nginx从入门到实战(一)


最权威的文档和教程:nginx.org

  • rpm -ql nginx

  • worker_processes工作进程数一般设置为cpu数量。也可以设置为auto

  • worker_connections可以优化,可以设置为1万多个。

  • limit_req_zone同一IP限制请求频率。

    http {
      limit_conn_zone $binary_remote_addr zone=conn_zone:1m;
      #binary比string节省空间。同IP限速1秒一个request。
      limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
    
    }
    
    location / {
           
            #limit_conn conn_zone 1;
            #burst为缓冲队列,每秒清除rate个请求.每秒最大可处理rate+burst个请求
            limit_req zone=req_zone burst=3 nodelay;
            limit_req zone=req_zone burst=3;
            #limit_req zone=req_zone;
            
    }
    
    http {
            map $http_x_forwarded_for  $clientRealIp {
            ""      $remote_addr;
            ~^(?P<firstAddr>[0-9\.]+),?.*$  $firstAddr;
        }
    }        
        我们通过map自定义了一个变量$clientRealIp;
        如果X-Forwarded-For头是空的,那么客户端真实IP就是remote_addr;
        如果X-Forwarded-For头非空,我们就通过正则匹配,捕获到第一段,这就是用户的真实IP;
        必须注意的是,在每一层代理都要设置X-Forwarded-For头。
    
    
  • http_access_module

    location ~ ^/admin.html {
            root   /opt/app/code;
           #allow 222.128.189.0/24;
            deny 192.168.32.8;
            allow all;
            index  index.html index.htm;
    }
    
    
  • 静态资源

    #sendfile开启,提高网络包的传输效率,适合大文件传输
    tcp_nopush on
    #keepalive连接下,提高传输实时性
    tcp_nodelay on
    
    gzip on
    gzip_comp_level 2
    
    
  • 跨域访问

     location ~ .*\.(htm|html)$ {
            #允许abc站点跨域,或设置为*,允许所有站点跨域。
            add_header Access-Control-Allow-Origin http://www.abc.com; 
            add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
            #expires 24h;
            root  /opt/app/code;
        }
    
  • 防盗链

    location ~ .*\.(jpg|gif|png)$ {
        #none:允许没有referer头信息的访问
        #blocked:允许不是http协议的请求访问
        #允许特定ip访问
        #
        valid_referers none blocked 134.1.12.4 jeson.imoocc.com ~wei\.png;
        if ($invalid_referer) {
            return 403;
        }
        root  /opt/app/code/images;
    }
    

    测试

    #返回403
    curl -e "http://www.baidu.com" -I http://localhost/wei.png
    #返回200,没有referer头
    curl -I http://localhost/wei.png
    #返回403
    curl -e "http://128.147.3.2" -I http://localhost/wei.png
    #返回200
    curl -e "http://134.1.12.4" -I http://localhost/wei.png
    #返回200,https协议也属于http
    curl -e "http://jeson.imoocc.com" -I http://localhost/wei.png
    #返回200,虽然域名非法,但协议不是http或https
    curl -e "ftp://abn.isfc.com" -I http://localhost/wei.png
    
    #返回200,正则匹配了wei.png
    curl -e "http://abc.com/wei.png/alsjfls" -I http://localhost/wei.png
    
  • 反向代理

    location ~ /test_proxy.html$ {
            proxy_pass http://127.0.0.1:8080;
        
        proxy_redirect default;
    
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    
    proxy_connect_timeout 30;
    proxy_send_timeout 60;
    proxy_read_timeout 60;
    
    proxy_buffer_size 32k;
    proxy_buffering on;
    proxy_buffers 4 128k;
    proxy_busy_buffers_size 256k;
    proxy_max_temp_file_size 256k;
    }
    

    测试

    先用防火墙关闭8080端口,禁止外网直接访问8080.
    firewall-cmd --zone=public --add-port=80/tcp --permanent
    firewall-cmd --zone= public --remove-port=8080/tcp --permanent
    firewall-cmd --reload
    
  • 负载均衡

    #简单轮询
    http {
    	upstream imooc {
            #url_hash调度
            hash $request_uri
            #ip_hash;
                
            server 127.0.0.1:8001;
            server 127.0.0.1:8002;
            server 127.0.0.1:8003;
        }
    
    }
    
    
    server {
        listen       80;
        server_name  localhost;
    
        #charset koi8-r;
        access_log  /var/log/nginx/test_proxy.access.log  main;
        resolver  8.8.8.8;
        
        location / {
            proxy_pass http://imooc;
            include proxy_params;
      }
    	
    }
    

     upstream imooc {
            #down:暂时不参与负载均衡,max_conns:限制最大的接收的连接数
            server 127.0.0.1:8001 down;
            server 127.0.0.1:8002 backup;
          server 127.0.0.1:8003 max_fails=1 fail_timeout=10s;
        }
    
    

    #清除规则
    iptables -F
    #禁用8003端口
    iptables -I INPUT -p tcp --dport 8003 -j DROP
    

nginx从入门到实战(一)

  • 缓存

    #60分钟无访问的缓存将被清除
    proxy_cache_path /opt/app/cache levels=1:2 keys_zone=imooc_cache:10m max_size=10g inactive=60m use_temp_path=off;
    
    if ($request_uri ~ ^/(url3|login|register|password\/reset)) {
    		set $cookie_nocache 1;
    	}
    
     location / {
            proxy_cache imooc_cache;
            #proxy_cache off;
            proxy_pass http://imooc;
            proxy_cache_valid 200 304 12h;
            proxy_cache_valid any 10m;
            proxy_cache_key $host$uri$is_args$args;
            
            #特定url不缓存
            proxy_no_cache $cookie_nocache $arg_nocache;
            
            add_header  Nginx-Cache "$upstream_cache_status";  
            
            #当一台服务器出现错误,超时,500等状态码时,跳到下一台服务器请求
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            include proxy_params;
        }
    
相关标签: nginx