nginx学习笔记

给nginx添加登陆密码:
	1、增加密码
		htpasswd -bc /usr/local/nginx/conf/htpasswd.user username password
		htpasswd -b /usr/local/nginx/conf/htpasswd.user username1 password1 # 增加第二个用户把'-c'去掉,不然会覆盖掉前面的用户
	2、修改文件/usr/local/ngnix/conf/htpasswd.users的所有者所属组,与nginx的所属用户一致
	3、配置文件中加上两行
		auth_basic "Restricted Access";
		auth_basic_user_file /usr/local/nginx/conf/htpasswd.users;

热升级nginx:(只会改变nginx二进制文件)
	1、备份现有的nginx二进制文件
		cp /url/local/openresty/nginx/sbin/nginx /url/local/openresty/nginx/sbin/nginx.old
	2、将新的二进制文件覆盖原来的nginx二进制文件
		cp -f nginx /url/local/openresty/nginx/sbin/nginx
	3、给原nginx的master进程发送一个热部署的信号,此时新老进程一起运行,老进程不再监听history |grep patch端口
		kill -USR2 13195(进程号)
	4、关闭老进程,进程号还在,进程没了
		kill -WINCH 13195	
	5、回滚:向老master发送HUP,向新master发送QUIT
	6、关闭老进程
		kill -QUIT 13195



日志切割:
	先备份日志,再执行:nginx -s reopen,重新生产日志文件(或:kill -USER1 $(cat /usr/local/openresty/nginx/logs/nginx.pid))

goaccess分析access log

制作https站点:
	1、安装python2-certbot-nginx
		yum install python2-certbot-nginx
	2、制作
		certbot --nginx --nginx-server-root=/usr/local/openresty/nginx/conf -d geektime.taohui.pub

Nginx进程管理:信号
	Master进程:
		1、监控worker进程:CHLD
		2、管理worker进程
		3、接收信号
			TERM,INT
			OUIT
			HUP
			USER1
			USER2
			WINCH
	Worker进程:
		接收信号:
			TERM,INT、QUIT、USR1、WINCH
	nginx命令行:
		reload:HUP
		reopen:USER1
		stop:TERM # 立即退出nginx
		quit:QUIT # 优雅的关闭nginx(主要针对http,设置定时器(worker_shutdown_timeout)、关闭监听句柄、关闭空闲连接、在循环中等待全部连接关闭、退出进程)


模块分类:
	核心模块:NGX_CORE_MODULE
	子模块: NGX_EVENT_MODULE:
				event_core:通用参数模块
				epoll
			NGX_HTTP_MODULE:
				ngx_http_core_module:通用参数模块
				请求处理模块
				响应过滤模块
				upsteam相关模块
			NGX_STREAM_MODULE:
				ngx_stream_core_module:通用参数模块
				steam模块
			NGX_MAIL_MODULE:
				ngx_mail_core_module
			NGX_CONF_MODULE:
				ngx_conf_module

动态模块:
	1、Configure加入动态模块
		例: --with-http_image_filter_module=dynamic
	2、编译进binary
	3、启动时初始化模块数组
	4、读取load_moudule配置
		linux下动态库以.so结尾,静态库以.c结尾
	5、打开动态库并加入模块数组
		在配置文件里导入动态库路径:
				load_module modules/ngx_http_image_filter_module.so
			在location定位的路径上设置读取图片大小:image_filter resize 15 10
	6、基于模块数组开始初始化

http模块:
	Listen:server配置块下
		listen address[:port]
		listen port
		listen unix:path # unix socket地址,只能用于本机通讯
		例子:
			listen unix:/var/run/nginx.sock;
			listen 127.0.0.1:8000;
			listen 127.0.0.1; # 默认使用80端口
			listen 8000;
			listen *:8000;
			listen localhost:8000 bind;
			listen [::]:8000 ipv6only=on;  #ipv6地址配置,只支持ipv6
			listen [::1];

	处理HTTP请求头部的流程:


	server_name:
		1、指令后可以跟多个域名,第一个是主域名
			server_name first.taohui.com second.taohui.com;
			server_name_in_redirect on; # 可以放在http、server、location中,默认是off,当设置为on时,访问第二个域名,会通过第一个域名指向服务
			return 302 /redirect;
		2、*泛域名:仅支持在最前或最后加*
			server_name *.taohui.tech 
		3、正则表达式:加~前缀 
			server_name www.tail.com ~^www\d++\.taohui\.tech$;
		4、用正则表达式创建变量:用()
			server {
				server_name ~^(www\.)?(.+)$;
				location / { root /sites/$2; } # $2取server_name中第二个括号内匹配的值 
			}
			server {
				server_name ~^(www\.)?(?<domain>.+)$;
				location / { /root/sites/$domain; } # 取(?<domain>.+)匹配的值
			}
		5、其他:
			.taohui.tech可以匹配taohui.tech *.taohui.tech
			_匹配所有
			""匹配没有传递Host头部
		6、server匹配顺序
			01 精确匹配
			02 *在前的泛域名
			03 *在后的泛域名
			04 按文件中的顺序匹配正则表达式域名
			05 default server
				- 第一个
				- listen指定default

	http请求处理的11个阶段
		POST_READ			realip
		SERVER_REWRITE		rewrite
		FIND_CONFIG		
		REWRITE  			rewrite
		POST_REWRITE	
		PREACCESS			limit_conn,limit_req
		ACCESS              auth_basic,access,auth_request
		POST_ACCESS			
		PRECONTENT			try_files
		CONTENT				index,autoindex,concat
		LOG   				access_log

	postread阶段:获取真实客户端地址的realip模块 
		  用户(内网ip:192.168.0.56)->ADSL(运营商公网IP:115.204.33.1)->CDN(IP地址:1.1.1.1)->某反向代理(IP地址:2.2.2.2)->Nginx
		  TCP连接的四元组(src ip,src port,dst ip,dst port)
		  HTTP头部X-Forwarded-For用于传递IP
		  HTTP头部X-Real-IP用于传递用户IP:
		  		X-Forwarded-For: 115.204.33.1, 1.1.1.1
		  		X-Real-IP: 115.204.33.1
		  真实用户IP使用方式:基于变量
		  		将X-Forwarded-For等的值覆盖binary_remote_addr、remote_addr,这样做限制(limit_conn)才有意义
		realip模块:
			编译进Nginx: --with-http_realip_module
			功能: 修改客户端地址
			变量: realip_remote_addr、realip_remote_port
			指令: set_real_ip_from、real_ip_header、real_ip_recursive

	rewrite阶段的rewrite模块:
		return指令
			可以放在server、location、if中
		rewrite指令:
			重写URL:
				rewrite regex replacement[flag];
				- 将regex指定的url替换成replacement这个新的url
					- 可以使用正则表达式及变量提取
				- 当replacement以http://或者https://或者$schema开头,则直接返回302重定向
				- 替换后的url根据flag指定的方式进行处理
					- last:用replacement这个URI进行新的location匹配
					- break:break指令停止当前脚本指令的执行,等价于独立的break指令
					- redirect:返回302重定向,临时重定向
					- permanent:返回301重定向,永久重定向 
					例:
						location /first {
							rewrite /first(.*) /second$1 last;
							return 200 'first';
						}
						location /second {
							rewrite /second(.*) /third$1 break;
							return 200 'second!';
						}
						location /third {
							return 200 'third!'
						}
			if指令:
				Syntax:if(condition){...}
				Context:server,location
				注意:检查是否为空或者值为0;与字符串匹配,=或!=;将变量与正则表达式做匹配(大小写敏感:~或者!~,大小写不敏感:~*或者!~*)
					检查文件是否存在(-f或!-f);检查目录是否存在(-d或!-d);检查文件、目录、软连接是否存在(-e、!-e)
					检查是否为可执行文件(-x、!-x)

	find_config阶段:找到请求的location指令块	
		merge_slashes on|off; #合并url中的斜杠
		location匹配规则:
			前缀字符串:
				- 常规
				- =:精确匹配
				- ^~:匹配上后则不再进行正则表达式匹配,即禁止正则表达式匹配
			正则表达式:
				- ~:大小写敏感
				- ~*:忽略大小写
			合并连续的/符号:
				- merge_slashes on
			用于内部跳转的命名location
				- @					
			优先级:精确匹配(=)>禁止正则表达式匹配(^~)>正则表达式匹配>常规前缀字符串匹配(匹配越长优先级越高)

	preaccess阶段:
		对连接做限制的limit_conn模块:
			- 生效阶段:NGX_HTTP_PREACCESS_PHASE阶段
			- 模块:http_limit_conn_module
			- 默认编译进nginx,通过--without-http_limit_conn_module禁用
			- 生效范围:
				-全部worker进程(基于共享内存)
				-进入preaccess阶段前不生效
				-限制的有效性取决于key的设计:依赖postread阶段的realip模块取到真实ip
			- 定义共享内存(包括大小),以及key关键字
				Syntax: limit_conn_zone key zone=name:size;
				Context: http
			- 限制并发连接数:
				Syntax: limit_conn zone number;
				Context: http,server,location
			- 限制发生时的日志级别
				Syntax: limit_conn_log_level info |notice |warn| error;
				default: limit_conn_log_level error;
				Context: http,server,location
			- 限制发生时向客户端返回的错误码
				Syntax: limit_conn_status code;
				Default: limit_conn_status 503;
				Context: http,server,location
			- limit_rate 50; # 限制向用户返回的速度
		对请求做限制的limit_req模块:
			- 生效阶段:NGX_HTTP_PREACCESS_PHASE阶段
			- 模块:http_limit_req_module
			- 默认编译进nginx,通过--without-http_limit_req_module禁用
			- 生效算法:leaky bucket算法
			- 生效范围:
				-全部worker进程(基于共享内存)
				-进入preaccess阶段前不生效		
			- 定义共享内存(包括大小),以及key关键字
				Syntax: limit_req_zone key zone=name:size rate=rate;
				Context: http
			- 限制并发连接数:
				Syntax: limit_req zone=name [burst=number][nodelay];
				Context: http,server,location
					-burst默认为0
					-nodelay,对burst中的请求不再采用延时处理的做法,而是立刻处理

	access阶段:
		对ip做限制的access模块
			- 生效阶段:NGX_HTTP_ASSCESS_PHASE阶段
			- 模块:http_access_module
			- 默认编译进nginx,通过--without-http_access_module禁用
			- 生效范围:
				进入access阶段前不生效
			Syntax: allow或deny address|CIDR|unix:|all;	
			Context: http,server,location,limit_except
			事例:
				location / {
					deny 192.168.1.1;
					allow 192.168.1.0/24;
					allow 10.1.1.0/16;
					allow 2001:0db8::/32;
					deny all;
				}
		对用户名密码做限制的auth_basic模块:
			基于HTTP Basic Authutication协议进行用户名密码的认证
			默认编译进nginx:
				通过--without-http_auth_basic_module禁用功能
			语法:
				auth_basic string|off;  # 开启的话,string就是给浏览器中显示的title
				auth_basic_user_file file;  # file中配置用户名密码
				Context: http,server,location,limit_except
			生成密码文件:
				工具:httpd-tools
				命令:htpasswd -c file -b user pass
		使用第三方做权限控制的auth_request模块:
			功能:向上游的服务转发请求,若上游昙厵返回的响应码是2xx,则继续执行,若上游服务返回的是401或者403
				,则将响应返回给客户端
			编译:--with-http_auth_request_module
			指令:
				auth_request uri|off;
				auth_request_set $variable value;
				Context:http,server,location
			示例:
				location / {
					auth_request /test_auth;
				}
				location = /test_auth{
					proxy_pass http://127.0.0.1:8080/auth_upstream;
				}
				location /auth_upstream{
					return 403 'auth success'
				}
		satisfy指令:允许改变access执行顺序
			access模块执行顺序:access模块、auth_basic模块、auth_request模块、其他模块
			指令:
				Syntax:satisfy all|any;  # all必须所有access模块通过才放行,any任一个模块通过请求即可
				Default: satisfy all;
				Context: http,server,location
			注意:
				如果return和access放在一起,access模块不会生效

	precontent阶段:
		按序访问资源的try_files模块:
			模块:ngx_http_try_files_module模块
			指令:
				Syntax:
					try_files file ... uri;
					try_files file ... =code;
				Context: server,location
			功能:依次试图访问多个url对应的文件(由root或者alias指令指定),当文件存在时直接返回文件内容,如果所有
				文件都不存在,咋按最后一个URL结果或code返回;
		mirror模块:实时拷贝流量
			模块:ngx_http_mirror_module模块
			功能:处理请求时,生成子请求访问其他服务,对子请求的返回值
			指令:
				Syntax: mirror uri|off;     # 将请求指向指向另一个url
				Default: mirror off;
				Context: http,server,location

				Syntax: mirror_request_body on|off;
				Default: mirror_request_body on;
				Context: http,server,location 

	content阶段:
		static模块:
			root和alias指令:将url映射为文件路径,以返回静态文件内容
				Syntax: alias path;
				Context: location

				Syntax: root path;
				Default: root html;
				Context: http,server,location,if in location
				差别:
					root会将完整url映射进文件路径中,即会将location后的匹配路径加到路径之后
					alias只会将location后的URL映射到文件路径
			static模块的3个变量:
				request_filename:待访问的完整路径
				document_root:由URI和root/alias规则生产的文件夹路径,文件夹可能是软链接
				realpath_root:将document_root中的软链接等换成真实路径
				静态文件返回时的content-type:
					Syntax: types {...}
					Default: types { text/html; image/gif gif; image/jpeg jpg; }
					
					Syntax: default_type mime-type;
					Context: default_type text/plain;

					Syntax: types_hash_bucket_size size;
					Default: types_hash_bucket_size 64;

					Syntax: types_hash_max_size size;
					Default: types_hash_max_size 1024;

					Syntax:log_not_found on|off;
					Default: log_not_found on;
					Context: http,server,location
			static模块对url不以斜杠结尾却访问目录的做法:
				server_name_in_redirect off; # 重定向时on以主域名返回给客户端url,off是以访问的域名返回url;
				port_in_redirect on;		# on访问的端口也显示在返回重定向的域名中 
				absolute_redirect on;		# 重定向时on的时候返回的url是绝对路径,带域名,否则返回只路径不带域名
				Context:http,server,location

		index模块(ngx_http_index_module:无法移除)和autoindex模块(去除:--without-http_autoindex_module):
			index模块:访问url末尾有/时,默认寻找目录下指定的文件,优先级高于autoindex
				Syntax: index file ...;   
				Default: index index.html; 
				Context: http,server,location
			autoindex模块:访问url末尾有/时,尝试以html/xml/json/jsonp等格式返回root/alias中指向目录的目录结构
				autoindex on |off; 		# 默认off,不开启autoindex
				autoindex_exact_size on|off; 	# 默认on,绝对路径,以字节为单位显示,格式为相对路径(off)时会根据文件大小改变单位,格式为html时生效
				autoindex_format html|xml|json|jsonp; 	# 显示格式,默认html
				autoindex_localtime on|off;   # 默认off,是否以本地时间格式显示
				Context:http,server,location

		提升多个小文件性能的concat模块:
			功能:当页面需要返回多个小文件是,把他们的内容合并到一次http响应中返回,提升性能
			url格式:??后是要访问的文件,文件之间以逗号分割
			模块:ngx_http_concat_module
				模块开发者Tengine,先将这个模块下载下来,然后编译时加上--add-module=../nginx-http-concat/
			指令:
				concat on|off; 		# 默认off
				concat_types:MIME types;	# 对哪些类型的内容合并,默认:text/css application/x-javascript
				concat_unique on|off;	# 默认on,对多种类型文件合并
				concat_max_files numberp;  # 最多合并多少文件,默认10个
				concat_delimiter string;  # 定义返回文件内容之间的分隔符,默认NONE
				concat_ignore_file_error on|off;  # 默认off,忽略合并的文件有错误的情况,比如403或404
				Context:http,server,location

		access日志,log(ngx_http_log_module):
			指令:
				Syntax: log_format name [escape=default|json|none] string ...;
				Default: log_format combined "...";
				Context: http

				Syntax: access_log path[format [buffer=size][gzip[=level][flush=time][if=condition]]]
						access_log off;
				Default: access_log logs/access.log combined;
				Context: http,server,location,if in location,limit_except
				# 对日志文件名包含变量使的优化(缓存,如果不使用缓存,每次写入日志文件都要重新打开文件)
				Syntax: open_log_file_cache max=N(缓存内的最大文件句柄数) [inactive=time(文件访问完后在这段时间内不会被关闭,默认10s)][min_uses=N][valid=time(超出valid时间后,将对缓存的日志检查是否存在,默认60s)]
						open_log_file_cache off;
				Default: open_log_file_cache off;
				Context: http,server,location

	http过滤模块:会改变发往用户的响应
			copy_filter:复制包体内容
			postpine_filter:处理子请求
			header_filter:构造响应头部
			write_filter:发送响应
		sub模块:将响应中指定的字符串替换成新的字符串
			模块:ngx_http_filter_module(--with-http_sub_filter_module)
			指令:
				sub_filter string replacement;  # 将匹配string变为replacement,忽略大小写
				sub_filter_last_modified on|off; # 是否返回原来的内容,默认off
				sub_filter_once on|off;			# 默认on,只替换一次,off的话,替换全局
				sub_filter_types mome_types ...; # 只针对指定类型进行替换,默认text/html
				Context:http,server,location	
		addition模块:在响应前或响应后增加内容,而增加内容的方式是通过新增子请求的响应完成
			模块:ngx_http_addition_filter_module(--with-http_addition_module)
			指令:
				add_before_body url;	# 将访问url的子请求响应加到响应后
				add_after_body url;
				addition_types mime-type ...; # 只针对指定类型,默认text/html
				Context:http,server,location	

	Nginx变量:
		存放变量的哈希表:
			variables_hash_bucket_size 64;
			variables_hash_max_size 1024;
			Context:http

		HTTP框架提供的请求相关的变量:
			1、HTTP请求相关的变量
				arg_参数名:URL中摸个具体参数的值
				query_string:与args变量完全相同
				args:全部URL变量
				is_args:如果请求URL中有参数则返回?否则返回空
				content_length:HTTP请求中标识包体长度Content-Length头部的值
				content_type:标识请求包体类型的Content-Type头部的值
				uri:请求的URI(不同URL,不包括?后的参数)
				document_uri:与uri完全相同
				scheme:协议名,例如HTTP或者HTTPS
				request_method:请求方法,例如GET或者POST
				request_length:所有请求内容的大小,包括请求行、头部、包体等
				remote_user:有HTTP Basic Authutication协议传入的用户名
				request_body_file:临时存放请求包体的文件
					如果包体非常小则不会存文件
					client_body_in_file_only:强制所有包体存入文件,且可决定是否删除
				request_body:请求中的包体,这个变量当且仅当使用反向代理,切设定用内存暂存包体是才会有效
				request:原始的url请求,含有方法与协议版本,例如GET /?腌&表2 HTTP/1.1
				host:	1、向从请求行中获取
						2、如果含有Host头部,则用其值替换掉请求行中的主机名
						3、如果前两者都娶不到,则使用匹配上的server_name
				http_头部名字:返回一个具体请求头部的值
					特殊:
						http_host
						http_user_agent
						http_referer
						http_via
						http_x_forwarded_for
						http_cookie

			2、TCP连接相关变量
				binary_remote_addr:客户端地址的整形格式,对于IPv4是4字节,对于IPv6是16字节
				connection:递增的连接序号
				connection_requests:当前连接上的请求数,对keepalive连接有意义
				remote_addr:客户端地址
				remote_port:客户端端口
				proxy_protocol_addr:若使用了proxy_protocol协议则返回协议中的地址,否则返回空
				proxy_protocol_port:若使用了proxy_protocol协议则返回协议中的端口,否则返回空
				server_addr:服务器端地址
				server_port:服务器端端口
				TCP_INFO:tcp内核层参数,包括$tcpinfo_rtt,$tcpinfo_rttvar,$tcpinfo_snd_cwnd,$tcpinfo_rcv_space
				server_protocol:服务端协议,例如HTTP/1.1

			3、Nginx处理请求产生变量
				request_time:请求处理到现在的耗时,单位为秒,精确到毫秒
				server_name:匹配上请求的server_name值
				https:如果开启了TLS/SSL,则返回on,否则返回空
				request_completion:若请求处理完则返回OK,否则返回空
				request_id:以16进制输出的请求标识id,该id共含有16字节,是随机生成的
				request_filename:待访问文件的完整路径
				document_root:由URI和root/alias规则生成的文件夹路径
				realpath_root:将document_root中的软连接等换成真实路径
				limit_rate:返回客户端响应是的速度上限,单位为每秒字节数。可以通过set指令修改对请求产生效果


			4、发送HTTP响应时的相关变量
				body_bytes_sent:响应中body包体的长度
				bytes_sent:全部响应的长度
				status:http响应中的返回码
				sent_trailer_名字:把响应结尾内容里值返回

			5、Nginx系统变量
				time_local:以本地时间标准输出的当期时间
				time_iso8601:使用ISO 8601标准输出的当前时间
				nginx_version:Nginx版本号
				pid:所属worker进程的进程id
				pipe:使用了管道则返回p,否则返回.
				hostname:所在服务器的主机名
				mscc:1970.1.1到现在的时间,单位秒

	使用变量防盗链的referer模块:
		场景:在网页上点击url时,跳转时http请求的头部会通过referer头部,将该网站当前的url带上
		目的:拒绝非正常的网站访问我们站的资源
		思路:通过referer模块,用invalid_referer变量(允许访问为空,不允许访问为1)根据配置判断referer头部是否合法
		referer模块:默认编译进nginx,--without-http_referer_module

		指令:
			valid_referers none|blocked|server_names|string ...;
				# 可携带多个参数,表示多个referer头部都生效;
				# none:允许缺失referer头部的请求访问
				# block:允许referer头部没有对应的值请求访问,反向代理时常见
				# server_names:若referer中站点域名与server_name中本机域名某个匹配,则允许访问
				# 匹配正则表达式
				# 匹配域名前缀或后缀,可在后面或前面加*
			referer_hash_bucket_size 64;
			referer_hash_max_size 2048;
			Context:server,locationFR

	使用变量实现防盗链的secure_link模块:
		过程:
			- 由服务器(也可以是nginx)生成加密的安全链接url,返回给客户端
			- 客户端使用安全url访问nginx,由nginx的secure_link变量判断是否验证通过
		模块:ngx_http_secure_link_module,编译时--with-http_secure_link_module
		变量:
			secure_link 	# 值为空字符串:验证不通过,值为0:URL过期,值为1:验证通过
			secure_link_expires  # 时间戳的值
		指令:
			secure_link 	
			secure_link_md5
			secure_link_secret
		事例:
			命令行生成安全链接:
				原请求:/test1.txt?md5=md5生成值&expires=时间戳
				生成md5:echo -n '时间戳URL客户端IP 密钥'|openssl md5 -binary |openssl base64|tr +/ -|tr -d =
			Nginx配置:
				- secure_link $arg_md5,$args_expires; # 获取原请求
				- secure_link_md5 "$secure_link_expires$uri$remote_addr secret"; # 验证md5的值	

			仅对URI进行哈希的简单办法:
				- 将请求URI分为三个部分:(原请求:link,生成安全请求:/prefix/md5/link)
					/prefix/hash/link
				- Hash生成方式:(echo -n 'linksecret'|openssl md5 -hex)
					对"link密钥"做md5哈希求值
				- 用secure_link_secret secret;配置密钥,看该密钥是否与上一步hash生成密钥匹配

	为复杂的业务生成新的变量:map模块
		功能:基于已有模块,使用类似switch{case:... default:...}的语法创建新变量,为其他基于变量值实现功能的模块提供更多的变量
		模块:ngx_http_map_module,--without-http_map_module
		指令:
			map string $variable {...} # 大括号内为case语句,string为用来匹配的变量,生成的值赋给variable
			map_hash_bucket_size size;
			map_hash_max_size 2048;
			Context:http
		例子:
			map $http_host $name {
				hostnames;	# 使用hostnames指令,可以对域名前缀和后缀*泛域名匹配
				default 0;
				~map\.tao\w+\.org.cn 1;
				*.taohui.org,cn 2;
				map.taohui.tech 3;
				map.taohui.* 4;
			}

	通过变量指定少量用户实现AB测试:split_client模块
		功能:基于已有变量创建新变量,为其他AB测试提供更多的可能性
		模块:ngx_http_split_clients_module,--without-http_split_clients_module
		已有变量:
			字符串
			一个或多个变量
			变量与字符串的组合
		case规则:
			xx.xx%:支持小数点后2位,所有项的百分比相加不能超过100%
			*:由它匹配剩余的百分比
		指令:
			split_clients string $variable {...}

	根据IP地址范围的匹配生成新变量:geo模块
		模块:ngx_http_geo_module,默认编译进
		功能:根据IP地址创建新变量
		指令:geo [$address] $variable {...}
		规则:指令后不输入$address,那么默认使用$remote_addr变量作为IP地址
			{}内的指令匹配:优先最长匹配
				- ip地址掩码
				- default
				- 通过proxy指令指定可信地址(参考realip模块),此时remote_addr的值为X-Forwarded-For头部值中最后一个IP
				- prxoy_recursive允许循环地址搜索
				- include
				- delete删除指定网络
		例子:
			geo $country {
				default ZZ;
				# include conf/gep.conf;
				proxy 116.15.160.193;

				127.0.0.1/24 US;
			}

	使用变量获取用户的地理位置:geoip模块(基于MaxMind数据库从客户端获取变量)
		功能:根据IP地址创建新变量
		模块:ngx_http_geoip_module,默认未编译进,--with-http_geoip_module
		流程:
			- 安装MaxMind里的geoip的C开发库
			- 编译Nginx时,带上--with-http_geoip_module
			- 下载MaxMind中的二进制地址库
			- 使用geoip_country或者geoip_city指令配置好nginx.conf
			- 运行(或者生级nginx)
		指令:
			geoip_country file;         # 指定国家类的文件
			geoip_proxy address|CIDR;  # 定义可信地址。 如果请求来自可信地址,nginx将使用其“X-Forwarded-For”头来获得地址
			geoip_city file;			# 指定城市类的文件
			geoip_proxy_recursive on|off; #如果关闭递归查找,在客户端地址与某个可信地址匹配时,nginx将使用“X-Forwarded-For”中的最后一个地址来代替原始客户端地址。 如果开启递归查找,在客户端地址与某个可信地址匹配时,nginx将使用“X-Forwarded-For”中最后一个与所有可信地址都不匹配的地址来代替原始客户端地址
			Context:http
		变量:
			- $geoip_country_code
				两个字母的国家代码,比如CN或者US
			- $geoip_country_code3
				三个字符的国家代码,比如CHN或者USA
			- $geoip_country_name
				国家名称,例如"China"

	对客户端使用keepalive提升连接效率:
		协议:
			Connection头部:close|keepalive
			Keep-Alive: 值为timeout=n,单位为秒,表示至少保留n秒
		指令:
			keepalive_diable none|brower ...; # 默认msie6,不使用keepalive
			keepalive_requests number;		# 一个keepalive连接最多执行多少条指令,默认100条
			keepalive_timeout timeout [header_timeout]; # 空闲多少秒关闭(默认75s)【一个keepalive至少保留多少秒】



日常问题:
	ngnix添加有的模块编译失败,打补丁:下载对应版本补丁后
		sudo patch -p1 < /software/write_filter-1.7.11.patch

     nginx使用nginx_upstream_check_module-master监控upstream模块
     	1、下载模块(版本对应)
     	2、进入nginx的目录打补丁:patch -p1 < ../nginx_upstream_check_module-master/check_1.16.1+.patch 
     	3、编译、make、替换nginx,nginx升级

     patch -p0 < /usr/local/nginx-upstream-jvm-route-master/jvm_route.patch 

     nginx返回的包头,Content-encoding 是gzip,实际却没有被压缩,注意配置gzip_min_length、gzip_types

     nginx转发问题:
     	加上/,不会带后缀转发,带/会带后缀转发
     	proxy_pass http://js.test.com/; 

        if ( $uri !~* "^/ssologin/getToken$|^/services/WangWangTodoListService$|^/services/WangWangWorkflowService$|^/spa/workflow/static4mobile/index.html$|^/spa/workflow/static4mobileform/index.html$" ) {
        rewrite ^(.*) http://i.want-want.com/$1 permanent;
}

请求头:	
	X-Frame-Options HTTP 响应头是微软提出来的一个HTTP响应头,主要用来给浏览器指示允许一个页面可否在 <frame>, <iframe> 或者 <object> 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去
		# DENY:表示该页面不允许在frame中展示,即使在相同域名的页面中嵌套也不允许
		# SAMEORIGIN:表示该页面可以在相同域名页面的frame中展示
		# ALLOW-FROM url:表示该页面可以在指定来源的frame中展示
		例子:add_header X-Frame-Options:SAMEORIGIN;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值