用户在前端页面点击请求, 到nginx(根据upstream配置的后端服务器 ip:端口 和 location匹配规则 负载到后端)。
nginx.conf 配置文件
#指定用户,避免权限问题
user root;
#工作线程程数 核心数的2倍
worker_processes 1;
#日志记录
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
#这一块 负载均衡 需要我们自己添加,可以写多个后端服务 server localhost:8080;
upstream ruoyi_admin_server_group {
#ip_hash;
server localhost:8080;
}
server {
#server模块, 监听的端口 localhost:80 访问
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#所有的请求都会进入location中,支持正则表达式
location / {
root /sino/dist;
index index.html index.htm;
}
location /prod-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#server_group 's name appeal twice,http://ruoyi_admin_server_group/ 拼接以后就是http://localhost:8080/
#转发后端站点地址,一般用于做软负载,轮询后端服务器
#如果后端只有一个 不需要upstream ruoyi_admin_server_group, 只此 proxy_pass http://localhost:8080/; 即可
proxy_pass http://ruoyi_admin_server_group/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
http://192.168.188.131/prod-api/system/user/list?pageNum=1&pageSize=10
/prod-api 的接口都会转发到后端 localhost:8080/system/user/list?pageNum=1&pageSize=10
负载均衡效果:
1)ip_hash:依据ip分配方式,指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端请求一致发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。
upstream ruoyi_admin_server_group {
#ip_hash;
server localhost:8080;
}
upstream [服务器组名称]{
ip_hash;
server [IP地址]:[端口号];
server [IP地址]:[端口号];
}
2)轮询:最基本的配置方法,是upstream模块默认的负载均衡策略。每个请求会按时间顺序平均分配到不同的后端服务器。
upstream [服务器组名称]{
server [IP地址]:[端口号];
server [IP地址]:[端口号];
}
3)weight:权重方式,在轮询策略的基础上指定轮询的几率。也可以认为是在轮询的基础上新增了一个weight的参数,此参数指定轮询的几率,值为number。
upstream [服务器组名称]{
server [IP地址]:[端口号] weight=2;
server [IP地址]:[端口号] weight=8;
}
location /api/v1 location /api/v2 以/api/v1开头的请求 或 以/api/v2开头的请求 都会转发到后台 即前端到后端的跳转url被nginx拦截再转发。
实现前后端分离,可以让前后端独立开发、独立部署、独立单测,双方通过JSON进行数据交互。
对于前端开发人员来说,不用每次调试都需要启动或配置Java/Tomcat运行环境;
对于后端开发人员来说 ,也不用在需要往JSP页面注入数据。
通过nginx来部署前端代码,可以帮助前端实现以下基本需求:
1、请求转发,解决请求跨域的问题 使用nginx做代理来实现跨域和负债均衡
如果有网关, 只需要配有个 location /api/v1 即请求接口先到网关, 然后有网关调用微服务。 如果没有网关,配置多个。
server {
listen 7777;
location /{
root /Users/xiaoyun/git/someproject/dist;
}
location /api/v1{
proxy_set_header Host api.yourhost.com;
proxy_pass http://api.yourhost.com/api/v1/;
}
location /api/v2{
proxy_pass http://api.yourhost.com/new;
}
}
以上是一段nginx配置参考:
listen nginx服务端口号
location / 设置默认根目录所访问的本地代码路径,这里还可以设置默认主页index
proxy_pass 请求转发,可以配置多个,从上至下进行匹配
以第一个配置为例,即所有本地以/api/v1开头的请求都会转发至对应线上服务器,例如: http://localhost:7777/api/v1/getConfig 则会自动转发到:http://api.yourhost.com/api/v1/getConfig
另外,还需要注意的是,proxy_pass配置的路径如果是以/结尾,如上面的配置v1,那么此时路径为相对路径,否则为绝对路径
例如 v2的转发配置:如果请求 http://localhost:7777/api/v2/user/list 则会转发自 http://api.yourhost.com/new/user/list ,不会带有原路径的 /api/v2
2、gzip请求压缩
网站开启gzip压缩,不仅能够节省带宽,也能够快速响应用户的访问
http{
gzip on;
gzip_proxied any;
gzip_min_length 1024;
gzip_buffers 4 8k;
gzip_comp_level 3;
gzip_types text/plain text/css application/x-javascript application/javascript application/xml application/json;
}