Nginx 笔记
关键词:反向代理、负载均衡、动静分离、高可用
相关概念
反向代理
正向代理
nginx 可以进行正向代理。
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。类似 VPN。
反向代理
客户端对代理是无感知的,因为客户端不需要任何配置就可以访问。
客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据,再返回给客户端。这种情况只对外暴露代理服务器的地址,隐藏了真实服务器的 IP 地址。
正向代理与反向代理区别
口诀:正向隐藏客户端,反向隐藏服务端
实际上并没有本质的区别,只不过正向代理是需要客户端设置,反向代理需要服务端设置。
负载均衡
增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。(提高并发数量)
利用了反向代理:向反向代理服务器发送请求,由反向代理服务器分发请求给服务端。
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。
安装(略)
常用命令
使用 nginx 操作命令前提条件:
- 先进入到 nginx 的目录(在 Linux 中为
/usr/local/nginx/sbin
) - 如果不想做第一步,需要将上面的目录加入到环境变量
查看版本号
nginx -v
启动
nginx
停止 nginx(通常使用 systemctl,而不是使用 nginx 的命令)
nginx -s stop
重新加载 nginx
nginx -s reload
nginx 的配置文件
usr/local/nginx/conf/nginx.conf
其组成主要分为三部分:
- 全局块
- events 块
- http 块
配置概述如下:
全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令。
events 块
涉及的指令主要影响 nginx 服务器与用户的连接。
http 块
是 nginx 服务器配置中最频繁的部分,http 块又包含 http 全局块、server 块。
http 全局块
包括文件引入、MINE-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
server 块
与虚拟主机有密切关系。
虚拟主机:虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
server 全局块
最常见的配置是本虚拟机的监听配置和本虚拟机主机的名称或 IP 配置。
location 块
一个 server 块可以配置多个 location 块。
location 块的主要作用是基于 nginx 服务器接收到的请求字符串(例如 server_name/uri-string
)对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如前面的 /uri-string
)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
配置实例一:反向代理(一)
实现效果
打开浏览器,访问 nginx 代理的 80 端口,效果等同于访问到 Linux 系统 tomcat 开放的 8080 端口的主页面
准备工作
-
Linux 系统以默认端口 8080 启动 tomcat
-
防火墙开放 80、8080 端口,重启防火墙(实际上通过反向代理之后,直接通过 80 端口就可以达到访问 8080 端口的目的,不需要直接开启 8080 端口,可以起到隐藏的作用)
firewall-cmd --add-port=8080/tcp --permanent firewall-cmd --reload firewall-cmd --list-all
-
尝试直接访问 tomcat:如 Linux 的 IP 为
192.168.17.29
,直接访问 http://192.168.17.29:8080,检查是否可以访问到
访问过程分析
本地浏览器访问 Linux 中 nginx 开放的 80 端口,由 nginx 将请求转发到 8080 端口,之后获取到响应后再返回给本地浏览器。
修改配置
usr/local/nginx/conf/nginx.conf
-
在 server 全局块中,将 server_name 改成 Linux 的 IP
-
在 location 块中添加转发的路径
proxy_pass http://127.0.0.1:8080;
测试结果
启动 nginx 后直接访问 192.168.17.129
(直接访问默认 80 端口)
配置实例二:反向代理(二)
实现效果
使用 nginx 反向代理,根据访问的路径跳转到不同的端口的服务中。
nginx 监听端口为 9001
访问 http://192.168.17.129:9001/edu,实现访问 http://192.168.17.129:8080 的效果
访问 http://192.168.17.129:9001/vod,实现访问 http://192.168.17.129:8081 的效果
准备工作
准备两个 tomcat 服务器(添加点区别,方便辨识),并分别配置为 8080、8081 端口并启动
修改配置
usr/local/nginx/conf/nginx.conf
-
再添加一个 server 块
-
在 server 全局块中,监听端口设置为 9001,并将 server_name 设置为 Linux 的 IP
server { listen 9001; server_name 192.167.17.129; }
-
在 server 块中添加两个 location 块,配置转发的路径
location ~ /edu/ { proxy_pass http://127.0.0.1:8080; } location ~ /vod/ { proxy_pass http://127.0.0.1:8081; }
~ /vod/
:~
表示使用正则表达式
测试结果
分别访问两个看到区别
location 指令说明
该指令用于匹配 URL。
语法如下:
location [ = | ~ | ~* | ^~ ] uri {
}
=
:用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。~
:用于表示 uri 包括正则表达式,并且区分大小写。~*
:用于表示 uri 包括正则表达式,并且不区分大小写。^~
:用于不含正则表达式的 uri 前,要求 nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
配置实例三:负载均衡
实现效果
通过浏览器的地址栏输入 http://192.168.17.129/edu/a.html,实现负载均衡效果,平均分配到 8080 和 8081 端口中。
准备工作
同实例二。
修改配置
usr/local/nginx/conf/nginx.conf
-
在 http 全局块中添加
upstream myserver { # ip_hash; # 作用是同一IP前后两次分配同一个服务器,我们这里演示暂时不需要,下面介绍几种其他方式 server 192.168.17.129:8080; server 192.168.17.129:8081; }
-
添加 server 块,配置 server 全局块。
-
在 location 块中添加
proxy_pass http://myserver; # proxy_connect_timeout 10;
测试结果
访问同一个地址会访问到不同结果
分配方式
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,能自动剔除。
weight
weight 代表权重,默认为 1,权重越高被分配的客户端越多。
upstream server_pool {
server 192.168.17.129:8080 weight=5;
server 192.168.17.129:8081 weight=10;
}
ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问同一个后端服务器,可以解决 session 的问题。
upstream server_pool { ip_hash; server 192.168.17.129:8080; server 192.168.17.129:8081;}
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server_pool { server 192.168.17.129:8080; server 192.168.17.129:8081; fair;}
配置实例四:动静分离
动态分离:将动态请求和静态请求分开。
常用的两种实现:
- 纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案。
- 动态和静态文件混合在一起发布,通过 nginx 来分开。
目的:提高效率,使请求更高效。
准备工作
在 Linux 系统中准备静态资源,用于进行访问。
修改配置
usr/local/nginx/conf/nginx.conf
location /www/ { root /data/; index index.html index.htm;}location /image/ { root /data/; autoindex on;}
测试结果
可以通过浏览器直接访问到静态资源,不需要经过 tomcat 服务器
配置实例五:高可用
解决 nginx 可能宕机的问题
启用两台 nginx 服务器,主服务器 MASTER、备份服务器 BACKUP。
准备工作
准备两台服务器,并安装 nginx、keepalived(作用是路由,对外提供一个虚拟 ip)