Linux-Nginx介绍

一.启动

cd usr/local/nginx/sbin
./nginx
 

二.重启

更改配置重启nginx

killall -s HUP nginx
cd /usr/local/nginx/sbin ./nginx -s reload

nginx -t -c /usr/local/nginx/conf/nginx.conf

cd /usr/local/nginx/sbin ./nginx -t
 

三.关闭

查询nginx主进程号

ps -ef | grep nginx
从容停止 kill -QUIT 主进程号

快速停止 kill -TERM 主进程号

强制停止 kill -9 nginx

若nginx.conf配置了pid文件路径,如果没有,则在logs目录下

kill -信号类型 '/usr/local/nginx/logs/nginx.pid'





1.管理
	介绍
		轻量级web服务器。高性能。反向代理。 也是一个:IMAP/POP3/SMTP代理服务器。
		
	安装,启动 官网源码包
		wget http://nginx.org/download/nginx-1.15.5.tar.gz -P /usr/src
		配置:configure --prefix= 路径
		1.检查环境是否满足安装条件。依赖解决
		2.指定安装 配置文件 命令文件 各种文件放哪里, 开启模块功能,内置模块,三方模块。
		3.指定软件安装在哪里。
		编译 && 安装
		启动:/usr/local/nginx/sbin/nginx -g /usr/local/nginx/conf/nginx.conf 检查配置文件是否有问题。

默认网站:一台服务器发布一个网站叫做默认网站。

2.目录访问控制
	简单的权限配置
		#访问控制:只允许本机访问a目录 其他机器拒绝访问
		location /a {
			allow 127.0.0.1;
			allow 192.16.16.110;   这是两种写法
			deny all;
			
			#return 502 拒绝后返回的数据;
			return http://www.jd.com;  #可以是跳转别的网站
			return 502; #也可以是返回错误网页
		}

	认证配置
		1.openssl
		2.htpasswd yum install -y httpd-tools 在http工具包内。
		vim /etc/nginx/htpasswd 如果没有就创建在此目录下。
		htpasswd -m /etc/nginx/htpasswd sky 创建sky用户。 之后输入密码
	
		配置:
		location /b {
			auth_basic "登录验证";
			auth_basic_user_file /etc/nginx/htpasswd;   #认证文件。
		}
		
		
		
		
		
3.日志管理:ELK日志分析系统
	区别:也可以定义成json格式
	
	日志级别: debug > info > notice > warn > error > crit > alert > emerg
	nginx访问日志主要有两个参数控制
	1.log_format #用来定义记录日志格式(可以定义多种日志格式,取不同的名字即可)
		log_format log_name string
	2.access_log #用来指定日志文件的路径及使用的何种日志格式记录日志
		access_log logs/access_log main;   位置。
		
	日志变量说明:
		$remote_addr, $http_x_forwarded_for  记录客户端IP地址
		$remote_user 记录客户端用户名称
		$request	记录请求的URL和HTTP协议(GET,POST,DEL,等)
		$status	记录请求状态
		$body_bytes_sent	发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
		$bytes_sent	发送给客户端的总字节数。
		$connection	连接的序列号。
		$connection_requests 	当前通过一个连接获得的请求数量。
		$msec 	日志写入时间。单位为秒,精度是毫秒。
		$pipe	如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
		$http_referer 记录从哪个页面链接访问过来的
		$http_user_agent	记录客户端浏览器相关信息
		$request_length	请求的长度(包括请求行,请求头和请求正文)。
		$request_time 	请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
		$time_iso8601 	ISO8601标准格式下的本地时间。
		$time_local	通用日志格式下的本地时间。
	
	日志参数配置。可以百度。
		https://www.cnblogs.com/biglittleant/p/8979856.html   案例

4.防盗链:防爬虫,防止别人盗用连接
	在浏览器中查看请求头中的refer
	location /c {    针对文件夹的写法。
	#location ~* \.(png|gif|bmp)$ {   针对某个文件的写法
		ivalid_referers none blockd *.ayitula.com;
		if ($invalid_referer) {
			return 403;
			}
	}
	

5.虚拟主机:一台服务器发布多个网站,叫做虚拟主机。

	基于IP的虚拟主机
		每一个网站都需要一个ip,缺点:需要多个ip如果是公网ip每个ip都需要付费
		server {
			listen 192.16.16.110:80;
			location / {
				root html/web1;
				index index.html index.htm index.php;
			}
		}
		
		server {
			listen 192.16.16.111:80;
			location / {
				root html/web2;
				index index.html index.htm;
			}
		}

	基于端口的虚拟主机
		只需要一个ip。 缺点,端口是无法告诉公网用户。无法适用于公网客户。适合内部用户
		server {
			listen 80;
			server_name www.abc.com;
			location / {
				root html/web1;
				index index.html index.htm index.php;
			}
		}
		
		server {
			listen 8080;
			server_name www.abc.com;
			location / {
				root html/web2;
				index index.html index.htm;
			}
		}
		
	基于域名的虚拟主机
		修改 /etc/hosts添加域名和地址。适合所有环境,一个IP地址,能配置多个域名。
	
		server {
			listen 80;
			server_name www.abc.com;
			location / {
				root html/web1;
				index index.html index.htm index.php;
			}
		}
		
		server {
			listen 80;
			server_name www.cbd.com;
			location / {
				root html/web2;
				index index.html index.htm;
			}
		}


6.反向代理
	代理的是服务器。
		代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务器接受客户机请求之后,在向主机发出,并接收目的主机返回的数据,存放在代理服		务器的硬盘中,在发给客户机。

	反向代理原理
		1),客户端通过浏览器 发起请求   代理服务器
		2)代理服务器   接受请求
		3)代理服务器  发起请求   业务服务器
		4)业务服务器   接受请求 
		5)业务服务器  处理请求
		6)业务服务器 响应请求    代理服务器
		7)代理服务器 响应请求   客户端
		8)客户端通过浏览器渲染请求并展示给用户。

	堡垒机场景
		保证数据的安全。 业务服务器只开放对堡垒机的ip地址和80端口的问题。
		

	内网服务器发布场景
		ip地址不足,只有一个的时候。代理多个业务服务器。
	
	缓存场景
		缓存静态内容。用户访问速度上比较快。并且减小业务服务器的压力。80%的静态数据。20%的动态数据。

	
	实现配置:
		在server段里面的location加上proxy_pass  http://ip:端口;
		server {
			listen       80;
			server_name  localhost;

			#charset koi8-r;

			#access_log  logs/host.access.log  main;

			location / {
				proxy_pass http://192.16.16.110:80;
				proxy_set_header   设置有后端的服务器获取用户的主机名或真是ip地址,以及代理者的真实IP地址。
					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;

				client_max_body_size 10m;
				client_body_buffer_size 128k;
				proxy_connect_timeout 90;    #后端服务器链接的超时时间
				proxy_send_timeout 90;       #后端服务器数据回传时间。规定时间内必须传完所有的数据。
				proxy_read_timeout 90;		#链接成功后,等待后端服务器响应时间,其实已经进入后端排队
				proxy_buffer_size 4k;       #缓冲区大小
				proxy_buffers 4 32k;        #
				proxy_busy_buffers_size 64k;   
				proxy_temp_file_write_size 64k;
        }
		

7.限速
	应用场景
		DDOS防御
		下载场景保护IO。长时间下载会导致硬盘损坏。

	两种模块
		limit_req_zone 用来限制单位时间内的请求数,即速率限制。
		limit_conn_zone 用来限制同一时间连接数,即并发限制。
		limit_zone: 是针对每个IP定义一个存储session状态的容器.这个示例中定义了一个10m的容器,按照32bytes/session, 可以处理320000个session。

		
	配置方式:
		#基于IP对下载速率做限制 限制每秒处理1次请求,对突发超过10个以后的请求放入缓存区。
		limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
		
		#基于IP做连接限制 限制同一IP并发为3 下载速度为300k
		limit_conn_zone $binary_remote_addr zone=addr:10m;
		server {
			listen 80;
			server_name www.cbd.com;
			location / {
				root html/web2;
				index index.html index.htm;
			}
			
			location /abc{
				limit_req zone=one burst=10 nodelay;   #突发超过10个以后的请求放入缓存区。
				limit_conn addr 3;  限制每个IP只能发起3个并发连接。
				limit_rate 300k; 对每个连接限速300k. 注意,这里是对连接限速,而不是对IP限速。如果一个IP允许两个并发连接,那么这个IP就是限速limit_rate×2。
			}
		}
		
		补充路径详解:
			格式:location ??? {

			}

			路径优先级 (与代码所在前后顺序无关,只与规则有关)
			1. = /error.html
			2. ^~ /images/
			3. ~* \.(gif|jpg|jpeg|png|bmp|swf)$
			4. /static/
			5. /

			解释:
			1.表示完整匹配,用=和完全的路径匹配,比如 =/error.html 就匹配 error.html =/ 匹配根路径
			2.表示开头等于,优先级第二,越长就越能匹配,比如^~ /abc/cd ^~/abc 第一个会优先匹配/abc/cd/xxx
			3.表示不区分大小的正则,并且正则中含义是.jpg等结尾的,优先级第三,同样正则越长越高。
			4.表示开头等于/static/的,但是优先级比第二种低,是一种其他配置找不到再找它,越长就越能匹配。
			5.因为4说了是越长越能匹配,当能匹配/static/就不会匹配/,而/是所有其他的一个默认匹配。

			特别补充比如:location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ { //注意正则与其他符号要空格,其他一些配置也是如是。
			

8.URL重写
	介绍
		域名修改后,访问老地址,直接跳转到新域名。
		rewirte模块:ngx_http_rewrite_module
		工能实现是依赖与PCRE(Perl兼容的正则表达式)的支持,所以在编译安装Nginx之前,需要安装PCRE库。

	应用场景
		域名变更。
		用户跳转(从某个连接跳到另一个连接)
		伪静态场景(便于CDN缓存动态页面数据)

	语法
		set 设置变量
		if 负责语句中的判断
		return 返回返回值或URL
		break  终止后续的rewrite规则
		rewrite 重定向URL

	set 指令 自定义变量
		set $variable value;   variable指定变量名称,value变量值。
		Context: 指定作用域
			server,location,if

		
	if判断指令:
		语法为if(condition){…}   #对给定的条件condition进行判断。
		如果为真,大括号内的rewrite指令将被执行,if条件(conditon)可以是如下任何内容:

		  a:当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false,其他情况为true。 
		  b: 直接比较变量和内容时,使用 = 或!= 
		  c: 正则表达式匹配,*不区分大小写的匹配,!和!*反之。 

		注意:使用正则表达式字符串一般不需要加引号,但是如果含有右花括号“}”或者分号“;”字符时,必须要给整个正则表达式加引号

		其他指令:
		-f和!-f用来判断请求文件是否存在
		-d和!-d用来判断请求目录是否存在
		-e和!-e用来判断是请求的文件或者目录否存在
		-x和!-x用来判断请求的文件是否可执行 

		例子:if (-f $request_filename){
				… #判断请求的文件是否存在,存在就执行这里面的代码块
		}
		
	if判断:nginx内置变量
		$host不带端口,$http_host带端口
		$arg_name 请求中的的参数名,即“?”后面的arg_name=arg_value形式的arg_name
		$args 请求中的参数值
		$binary_remote_addr	客户端地址的二进制形式, 固定长度为4个字节
		$body_bytes_sent	传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的“%B”参数保持兼容
		$bytes_sent	传输给客户端的字节数 (1.3.8, 1.2.5)
		$connection		TCP连接的序列号 (1.3.8, 1.2.5)
		$connection_requests	TCP连接当前的请求数量 (1.3.8, 1.2.5)
		$content_length		“Content-Length” 请求头字段
		$content_type	“Content-Type” 请求头字段
		$cookie_name	cookie名称
		$document_root 	当前请求的文档根目录或别名
		$document_uri	同 $uri
		$host	优先级如下:HTTP请求行的主机名>”HOST”请求头字段>符合请求的服务器名	
		$hostname	主机名
		$http_name	匹配任意请求头字段; 变量名中的后半部分“name”可以替换成任意请求头字段,如在配置文件中需要获取http请求头:“Accept-Language”,那么将“-”替换为下						划线,大写字母替换为小写,形如:$http_accept_language即可。
		$https	如果开启了SSL安全模式,值为“on”,否则为空字符串。
		$is_args	如果请求中有参数,值为“?”,否则为空字符串。
		$limit_rate	用于设置响应的速度限制,详见 limit_rate。
		$msec	当前的Unix时间戳 (1.3.9, 1.2.6)
		$nginx_version nginx版本
		$pid 工作进程的PID
		$pipe	如果请求来自管道通信,值为“p”,否则为“.” (1.3.12, 1.2.7)
		$proxy_protocol_addr	获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串。(1.5.12)
		$query_string	同 $args
		$realpath_root	当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径。
		$remote_addr	客户端地址
		$remote_port 客户端端口
		$remote_user	用于HTTP基础认证服务的用户名
		$request	代表客户端的请求地址
		$request_body	客户端的请求主体
			此变量可在location中使用,将请求主体通过proxy_pass, fastcgi_pass, uwsgi_pass, 和 scgi_pass传递给下一级的代理服务器。
		$request_body_file将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传							递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off, 				                           uwsgi_pass_request_bodyoff, or scgi_pass_request_body off 。

		$request_completion 如果请求成功,值为”OK”,如果请求未完成或者请求不是一个范围请求的最后一部分,则为空。
		$request_filename	当前连接请求的文件路径,由root或alias指令与URI请求生成。

		$request_length	请求的长度 (包括请求的地址, http请求头和请求主体) (1.3.12, 1.2.7)
		$request_method	HTTP请求方法,通常为“GET”或“POST”
		$request_time	处理客户端请求使用的时间 (1.3.9, 1.2.6); 从读取客户端的第一个字节开始计时。
		$request_uri	这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:”/cnphp/test.php?arg=freemouse”。

		$scheme	请求使用的Web协议, “http” 或 “https”

		$sent_http_name		可以设置任意http响应头字段; 变量名中的后半部分“name”可以替换成任意响应头字段,如需要设置响应头Content-length,那么将“-”替换为下划                             线,大写字母替换为小写,形如:$sent_http_content_length 4096即可。

		$server_addr	服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中。
		$server_name	服务器名,www.cnphp.info
		$server_port	服务器端口
		$server_protocol	服务器的HTTP版本, 通常为 “HTTP/1.0” 或 “HTTP/1.1”
		$status	HTTP响应代码 (1.3.2, 1.2.2)
		$tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, $tcpinfo_rcv_space  客户端TCP连接的具体信息
		$time_iso8601	服务器时间的ISO 8610格式 (1.3.12, 1.2.7)
		$time_local	服务器时间(LOG Format 格式) (1.3.12, 1.2.7)
		$uri	请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含                 主机名,如”/foo/bar.html”。

	匹配符号
		模糊匹配:~匹配  !~不匹配   ~×不区分大小写的匹配
		精确匹配: =匹配   !=不匹配
		
	常用正则
		. : 匹配除换行符以外的任意字符
		? : 重复0次或1次
		+ : 重复1次或更多次
		* : 重复0次或更多次
		\d :匹配数字
		^ : 匹配字符串的开始
		$ : 匹配字符串的介绍
		{n} : 重复n次
		{n,} : 重复n次或更多次
		[c] : 匹配单个字符c
		[a-z] : 匹配a-z小写字母的任意一个
		小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。

	return指令:
		可以返回403,
		可以返回url,
		可以返回数据。
		
	break
		终止。
		
	rewrite语法:
		rewrite <regex> <replacement> [flag]
		关键字    正则     替代内容       flag标记
		
		flag标志位:
			last:  相当于Apache的[L]标记,表示完成rewrite
			break:  停止执行当前虚拟主机的后续rewrite指令集
			redirect:  返回302临时重定向,地址栏会显示跳转后的地址
			permanent:  返回301永久重定向,地址栏会显示跳转后的地址
			
	永久重定向:
		rewrite ^(.*)$ http://www.jd.com permanent;

	last使用
		工作原理:url重写后,马上发起一个新的请求,再次进入server块,重试location匹配。超过10此匹配不到报500错误,地址栏url不变。
	
		if判断如果是chrome浏览器访问。 就返回新的url http://ip/chrome/$url . 然后拿新的url再去location访问数据。需要创建chorme的目录
		location /b {
			root html;
			
			if ($http_user_agent ~* 'chrome'){
				rewrite ^(.*)$ /chrome/$1 last;
			}

			#http://192.16.16.42/chrome/$uri   重写后的url
			location /chrome {
				root html;
				index index.html;
			}

		}

9.优化
		优化思路:
		充分利用最大服务器性能。并发数。

		工作进程优化:大并发优化
		优化:

	cpu的并发数要去测试。先给定一个并发数,看cpu压力。如果压力大,就把并发数调小,反之调大。
	netstat -antpl | grep nginx 查看nginx连接数。 top -a 查看cpu使用率
	netstat -antpl | grep nginx|grep ESTABLISHED|wc -l 统计连接数。
	长连接
	优化握手次。

	数据压缩
	给用户的时候压缩数据:节约带宽。节约时间。
	参数

	参数说明
	说明

	说明	

	客户端缓存
	expires 过期时间 1小时。


10.负载均衡

	三要素
		IP地址
		分发器
		web服务器

	nginx分发器构建web集群:分发器;接受请求和响应请求。
			1.ngx_http_upstream_module 基于应用层分发模块。
			2.ngx_stream_core_module 基于传输层分发模块

    集群原理
		虚拟主机+反向代理+upstream分发模块组成。
		虚拟主机:接收和响应请求。
		反向代理:带用户去数据服务器拿数据。
		upstream:告诉nginx去哪个数据服务器拿数据。
		

	分发器配置
		nginx分发算法
			分发算法:如何将用户请求按照一定的规律分发给业务服务器。
			轮询(默认)

			基于权重轮询
			简介

			配置:weight=1 给42服务器分发一个。 给43分发两个。

			基于ip_hash:
				解决session问题
				ip_hash


			基于源ip分发
				植入ip库,判断ip是哪里的。给分发到哪里的服务器。

			基于host主机头,域名分发。

			基于开发语言分发
				不同语言业务间的分发。

			基于浏览器分发
				应用于pc和手机端,区分。

			第三方


			服务器状态

	构建高可用Nginx集群:keepalived
		keepalived简介:高可用就是可用性高。那台机器宕机都切换能正常运行。
		运行协议:vrrp
		主分发器的kp会向网络中发组播,宣告自己还活着, 组播地址224.0.0.18
		下载网址:www.keepalived.org/download.html

		安装: systemctl keepalived start 启动

		主
			1.配置文件中定义脚本
				vrrp_script check_nginx {
					#脚本路径
					script "/etc/keepalived/nginx_pid.sh"
					#探针 每两秒运行一次脚本
					interval 2
					#失败次数
					fall 1
				}
			2.定义脚本内容
				#!/bin/bash
				nginx_kp_chek () {
				nginxpid=`ps -C nginx --no-header |wc -l`
				if [ $nginxpid -eq 0 ];then
					/usr/local/nginx/sbin/nginx
					sleep 1
						nginxpid=`ps -C nginx --no-header |wc -l`
							if [ $nginxpid -eq 0 ];then
				systemctl stop keepalived
					fi
				fi
				}
			

			脚本内容: 脚本文件改权限为 chmod 755 nginx_pid.sh

		调用脚本
		使用vrrp协议

		备
		cp主的文件和脚本。 修改 state backup , mcast_src_ip 备的ip 优先级改为比主的低。

RS故障检测机制
	upstream web {
		server 192.168.10.42 max_fail=2 fail_timeout=3;
		server 192.168.10.43 max_fail=2 fail_timeout=3;
	#容错机制,3秒内启动两次。启动不起来就是nginx宕机。
}



11.正则表达
		.   代表且只能代表任意一个字符(不包括空行)
		*   重复前面任意0个或多个字符
		.*   匹配所有字符。(包括空行)
		sed -ri 's#(.*)#\1#g' bqh.txt
		把前面正则匹配的括号内的结果,在后面用\1取出来操作。
		^   表示以什么开头,^bqh 以bqh开头
		$   是以什么结尾
		^$   表示空行。
		\ 例\.   就只代表点本身,转义符号,让有着特殊身份移动的字符,脱掉马甲,还原原型\$
		^.*   以任意多个字符开头。
		.*$   以任意多个字符结尾。
		(.*)   从第一字符匹配,到空格停止,
		[abc]   匹配字符集合内的任意一个字符【a-zA-Z】
		[^abc]   匹配不包括^后的任意字符的内容;中括号里的^为取反,注意和以...开头区别。
		a\{n,m\}   重复n到m次,前一个重复的字符。如果有用egrep/sed -r 可以去掉斜线。
		\{n,\}   重复至少n次,前一个重复的字符。如果有用egrep/sed -r 可以去掉斜线。
		\{n\}   重复n次,前一个重复的字符。如果有用egrep/sed -r 可以去掉斜线。
		①^word   搜索以word开头的;vi ^ 一行的开够
		②word$   搜索以word结尾的;vi $ 一行的开头
		③^$   表示空行。
		扩展的正则表达式:ERP(egrep或grep -E)

		+   重复一个或一个以上前面的字符
		? 复0个或一个0前面的字符
		|   用或的方式查找多个符合的字符串
		()  找出“用户组”字符串

 

posted @ 2020-02-11 21:16  东风伴侣  阅读(242)  评论(0编辑  收藏  举报