日期: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.exe | Nginx主程序 |
4)Nginx测试
定位到当前路径,打开cmd
查看Nginx当前版本
尝试启动nginx,如下图所示,无法正常运行的错误原因: Nginx的默认配置是80端口,而我这台电脑的80端口已经被占用,导致nginx无法启动。
将默认的80端口,改为8080端口
再次运行Nginx,浏览器中输入网址http://localhost:8080/
,访问成功^ - ^
Welcome to nginx!
5)Nginx命令
使用帮助来查询命令信息,如下所示:
常用命令小结
作用 | 命令 |
---|---|
启动Nginx | nginx |
退出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
中的s
是signal
(信号)的缩写;
四、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 {……} |
= | 精准匹配url | location = /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,以不同方式将请求映射到服务器文件上,具体如下所示:
指令 | root | alias |
---|---|---|
语法 | root path | alias path |
默认值 | root html | - - |
配置块 | http ,server ,location | location |
说明 | 设定请求 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