Nginx快速入门
1. DNS域名解析
- 先从本地host文件中使用域名获取对应的ip地址;
- 如果本地host文件中没有的话,就去运营商获取ip地址;
- host文件位置:
windows:C:\Windows\System32\drivers\etc
linux:/etc/hosts
2. Nginx概述
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。
3. Nginx实际应用场景
- 反向代理,客户端发送请求达到Nginx服务器,Nginx转发到真实服务器访问,从而保证真实服务安全性;
- 负载均衡,能够对集群的节点实现负载均衡和故障转移,负载均衡算法:(轮询、权重、随机、hash等);
- 微服务网关入口 ,可以对微服务网关实现集群;
- 静态服务器 比Tomcat性能高很多,可以存放静态资源;
推荐以后将静态资源存放到CDN。 - 保护网站, 使用nginx+lua 实现对请求实现服务限流;
4. Nginx环境安装
4.1 Windows环境安装
- nginx 下载地址:
http://nginx.org/en/download.html - 解压当前目录
- 双击nginx.exe
- Nginx默认端口号为80
- 文件介绍
1)conf 配置文件 (nginx核心配置文件 nginx.conf)
2)contrib 存放一些实用工具
3)docs 存放文档
4)html 存放Html 存放静态资源
6)logs 存放日志文件
7)temp 临时文件
4.2 Linux环境安装
- linux 安装nginx(纯原生方式非常麻烦)提前下载很多依赖 10分钟—不推荐
- 使用docker安装nginx 1分钟
- 使用宝塔可视化界面安装nginx 5s
4.3 Windows环境下Nginx命令
- 启动
1)执行命令:
start nginx
或
nginx.exe
2)双击nginx.exe
- 停止
nginx.exe -s stop
或
nginx.exe -s quit
注:stop是快速停止nginx,可能并不保存相关信息;quit是完整有序的停止nginx,并保存相关信息
- 重新载入Nginx
nginx.exe -s reload
- 重新打开日志文件
nginx.exe -s reopen
- 查看Nginx版本
nginx -v
5. 基于Nginx相关配置
5.1 基于Nginx存放Html静态资源
Nginx中的server_name指令主要用于配置基于名称的虚拟主机,server_name指令在接到请求后的匹配顺序
例如:访问member.mc.com 会从html/member目录中查找静态资源
server {
listen 80;
server_name member.mc.com;
location / {
root html/member;
index index.html index.htm;
}
}
例如:访问order.mc.com 会从html/order 目录中查找静态资源
server {
listen 80;
server_name order.mc.com;
location / {
root html/order;
index index.html index.htm;
}
}
5.2 基于Nginx反向代理/正向代理
5.2.1 反向代理
客户端请求达到Nginx代理服务器 在通过代理服务器转发到真实服务器 隐藏服务器端真实的IP信息。
- host文件新增:
127.0.0.1 www.mc.com
- nginx相关配置:
server {
listen 80;
server_name www.mc.com;
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
5.2.2 正向代理
正向代理,是在用户端的,比如需要访问某些国外网站,例如 github 在相关部门的允许情况下,我们可以使用vpn。
并且vpn是在我们的用户浏览器端设置的(并不是在远端的服务器设置)。
浏览器先访问vpn地址,vpn地址转发请求,并最后将请求结果原路返回来。
正向代理与反向代理区别:正向代理隐藏用户的真实行为,反向代理隐藏真实服务器。
6. Nginx负载均衡
6.1 Nginx负载均衡状态
状态 | 概述 |
---|---|
down | 当前的server暂时不参与负载均衡 |
backup | 预留的备份服务器 |
max_fails | 允许请求失败的次数 |
fail_timeout | 经过max_fails次失败后,服务暂停的时间 |
max_conns | 限制最大的接收连接数 |
6.1.1 down状态
down:将该服务器标记为永久不可用,那么该代理服务器将不参与负载均衡。
# 设置服务器组
upstream backend {
server localhost:9001 down;
server localhost:9002;
server localhost:9003;
}
server {
listen 8080;
server_name localhost;
location / {
# backend 就是服务器组的名称
proxy_pass http://backend/;
}
}
该状态一般会对需要停机维护的服务器进行设置。
6.1.2 backup状态
backup:将该服务器标记为备份服务器,当主服务器不可用时,将用来传递请求。
# 设置服务器组
upstream backend {
server localhost:9001 down;
# 9002 作为 9003 的备份服务器
server localhost:9002 backup;
server localhost:9003;
}
server {
listen 8080;
server_name localhost;
location / {
# backend 就是服务器组的名称
proxy_pass http://backend/;
}
}
6.1.3 max_fails状态
max_fails=numer:设置允许请求代理服务器失败的次数,默认为1。
6.1.4 fail_timeout状态
fail_timeout=time:设置经过max_fail次失败后,服务暂停的时间,默认是10秒。
# 设置服务器组
upstream backend {
server localhost:9001 down;
# 9002 作为 9003 的备份服务器
server localhost:9002 backup;
server localhost:9003 max_fails=3 fail_timeout=20;
}
server {
listen 8080;
server_name localhost;
location / {
# backend 就是服务器组的名称
proxy_pass http://backend/;
}
}
6.1.5 状态max_conns
max_conns=number:用来设置代理服务器同时活动链接的最大数量,默认为0,表示不限制,使用该配置可以根据后端服务器处理请求的并发量来进行设置,防止后端服务器被压垮。
6.2 基于Nginx负载均衡策略
- 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 - 指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 - IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 - fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。 - url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
Nginx负载均衡提供上游服务器(真实业务逻辑访问的服务器),负载均衡、故障转移、失败重试、容错、健康检查等。
当上游服务器(真实业务逻辑访问的服务器)发生故障时,可以转移到其他上游服务器(真实业务逻辑访问的服务器)。
6.2.1 轮询配置
轮询是upstream模块负载均衡默认的策略,每个请求会按时间顺序逐个被分配到不同的后端服务器。轮询不需要额外的配置。
###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮训机制
upstream backServer{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name upstream.mc.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
index index.html index.htm;
}
}
6.2.2 权重配置
weight=number:用来设置服务器的权重,默认为1,权重数字越大,被分配到请求的几率越大。该权重值主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的,所有此策略比较适合服务器的硬件配置差别比较大的情况。
###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮训机制
upstream backServer{
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:8081 weight=1;
}
server {
listen 80;
server_name upstream.mc.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
index index.html index.htm;
}
}
6.2.3 ip_hash配置
当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。这样,当来自某一个IP的用户在后端Web服务器A上登录后,再访问该站点的其他URL,能保证其访问的还是后端web服务器A。
# 设置服务器组
upstream backend {
ip_hash;
server localhost:9001;
server localhost:9002;
server localhost:9003;
}
server {
listen 8080;
server_name localhost;
location / {
# backend 就是服务器组的名称
proxy_pass http://backend/;
}
}
注意:使用ip_hash指令无法保证后端服务器的负载均衡,可能导致有些后端服务器接收到的请求多,有些后端服务器接受的请求少,而且设置后端服务器权重等方法将不起作用。
6.2.4 least_conn配置
least_conn:最少连接,把请求转发给连接数较少的后端服务器。轮询算法是把请求平均地转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。
# 设置服务器组
upstream backend {
least_conn;
server localhost:9001;
server localhost:9002;
server localhost:9003;
}
server {
listen 8080;
server_name localhost;
location / {
# backend 就是服务器组的名称
proxy_pass http://backend/;
}
}
此负载均衡适合请求处理时间长短不一造成服务器过载的情况。
6.2.5 url_hash配置
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以从缓存中读取。
# 设置服务器组
upstream backend {
hash $request_uri;
server localhost:9001;
server localhost:9002;
server localhost:9003;
}
server {
listen 8080;
server_name localhost;
location / {
# backend 就是服务器组的名称
proxy_pass http://backend/;
}
}
6.2.6 fair配置
fair采用的不是内建负载均衡使用的均衡算法,而是可以根据页面大小、加载时间长短智能地进行负载均衡。那么如何使用第三方模块的fair负载均衡策略?
# 设置服务器组
upstream backend {
fair;
server localhost:9001;
server localhost:9002;
server localhost:9003;
}
server {
listen 8080;
server_name localhost;
location / {
# backend 就是服务器组的名称
proxy_pass http://backend/;
}
}
此方式需要添加nginx-upstream-fair模块。
6.3 故障转移
当转发地址发生了宕机,无法访问 nginx,会默认自动故障转移切换到下一个地址。
集群,保证服务器端高可用 ,故障转移,立马切换到下一台。
6.4 Nginx负载均衡案例
6.4.1 对所有请求实现一般轮询规则的负载均衡
# 代理服务器
# 设置服务器组
upstream backend {
server localhost:9001;
server localhost:9002;
server localhost:9003;
}
server {
listen 8080;
server_name localhost;
location / {
# backend 就是服务器组的名称
proxy_pass http://backend/;
}
}
6.4.2 对所有请求实现加权轮询规则的负载均衡
# 代理服务器
# 设置服务器组
upstream backend {
server localhost:9001 weight=2;
server localhost:9002 weight=4;
server localhost:9003 weight=3;
}
server {
listen 8080;
server_name localhost;
location / {
# backend 就是服务器组的名称
proxy_pass http://backend/;
}
}
6.4.3 对特定资源实现负载均衡
# 代理服务器
# 设置服务器组
upstream memberbackend {
server localhost:9001;
server localhost:9002;
}
upstream orderbackend{
server localhost:9003;
server localhost:9004;
}
server {
listen 8080;
server_name localhost;
location /member/ {
proxy_pass http://memberbackend ;
}
location /order/ {
proxy_pass http://orderbackend;
}
}
6.4.4 对不同域名实现负载均衡
# 代理服务器
# 设置服务器组
upstream aaabackend {
server 192.168.200.146:9001;
server 192.168.200.146:9002;
}
upstream bbbbackend {
server 192.168.200.146:9003;
server 192.168.200.146:9004;
}
server {
listen 8080;
server_name www.aaa.com;
location / {
proxy_pass http://aaabackend;
}
}
server {
listen 8081;
server_name www.bbb.com;
location / {
proxy_pass http://bbbbackend;
}
}
6.4.5 对带有URL重写的负载均衡
# 代理服务器
# 设置服务器组
upstream backend {
server 192.168.200.146:9001;
server 192.168.200.146:9002;
}
server {
listen 8080;
server_name localhost;
# URL重写
location /file/ {
rewrite ^(/file/.*) /server/$1 last;
}
location /server {
proxy_pass http:backend;
}
}