1.什么是Nginx
介绍
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
特点
更快:单次请求响应更快,高并发可以更快的处理响应
高拓展性:设计极具扩展性,由多个不同功能、不同层次、不同类型且耦合度极低的模块组成
高可靠性:很多高流量网站都在核心服务器上大规模使用 Nginx
低内存消耗:一般1万个非活跃的 HTTP Keep-Alive 连接在 Nginx 中仅消耗2.5MB内存
高并发:单机支持10万以上的并发连接
热部署:master 管理进程与 worker工作进程的分离设计,使得 Nginx 能够支持热部署
开源协议:使用 BSD 许可协议,免费使用,且可修改源码
2.应用场景
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。动静分离的意思就是区分用户的访问类型,第一种是动态访问是需要调用后台数据的访问;第二种是静态的访问只需静态资源的访问(如:css、html、jpg、js等等文件)。那么Nginx动静分离就是区分用户的访问类型,然后分配访问不同的服务器,提高资源响应的速度。
反向代理
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问。我们只 需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返 回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器 地址,隐藏了真实服务器 IP 地址。
负载均衡
Nginx 把请求均匀的分摊给上游的应用服务器,这样即使某一个服务器宕机也不会影响请求的处理,或者当应用服务器扛不住了,可以随时进行扩容。 目前Nginx支持自带3种负载均衡策略(1.轮询 2. 权重 3. ip_hash ),还有2种常用的第三方策略(4. fair 5. url_hash)不过需要安装第三方模块才能使用 。
3.使用方式
动静分离
以在Nginx上部署Vue项目为例,将Vue项目打包后放在Nginx的html目录下,修改Nginx配置文件,访问进行测试
server {
# 设置监听的端口号以及服务名称
listen 7001;
server_name "oneSystem";
#禁止访问某些后缀文件
location ~ \.(ini|conf|txt|svn|git)
{
deny all;
}
# 配置根路径访问的前端项目
location / {
#设置根目录
root html/cms-system/;
#设置默认页
index index.html index.htm;
#解决页面刷新导致空白
try_files $uri $uri/ /cms-system/index.html;
}
# 配置各路径访问的前端项目
location /cms-system {
alias html/cms-system/;
index index.html index.htm;
try_files $uri $uri/ /cms-system/index.html;
}
location /journal-system {
alias html/journal-system/;
index index.html index.htm;
try_files $uri $uri/ /journal-system/index.html;
}
location /liveWeb {
alias html/liveWeb/;
index index.html index.htm;
try_files $uri $uri/ /liveWeb/index.html;
}
location /okr {
alias html/okr/;
index index.html index.htm;
try_files $uri $uri/ /okr/index.html;
}
location /robot {
alias html/robot/;
index index.html index.htm;
try_files $uri $uri/ /robot/index.html;
}
#访问异常页面配置
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
反向代理
查看前端配置的接口请求路径,根据请求路径修改Nginx配置文件,反向代理到部署后端项目的正确路径
server {
# 设置监听的端口号以及服务名称
listen 7001;
server_name "oneSystem";
#禁止访问某些后缀文件
location ~ \.(ini|conf|txt|svn|git)
{
deny all;
}
# 配置根路径访问的前端项目
location / {
#设置根目录
root html/cms-system/;
#设置默认页
index index.html index.htm;
#解决页面刷新导致空白
try_files $uri $uri/ /cms-system/index.html;
}
# 配置各路径访问的前端项目
location /cms-system {
alias html/cms-system/;
index index.html index.htm;
try_files $uri $uri/ /cms-system/index.html;
}
# 配置接口代理
location /api_cms {
#关闭重定向
proxy_redirect off;
#反向代理到后端项目部署地址
proxy_pass http://127.0.0.1:9018/cms_system;
#解决因为反向代理导致路径不一致后cookie丢失
proxy_cookie_path /cms_system /;
#设定被代理服务器接收到的header信息,重定义发往后端服务器的请求头
proxy_set_header Host $host;
proxy_set_header Remote_Addr $remote_addr;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#访问异常页面配置
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
负载均衡
1.RR(轮询 默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
在配置文件的http模块中配置服务器地址列表
#配置后端服务器列表-轮询配置
upstream systemApi {
server 127.0.0.1:9018;
server 127.0.0.1:9019;
}
修改接口反向代理的路径
location /api_journal {
proxy_redirect off;
#修改代理地址,将原来的写死路径(127.0.0.1)替换为后端服务器列表变量
proxy_pass http://systemApi/cms_system;
proxy_cookie_path /cms_system /;
proxy_set_header Host $host;
proxy_set_header Remote_Addr $remote_addr;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
模拟配置了2台服务器,Nginx会自动判断服务器的状态,如果服务器处于不能访问(服务器挂了),就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况。
2.权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
#配置后端服务器列表-权重配置
upstream systemApi {
server 127.0.0.1:9018 weight=4;
server 127.0.0.1:9019 weight=1;
}
那么5次一般只会有1次会访问到9019,而有4次会访问到9018
3.ip_hash
上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用ip_hash了,ip_hash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
#配置后端服务器列表-ip_hash配置
upstream systemApi {
ip_hash;
server 127.0.0.1:9018;
server 127.0.0.1:9019;
}
4.fair(最快响应)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
#配置后端服务器列表-fair配置
upstream systemApi {
fair;
server 127.0.0.1:9018;
server 127.0.0.1:9019;
}
5.url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
#配置后端服务器列表-url_hash配置
upstream systemApi {
hash $request_uri;
hash_method crc32;
server 127.0.0.1:9018;
server 127.0.0.1:9019;
}
定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法