打算搭个自己的项目。前后端完全分离,前端文件都不放在后端的项目中,所以搭个Nginx进行请求的转发。也就是传说中的反向代理了。后面再折腾一下负载均衡功能,毕竟Nginx两大功能,不能不体验啊。
环境 window10 + springboot + Nginx-1.14.0。
常用命令:
1、启动:
C:\server\nginx-1.0.2>start nginx或
C:\server\nginx-1.0.2>nginx.exe
2、停止:
C:\server\nginx-1.0.2>nginx.exe -s stop或
C:\server\nginx-1.0.2>nginx.exe -s quit
注:stop是快速停止nginx,可能并不保存相关信息;quit是完整有序的停止nginx,并保存相关信息。
3、重新载入Nginx:
C:\server\nginx-1.0.2>nginx.exe -s reload
当配置信息修改,需要重新载入这些配置时使用此命令。
4、重新打开日志文件:
C:\server\nginx-1.0.2>nginx.exe -s reopen
5、查看Nginx版本:
C:\server\nginx-1.0.2>nginx -v
反向代理:
先起一个8889端口。暴露一个api接口:http://localhost:8889/hello
然后我们配置一下配置文件,隐藏一下真正的地址。
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
index index.html index.htm;
root D:\Devs\simple\src\main;
location /test/ {
proxy_pass http:// localhost:8889/;
}
}
}
然后访问localhost/test/hello的请求会被映射到http://localhost:8889/hello。由于80端口是默认端口,所以可以不写,其中server_name主要用来匹配url地址。其中proxy_pass属性可以有很多种配法。推荐一个nginx 之 proxy_pass详解。到目前为止,方向代理成功了。
负载均衡:
起4个服务,分别部署在8889端口-8892端口。然后写配置文件->
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream tomcatserver {
server localhost:8889 down; #不参加负载
server localhost:8890 weight=2; #权重为2
server localhost:8891 max_fails=3 fail_timeout=30s; #在30秒内最多失败3次
server localhost:8892 backup; #备用服务,负载最轻
}
server {
listen 80;
server_name localhost;
index index.html index.htm;
root D:\Devs\simple\src\main;
location /test/ {
proxy_pass http://tomcatserver/;
}
location /api/ {
proxy_pass http://localhost:8889/blog/;
}
location /hub/ {
proxy_pass http://127.0.0.1:9090/sso/;
}
}
}
至此负载均衡也简单的实现了。这时我们来关注一下Nginx的负载均衡策略,他有5种:
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
}
2、指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream backserver {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
3、IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
}
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
具体实现,请参见源码。实在是看不太懂。。