前言
最初了解nginx是为了解决前后端分离导致访问后台报跨域错误问题,简单的学会了怎么配置,怎么启动。
后面有出现了新的需求,请求的接口,被部署到了不同的服务器上,那么就需要配置多个代理解决。
然而对于正向代理、反向代理、负载均衡是什么都很模糊,于是决定系统的整理下。接下来,上图!
nginx介绍及实战代码
1. 正向代理
解决的问题:
你想访问国外网站,访问不了,怎么办?在国内可访问到外网的服务上部署个nginx,你访问nginx,让nginx帮你访问国外站点。
正向代理在开发中比较少被用到,想深入了解见
《nginx做代理上网》www.nginx.cn/482.html
2. 反向代理
经典案例:前言中提到的两种,跨域,客户端/浏览器访问不同服务上接口。
1)解决跨域
其实配置内容很简单,关注以下几个点即可。
listen监听本地哪个端口的请求;location /下root配置好打包后前端代码的存放路径;locationparoxy_pass告诉nginx转发到的地址。
2)根据代理到匹配多个服务器
实例1中只转发了api开头的请求,如果需要配置多个,写多个即可,如下同时转发/datasource /auth开头的请求。
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/host.access.log main;
error_log /var/log/nginx/error.log error;
location / {
root /usr/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://134.100.100.1:8080/;
}
location /datasource/ {
proxy_pass http://134.100.100.2:8080/;
}
location /auth/ {
proxy_pass http://134.100.100.3:8081/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
3. 负载均衡
比如双十一大促,某宝某一时间段内访问量大增,怎么避免服务器承受不了压力出现网络繁忙呢,可以多准备几台服务器,将压力分摊到多个服务器上。
nginx实现负载均衡的策略有以下几种:
1)轮询(默认)
按照请求时间顺序,轮流代理到不同后端服务器上,如果某个后台服务挂了,就自动剔除。
worker_processes 1; #工作进程数,默认1,可以调大为CPU核心数
events {
worker_connections 1024;#单个工作进程可以允许同时建立外部连接的数量
}
http {
upstream dalaoyang-server {
server localhost:10001;
server localhost:10002;
}
server {
listen 10000;
server_name localhost;
#nginx接受到端口10000的所有请求并将其传递给上游upstream 。
#upstream名称和proxy_pass需要匹配!!!
location / {
proxy_pass http://dalaoyang-server;
proxy_redirect default;
}
}
}
2)weight权重
在轮询的基础上添加了权重,权重越高,分配概率越大。据上面案例仅修改http中upstream模块。
upstream dalaoyang-server {
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}
3)ip_hash
根据请求的ip的hash结果分配,相当于ip相同,就会访问同一个后端服务器,有效的解决了session问题。
据上面案例仅在http中upstream中添加ip_hash。
upstream dalaoyang-server {
ip_hash;
server localhost:10001;
server localhost:10002;
}
4)fair(需要安装upstream-fair第三方模块)
根据后端服务器响应速度效率来分配请求,响应快的优先分配,能者多劳。使用这种调度算法,必须下载Nginx的upstr_fair模块。
据上面案例仅在http中upstream中添加fair。
upstream dalaoyang-server {
server localhost:10001;
server localhost:10002;
fair;
}
4. 动静分离
我们正常部署项目,前端打包的代码放到和nginx同一台服务器上,访问静态资源(html,js,img...)就不需要去远程服务器上找,直接返回就可以了,加快了请求效率,节省了资源。
简单的实现拦截静态资源
location ~ .*.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
root /Users/html/static;
}
5. 高可用
没有人能够保证服务器不会出现意外宕机的状况,若要减小这种风险怎么办呢?就可以备用几台服务器,如A,B两台虚拟机都装好了nginx并启动,如果A意外宕机,B立即启用,这样就大大降低了服务器不可访问发生的概率。
高可用的实现需要Keepalived的加持,keepalived除了可以实现nginx的高可用,还有很多功能。
我没有用到过该场景,就不细说了,等用过再加续集。
不得不说,nginx,牛!!!