C写的轻量级服务器
1. 应用场景
1.反向代理 客户端发送请求达到Nginx服务器,Nginx转发到真实服务器访问,从而保证真实服务安全性;
2.负载均衡 能够对集群的节点实现负载均衡和故障转移,负载均衡算法:(轮询、权重、随机、hash等);
3.微服务网关入口 ,可以对微服务网关实现集群;
4.静态服务器 比Tomcat性能高很多,可以存放静态资源;-----推荐以后将静态资源存放到CDN;
5.保护网站 使用nginx+lua 实现对请求实现服务限流;
2. 安装方式
1.windows 安装nginx
2.linux 安装nginx(纯原生方式非常麻烦)提前下载很多依赖 10分钟---不推荐
3.使用docker安装nginx 1分钟
4.使用宝塔可视化界面安装nginx 5s
一共四种方法,在Windows上下载解压好后,运行nginx.exe文件启动服务器
3. Nginx部署静态资源
Nginx相关配置
1.在C:\Windows\System32\drivers\etc host文件中配置
127.0.0.1 member.lzx.com
127.0.0.1 order.lzx.com
2.Nginx中的server_name指令主要用于配置基于名称的虚拟主机,server_name指令在接到请求后的匹配顺序
例如:访问member.lzx.com 会从html/member 目录中查找静态资源
server {
listen 80;
server_name member.lzx.com;
location / {
root html/member;
index index.html index.htm;
}
}
server {
listen 80;
server_name order.lzx.com;
location / {
root html/order;
index index.html index.htm;
}
}
4. 基于Nginx正向代理/反向代理
正向代理:VPN,在客户端和服务器中间加一个Nginx然后通过Nginx将客户端的请求转发到服务器。正向代理隐藏用户的真实行为。
反向代理:客户端请求达到Nginx代理服务器 在通过代理服务器转发到真实服务器 隐藏服务器端真实的IP信息。在同一个域下。
5. 负载均衡策略
1. 轮询策略(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2. 指定权重:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3. IP绑定 ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
4. fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5. url_hash(第三方):
轮询配置:
###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮询机制
upstream backServer{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name upstream.mayikt.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
index index.html index.htm;
}
}
6. Nginx Location指令详解
通过指定模式来与客户端请求的URI相匹配,基本语法如下:
location [=|~|~*|^~|@] pattern{……}
1、没有修饰符 表示:必须以指定模式开始,如:
server {
server_name www.mayikt.com;
location /member {
proxy_pass http://127.0.0.1:8080/;
index index.html index.htm;
}
}
访问http://member.mayikt.com/member 反向代理:http://127.0.0.1:8080/
那么,如下是对的:
http://member.mayikt.com/member
http://member.mayikt.com/member?p1
http://member.mayikt.com/member/
http://member.mayikt.com/Member
注意 proxy_pass http://127.0.0.1:8080/; 后面需要加上 / 反向代理到http://127.0.0.1:8080 不需要
加上location匹配的值。
2、=表示:必须与指定的模式精确匹配
server {
server_name www.mayikt.com;
location = /member {
proxy_pass http://127.0.0.1:8080/;
index index.html index.htm;
}
}
访问http://www.mayikt.com/member 反向代理:http://127.0.0.1:8080
那么,如下是对的:
http://www.mayikt.com/member
http://www.mayikt.com/member?p1
如下是错误:
http://www.mayikt.com/member/
http://www.mayikt.com/memberabc
3、~ 表示:指定的正则表达式要区分大小写
server {
server_name www.mayikt.com;
location ~ ^/member$ {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
访问http://www.mayikt.com/member 反向代理:http://127.0.0.1:8080
那么,如下是对的:
http://www.mayikt.com/member
http://www.mayikt.com/member?p1
如下是错误:
http://www.mayikt.com/Member/
http://www.mayikt.com/memberabc
4.~* 表示:指定的正则表达式不区分大小写
server {
server_name www.mayikt.com;
location ~* ^/member$ {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
访问http://www.mayikt.com/member 反向代理:http://127.0.0.1:8080
那么,如下是对的:
http://www.mayikt.com/member
http://www.mayikt.com/member?p1
http://www.mayikt.com/Member
如下是错误:
http://www.mayikt.com/member/
http://www.mayikt.com/memberabc
1:带有“=“的精确匹配优先
2:没有修饰符的精确匹配
3:正则表达式按照他们在配置文件中定义的顺序
4:带有“^~”修饰符的,开头匹配
5:带有“~” 或“~*” 修饰符的,如果正则表达式与URI匹配
6:没有修饰符的,如果指定字符串与URI开头匹配
7. 基于Nginx解决跨域问题
1.项目响应头设置允许跨域权限 response.setHeader("Access-Control-Allow-Origin", "*"); 适合于小公司
2.使用jsonp解决网站跨域问题 缺点:只能支持Get请求 模拟脚本提交。
3.使用Nginx搭建API网关保持域名和端口一致 Location
4.使用微服务中的网关
5.HttpClient实现转发 缺点:重复发送两次请求
解决跨域问题核心思想:
页面访问的地址与ajax请求 域名、端口 协议 需要一致。
在响应头中 响应 允许浏览器端跨域
resp.setHeader("Access-Control-Allow-Origin", "*");
java项目 aop 拦截器 过滤器 、网关、nginx中