• Linux_30 IO事件模型及nginx常用模块使用(1)


    http服务及IO事件模型

    engine X = Nginx
    	http协议:web 服务器(类似于httpd)、http reverse proxy(类似于httpd)、imap/pop3 reverse proxy
    	
    	NGINX is a free,open-source,high-performance HTTP server and reverse proxy,as well as an IMAP/POP3 proxy server.
    	C10K(10K Connections).
    	Tengine,OpenResty.
    	
    http 协议:
    	URL:shceme://username:password@host:port/path;params?query#frag
    	params:
    		key=value&key=value
    	query:
    		field=value,...
    	
    	http 事务:
            request:
                <method><URL><VERSION>
                HEADERS
    
                <body>
    
            response
            	<VERSION><STATUS><REASON-PHRASE>
            	HEADERS
            	<body>
            	
                name:value
    		
    		Method:GET/HEAD/POST,PUT/DELETE,TRACE,OPTIONS
    		
    		Status Code:
    			1xx:
    			2xx:成功类响应码,200
    			3xx:重定向类的响应码,301,302,304
    			4xx:客户端错误,403,404
    			5xx:服务器端错误,502
    		
    		认证:
    			基于ip认证
    			基于用户认证:basic/digest
    		
    		httpd MPM:
    			prefork:进程模型,两级结构,主进程master负责生成子进程,每个子进程负责响应一个请求;
    			worker:线程模型,三级结构,主进程master负责生成子进程,每个子进程负责生成多个线程,每个线程响应一个请求;
    			event:主进程master负责生成子进程,每个子进程响应多个请求;
    			
    		
    	I/O模型:(服务器并发编程的5中模式)
    		阻塞型、非阻塞型、复用型、信号驱动型、异步(AIO)
                阻塞型:数据从磁盘到内核,再从内核到用户空间都是阻塞的; # 同步阻塞
                
                非阻塞型:数据从磁盘拷贝到内存是非阻塞的,调用者会一直询问数据是否准备好(是否拷贝到内核内存空间),但是从内存空间到用户空间还是阻塞的,这叫做非阻塞型; # 同步非阻塞
                
                复用型:不再直接调用磁盘I/O,而是调用内核中的IO复用器,这个复用器能帮助这个进程监控多路的IO(磁盘IO、键盘IO),对进程进行响应;依然是阻塞的,但阻塞的位置不同,它阻塞在复用器上。 # 同步复用型阻塞
                
                信号驱动型:进程在接收到用户请求,向内核发起调用,在数据从磁盘拷贝到内核内存这一步不会等待,可以继续接收用户请求;在数据从磁盘拷贝到内存以后,被调用者会通过调用者留的回调接口通知调用者,数据准备完毕,从磁盘到内核内存这一步不会阻塞,从内核内存用户进程内存仍是阻塞,好在从磁盘到内核内存的拷贝过程及其耗时,这种模型已经节省了相当大的时间。 # 半异步,第一段非阻塞,第二段阻塞
                
                异步:在两个阶段中都不参与,进程可以一直接收用户请求,只有数据完成这两步(数据拷贝到进程内存),被调用者通知调用者数据已经拷贝到进程内存中了,进程直接拿数据去响应的过程。 # 完全异步型IO
                
                
    		同步/异步:
    			关注消息通知机制;
    			
    			消息通知:
    				同步:等待对方返回消息;
    				异步:被调用者通过状态、通知或回调机制通知调用者被调用者的运行状态;
    		
    		阻塞/非阻塞:
    			关注调用者在等待结果返回之前所处的状态;
    				阻塞:blocking,调用结果返回之前,调用者被挂起;
    				非阻塞:nonblocking,调用结果返回之前,调用者不会被挂起;
    		
    		一次文件IO请求,都会由两个阶段组成:
    			第一步:等待数据准备完成,即数据从磁盘到内核内存;
    			第二步:复制数据,即数据从内核内存到进程内存;
    		
    		复用型IO调用:
    			select():1024  # Linux模型使用的是select  1024表示能同时接收1024个网络IO请求,可以超多这个数字,但是并没有太多意义,因为性能上并没有提升  select 是加州伯克利分校的BSD设计研发的 
    			poll():没有限制进程数,但是性能并不比select好  # poll 贝尔实验室研发的 ,情绪化的产物,
    			
    			event-driven:
    				epoll(linux):libevent # 对于Linux来讲,使用epoll的系统调用,有更加强大的网络IO库
    					yum info libevent
    			
    

    Nginx

    Nginx的程序架构

    master/worker
    	一个master进程:
    		负载加载和分析配置文件、管理worker进程、平滑升级
    	一个或多个worker进程
    		处理并响应用户请求
    	缓存相关的进程:
    		cache loader:载入缓存对象
    		cache manager:管理缓存对象
    
    特性:异步、事件驱动和非阻塞
    	并发请求处理:通过kevent/epoll/select,/dev/poll
    	文件IO:高级IO sendfile,异步,mmap
    	
    nginx高度模块化,但其模块早期不支持DSO机制;近期版本支持动态装载和卸载;
    	模块分类:
    		核心模块:core module
    		标准模块:
    			HTTP modules:(与web服务相关的模块)
    				Standard HTTP modules
    				Optional HTTP modules(编译时选择--with的选项编译进来的)
    			Mail modules
    			Stream modules :传输层负载均衡(四层代理相关的模块)
    		3rd party modules   
    
    nginx的功用:
    	静态的web资源服务器;(图片服务器,或js/css/html/txt等静态资源服务器)
    	结合FastCGI/SCGI等协议反代动态资源请求;
    	http/https协议的反向代理;
    	imap4/pop3协议的反向代理;
    	tcp/udp协议的请求转发;
    
    nginx的安装配置:
    	官方的预制包:
    		http://nginx.org/packages/cnetos/7/x86_64/RPMS/
    		Fedora-EPEL:
    	
    	编译安装:
    		yum groupinstall "Development Tools" "Server Platform Development"
    		yum install pcre-devel openssl-devel zlib-devel
    		useradd -r nginx
    		./configure --prefix=/usr/local/nginx --conf.path=/etc/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_v2_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-fule-aio
    		make && make install
    		
    		配置文件的组成部分:
    			主配置文件:nginx.conf
    				include conf.d/*.conf
    			fastcgi,uwsgi,scgi等协议相关的配置文件
    			mime.types:支持的mime类型 # mime 多用途互联网邮件扩展
    			
    		主程序文件:/usr/sbin/nginx
    		
    		主配置文件的配置指令:
    			directive value [value2 ...];
    			
    			注意:
    				(1)指令必须以分号结尾;
    				(2)支持使用配置变量;
    					内建变量:由nginx模块引入,可直接引用;
    					自定义变量:由用户使用set命令定义;
    						set variable_name value:
    							引用变量:$variable_name
    		
    		主配置文件结构:
    			main block:主配置段,也即全局配置段;
    				event{
    					...
    				}:事件驱动相关的配置;
    			http{
    				...
    			}:http/https协议相关的配置段;
    			mail{
    				...
    			}
    			stream{
    				...
    			}
    		
    		http协议相关的配置结构
    			http {
    				...
    				...:各server的公共配置
    				server{
    					...
    				}:每个server用于定义一个虚拟主机;
    				server{
    					...
    					listen
    					server_name
    					root
    				}
    			}
    

    nginx(2)

    配置指令:
    	main配置段常见的配置指令:
    		分类:
    			正常运行必备的配置
    			优化性能相关的配置
    			用于调试及定位问题相关的配置
    			事件驱动相关的配置
    

    正常运行必备的配置

    正常运行必备的配置:
    	1.user:
    		Syntax:user user [group];
    		Detault:user nobody nobody;
    		Context:main
    				
    		Defines user and group credentials used by worker processes.If group is omitted,a group whose name equals that of user is used.
    			
    	2. pid /PATH/TO/PID_FILE;
    		指定存储nginx主进程进程号码的 文件路径;
    		
         3.include file | mask;
    		指明包含进来的其它配置文件片段;
    			
    	4. load_module file;
    		指明要装载的动态模块;
    		
    

    性能优化相关的配置

    性能优化相关的配置:
    	1.worker_processes number | auto;
    		worker 进程的数量;通常应该为当前主机的cpu物理核心数;
    			
    	2. worker_cpu_affinity cpumask...;
    		worker_cpu_affinity auto [cpumask];
    				
    		CPU MASK: # 如图1
    			00000001:0号CPU
    			00000010:1号CPU
    			... ...
    	3.worker_priority number;
    		指定worker进程的nice值,设定worker进程优先级;[-20,19]
    		worker_priority -5;
    				
    	4.worker_rlimit_nofile number;
    		worker_rlimit_nofile 65535;
             worker进程所能够打开的文件数量上限;
    

    图1:

    查看某个进程被分配到哪个CPU上运行:
    	ps axo comm,pid,psr | grep nginx
    # 动态监视进程被调度到哪个CPU上运行
    watch -n .5 'ps axo comm,pid,psr | grep nginx'
    
    使用ab 命令压测:
    	yum install -y httpd-tools # 
    	ab -n 100000 -c 100 http://192.168.0.10/index.html
    

    httpd-tools:

    image-20210707200713599

    调试、定位问题

    1.daemon on | off
    	是否以守护进程方式运行Nginx;
    2.master_process on | off;
    	是否已master/worker模型运行nginx;默认为on;
    3.error_log file [level];
    

    事件驱动相关的配置

    events {
    	...
    }
    
    1. worker_connections number;
    	每个worker进程所能够打开的最大并发连接数数量;
    	worker_processes* worker_connections
    
    2.use method;
    	指明并发连接请求的处理方法;
    	
    		use epoll  # select 最大1024个请求
    
    3.accept_mutex on | off;
    	处理新的连接请求的方法;on 意味着由各worker轮流处理新请求,Off意味着每个新请求的到达都会通知所有的worker进程。
    
    

    http协议相关配置

    http {
    	... ...
    	server {
    	...
    	server_name
    	root
    	location [OPERATOR] /url/ {
    		...
    		}
    	}
    	server {
    		...
    	}
    }
    
    与套接字相关的配置:
    	1.server {...}
    	配置一个虚拟主机;
    		server {
    			listen address [:PORT]/PORT;
    			server_name SERVER_NAME;
    			root /PATH/TO/DOCUMENT_ROOT;
    		}
    	
    	2.listen PORT | address[:port]|unix:/PATH/TO/SOCKET_FILE
    	listen address[:port][default_server][ssl][http2 | spdy] [backlog=number][rcvbuf=size] [sndbuf=size]
    	
    	default_server:设定为默认虚拟主机;
    	ssl:限制仅能够通过ssl连接提供服务;
    	backlog=number:后援队列提供服务;
    	backlog=number:后援队列长度;
    	rcvbuf=size:接收缓冲区大小;
    	sndbuf=size:发送缓冲区大小;
    	
    	3.server_name name...;
    		指明虚拟主机的主机名称;后可跟多个由空白字符分隔的字符串;
    			支持*通配任意长度的任意字符;server_name*.sanzhang.com www.sili.*
    			支持~起始的字符做正则表达式匹配;server_name ~^wwwd+.sanzhang.com$
    		
    		匹配机制:
    			(1)首先是字符串精确匹配;
    			(2)左侧*通配符;
    			(3)右侧*通配符;
    			(4)正则表达式;
    		
    		定义四个虚拟主机,混合使用三种类型的虚拟主机;
    			仅开放给来自于本地网络中的主机访问;
    		
    	4.tcp_nodelay on | off;
    		在keepalived 模式下的连接是否启用TCP_NODELAY选项;
    		
    		tcp_nopush on | off;
    		在sendfile模式下,是否启用TCP_CORK选项
    	
    	5.sendfile on | off;
    		是否启用sendfile功能;
    	
    

    定义路径相关的配置

    6.root path;
    	设置web资源路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;可用的位置:http,server,location,if in location;
    		
    7.location [=|~|~*|^~] url {...}
    	Sets configuration depending on a request URL.
    			
    	在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;nginx会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置;
    			
    	=:对URI做精确匹配;例如,http://www.sanzhang.com/,http://www.sanzhang.com/index.html
            location * / { 
            	...
            }
        ~:对URI做正则表达式模式匹配,区分字符大小写;
        ~*:对URL做正则表达式模式匹配,不区分字符大小写;
        ^~:对URI的左半部分做匹配检查,不区分字符大小写;
        不带符号:匹配起始于此uri的所有的url;
            
        匹配优先级:=,^~,~/~*,不带符号;
            
        root /vhosts/www/htdocs/
        http://www.sanzhang.com/index.html --> /vhosts/www/htdocs/index.html
            
        server {
        	root /vhosts/www/htdocs/
            location /admin/ {
            root /webapps/app1/data/
            }
        }
    
    8. alias path;  # 如图1
    	定义路径别名,文档映射的另一种机制;仅能用于location上下文;
    	
        注意:location中使用root指令和alias指令的意义不同;
        	(a)root,给定的路径对应于location中的/uri/左侧的/;
        	(b)alias,给定的路径对应于location中的/uri右侧的/;
    
    9、index file ...
    	默认资源;http,server,location;
    	
    10. error_page code ... [=[response]] uri;  # 如下图2
    	Defines the URI that will be shown for the specified errors.
    
    11. try_files file ... uri;
    

    图1:

    vim /etc/nginx/conf.d/vhost1.conf

    图2:

    定义客户端请求的相关配置

    12. keepalive_timeout timeout [header_timeout];
    	设定保持连接的超时时长,0表示禁止长连接;默认为75s;
    13. keepalive_requests number;
    	在一次长连接上所允许请求资源的最大数量,默认为100;
    14. keepalive_disable none | browser ...;
    	对那种浏览器禁用长连接;
    15. send_timeout time;
    	向客户端发送响应报文的超时时长,此处,是指两次写操作之间的间隔时长;
    16. client_body_buffer_size size;
    	用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,将其被暂存到磁盘上的由client_body_temp_path指令所定义的位置;
    17.client_body_temp_path path [level1 [level2 [le vel3]]];
    	设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
    		16进制的数字;
    		
    		client_body_temp_path /var/tmp/client_body 2 1 1
    			1:表示用一位16禁止数字表示一级子目录;0-f
    			2:表示用2位16进制数字表示二级子目录:00-ff
    			2:表示用2位16进制数字表示三级子目录:00-ff
    		
    

    对客户端进行限制的相关配置

    18. limit_rate rate;
    	限制响应给客户端的传输速率,单位是bytes/second,0表示无限制;
    
    19. limit_except method... {...}
    	限制客户端对指定的请求方法之外的其它方法的使用;
    	
    	limit_except GET {
    		allow 192.168.1.0/24;
    		deny all;
    	} # 表示GET方法以外的其它方法只允许在192.168.1.0这个网段的用户使用
    

    文件操作优化的配置

    20.aio on | off | threads[=pool];
    	是否启用aio功能;
    21.direcio size | off;
    	在Linux主机启用O_DIRECT标记,此处意味文件大于等于给定的大小时使用,例如directio 4m;
    	
    22. open_file_cache off;
    	open_file_cache  max=N [inactive=time];
    		nginx可以缓存以下三种信息:
    			(1)文件的描述符、文件大小和最近一次的修改时间;
    			(2)打开的目录结构;
    			(3)没有找到的或者没有权限访问的文件的相关信息;
    		
    		max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理;
    		
    		inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项;
    
    23. open_file_cache_valid time;
    	缓存项有效性的检查频率;默认为60s;
    
    24. open_file_cache_min_uses number;
    	在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项;
    
    25. open_file_cache_errors on | off;
    	是否缓存查找时发生错误的文件一类的信息;
    

    核心功能:https://nginx.org/en/docs/ngx_core_module.html

    以上为核心功能,以下为常用的模块。。。。

    常用模块:https://nginx.org/en/docs/

    ngx_http_access_module 模块:
    	实现基于ip的访问控制功能
    	
    	26. allow address | CIDR | unix: | all;
    	27. deny address | CIDR | unix: | all;
    		http,server,location,limit_except
    
    ngx_http_auth_basic_module模块
    	实现基于用户的访问控制,使用basic机制进行用户认证;
    	
    	28. auth_basic string | off;
    	29. auth _basic_user_file file;
    		location /admin/ {
    			alias /webapps/app1/data/;
    			auth_basic "Admin Area.";
    			auth_basic_user_file /etc/nginx/.ngxpasswd;
    		}
    		注意:htpasswd命令由httpd-tools所提供;
    
    ngx_http_stub_status_module
    	用于输出nginx的基本状态信息;
    		Active connections:291
    		server accepts handled requests
    			16630948 16630948 31070465
    		Reading:6 Writing: 179 Waiting:106
    		
    		Active connections:活动状态的连接数;
    		accepts:已经接受的客户端请求的总数;
    		handled:已经处理完成的客户端请求的总数;
    		requests:客户端发来的总的请求数;
    		Reading:处于读取客户端请求报文首部的连接的连接数;
    		Writing:处于向客户端发送响应报文过程中的连接数;
    		Waiting:处于等待客户端发出请求的空闲连接数;
    		
    		30. stub_status;
    		
    		配置示例:
    			location /basic_status {
    				stub_status;
    			}
    	
    ngx_http_log_module模块
    	he ngx_http_log_module module writes request logs in the specified format.
    		
    	31. log_format name string...;
    		string 可以使用nginx核心模块及其它模块内嵌的变量;
    			
    		可尝试为nginx定义使用类似于httpd的combined格式的访问日志;
    		
    	32. access_log path [romat [buffer=size][gzip[=level]][flush=time][if=condition]];
    		access_log off;
    			
    		访问日志文件路径,格式及相关的缓冲的配置;
    			buffer=size
    			flush=time
    	33. open_log_file_cache max=N [inactive=time][min_uses=N][valid=time];
    		open_log_file_cache off;
    			缓存各日志文件相关的元数据信息;
    				
    			max:缓存的最大文件描述符数量;
    			min_uses:在inactive指定的时长内访问大于等于此值方可被当作活动项;
    			inactive:非活动时长;
    			valid:验证缓存中各缓存项是否为活动项的时间间隔;
    	
    	ngx_http_gzip_module: # 如图1
    		The ngx_http_gzip_module module is a filter that compresses respinses using the "gzip" method. This often helps to reduce the size of transmitted data by half or even more.
    		1. gzip on | off;
    			Enables or disables gzipping of responses.
    		2.gzip_comp_level level;
    			Sets a gzip compression level of a response. Acceptable values are in the range from 1 to 9.
    		3. gzip_disable regex ...;
    			Disables gzipping of responses for requests with "User-Agent" header fields matching any of the specified regular expressions.
    		4. gzip_min_length length;
    			启用压缩功能的响应报文大小阈值;
    		5.gzip_buffers number size;
    			支持实现压缩功能时为其配置的缓冲区数量及每个缓存区的大小;
    		6.gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
    			nginx作为代理服务器接收到从被代理服务器发送的响应报文后,在何种条件下启用压缩功能的;
    			off:对代理的请求不启用
    			no-cache,no-store,private:表示从被代理服务器收到的响应报文首部的Cache-Control的值为此三者中任何一个,则启用压缩功能;	
    		7.gzip_types mime-type...;
    			压缩过滤器,仅对此处设定的MIME类型的内容启用压缩功能;
    		
    		示例:
    			gzip on;
    			gzip_proxied any;
    			gzip_types text/xml text/css application/javascript;
    
    ngx_http_ssl+module模块:
    	1.ssl on | off;
    		Enables the HTTPS protocol for the given virtual server.
    	2.ssl_certificate file;
    		当前虚拟主机使用PEM格式的证书文件;
    	3.ssl_certificate_key file;
    		当前虚拟主机上与其证书匹配的私钥文件;
    	4. ssl_protocols [SSLv2][SSLv3][TLSv2][TLSv1.1][TLSv1.2];
    		支持ssl协议版本,默认为后三个;
    	5.ssl_session_cache off | none | [builtin[:size]][shared:name:size];
    		builtin[:size]:使用OpenSSL内建的缓存,此缓存为每worker进程私有;
    		
    		[shared:name:size]:在各worker之间使用一个共享的缓存;
    	
    	6.ssl_session_timeout:time;
    		客户端一侧的连接可以复用ssl session cache中缓存的ssl参数的有效时长;
    	
    	配置示例:
    		server {
    			listen 443 ssl;
    			server_name www.sanzhang.com;
    			root /vhosts/ssl/htdocs;
    			ssl on; # 1.15版本以后此参数被废弃,直接 listen 443 ssl;就行了 
    			ssl_certificate /etc/nginx/ssl/nginx.crt;
    			ssl_certificate_key /etc/nginx/ssl/nginx.key;
    			ssl_session_cache shared:sslcache:20m;
    		}
    		
    		
    		cp /etc/nginx/conf.d/centos7.conf /etc/nginx/conf.d/centos7_ssl.conf
    		vim /etc/nginx/conf.d/centos7_ssl.conf  # 如下图2
    		nginx -t 
    		nginx -s reload
    		
    		浏览器访问 :https://www.ilinux.com # 如图3
    

    图1:

    图2:

    图3:

    ngx_http_rewrite_module模块
    	The ngx_http_rewrite_module module is used to change request URI using PCRE regular expressions, return redirects, and conditionally select configurations.
    	bbs.sanzhang.com/-->www.sanzhang.com/bbs/,http://www.sanzhang.com/-->https://www.sanzhang.com/
    	http://www.sanzhang.com/login.php;username=tom-->http://www.sanzhang.com/tom/
    
    	将用户请求的URI基于regex所描述的模式进行检查,而后完成替换;
    	
    	1.rewrite regex replacement [flag] # 如图1
    		将用户请求的URL基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URL;
    		注意:如果在同一级配置块中存在多个rewrite规则,那么会自上而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制;
    		
    		如果replacement是以http://或https://开头,则替换结果会直接以重定向返回给客户端;
    			301:永久重定向;
    		
    		[flag]:
    			last:重写完成后停止对当前URL在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查;提前重启新一轮循环;# 不会对location中当前rewrite下的其它rewrite进行重写,而是类似于continue的操作,使用重写后的url再次进行一次rewrite循环,直到所有的rewrite都检查完。
    			break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置:结束循环;# 跳出当前配置块(比如location,)直接进入下个配置块
    			redirect:重写完成后以临时重定向方式直接返回重写后的新UTI给客户端,由客户端重新发起请求;不能以http://或https://开头
    			permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;
    			
    			last,break是在服务器端直接修改,找到匹配的数据,直接返回给客户端,客户端无从感知,而且也不会修改原请求的URL;
    			redirect:临时从定向(status code:302)服务器端修改URL之后返回给客户端做二次请求,会修改URL,不过包括last,break在内,都不需要用户的参与。
    			permanent:永久从定向(status code:301),也需要客户端重新发请求;
    	
    	2.return
    		return code [text];
    		return code URL;
    		return URL;
    		
    		Stops processing and returns the specified code to a client.
    	
    	3. rewrite_log on | off;
    		是否开启重写日志; # 如果发生重写,是否要记录到日志中,on记录,off不记录;
    	
    	4. if [condition] {...}
    		引入一个新的配置上下文;条件满足时,执行配置块中的配置指令;server,location;
    		
    		condition:
    			比较操作符:
    				==
    				!=
    				~:模式匹配,区分字符大小写;
    				~*:模式匹配,不区分字符大小写;
                     !~:模式不匹配,区分字符大小写;
                     !~*:模式不匹配,不区分字符大小写;
    			文件及目录存在性判断:
    				-e,!-e
    				-f,!-f
    				-d,!-d
    				-x,!-x
    			
    	5. set $variable value;
    		用户自定义变量;
    

    如图1:

    rewrite /(.*)$ https://www.ilinux.io/$1   # http请求重定向到https请求
    

    ngx_http_referer_module模块:
    	The ngx_http_referer_module module is used to block access to a site for requests with invalid values in the "Referer" header field.
    	
    	1. valid_referers nome | blocked | server_names | string...;
    		定义referer首部的合法可用值;
    			none:请求报文首部没有referer首部;
    			blocked:请求报文的referer首部没有值;
    			server_names:参数,其可以有值作为主机或主机名模式;
    				arbitrary_string:直接字符串,但可使用*作为通配符;
    				regular expression:被指定的正则表达式模式匹配到的字符串;要使用~大头,例如~.*.sanzhang.com;
    
    		配置示例:
    			valid_referers none block server_names *.sanzhang.com *.sanzhangedu.com sanzhangedu.* ~
    			.sanzhangedu.;
    			
    			if ($invalid_referer) {
    				return http://www.sanzhang.com/invalid.jpg;
    			}
    
  • 相关阅读:
    shell中逻辑与的两种表示方法
    Git学习之Git恢复进度
    RH318之域控服务器
    《征服C指针》读书笔记
    2013年:一个技术领导的启程
    sqlite的一个Unable to Open database file的坑爹错误
    我的2013——青春的躁动
    C/C++注册动态对象到Lu系统并进行运算符重载
    Geeks面试题:Min Cost Path
    Leetcode Gray Code
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/15011606.html
Copyright © 2020-2023  润新知