Nginx的使用
一、Nginx基本的介绍
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx默认端口号为80
二、Nginx实际应用场景
2.1、Windows环境快速入门
- 下载winDows安装包
- 解压当前目录
- 双击nginx.exe
- Nginx默认端口号为80
2.2、Nginx目录结构介绍
Conf 配置文件 (nginx核心配置文件 nginx.conf)
Contrib 存放一些实用工具
Docs 存放文档
Html 存放Html
Logs 存放日志文件
Temp 临时文件
2.3、基于Nginx存放Html静态资源
server {
listen 80;
server_name localhost;
#访问端口为80 location为/ 访问的html文件目录,找到index.html页面访问
location / {
root html;
index index.html index.htm;
}
}
2.3.1、反向代理与正向代理区别
- 正向代理:
比如访问一些国外的网站,需要通过vpn才可以访问这时候就可以使用正向代理可以隐藏用户真实行为; - 反向代理:
客户端请求达到代理服务器 在通过代理服务器转发到真实服务器
正向代理与反向代理区别:
正向代理隐藏用户的真实行为、反向代理隐藏真实服务器
2.3.2、基于Nginx实现反向代理
C:\Windows\System32\drivers\etc host文件中新增
127.0.0.1 www.java521.com
注意:记得清理缓存
2.4、五种负载均衡策略
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3、IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
2.4.1、服务集群带来的问题
分布式Session
分布式日志
分布式任务调度
2.4.2、配置负载均衡策略
Nginx负载均衡提供上游服务器(真实业务逻辑访问的服务器),负载均衡、故障转移、失败重试、容错、健康检查等。当上游服务器(真实业务逻辑访问的服务器)发生故障时,可以转移到其他上游服务器(真实业务逻辑访问的服务器)。
2.4.3、Upstream Server配置
upstream 主要配置如下:
IP地址和端口号:配置上游服务器的IP地址和端口
###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮训机制
## 定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮训机制
upstream backServer{
#轮询
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name www.java521.com;
location / {
## 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
index index.html index.htm;
}
}
注意:负载均衡效果谷歌浏览器需要直接从浏览器中访问才可以生效
## 定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮训机制
upstream backServer{
#轮询
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name www.java521.com;
location / {
## 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
index index.html index.htm;
}
}
2.4.4、软负载与硬负载区别
软负载是基于服务器上安装的特定软件,比如Nginx实现负载均衡
硬负载均衡是基于固定的硬件实现负载均衡,比如F5
2.5、Linux环境Nginx安装
Linux环境Nginx安装:https://blog.csdn.net/qq_37242720/article/details/117988077
nginx.conf中root 、alias指令区别
alias是一个目录别名的定义,alias后面必须要用“/”结束,否则会找不到文件的
root则是最上层目录的定义。root后面"/"则可有可无
2.6、基于Nginx解决跨域问题
2.6.1、什么是网站跨域问题
页面中请求的ajax地址如果与页面请求地址域名和端口、协议不同的话,浏览器采用安全策略,请求能够正常到达服务器端,但是无法获取响应结果。
2.6.2、相关跨域错误信息
2.6.3、网站跨域问题解决方案
跨域问题解决方案
- B项目响应头设置允许跨域权限 response.setHeader(“Access-Control-Allow-Origin”, “*”); 适合于小公司
- 使用jsonp解决网站跨域问题 缺点:只能支持Get请求 模拟脚本提交。
- 使用Nginx搭建API网关保持域名和端口一致 Location
- 使用微服务中的Zuul网关
- HttpClient实现转发 缺点:重复发送两次请求
2.6.4、使用jsonp解决网站跨域问题
A项目ajax相关配置
<script type="text/javascript"
src="./js/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$.ajax({
type : "post",
async : false,
url : "http://127.0.0.1:8081/b/getBInfo?callback=",
dataType : "jsonp",
jsonp:"jsonpCallback",
jsonpCallback:"callback",
success : function(data) {
alert(data["retMsg"]);
},
error : function(msg) {
alert(msg.toString());
}
});
});
</script>
B项目服务端
@RequestMapping("/getBInfo")
public void getBInfo(HttpServletResponse response, String jsonpCallback)
throws IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
JSONObject result = new JSONObject();
result.put("retCode", "200");
result.put("retMsg", "登陆成功");
PrintWriter writer = response.getWriter();
writer.println(jsonpCallback + "(" + result.toJSONString() + ")");
writer.close();
}
使用Nginx搭建API网关保持域名和端口一致
location /b {
proxy_pass http://192.168.18.190:8081/;
index index.html index.htm;
}
location /a {
proxy_pass http://192.168.18.190:8080/;
index index.html index.htm;
}
A项目访问 http://127.0.0.1:8081/a/aIndexJsp
2.7、Nginx Location指令详解
通过指定模式来与客户端请求的URI相匹配,
基本语法如下:location [=||*|^~|@] pattern{……}
~ #区分大小写的正则匹配
~* #不区分大小写的正则匹配
^~ #普通字符匹配,如果此选项匹配成功,忽略其他匹配选项,一般用来匹配目录
= #普通字符精确匹配
2.7.1、location ~* 不区分大小
location ~* /b/ {
}
http://127.0.0.1:8081/b/getBInfo
http://127.0.0.1:8081/B/getBInfo
可能会如下错误:
ginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in
将 proxy_pass http://192.168.18.190:8081/
; 变为http://192.168.18.190:8081
后端接口需要新增
@RequestMapping(value = {"/b/getBInfo","/B/getBInfo"})
location ~ 区分大小写
2.7.2、location ~* /b/ { 区分大小写
正确访问
http://127.0.0.1:8081/b/getBInfo
错误访问
http://127.0.0.1:8081/B/getBInfo
2.7.3、Location ^~ 区分大小写
正确访问:
http:/127.0.0.1:8081/b/java521/getBInfo
http://127.0.0.1:8081/b/getBInfo
后端接口新增
@RequestMapping(value = {"/b/getBInfo","/B/getBInfo","/b/java521/getBInfo"})
2.7.4、location = 精确访问
正确访问 http://127.0.0.1:8081/b/
错误访问 http://127.0.0.1:8081/b/java521