白话讲解nginx(附案例)

1,071 阅读4分钟

前言

最初了解nginx是为了解决前后端分离导致访问后台报跨域错误问题,简单的学会了怎么配置,怎么启动。 后面有出现了新的需求,请求的接口,被部署到了不同的服务器上,那么就需要配置多个代理解决。 然而对于正向代理、反向代理、负载均衡是什么都很模糊,于是决定系统的整理下。接下来,上图!

nginx介绍及实战代码

1.     正向代理

解决的问题: 你想访问国外网站,访问不了,怎么办?在国内可访问到外网的服务上部署个nginx,你访问nginx,让nginx帮你访问国外站点。 正向代理在开发中比较少被用到,想深入了解见 《nginx做代理上网》www.nginx.cn/482.html

image.png

2.     反向代理

经典案例:前言中提到的两种,跨域,客户端/浏览器访问不同服务上接口。

image.png

1)解决跨域

其实配置内容很简单,关注以下几个点即可。

  1. listen 监听本地哪个端口的请求;
  2. location /root配置好打包后前端代码的存放路径;
  3. location paroxy_pass告诉nginx转发到的地址。 image.png

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.     负载均衡

比如双十一大促,某宝某一时间段内访问量大增,怎么避免服务器承受不了压力出现网络繁忙呢,可以多准备几台服务器,将压力分摊到多个服务器上。

image.png 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权重

在轮询的基础上添加了权重,权重越高,分配概率越大。据上面案例仅修改httpupstream模块。

upstream  dalaoyang-server {
       server    localhost:10001 weight=1;
       server    localhost:10002 weight=2;
   }

3)ip_hash

根据请求的iphash结果分配,相当于ip相同,就会访问同一个后端服务器,有效的解决了session问题。 据上面案例仅在httpupstream中添加ip_hash

upstream  dalaoyang-server {
       ip_hash;
       server    localhost:10001;
       server    localhost:10002;
   }

4)fair(需要安装upstream-fair第三方模块)

根据后端服务器响应速度效率来分配请求,响应快的优先分配,能者多劳。使用这种调度算法,必须下载Nginxupstr_fair模块。 据上面案例仅在httpupstream中添加fair

upstream  dalaoyang-server {
       server    localhost:10001;
       server    localhost:10002;
       fair;
   }

4.     动静分离

我们正常部署项目,前端打包的代码放到和nginx同一台服务器上,访问静态资源(html,js,img...)就不需要去远程服务器上找,直接返回就可以了,加快了请求效率,节省了资源。

image.png 简单的实现拦截静态资源

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,牛!!!