Nginx入门和使用

Nginx入门

基础

https://blog.csdn.net/weixin_40792878/article/details/83316519

快速入门

Nginx 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强

  • 代理:用于隐藏客户端或者目标服务器,是客户端和目标服务器的桥梁
    • 反向代理:反向代理可以隐藏原始服务器代理服务器来接受客户端的网络访问连接请求(此时代理服务器本质就是目标服务器),然后交由业务服务器进行处理;实现服务对于客户端的单向透明
      • Nginx入门和使用_第1张图片
    • 正向代理:正向代理可以隐藏客户端,本质就是客户端通过代理服务器访问目标服务端,代理服务器作为目标服务器的真实客户端进行访问;实现了客户端对于服务端的单向透明;(例如VPN和内网的网关服务器)
      • Nginx入门和使用_第2张图片

基础概念

  1. 文件目录
    • config:配置文件
    • sbin:程序
    • logs:日志
    • html:静态文件
  2. 配置文件
    • Nginx入门和使用_第3张图片
    • nginx.conf:主配置文件
  3. Master-Worker模式
    • master进程:管理子进程、读取Nginx.conf配置文件
    • worker进程:业务进程(处理客户端请求)
      • 每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;

使用

  • .default:默认配置文件(用于还原)
  • fastcgi.conf:为了规范配置指令SCRIPT_FILENAME的用法,引入FastCGI变量传递配置。
  • scgi_params:Nginx在配置SCGI代理服务时会根据scgi_params文件的配置向SCGI服务器传递变量。
  • uwsgi_params:Nginx在配置uWSGI代理服务时会根据uwsgi_params文件的配置向uWSGI服务器传递变量。
主配置文件

Nginx.conf

  • user nginx;			  #用户
    worker_processes auto; #worker进程树
    error_log /var/log/nginx/error.log; #错误日志
    pid /run/nginx.pid;		#进程id
    
    #导入所有nginx的配置文件
    include /usr/share/nginx/modules/*.conf;
    
    #事件配置
    events {
        worker_connections 1024;
    }
    
    #http配置
    http {
        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  /var/log/nginx/access.log  main;
    	
    	#tcp设置
        sendfile            on;
        tcp_nopush          on;
        tcp_nodelay         on;
        keepalive_timeout   65;
        types_hash_max_size 2048;
    	
    	#导入请求响应(响应数据的格式)的配置文件
    		#mime.types配置:文件格式和文件后缀名的映射
        include             /etc/nginx/mime.types;
        #默认格式
        default_type        application/octet-stream;
    
        include /etc/nginx/conf.d/*.conf;
    	
    	upstarem 组名 {
    		server ip:port <weight=number> <backup>
    		server ip:port <weight=number> <backup>
    		……
    	}
    	
    	#server配置:配置业务服务和代理URI的映射
        server {
            listen       80 default_server;
            listen       [::]:80 default_server;
            server_name  _;
            root         /usr/share/nginx/html;
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
            location / {
            	proxy_pass http://ip:port; #配置业务处理服务器
            	root /www/index.html       #配置当前目录下处理(返回静态页面)。显然如果配置了proxy_pass将失效
            }
            
            
    		# 错误页面 响应码
            error_page 404 /404.html;
                location = /40x.html {
            }
            
    		# 错误页面 响应码
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
        }
    
    
  • 配置文件

    • Nginx入门和使用_第4张图片
    • main:服务器全局配置

      • 例如前面的worker数目、日志等
    • events:连接事件配置

      • Nginx 服务器与用户的网络连接配置
    • http:http配置

      • http全局块:主要配置TCP连接、响应

        • 包括文件引入MIME-TYPE 定义日志自定义连接超时时间、单链接请求数上限等。
      • server虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的

        • server全局块虚拟主机服务器配置(包括监听的端口等)

        • upstraem模块:配置业务服务器组名和服务器组的映射

          • upstarem 组名 {
            		# weight:设置服务权重(被调用的概率) backup:开启备份服务器
            		server ip:port <weight=number> <backup> 
            		server ip:port <weight=number> <backup>
            		……
            	}
            
        • location块设定URL和处理器的映射(通过proxy_pass或root进行映射)对特定的请求进行处理

          location / {
          			#检测http的header的referes是否存在,且为指定的域名/端口;主要是防盗链
          			#valid_referes <拒绝策略> 域名/ip <拒绝处理handler> 
          				#例如:valid_referes none 111.111.11.1;
                          #if($valid_referes) return 403;
                         
                       #URL重写;可以通过if(condition){…} 判断是否需要重写
                  	#rewrite            [flag];
                  		#例如将所有http请求变为https请求
                  	#rewrite ^(.*) https://$server_name$1 redirect;
                       
                       
                  	proxy_pass http://ip:port; #配置直接指定业务处理服务器
                  	proxy_pass http://组名; #配置业务处理服务器组,由upstream决定业务服务器
                  	
          
                  	
                  	#root /www/index.html       #配置当前目录下处理(返回静态页面)。显然如果配置了proxy_pass将失效
                  }
          
mine配置文件
  • 配置响应数据的格式:Content-Type: XXX
types {
#格式 文件后缀名;没有配置,但是有该类型则需要在文件中配置,例如返回数据有MP3
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;
    
    #
    video/mp4                                        mp4;
    audio/mpeg                                       mp3;
    #application/octet-stream:下载
    application/octet-stream                         bin exe dll;
}

主要配置

负载均衡

  • 轮询(默认)

  • 权重

    • 直接在upstream设置server的weight
  • 响应时间

  • 最少连接数

  • hash

    Nginx入门和使用_第5张图片

URL重写

https://blog.csdn.net/weixin_44953658/article/details/106314558

防盗链

配置语法

  • 前面学习了基本配置,下面介绍配置语法
  • 通过;设置指令的结束标记
  • 通过{}标记指令的作用域
  • 支持变量、if
  • 支持单位
    • 容量单位
    • 时间单位
    • Nginx入门和使用_第6张图片
  • 变量数据类型
    • 字符串
    • 数值
    • map:前面的mimes的types就是hash表

网关

  • Nginx可以作为服务网关,并且进行:高可用和系统容错配置
    • 负载均衡
    • 限流
    • 安全

限流配置

  • 分布式理论学过:

    • 限流主要有三种思路:时间段分区分配、漏桶算法、令牌桶
    • 实现思路基本是:统计区+算法
    • ngnix(和sentinel类似)也是基于:AQS和连接数进行限流处理
  • 配置策略:算法 统计区

    • limit_conn_zone:连接数
    • limit_req_zone:请求数
    • ngx_http_upstream_module
    #限流策略:<请求/连接数>  zone=<共享内存(统计区)名>:<内存大小> <限流参数>
    
    #使用,一般在http定义,在具体的server/location中通过 共享内存(统计区)名调用
    	#通过请求数+请求的ip作为限流依据
    		#$binary_remote_addr:连接的ip地址的散列结果作为key
    limit_conn_zone $binary_remote_addr zone=perip:10m #perip统计区大小为10M
    		#$binary_remote_addr:连接的server作为key
    limit_conn_zone $server_name zone=perserver:10m #perserver统计区大小为10M
    server {
    	limit_conn perip 10; #每个ip最多10连接连接该server
    	limit_conn perserver 100; #每个server最多100有连接该server
    }
    
    
    
    #AQS限流
    limit_req_zone $server_name zone=req_one:10m rate=20r/s; 
    server {
        location / {
            limit_req zone=req_one; #相当漏斗限流(固定流速
            	#limit_req zone=myRateLimit burst=20; 相当于分区限流,若同时有21个请求到达,Nginx 会处理第一个请求,剩余20个请求将放入队列,然后每隔100ms从队列中获取一个请求进行处理。若请求数大于21,将拒绝处理多余的请求,直接返回503.
            	#limit_req zone=myRateLimit burst=20 nodelay;相当于令牌桶限流,最多有20个令牌,每rom都会添加令牌
            proxy_pass http://xxxxx;
     }
    }
    

服务网关

  • 微服务设置防火墙只允许ngnix服务器访问,所有服务必须通过ngnix才能访问
  • ngnix通过设置访问白名单,进行限制访问
#设置只允许某些IP访问 例如111.111.11.1 111.111.11.1
allow 111.111.11.1;
allow 111.111.11.11;
#设置禁止某些IP访问 例如 111.2222.33.0
deny 111.2222.33.0;

geo $limit {
 default 1;
 10.0.0.0/8 0;
 192.168.0.0/24 0;
 172.20.0.35 0;
}

map $limit $limit_key {
 0 "";
 1 $binary_remote_addr;
}

limit_req_zone $limit_key zone=myRateLimit:10m rate=10r/s

你可能感兴趣的:(nginx,服务器,运维)