静下心来聊一聊Nginx

日期:2021年05月20日
作者:Commas
注释:静下心来聊一聊Nginx,为自己的知识屋加瓦添砖,同时也希望可以帮助到大家。如果您觉得有所帮助,帮忙点个赞;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^



一、Nginx的定义

Nginx (engine x) 是一个高性能HTTP反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

本段引自:百度百科Nginx

二、Nginx的代理模式

代理服务器(proxy server):请求客户端和原始服务器之间的跳板服务器。正向代理可以隐藏客户端,反向代理可以隐藏原始服务器。
转发代理(Forward agency):用户知道目标服务器的地址,但由于网络限制等原因,无法直接访问。这时候需要先连接代理服务器,然后代理服务器才能访问目标服务器。转发代理目标服务器不知道真正的客户端。

1)正向代理(Forward Proxy)

定义:内网服务器主动要去请求外网的地址或服务,所进行的一种行为
对象:客户端
方向:内网→转发请求→外网
在这里插入图片描述

2)反向代理(Reverse Proxy)

定义:外网要访问内网服务而进行的一种行为;
对象:服务器
方向:外网→转发请求→内网
在这里插入图片描述

3)负载均衡(Load Balancer)

定义:负载均衡(Load Balancer)就是将其所承受的负载按照一定的规则分摊到多个操作单元上进行执行,共同完成工作任务,从而让服务器能够承受更大的并发压力。
类比:犹如你用相同的力掰断1根筷子和10根,1根筷子可能承受不住这个力(负载),但是10根筷子却分散了那份负载,从而有能力来抵抗你掰断它们……在这里插入图片描述

在这里插入图片描述

( 1)轮询(Polling)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream commas-server { 
       server 192.168.0.2; 
       server 192.168.0.5; 
       server 192.168.0.8; 
} 

( 2)权重(weight)
指定每个服务的权重比例,weight和访问比率成正比,通常用于后端服务机器性能不统一,将性能好的分配权重高来发挥服务器最大性能

upstream commas-server { 
       server 192.168.0.2 weight=5; 
       server 192.168.0.5 weight=2; 
       server 192.168.0.8 weight=3; 
} 

( 3) ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream commas-server { 
       ip_hash; 
       server 192.168.0.2:88; 
       server 192.168.0.5:80; 
       server 192.168.0.8:80; 
} 

( 4)最少连接
将请求分配到连接数最少的服务上。

upstream  commas-server {
       least_conn;
       server 192.168.0.2 weight=5; 
       server 192.168.0.5 weight=2; 
       server 192.168.0.8 weight=3; 
}

( 5)fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream  commas-server {
       server 192.168.0.2 weight=5; 
       server 192.168.0.5 weight=2; 
       server 192.168.0.8 weight=3; 
       fair;   #实现响应时间短的优先分配
}

( 6)url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

upstream commas-server {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;   #实现每个url定向到同一个后端服务器
    hash_method crc32;
}

知识加油站:
①为了避免不必要的命名冲突,变量的命名中最好不要有下划线_,因为系统变量是使用下划线_命名的;
②每个指令必须有分号;结束哦!

4)动静分离(Separation of Dynamic And Static)

定义:区分动态请求静态请求,将动静分流到不同的服务器,从而提高网站的响应速度,减轻服务器的负担。(通过location指定不同的后缀名来转发不同的请求,静态资源缓存时间由expires配置)

实现方案一:将静态资源放在单独的服务器上(主流方法)
在这里插入图片描述
实现方案二:动态文件和静态文件一起分布,通过nginx配置分开。
在这里插入图片描述

三、Nginx的下载与安装

本文章以Windows安装Ningx为例

1)Nginx下载

百度搜索Nginx或者直接输入官网地址,Nginx官网入口
在这里插入图片描述
比较推荐安装稳定版本(Stable version),如图所示②
在这里插入图片描述
点击“nginx/Windows-1.20.1”,进行下载
在这里插入图片描述

2)Nginx安装

下载下来的安装包是一个zip格式的文件,只需要在想要安装的目录下解压即可,如图所示。我解压的路径是D:\,即Nginx安装在D:\nginx-1.20.1
在这里插入图片描述
安装后的文件,如下图所示:
在这里插入图片描述

3)Nginx目录

目录说明
conf配置目录,所有配置文件,其中nginx.conf为Nginx服务器的主配置文件
contrib
docs文档目录
html静态页面目录
logs日志目录
temp临时文件目录
nginx.exeNginx主程序

4)Nginx测试

定位到当前路径,打开cmd
在这里插入图片描述
查看Nginx当前版本
在这里插入图片描述
尝试启动nginx,如下图所示,无法正常运行的错误原因: Nginx的默认配置是80端口,而我这台电脑的80端口已经被占用,导致nginx无法启动。
在这里插入图片描述
将默认的80端口,改为8080端口
在这里插入图片描述
再次运行Nginx,浏览器中输入网址http://localhost:8080/,访问成功^ - ^
Welcome to nginx!
在这里插入图片描述

5)Nginx命令

使用帮助来查询命令信息,如下所示:
在这里插入图片描述
常用命令小结

作用命令
启动Nginxnginx
退出Nginx(优雅关闭)nginx -s quit
停止Nginx(快速停止)nginx -s stop
热重启Nginx(重载配置文件)nginx -s reload
查看Nginx版本nginx -v
检查Nginx配置文件nginx -t
强行关闭所有Nginx进程taskkill /f /im nginx.exe

知识加油站:nginx -s xxx中的ssignal(信号)的缩写;

四、Nginx配置文件

配置目录:D:\nginx-1.20.1\conf
配置文件:nginx.conf
特别提示:每个指令必须以;结束

1)配置文件的结构

1-1)配置文件结构示意图

在这里插入图片描述

1-2)配置文件结构说明表

名称说明
全局块配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
events块配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
http块协议级别,可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
server块服务器级别,配置虚拟主机的相关参数,一个http中可以有多个server。
location块请求级别,配置请求的路由,以及各种页面的处理情况。

2)配置文件的探讨

2-1)默认配置的配置示例

# 注:每个指令必须有分号结束哦!^-^

#1)全局块
#运行用户
#user  nobody;
#worker_processes越大,可以支持的并发处理量也越多,通常设置成和cpu的数量相等;
worker_processes  1;

#2)events块
events {
	#单个后台worker process进程的最大并发链接数
    worker_connections  1024;
}

#3)http块
http {
	# 3-1)http全局块
	# http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上线等;
    include       mime.types;
    default_type  application/octet-stream;

	#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,一般设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile        on;

	#连接超时时间
    keepalive_timeout  65;

	#3-1-1)server块
	# server块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,
	# 该技术的产生是为了节省互联网服务器硬件成本;
	# ①每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机;
	# ②而每个server块也分全局server块,以及可以同时包含多个location块;
    server {
        listen       8080;		# 监听端口为8080
        server_name  localhost;	# 监听IP地址或域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

		#3-1-1-1-1)location块
        location / {
            root   html;
            index  index.html index.htm;
        }
		
		# 定义错误提示页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

2-2)反向代理的配置示例

# 注:每个指令必须有分号结束哦!^-^

#1)全局块
#运行用户
#user  nobody;
#worker_processes越大,可以支持的并发处理量也越多,通常设置成和cpu的数量相等;
worker_processes  1;

#2)events块
events {
	#单个后台worker process进程的最大并发链接数
    worker_connections  1024;
}

#3)http块
http {
	# 3-1)http全局块
	# http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上线等;
    include       mime.types;
    default_type  application/octet-stream;

	#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,一般设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile        on;

	#连接超时时间
    keepalive_timeout  65;

	#3-1-1)server块
	# server块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,
	# 该技术的产生是为了节省互联网服务器硬件成本;
	# ①每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机;
	# ②而每个server块也分全局server块,以及可以同时包含多个location块;
    server {
        listen       8080;		# 监听端口为8080
        server_name  localhost;	# 监听IP地址或域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

		#3-1-1-1-1)location块
        location / {
            # root   html;
            # index  index.html index.htm;
			# 注释以上两行指令,配置反向代理
			# location拦截,反向代理 http://127.0.0.1:9090 处理
            proxy_pass http://127.0.0.1:9090;
        }
		
		# 定义错误提示页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

2-3)负载均衡的配置示例

# 注:每个指令必须有分号结束哦!^-^

#1)全局块
#运行用户
#user  nobody;
#worker_processes越大,可以支持的并发处理量也越多,通常设置成和cpu的数量相等;
worker_processes  1;

#2)events块
events {
	#单个后台worker process进程的最大并发链接数
    worker_connections  1024;
}

#3)http块
http {
	# 3-1)http全局块
	# http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上线等;
    include       mime.types;
    default_type  application/octet-stream;

	#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,一般设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile        on;

	#连接超时时间
    keepalive_timeout  65;
	
	upstream commas-server { 
		   server 192.168.0.2 weight=5; 
		   server 192.168.0.5 weight=2; 
		   server 192.168.0.8 weight=3; 
	} 
	
	#3-1-1)server块
	# server块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,
	# 该技术的产生是为了节省互联网服务器硬件成本;
	# ①每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机;
	# ②而每个server块也分全局server块,以及可以同时包含多个location块;
    server {
        listen       8080;		# 监听端口为8080
        server_name  localhost;	# 监听IP地址或域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

		#3-1-1-1-1)location块
        location / {
            # root   html;
            # index  index.html index.htm;
			# 注释以上两行指令,配置反向代理、负载均衡
            # commas-server只是一个变量名,可以自己命名的
            proxy_pass http://commas-server;
        }
		
		# 定义错误提示页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

2-4)动静分离的配置示例

# 注:每个指令必须有分号结束哦!^-^

#1)全局块
#运行用户
#user  nobody;
#worker_processes越大,可以支持的并发处理量也越多,通常设置成和cpu的数量相等;
worker_processes  1;

#2)events块
events {
	#单个后台worker process进程的最大并发链接数
    worker_connections  1024;
}

#3)http块
http {
	# 3-1)http全局块
	# http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上线等;
    include       mime.types;
    default_type  application/octet-stream;

	#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,一般设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile        on;

	#连接超时时间
    keepalive_timeout  65;

	#3-1-1)server块
	# server块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,
	# 该技术的产生是为了节省互联网服务器硬件成本;
	# ①每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机;
	# ②而每个server块也分全局server块,以及可以同时包含多个location块;
    server {
        listen       8080;		# 监听端口为8080
        server_name  localhost;	# 监听IP地址或域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

		#3-1-1-1-1)location块===》动态资源请求
        location / {
            root   html;
            index  index.html index.htm;
        }
        
		#3-1-1-1-2)location块===》静态态资源请求
	 	location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ { 
	 		# 此示例静态资源从本地获取;
	 		# 静态资源也可以通过反向代理到静态资源服务器获取;
            Root / data /; 
            Expires 3D; # cache for 3 days 
        } 
		
		# 定义错误提示页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

3)location块的探讨

location匹配语法规则:location [^~|=|~|~*|!~|!~*|@] pattern {……}
其中,pattern根据前面的修饰符来决定是url,还是正则表达式……

3-1)location的语法说明表

修饰符说明示例
匹配url的开始location /abc {……}
^~类似无修饰符,但优先级更高location ^~ /abc {……}
=精准匹配urllocation = /abc {……}
~区分大小写正则匹配location ~ ^/abc$ {……}
~*不区分大小写正则匹配location ~* ^/abc$ {……}
!~区分大小写正则不匹配location ~ ^/abc$ {……}
!~*不区分大小写正则不匹配location ~* ^/abc$ {……}
@定义命名location,用于内部重定向location @abc {……}

特别说一下@修饰符的用法,Nginx内部重定向,如下所示:

#内部重定向 @bbb
	location /aaa {
    	try_files index.html @bbb;
	}

#定义一个@bbb
	location @bbb {
		bbb.html
    }

知识加油站:try_files是nginx中http_core核心模块所带的指令,主要是能替代一些rewrite的指令,提高解析效率。
官网:http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

3-2)location中的查找的顺序及优先级

当有多条location指令时,Nginx有一套优先级规则,大致概括如下所示:

先精确,再条件前缀,三而正则,
四无条件,同级谁前听谁的
优先级规则示例
精确匹配location = /abc {……}
^~(有条件)的前缀匹配location ^~ /abc {……}
正则匹配location ~ ^/abc$ {……}
没有修饰符(无条件)的前缀匹配location /abc {……}

同级谁前听谁的,如下所示,访问/a123,会返回a12.html哦!

	# 第一个
	location ~ ^/a12 {
		a12.html;
	}
	
	# 第二个
	location ~ ^/a1 {
		a1.html;
	}

3-3)root和alias的区别

root与alias主要区别在于Nginx如何解释location后面的URL,以不同方式将请求映射到服务器文件上,具体如下所示:

指令rootalias
语法root pathalias path
默认值root html- -
配置块http,server,locationlocation
说明设定请求 URL 的本地文件根目录将匹配的访问路径重新指定为新定义的文件路径
结果root路径+location路径alias路径代替location路径
	# 如果请求:/abc/a.html,
	# 那么web服务器将会返回服务器上的/www/root/html/abc/a.html的文件
	location ^~ /abc/ {
		root /www/root/html/;
	}
	
	# 如果请求:/abc/a.html,
	# 那么web服务器将会返回服务器上的/www/root/html/a.html的文件
	location ^~ /abc/ {
		alias /www/root/html/;
	}

知识加油站:特别值得指出的是,alias后面必须要用/结束,否则找不到文件
参考文章:
Nginx root指令:根目录配置
Nginx alias指令:虚拟目录配置


参考文章:
1、Nginx Module ngx_http_core_module
2、Nginx中文文档
3、Common configuration of nginx (reverse proxy, load balancing, dynamic static separation, high availability cluster)


版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/117072364

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Commas.KM

码路共同进步,感恩一路有您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值